convert: make filemap prune useless branch closing revs (issue2774)

A branch closing revision only applies if one of its parents belongs to the
branch being closed. Otherwise the filemap can prune it too.
This commit is contained in:
Patrick Mezard 2011-04-20 23:15:18 +02:00
parent 4669edf97c
commit 95e7147cd4
3 changed files with 99 additions and 13 deletions

View File

@ -209,6 +209,11 @@ class filemap_source(converter_source):
self.children[p] = self.children.get(p, 0) + 1
return c
def _cachedcommit(self, rev):
if rev in self.commits:
return self.commits[rev]
return self.base.getcommit(rev)
def _discard(self, *revs):
for r in revs:
if r is None:
@ -308,7 +313,14 @@ class filemap_source(converter_source):
self.origparents[rev] = parents
closed = 'close' in self.commits[rev].extra
closed = False
if 'close' in self.commits[rev].extra:
# A branch closing revision is only useful if one of its
# parents belong to the branch being closed
branch = self.commits[rev].branch
pbranches = [self._cachedcommit(p).branch for p in mparents]
if branch in pbranches:
closed = True
if len(mparents) < 2 and not closed and not self.wanted(rev, wp):
# We don't want this revision.

View File

@ -282,3 +282,83 @@ filemap errors
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
$ 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
$ 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
$ 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

View File

@ -32,24 +32,18 @@
created new head
$ chmod +x baz
$ hg ci -m 'mark baz executable' -d '5 0'
$ hg branch foo
marked working directory as branch foo
$ hg ci -m 'branch foo' -d '6 0'
$ hg ci --close-branch -m 'close' -d '7 0'
$ cd ..
$ hg convert --datesort orig new 2>&1 | grep -v 'subversion python bindings could not be loaded'
initializing destination new repository
scanning source...
sorting...
converting...
7 add foo bar
6 change foo
5 make bar and baz copies of foo
4 merge local copy
3 merge remote copy
2 mark baz executable
1 branch foo
0 close
5 add foo bar
4 change foo
3 make bar and baz copies of foo
2 merge local copy
1 merge remote copy
0 mark baz executable
$ cd new
$ hg out ../orig
comparing with ../orig