feat: add local diff review workflow
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user