changeset 5379:d3e51dc804f8

mercurial_source: add --filemap support
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
date Thu, 04 Oct 2007 23:21:37 -0300
parents 8a2915f57dfc
children a5a7f7fd5554
files hgext/convert/hg.py tests/test-convert-filemap tests/test-convert-filemap.out
diffstat 3 files changed, 294 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/convert/hg.py
+++ b/hgext/convert/hg.py
@@ -177,6 +177,7 @@ class mercurial_source(converter_source)
             raise NoRepo("could not open hg repo %s as source" % path)
         self.lastrev = None
         self.lastctx = None
+        self._changescache = None
 
     def changectx(self, rev):
         if self.lastrev != rev:
@@ -202,7 +203,10 @@ class mercurial_source(converter_source)
 
     def getchanges(self, rev):
         ctx = self.changectx(rev)
-        m, a, r = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3]
+        if self._changescache and self._changescache[0] == rev:
+            m, a, r = self._changescache[1]
+        else:
+            m, a, r = self.repo.status(ctx.parents()[0].node(), ctx.node())[:3]
         changes = [(name, rev) for name in m + a + r]
         changes.sort()
         return (changes, self.getcopies(ctx, m + a))
@@ -226,3 +230,14 @@ class mercurial_source(converter_source)
     def gettags(self):
         tags = [t for t in self.repo.tagslist() if t[0] != 'tip']
         return dict([(name, hex(node)) for name, node in tags])
+
+    def getchangedfiles(self, rev, i):
+        ctx = self.changectx(rev)
+        i = i or 0
+        changes = self.repo.status(ctx.parents()[i].node(), ctx.node())[:3]
+
+        if i == 0:
+            self._changescache = (rev, changes)
+
+        return changes[0] + changes[1] + changes[2]
+
new file mode 100755
--- /dev/null
+++ b/tests/test-convert-filemap
@@ -0,0 +1,124 @@
+#!/bin/sh
+
+HGMERGE=true; export HGMERGE
+
+echo '[extensions]' >> $HGRCPATH
+echo 'hgext.graphlog =' >> $HGRCPATH
+echo 'hgext.convert =' >> $HGRCPATH
+
+glog()
+{
+    hg glog --template '#rev# "#desc#" files: #files#\n' "$@"
+}
+
+hg init source
+cd source
+
+echo foo > foo
+echo baz > baz
+mkdir dir
+echo dir/file >> dir/file
+echo dir/file2 >> dir/file2
+hg ci -d '0 0' -qAm '0: add foo baz dir/'
+
+echo bar > bar
+echo quux > quux
+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'
+
+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'
+
+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
+
+echo '% final file versions in this repo:'
+hg manifest --debug
+hg debugrename copied
+echo
+
+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"
+    glog -R "$repo"
+    hg -R "$repo" manifest --debug
+}
+
+splitrepo 'skip unwanted merges; use 1st parent in 1st merge, 2nd in 2nd' foo
+
+splitrepo 'merges are not merges anymore' bar
+
+splitrepo '1st merge is not a merge anymore; 2nd still is' baz
+
+splitrepo 'we add additional merges when they are interesting' 'foo quux'
+
+splitrepo 'partial conversion' 'bar quux' '-r 3'
+splitrepo 'complete the partial conversion' 'bar quux'
+
+rm -r foo.repo
+splitrepo 'partial conversion' 'foo' '-r 3'
+splitrepo 'complete the partial conversion' 'foo'
+
+splitrepo 'copied file; source not included in new repo' copied
+hg --cwd copied.repo debugrename copied
+
+splitrepo 'copied file; source included in new repo' 'foo copied'
+hg --cwd foo-copied.repo debugrename copied
+
+cat > renames.fmap <<EOF
+include dir
+exclude dir/file2
+rename dir dir2
+include foo
+include copied
+rename foo foo2
+rename copied copied2
+EOF
+hg -q convert --filemap renames.fmap --datesort source renames.repo
+glog -R renames.repo
+hg -R renames.repo manifest --debug
+hg --cwd renames.repo debugrename copied2
+echo 'copied:'
+hg --cwd source cat copied
+echo 'copied2:'
+hg --cwd renames.repo cat copied2
new file mode 100644
--- /dev/null
+++ b/tests/test-convert-filemap.out
@@ -0,0 +1,154 @@
+@  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 quux
+|
+o  0 "0: add foo baz dir/" files: baz dir/file dir/file2 foo
+
+% final file versions in this repo:
+9463f52fe115e377cf2878d4fc548117211063f2 644 bar
+94c1be4dfde2ee8d78db8bbfcf81210813307c3d 644 baz
+6ca237634e1f6bee1b6db94292fb44f092a25842 644 copied
+3e20847584beff41d7cd16136b7331ab3d754be0 644 dir/file
+75e6d3f8328f5f6ace6bf10b98df793416a09dca 644 dir/file2
+9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo
+bc3eca3f47023a3e70ca0d8cc95a22a6827db19d 644 quux
+copied renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd
+
+% foo: skip unwanted merges; use 1st parent in 1st merge, 2nd in 2nd
+o  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
+% bar: merges are not merges anymore
+o  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
+% baz: 1st merge is not a merge anymore; 2nd still is
+o    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
+% foo quux: we add additional merges when they are interesting
+o  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
+% bar quux: partial conversion
+o  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
+% bar quux: complete the partial conversion
+o  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
+% foo: partial conversion
+o  0 "0: add foo baz dir/" files: foo
+
+2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 foo
+% foo: complete the partial conversion
+o  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
+% copied: copied file; source not included in new repo
+o  0 "1: add bar quux; copy foo to copied" files: copied
+
+2ed2a3912a0b24502043eae84ee4b279c18b90dd 644 copied
+copied not renamed
+% foo copied: copied file; source included in new repo
+o  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
+
+6ca237634e1f6bee1b6db94292fb44f092a25842 644 copied
+9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo
+copied renamed from foo:2ed2a3912a0b24502043eae84ee4b279c18b90dd
+o  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 foo2
+
+e5e3d520be9be45937d0b06b004fadcd6c221fa2 644 copied2
+3e20847584beff41d7cd16136b7331ab3d754be0 644 dir2/file
+9a7b52012991e4873687192c3e17e61ba3e837a3 644 foo2
+copied2 renamed from foo2:2ed2a3912a0b24502043eae84ee4b279c18b90dd
+copied:
+foo
+copied2:
+foo