# HG changeset patch # User Alexis S. L. Carvalho # Date 1191550897 10800 # Node ID d3e51dc804f83eabba6c2b196862bae093c90d87 # Parent 8a2915f57dfcc2b778ae6276e2cdd5629c8fb132 mercurial_source: add --filemap support diff --git a/hgext/convert/hg.py b/hgext/convert/hg.py --- 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] + diff --git a/tests/test-convert-filemap b/tests/test-convert-filemap 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 <