diff --git a/tests/test-graft.t b/tests/test-graft.t new file mode 100644 --- /dev/null +++ b/tests/test-graft.t @@ -0,0 +1,227 @@ +Create a repo with some stuff in it: + + $ hg init a + $ cd a + $ echo a > a + $ echo a > d + $ echo a > e + $ hg ci -qAm0 + $ echo b > a + $ hg ci -m1 -u bar + $ hg mv a b + $ hg ci -m2 + $ hg cp b c + $ hg ci -m3 -u baz + $ echo b > d + $ echo f > e + $ hg ci -m4 + $ hg up -q 3 + $ echo b > e + $ hg branch -q stable + $ hg ci -m5 + $ hg merge -q default --tool internal:local + $ hg branch -q default + $ hg ci -m6 + +Need to specify a rev: + + $ hg graft + abort: no revisions specified + [255] + +Can't graft ancestor: + + $ hg graft 1 2 + skipping ancestor revision 1 + skipping ancestor revision 2 + [255] + +Can't graft with dirty wd: + + $ hg up -q 0 + $ echo foo > a + $ hg graft 1 + abort: outstanding uncommitted changes + [255] + $ hg revert a + +Graft a rename: + + $ hg graft 2 -u foo + grafting revision 2 + merging a and b to b + $ hg export tip --git + # HG changeset patch + # User foo + # Date 0 0 + # Node ID d2e44c99fd3f31c176ea4efb9eca9f6306c81756 + # Parent 68795b066622ca79a25816a662041d8f78f3cd9e + 2 + + diff --git a/a b/b + rename from a + rename to b + --- a/a + +++ b/b + @@ -1,1 +1,1 @@ + -a + +b + +Look for extra:source + + $ hg log --debug -r tip + changeset: 7:d2e44c99fd3f31c176ea4efb9eca9f6306c81756 + tag: tip + parent: 0:68795b066622ca79a25816a662041d8f78f3cd9e + parent: -1:0000000000000000000000000000000000000000 + manifest: 7:5d59766436fd8fbcd38e7bebef0f6eaf3eebe637 + user: foo + date: Thu Jan 01 00:00:00 1970 +0000 + files+: b + files-: a + extra: branch=default + extra: source=5c095ad7e90f871700f02dd1fa5012cb4498a2d4 + description: + 2 + + + +Graft out of order, skipping a merge and a duplicate + + $ hg graft 1 5 4 3 'merge()' 2 --debug + skipping ungraftable merge revision 6 + scanning for duplicate grafts + skipping already grafted revision 2 + grafting revision 1 + searching for copies back to rev 1 + unmatched files in local: + a.orig + b + all copies found (* = to merge, ! = divergent): + b -> a * + checking for directory renames + resolving manifests + overwrite False partial False + ancestor 68795b066622 local d2e44c99fd3f+ remote 5d205f8b35b6 + b: local copied/moved to a -> m + preserving b for resolve of b + updating: b 1/1 files (100.00%) + searching for copies back to rev 1 + unmatched files in local: + a + unmatched files in other: + b + all copies found (* = to merge, ! = divergent): + b -> a * + checking for directory renames + b + b: searching for copy revision for a + b: copy a:b789fdd96dc2f3bd229c1dd8eedf0fc60e2b68e3 + grafting revision 5 + searching for copies back to rev 1 + unmatched files in local: + a.orig + resolving manifests + overwrite False partial False + ancestor 4c60f11aa304 local 6f5ea6ac8b70+ remote 97f8bfe72746 + e: remote is newer -> g + updating: e 1/1 files (100.00%) + getting e + searching for copies back to rev 1 + unmatched files in local: + c + all copies found (* = to merge, ! = divergent): + c -> b * + checking for directory renames + e + grafting revision 4 + searching for copies back to rev 1 + unmatched files in local: + a.orig + resolving manifests + overwrite False partial False + ancestor 4c60f11aa304 local 77eb504366ab+ remote 9c233e8e184d + e: versions differ -> m + d: remote is newer -> g + preserving e for resolve of e + updating: d 1/2 files (50.00%) + getting d + updating: e 2/2 files (100.00%) + picked tool 'internal:merge' for e (binary False symlink False) + merging e + my e@77eb504366ab+ other e@9c233e8e184d ancestor e@68795b066622 + warning: conflicts during merge. + merging e failed! + searching for copies back to rev 1 + unmatched files in local: + c + all copies found (* = to merge, ! = divergent): + c -> b * + checking for directory renames + abort: unresolved conflicts, can't continue + (use hg resolve and hg graft --continue) + [255] + +Continue without resolve should fail: + + $ hg graft -c + grafting revision 4 + abort: unresolved merge conflicts (see hg help resolve) + [255] + +Fix up: + + $ echo b > e + $ hg resolve -m e + +Continue with a revision should fail: + + $ hg graft -c 6 + abort: can't specify --continue and revisions + [255] + +Continue for real, clobber usernames + + $ hg graft -c -U + grafting revision 4 + grafting revision 3 + +Compare with original: + + $ hg diff -r 6 + $ hg status --rev 0:. -C + M d + M e + A b + a + A c + a + R a + +View graph: + + $ hg --config extensions.graphlog= log -G --template '{author}@rev: {desc}\n' + @ test@rev: 3 + | + o test@rev: 4 + | + o test@rev: 5 + | + o bar@rev: 1 + | + o foo@rev: 2 + | + | o test@rev: 6 + | |\ + | | o test@rev: 5 + | | | + | o | test@rev: 4 + | |/ + | o baz@rev: 3 + | | + | o test@rev: 2 + | | + | o bar@rev: 1 + |/ + o test@rev: 0 +