feat: add local diff review workflow

This commit is contained in:
Valdemar Lorenzen
2026-10-16 13:10:07 +02:00
parent 930735c537
commit 0446ec86c7
15 changed files with 1871 additions and 7 deletions
+71
View File
@@ -195,6 +195,75 @@ fn disk_state(root: &Path) -> BTreeMap<PathBuf, (u32, Vec<u8>)> {
result
}
#[test]
fn comparison_revisions_freeze_commits_and_address_working_contents() {
for kind in [RepoKind::Git, RepoKind::Jujutsu] {
let fixture = Fixture::new();
let root = fixture.dir("identity").canonicalize().unwrap();
match kind {
RepoKind::Git => init_git(&root),
RepoKind::Jujutsu => init_jj(&root, false),
}
fs::write(root.join("file"), "committed\n").unwrap();
let id = match kind {
RepoKind::Git => {
git(&root, &["add", "."]);
git(&root, &["commit", "-m", "baseline"]);
git(&root, &["rev-parse", "HEAD"])
}
RepoKind::Jujutsu => {
jj(&root, &["describe", "-m", "baseline"]);
jj(&root, &["log", "--no-graph", "-r", "@", "-T", "commit_id"])
}
};
fs::write(root.join("file"), "working\n").unwrap();
let state = disk_state(&root);
let before = revision(&id, kind);
let after = working(kind);
let mut repository = open(&root);
let first = repository
.compare(1, &before, &after, ComparisonMode::Snapshots, &[])
.unwrap();
assert_eq!(first.revisions[0], id);
assert!(first.revisions[1].starts_with("working:"));
let reopened = open(&root)
.compare(2, &before, &after, ComparisonMode::Snapshots, &[])
.unwrap();
assert_eq!(first.revisions, reopened.revisions);
let overlay = repository
.compare(
3,
&before,
&after,
ComparisonMode::Snapshots,
&[(root.join("file"), "unsaved\n".into())],
)
.unwrap();
assert_ne!(overlay.revisions[1], first.revisions[1]);
let repeated = repository
.compare(
4,
&before,
&after,
ComparisonMode::Snapshots,
&[(root.join("file"), "unsaved\n".into())],
)
.unwrap();
assert_eq!(repeated.revisions, overlay.revisions);
let working_pair = repository
.compare(5, &after, &after, ComparisonMode::Snapshots, &[])
.unwrap();
assert_eq!(working_pair.revisions[0], first.revisions[1]);
assert_eq!(working_pair.revisions[0], working_pair.revisions[1]);
assert_eq!(disk_state(&root), state);
fs::write(root.join("file"), "working").unwrap();
let no_newline = repository
.compare(6, &before, &after, ComparisonMode::Snapshots, &[])
.unwrap();
assert_ne!(no_newline.revisions[1], first.revisions[1]);
}
}
#[test]
fn git_working_reads_disk_and_handles_ranges_ignored_files_binary_links_and_odd_paths() {
let fixture = Fixture::new();
@@ -874,6 +943,7 @@ fn jj_bookmark_refresh_recomputes_branch_merge_base_and_recovers_after_deletion(
.compare(1, before, after, ComparisonMode::BranchChanges, &[])
.unwrap();
assert!(original.before.ends_with(&base));
assert_eq!(original.revisions, [base.clone(), tip.clone()]);
jj(&root, &["bookmark", "set", "before", "-r", &tip]);
let Some(CheckoutRefresh::Bookmark(comparison)) =
repository.refresh_checkout(1, 2, false, &[]).unwrap()
@@ -881,6 +951,7 @@ fn jj_bookmark_refresh_recomputes_branch_merge_base_and_recovers_after_deletion(
panic!("Moved Before must recompute merge base");
};
assert!(comparison.before.ends_with(&tip));
assert_eq!(comparison.revisions, [tip.clone(), tip.clone()]);
assert!(comparison.files.is_empty());
jj(&root, &["bookmark", "delete", "after"]);
let state = disk_state(&root);