diff --git a/hgext/convert/monotone.py b/hgext/convert/monotone.py --- a/hgext/convert/monotone.py +++ b/hgext/convert/monotone.py @@ -122,14 +122,14 @@ class monotone_source(converter_source, #revision = self.mtncmd("get_revision %s" % rev).split("\n\n") revision = self.mtnrun("get_revision", rev).split("\n\n") files = {} - addedfiles = {} + ignoremove = {} renameddirs = [] copies = {} for e in revision: m = self.add_file_re.match(e) if m: files[m.group(1)] = rev - addedfiles[m.group(1)] = rev + ignoremove[m.group(1)] = rev m = self.patch_re.match(e) if m: files[m.group(1)] = rev @@ -144,6 +144,7 @@ class monotone_source(converter_source, toname = m.group(2) fromname = m.group(1) if self.mtnisfile(toname, rev): + ignoremove[toname] = 1 copies[toname] = fromname files[toname] = rev files[fromname] = rev @@ -155,7 +156,7 @@ class monotone_source(converter_source, for fromdir, todir in renameddirs: renamed = {} for tofile in self.files: - if tofile in addedfiles: + if tofile in ignoremove: continue if tofile.startswith(todir + '/'): renamed[tofile] = fromdir + tofile[len(todir):] diff --git a/tests/test-convert-mtn b/tests/test-convert-mtn --- a/tests/test-convert-mtn +++ b/tests/test-convert-mtn @@ -80,6 +80,14 @@ mtn add --quiet -R dir2/dir mtn ci -m emptydir mtn drop -R dir2/dir mtn ci -m dropdirectory +echo '% test directory and file move' +mkdir -p dir3/d1 +echo a > dir3/a +mtn add dir3/a dir3/d1 +mtn ci -m dirfilemove +mtn mv dir3/a dir3/d1/a +mtn mv dir3/d1 dir3/d2 +mtn ci -m dirfilemove2 cd .. echo % convert incrementally @@ -108,5 +116,7 @@ test -d dir1/subdir1 && echo 'renamed di hg log -v -C -r 4 | grep copies echo % check file remove with directory move hg manifest -r 5 +echo % check file move with directory move +hg manifest -r 9 exit 0 diff --git a/tests/test-convert-mtn.out b/tests/test-convert-mtn.out --- a/tests/test-convert-mtn.out +++ b/tests/test-convert-mtn.out @@ -53,19 +53,37 @@ mtn: dropping dir2/dir/emptydir from wor mtn: dropping dir2/dir from workspace manifest mtn: beginning commit on branch 'com.selenic.test' mtn: committed revision 2323d4bc324e6c82628dc04d47a9fd32ad24e322 +% test directory and file move +mtn: adding dir3 to workspace manifest +mtn: adding dir3/a to workspace manifest +mtn: adding dir3/d1 to workspace manifest +mtn: beginning commit on branch 'com.selenic.test' +mtn: committed revision 47b192f720faa622f48c68d1eb075b26d405aa8b +mtn: skipping dir3/d1, already accounted for in workspace +mtn: renaming dir3/a to dir3/d1/a in workspace manifest +mtn: skipping dir3, already accounted for in workspace +mtn: renaming dir3/d1 to dir3/d2 in workspace manifest +mtn: beginning commit on branch 'com.selenic.test' +mtn: committed revision 8b543a400d3ee7f6d4bb1835b9b9e3747c8cb632 % convert incrementally assuming destination repo.mtn-hg scanning source... sorting... converting... -5 update2 "with" quotes -4 createdir1 -3 movedir1 -2 movedir -1 emptydir -0 dropdirectory -6 files updated, 0 files merged, 0 files removed, 0 files unresolved -@ 7 "dropdirectory" files: dir2/dir/subdir/f +7 update2 "with" quotes +6 createdir1 +5 movedir1 +4 movedir +3 emptydir +2 dropdirectory +1 dirfilemove +0 dirfilemove2 +7 files updated, 0 files merged, 0 files removed, 0 files unresolved +@ 9 "dirfilemove2" files: dir3/a dir3/d2/a +| +o 8 "dirfilemove" files: dir3/a +| +o 7 "dropdirectory" files: dir2/dir/subdir/f | o 6 "emptydir" files: dir2/dir/subdir/f | @@ -87,6 +105,7 @@ dir1/subdir2/file1 dir1/subdir2_other/file1 dir2/a dir2/newfile +dir3/d2/a e % contents a @@ -108,3 +127,11 @@ dir1/subdir2_other/file1 dir2/a dir2/newfile e +% check file move with directory move +bin2 +dir1/subdir2/file1 +dir1/subdir2_other/file1 +dir2/a +dir2/newfile +dir3/d2/a +e