From 3e4cf4a568ad5852609b5ce53f1fb097b3217199 Mon Sep 17 00:00:00 2001 From: Daniil Demidko Date: Thu, 4 Apr 2024 01:28:18 +0600 Subject: [PATCH] draft... --- Cargo.lock | 7 +++++ Cargo.toml | 5 +++- README.md | 2 +- src/arch.rs | 5 ---- src/arch_hunk.rs | 5 ++++ src/git.rs | 10 ++++++- src/languages/arch_diff.rs | 7 +++++ src/languages/java_arch_diff.rs | 50 +++++++++++++++++++++++++++++++++ src/languages/mod.rs | 3 ++ src/main.rs | 5 +++- 10 files changed, 90 insertions(+), 9 deletions(-) delete mode 100644 src/arch.rs create mode 100644 src/arch_hunk.rs create mode 100644 src/languages/arch_diff.rs create mode 100644 src/languages/java_arch_diff.rs create mode 100644 src/languages/mod.rs diff --git a/Cargo.lock b/Cargo.lock index ccafa43..efa4268 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7,6 +7,7 @@ name = "archdiff" version = "2024.3.12" dependencies = [ "git2", + "similar", ] [[package]] @@ -150,6 +151,12 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "similar" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa42c91313f1d05da9b26f267f931cf178d4aba455b4c4622dd7355eb80c6640" + [[package]] name = "tinyvec" version = "1.6.0" diff --git a/Cargo.toml b/Cargo.toml index c77dacd..b0cbf70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,7 +3,10 @@ name = "archdiff" version = "2024.3.12" edition = "2021" -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[profile.release] +strip = "symbols" +panic = "abort" [dependencies] git2 = "0.18.3" +similar = "2.5.0" \ No newline at end of file diff --git a/README.md b/README.md index 194911d..0ba5387 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# archiff +# archdiff The utility calculates the difference of _architecture_ changes between two git branches. This is especially useful when analyzing large merge requests. These languages are supported: diff --git a/src/arch.rs b/src/arch.rs deleted file mode 100644 index c912e0a..0000000 --- a/src/arch.rs +++ /dev/null @@ -1,5 +0,0 @@ -struct Arch { - filename: String, - old_arch: String, - new_arch: String, -} \ No newline at end of file diff --git a/src/arch_hunk.rs b/src/arch_hunk.rs new file mode 100644 index 0000000..8f12d48 --- /dev/null +++ b/src/arch_hunk.rs @@ -0,0 +1,5 @@ +pub struct ArchHunk { + pub filename: String, + pub old_arch: String, + pub new_arch: String, +} \ No newline at end of file diff --git a/src/git.rs b/src/git.rs index 8273351..0e2164b 100644 --- a/src/git.rs +++ b/src/git.rs @@ -1,4 +1,6 @@ +use std::collections::hash_set::Difference; use std::fmt::Debug; +use std::path::Path; use std::str; use git2::{Diff, DiffDelta, DiffFindOptions, DiffHunk, DiffLine, Object, ObjectType, Repository}; @@ -27,6 +29,7 @@ pub fn diff_branches<'a>(repo: &'a Repository, old_branch: &str, new_branch: &st pub fn print_diff_line(delta: DiffDelta, hunk: Option, line: DiffLine) -> bool { println!(); + println!("{:?} {:?}", delta.old_file().path(), delta.new_file().path()); println!("{:?}", delta.status()); println!("{:?} {:?}", line.old_lineno(), line.new_lineno()); println!("{:?}", line.origin_value()); @@ -36,6 +39,11 @@ pub fn print_diff_line(delta: DiffDelta, hunk: Option, line: DiffLine) true } +fn extract_path<'a>(diff_delta: &'a DiffDelta) -> &'a Path { + let new_file = diff_delta.new_file().path(); + let old_file = diff_delta.old_file().path(); + new_file.or(old_file).unwrap() +} fn make_tree_object<'a>(repo: &'a Repository, arg: &str) -> Object<'a> { let obj = repo.revparse_single(arg).unwrap(); @@ -52,7 +60,7 @@ mod tests { #[test] fn it_works() { let repo = open_current_repo(); - let diff = diff_branches(&repo, "main", "test_branch"); + let diff = diff_branches(&repo, "test_branch", "main"); let diff_format = DiffFormat::Patch; diff.print(DiffFormat::Patch, print_diff_line).unwrap(); } diff --git a/src/languages/arch_diff.rs b/src/languages/arch_diff.rs new file mode 100644 index 0000000..592a276 --- /dev/null +++ b/src/languages/arch_diff.rs @@ -0,0 +1,7 @@ +use std::fmt::Display; + +use git2::DiffLine; + +pub trait ArchDiff: Display { + fn arch_diff(&mut self, filename: &str, diff: &DiffLine); +} \ No newline at end of file diff --git a/src/languages/java_arch_diff.rs b/src/languages/java_arch_diff.rs new file mode 100644 index 0000000..2e7c8a3 --- /dev/null +++ b/src/languages/java_arch_diff.rs @@ -0,0 +1,50 @@ +use std::fmt::Display; +use std::ops::Add; + +use diffy::create_patch; +use git2::DiffLine; + +use crate::languages::arch_diff::ArchDiff; + +struct JavaArchDiff { + filename: String, + old_arch: String, + new_arch: String, + diff: String, +} + +impl JavaArchDiff { + fn flush(&mut self) { + let old = &self.old_arch; + let new = &self.new_arch; + let diff = create_patch(old, new); + let diff = diff.to_string(); + self.diff += &diff + } +} + +impl Display for JavaArchDiff { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{}", self.diff) + } +} + +impl ArchDiff for JavaArchDiff { + fn arch_diff(&mut self, filename: &str, diff: &DiffLine) { + todo!() + } +} + +#[cfg(test)] +mod tests { + use diffy::{create_patch, DiffOptions}; + + #[test] + fn it_works() { + let old = "ool\nkek\njey trek\n"; + let new = "lol\nkek\njey trep"; + let diff = create_patch(old, new); + println!("{}", diff); + } +} + diff --git a/src/languages/mod.rs b/src/languages/mod.rs new file mode 100644 index 0000000..1b9e0bc --- /dev/null +++ b/src/languages/mod.rs @@ -0,0 +1,3 @@ +mod arch_diff; + +mod java_arch_diff; \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 01f0ee5..a38630d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,7 @@ mod git; -mod arch; +mod arch_hunk; + +mod languages; + fn main() {} \ No newline at end of file