diff options
Diffstat (limited to 'tests/test-convert-filemap.t')
-rw-r--r-- | tests/test-convert-filemap.t | 596 |
1 files changed, 596 insertions, 0 deletions
diff --git a/tests/test-convert-filemap.t b/tests/test-convert-filemap.t new file mode 100644 index 0000000..e351d7c --- /dev/null +++ b/tests/test-convert-filemap.t @@ -0,0 +1,596 @@ + + $ HGMERGE=true; export HGMERGE + $ echo '[extensions]' >> $HGRCPATH + $ echo 'graphlog =' >> $HGRCPATH + $ echo 'convert =' >> $HGRCPATH + $ glog() + > { + > hg glog --template '{rev} "{desc}" files: {files}\n' "$@" + > } + $ hg init source + $ cd source + $ echo foo > foo + $ echo baz > baz + $ mkdir -p dir/subdir + $ echo dir/file >> dir/file + $ echo dir/file2 >> dir/file2 + $ echo dir/file3 >> dir/file3 # to be corrupted in rev 0 + $ echo dir/subdir/file3 >> dir/subdir/file3 + $ echo dir/subdir/file4 >> dir/subdir/file4 + $ hg ci -d '0 0' -qAm '0: add foo baz dir/' + $ echo bar > bar + $ echo quux > quux + $ echo dir/file4 >> dir/file4 # to be corrupted in rev 1 + $ hg copy foo copied + $ hg ci -d '1 0' -qAm '1: add bar quux; copy foo to copied' + $ echo >> foo + $ hg ci -d '2 0' -m '2: change foo' + $ hg up -qC 1 + $ echo >> bar + $ echo >> quux + $ hg ci -d '3 0' -m '3: change bar quux' + created new head + $ hg up -qC 2 + $ hg merge -qr 3 + $ echo >> bar + $ echo >> baz + $ hg ci -d '4 0' -m '4: first merge; change bar baz' + $ echo >> bar + $ echo 1 >> baz + $ echo >> quux + $ hg ci -d '5 0' -m '5: change bar baz quux' + $ hg up -qC 4 + $ echo >> foo + $ echo 2 >> baz + $ hg ci -d '6 0' -m '6: change foo baz' + created new head + $ hg up -qC 5 + $ hg merge -qr 6 + $ echo >> bar + $ hg ci -d '7 0' -m '7: second merge; change bar' + $ echo >> foo + $ hg ci -m '8: change foo' + $ glog + @ 8 "8: change foo" files: foo + | + o 7 "7: second merge; change bar" files: bar baz + |\ + | o 6 "6: change foo baz" files: baz foo + | | + o | 5 "5: change bar baz quux" files: bar baz quux + |/ + o 4 "4: first merge; change bar baz" files: bar baz + |\ + | o 3 "3: change bar quux" files: bar quux + | | + o | 2 "2: change foo" files: foo + |/ + o 1 "1: add bar quux; copy foo to copied" files: bar copied dir/file4 quux + | + o 0 "0: add foo baz dir/" files: baz dir/file dir/file2 dir/file3 dir/subdir/file3 dir/subdir/file4 foo + + +final file versions in this repo: + + $ hg manifest --debug + 9463f52fe115e377cf2878d4fc548117211063f2 644 bar + 94c1be4dfde2ee8d78db8bbfcf81210813307c3d 644 baz + 7711d36246cc83e61fb29cd6d4ef394c63f1ceaf 644 copied + 3e20847584beff41d7cd16136b7331ab3d754be0 644 dir/file + 75e6d3f8328f5f6ace6bf10b98df793416a09dca 644 dir/file2 + e96dce0bc6a217656a3a410e5e6bec2c4f42bf7c 644 dir/file3 + 6edd55f559cdce67132b12ca09e09cee08b60442 644 dir/file4 + 5fe139720576e18e34bcc9f79174db8897c8afe9 644 dir/subdir/file3 + 57a1c1511590f3de52874adfa04effe8a77d64af 644 dir/subdir/file4 + 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo + bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644 quux + $ hg debugrename copied + copied renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd + + $ cd .. + $ splitrepo() + > { + > msg="$1" + > files="$2" + > opts=$3 + > echo "% $files: $msg" + > prefix=`echo "$files" | sed -e 's/ /-/g'` + > fmap="$prefix.fmap" + > repo="$prefix.repo" + > for i in $files; do + > echo "include $i" >> "$fmap" + > done + > hg -q convert $opts --filemap "$fmap" --datesort source "$repo" + > hg up -q -R "$repo" + > glog -R "$repo" + > hg -R "$repo" manifest --debug + > } + $ splitrepo 'skip unwanted merges; use 1st parent in 1st merge, 2nd in 2nd' foo + % foo: skip unwanted merges; use 1st parent in 1st merge, 2nd in 2nd + @ 3 "8: change foo" files: foo + | + o 2 "6: change foo baz" files: foo + | + o 1 "2: change foo" files: foo + | + o 0 "0: add foo baz dir/" files: foo + + 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo + $ splitrepo 'merges are not merges anymore' bar + % bar: merges are not merges anymore + @ 4 "7: second merge; change bar" files: bar + | + o 3 "5: change bar baz quux" files: bar + | + o 2 "4: first merge; change bar baz" files: bar + | + o 1 "3: change bar quux" files: bar + | + o 0 "1: add bar quux; copy foo to copied" files: bar + + 9463f52fe115e377cf2878d4fc548117211063f2 644 bar + $ splitrepo '1st merge is not a merge anymore; 2nd still is' baz + % baz: 1st merge is not a merge anymore; 2nd still is + @ 4 "7: second merge; change bar" files: baz + |\ + | o 3 "6: change foo baz" files: baz + | | + o | 2 "5: change bar baz quux" files: baz + |/ + o 1 "4: first merge; change bar baz" files: baz + | + o 0 "0: add foo baz dir/" files: baz + + 94c1be4dfde2ee8d78db8bbfcf81210813307c3d 644 baz + $ splitrepo 'we add additional merges when they are interesting' 'foo quux' + % foo quux: we add additional merges when they are interesting + @ 8 "8: change foo" files: foo + | + o 7 "7: second merge; change bar" files: + |\ + | o 6 "6: change foo baz" files: foo + | | + o | 5 "5: change bar baz quux" files: quux + |/ + o 4 "4: first merge; change bar baz" files: + |\ + | o 3 "3: change bar quux" files: quux + | | + o | 2 "2: change foo" files: foo + |/ + o 1 "1: add bar quux; copy foo to copied" files: quux + | + o 0 "0: add foo baz dir/" files: foo + + 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo + bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644 quux + $ splitrepo 'partial conversion' 'bar quux' '-r 3' + % bar quux: partial conversion + @ 1 "3: change bar quux" files: bar quux + | + o 0 "1: add bar quux; copy foo to copied" files: bar quux + + b79105bedc55102f394e90a789c9c380117c1b4a 644 bar + db0421cc6b685a458c8d86c7d5c004f94429ea23 644 quux + $ splitrepo 'complete the partial conversion' 'bar quux' + % bar quux: complete the partial conversion + @ 4 "7: second merge; change bar" files: bar + | + o 3 "5: change bar baz quux" files: bar quux + | + o 2 "4: first merge; change bar baz" files: bar + | + o 1 "3: change bar quux" files: bar quux + | + o 0 "1: add bar quux; copy foo to copied" files: bar quux + + 9463f52fe115e377cf2878d4fc548117211063f2 644 bar + bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644 quux + $ rm -r foo.repo + $ splitrepo 'partial conversion' 'foo' '-r 3' + % foo: partial conversion + @ 0 "0: add foo baz dir/" files: foo + + 2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 foo + $ splitrepo 'complete the partial conversion' 'foo' + % foo: complete the partial conversion + @ 3 "8: change foo" files: foo + | + o 2 "6: change foo baz" files: foo + | + o 1 "2: change foo" files: foo + | + o 0 "0: add foo baz dir/" files: foo + + 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo + $ splitrepo 'copied file; source not included in new repo' copied + % copied: copied file; source not included in new repo + @ 0 "1: add bar quux; copy foo to copied" files: copied + + 2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 copied + $ hg --cwd copied.repo debugrename copied + copied not renamed + $ splitrepo 'copied file; source included in new repo' 'foo copied' + % foo copied: copied file; source included in new repo + @ 4 "8: change foo" files: foo + | + o 3 "6: change foo baz" files: foo + | + o 2 "2: change foo" files: foo + | + o 1 "1: add bar quux; copy foo to copied" files: copied + | + o 0 "0: add foo baz dir/" files: foo + + 7711d36246cc83e61fb29cd6d4ef394c63f1ceaf 644 copied + 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo + $ hg --cwd foo-copied.repo debugrename copied + copied renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd + $ cat > renames.fmap <<EOF + > include dir + > exclude dir/file2 + > rename dir dir2 + > include foo + > include copied + > rename foo foo2 + > rename copied copied2 + > exclude dir/subdir + > include dir/subdir/file3 + > EOF + $ rm source/.hg/store/data/dir/file3.i + $ rm source/.hg/store/data/dir/file4.i + $ hg -q convert --filemap renames.fmap --datesort source dummydest + abort: data/dir/file3.i@e96dce0bc6a2: no match found! + [255] + $ hg -q convert --filemap renames.fmap --datesort --config convert.hg.ignoreerrors=1 source renames.repo + ignoring: data/dir/file3.i@e96dce0bc6a2: no match found + ignoring: data/dir/file4.i@6edd55f559cd: no match found + $ hg up -q -R renames.repo + $ glog -R renames.repo + @ 4 "8: change foo" files: foo2 + | + o 3 "6: change foo baz" files: foo2 + | + o 2 "2: change foo" files: foo2 + | + o 1 "1: add bar quux; copy foo to copied" files: copied2 + | + o 0 "0: add foo baz dir/" files: dir2/file dir2/subdir/file3 foo2 + + $ hg -R renames.repo manifest --debug + d43feacba7a4f1f2080dde4a4b985bd8a0236d46 644 copied2 + 3e20847584beff41d7cd16136b7331ab3d754be0 644 dir2/file + 5fe139720576e18e34bcc9f79174db8897c8afe9 644 dir2/subdir/file3 + 9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo2 + $ hg --cwd renames.repo debugrename copied2 + copied2 renamed from foo2:2ed2a3912a0b24502043eae84ee4b279c18b90dd + +copied: + + $ hg --cwd source cat copied + foo + +copied2: + + $ hg --cwd renames.repo cat copied2 + foo + +filemap errors + + $ cat > errors.fmap <<EOF + > include dir/ # beware that comments changes error line numbers! + > exclude /dir + > rename dir//dir /dir//dir/ "out of sync" + > include + > EOF + $ hg -q convert --filemap errors.fmap source errors.repo + errors.fmap:1: superfluous / in exclude 'dir/' + errors.fmap:3: superfluous / in include '/dir' + errors.fmap:3: superfluous / in rename '/dir' + errors.fmap:3: superfluous / in exclude 'dir//dir' + errors.fmap:4: unknown directive 'out of sync' + errors.fmap:5: path to exclude is missing + abort: errors in filemap + [255] + +test branch closing revision pruning if branch is pruned + + $ hg init branchpruning + $ cd branchpruning + $ hg branch foo + marked working directory as branch foo + (branches are permanent and global, did you want a bookmark?) + $ echo a > a + $ hg ci -Am adda + adding a + $ hg ci --close-branch -m closefoo + $ hg up 0 + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg branch empty + marked working directory as branch empty + (branches are permanent and global, did you want a bookmark?) + $ hg ci -m emptybranch + $ hg ci --close-branch -m closeempty + $ hg up 0 + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg branch default + marked working directory as branch default + (branches are permanent and global, did you want a bookmark?) + $ echo b > b + $ hg ci -Am addb + adding b + $ hg ci --close-branch -m closedefault + $ cat > filemap <<EOF + > include b + > EOF + $ cd .. + $ hg convert branchpruning branchpruning-hg1 + initializing destination branchpruning-hg1 repository + scanning source... + sorting... + converting... + 5 adda + 4 closefoo + 3 emptybranch + 2 closeempty + 1 addb + 0 closedefault + $ glog -R branchpruning-hg1 + o 5 "closedefault" files: + | + o 4 "addb" files: b + | + | o 3 "closeempty" files: + | | + | o 2 "emptybranch" files: + |/ + | o 1 "closefoo" files: + |/ + o 0 "adda" files: a + + +exercise incremental conversion at the same time + + $ hg convert -r0 --filemap branchpruning/filemap branchpruning branchpruning-hg2 + initializing destination branchpruning-hg2 repository + scanning source... + sorting... + converting... + 0 adda + $ hg convert -r4 --filemap branchpruning/filemap branchpruning branchpruning-hg2 + scanning source... + sorting... + converting... + 0 addb + $ hg convert --filemap branchpruning/filemap branchpruning branchpruning-hg2 + scanning source... + sorting... + converting... + 3 closefoo + 2 emptybranch + 1 closeempty + 0 closedefault + $ glog -R branchpruning-hg2 + o 1 "closedefault" files: + | + o 0 "addb" files: b + + +filemap rename undoing revision rename + + $ hg init renameundo + $ cd renameundo + $ echo 1 > a + $ echo 1 > c + $ hg ci -qAm add + $ hg mv -q a b/a + $ hg mv -q c b/c + $ hg ci -qm rename + $ echo 2 > b/a + $ echo 2 > b/c + $ hg ci -qm modify + $ cd .. + + $ echo "rename b ." > renameundo.fmap + $ hg convert --filemap renameundo.fmap renameundo renameundo2 + initializing destination renameundo2 repository + scanning source... + sorting... + converting... + 2 add + 1 rename + filtering out empty revision + repository tip rolled back to revision 0 (undo commit) + 0 modify + $ glog -R renameundo2 + o 1 "modify" files: a c + | + o 0 "add" files: a c + + + +test merge parents/empty merges pruning + + $ glog() + > { + > hg glog --template '{rev}:{node|short}@{branch} "{desc}" files: {files}\n' "$@" + > } + +test anonymous branch pruning + + $ hg init anonymousbranch + $ cd anonymousbranch + $ echo a > a + $ echo b > b + $ hg ci -Am add + adding a + adding b + $ echo a >> a + $ hg ci -m changea + $ hg up 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ echo b >> b + $ hg ci -m changeb + created new head + $ hg up 1 + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg merge + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m merge + $ cd .. + + $ cat > filemap <<EOF + > include a + > EOF + $ hg convert --filemap filemap anonymousbranch anonymousbranch-hg + initializing destination anonymousbranch-hg repository + scanning source... + sorting... + converting... + 3 add + 2 changea + 1 changeb + 0 merge + $ glog -R anonymousbranch + @ 3:c71d5201a498@default "merge" files: + |\ + | o 2:607eb44b17f9@default "changeb" files: b + | | + o | 1:1f60ea617824@default "changea" files: a + |/ + o 0:0146e6129113@default "add" files: a b + + $ glog -R anonymousbranch-hg + o 1:cda818e7219b@default "changea" files: a + | + o 0:c334dc3be0da@default "add" files: a + + $ cat anonymousbranch-hg/.hg/shamap + 0146e6129113dba9ac90207cfdf2d7ed35257ae5 c334dc3be0daa2a4e9ce4d2e2bdcba40c09d4916 + 1f60ea61782421edf8d051ff4fcb61b330f26a4a cda818e7219b5f7f3fb9f49780054ed6a1905ec3 + 607eb44b17f9348cd5cbd26e16af87ba77b0b037 c334dc3be0daa2a4e9ce4d2e2bdcba40c09d4916 + c71d5201a498b2658d105a6bf69d7a0df2649aea cda818e7219b5f7f3fb9f49780054ed6a1905ec3 + + $ cat > filemap <<EOF + > include b + > EOF + $ hg convert --filemap filemap anonymousbranch anonymousbranch-hg2 + initializing destination anonymousbranch-hg2 repository + scanning source... + sorting... + converting... + 3 add + 2 changea + 1 changeb + 0 merge + $ glog -R anonymousbranch + @ 3:c71d5201a498@default "merge" files: + |\ + | o 2:607eb44b17f9@default "changeb" files: b + | | + o | 1:1f60ea617824@default "changea" files: a + |/ + o 0:0146e6129113@default "add" files: a b + + $ glog -R anonymousbranch-hg2 + o 1:62dd350b0df6@default "changeb" files: b + | + o 0:4b9ced861657@default "add" files: b + + $ cat anonymousbranch-hg2/.hg/shamap + 0146e6129113dba9ac90207cfdf2d7ed35257ae5 4b9ced86165703791653059a1db6ed864630a523 + 1f60ea61782421edf8d051ff4fcb61b330f26a4a 4b9ced86165703791653059a1db6ed864630a523 + 607eb44b17f9348cd5cbd26e16af87ba77b0b037 62dd350b0df695f7d2c82a02e0499b16fd790f22 + c71d5201a498b2658d105a6bf69d7a0df2649aea 62dd350b0df695f7d2c82a02e0499b16fd790f22 + +test named branch pruning + + $ hg init namedbranch + $ cd namedbranch + $ echo a > a + $ echo b > b + $ hg ci -Am add + adding a + adding b + $ echo a >> a + $ hg ci -m changea + $ hg up 0 + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg branch foo + marked working directory as branch foo + (branches are permanent and global, did you want a bookmark?) + $ echo b >> b + $ hg ci -m changeb + $ hg up default + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg merge foo + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m merge + $ cd .. + + $ cat > filemap <<EOF + > include a + > EOF + $ hg convert --filemap filemap namedbranch namedbranch-hg + initializing destination namedbranch-hg repository + scanning source... + sorting... + converting... + 3 add + 2 changea + 1 changeb + 0 merge + $ glog -R namedbranch + @ 3:73899bcbe45c@default "merge" files: + |\ + | o 2:8097982d19fc@foo "changeb" files: b + | | + o | 1:1f60ea617824@default "changea" files: a + |/ + o 0:0146e6129113@default "add" files: a b + + $ glog -R namedbranch-hg + o 1:cda818e7219b@default "changea" files: a + | + o 0:c334dc3be0da@default "add" files: a + + + $ cd namedbranch + $ hg --config extensions.mq= strip tip + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + saved backup bundle to $TESTTMP/namedbranch/.hg/strip-backup/73899bcbe45c-backup.hg (glob) + $ hg up foo + 2 files updated, 0 files merged, 0 files removed, 0 files unresolved + $ hg merge default + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + (branch merge, don't forget to commit) + $ hg ci -m merge + $ cd .. + + $ hg convert --filemap filemap namedbranch namedbranch-hg2 + initializing destination namedbranch-hg2 repository + scanning source... + sorting... + converting... + 3 add + 2 changea + 1 changeb + 0 merge + $ glog -R namedbranch + @ 3:e1959de76e1b@foo "merge" files: + |\ + | o 2:8097982d19fc@foo "changeb" files: b + | | + o | 1:1f60ea617824@default "changea" files: a + |/ + o 0:0146e6129113@default "add" files: a b + + $ glog -R namedbranch-hg2 + o 2:dcf314454667@foo "merge" files: + |\ + | o 1:cda818e7219b@default "changea" files: a + |/ + o 0:c334dc3be0da@default "add" files: a + |