# HG changeset patch # User Eugene Baranov # Date 2015-07-14 13:40:56 # Node ID 584044e5ad571c3b4f2f9c2f6201917fd369b1f9 # Parent f0a77cb6316a0dcd9e0d9917bdfa16532e0866ef convert: use 'default' for specifying branch name in branchmap (issue4753) A fix for issue2653 with 1d155582a8ea introduced a discrepancy how default branch should be denoted when converting with branchmap from different SCM. E.g. for Git and Mercurial you need to use 'default' whilst for Perforce and SVN you had to use 'None'. This changeset unifies 'default' for such purposes whilst falling back to 'None' when no 'default' mapping specified. diff --git a/hgext/convert/convcmd.py b/hgext/convert/convcmd.py --- a/hgext/convert/convcmd.py +++ b/hgext/convert/convcmd.py @@ -29,6 +29,39 @@ def recode(s): else: return s.decode('utf-8').encode(orig_encoding, 'replace') +def mapbranch(branch, branchmap): + ''' + >>> bmap = {'default': 'branch1'} + >>> for i in ['', None]: + ... mapbranch(i, bmap) + 'branch1' + 'branch1' + >>> bmap = {'None': 'branch2'} + >>> for i in ['', None]: + ... mapbranch(i, bmap) + 'branch2' + 'branch2' + >>> bmap = {'None': 'branch3', 'default': 'branch4'} + >>> for i in ['None', '', None, 'default', 'branch5']: + ... mapbranch(i, bmap) + 'branch3' + 'branch4' + 'branch4' + 'branch4' + 'branch5' + ''' + # If branch is None or empty, this commit is coming from the source + # repository's default branch and destined for the default branch in the + # destination repository. For such commits, using a literal "default" + # in branchmap below allows the user to map "default" to an alternate + # default branch in the destination repository. + branch = branchmap.get(branch or 'default', branch) + # At some point we used "None" literal to denote the default branch, + # attempt to use that for backward compatibility. + if (not branch): + branch = branchmap.get(str(None), branch) + return branch + source_converters = [ ('cvs', convert_cvs, 'branchsort'), ('git', convert_git, 'branchsort'), @@ -377,12 +410,7 @@ class converter(object): def cachecommit(self, rev): commit = self.source.getcommit(rev) commit.author = self.authors.get(commit.author, commit.author) - # If commit.branch is None, this commit is coming from the source - # repository's default branch and destined for the default branch in the - # destination repository. For such commits, passing a literal "None" - # string to branchmap.get() below allows the user to map "None" to an - # alternate default branch in the destination repository. - commit.branch = self.branchmap.get(str(commit.branch), commit.branch) + commit.branch = mapbranch(commit.branch, self.branchmap) self.commitcache[rev] = commit return commit diff --git a/hgext/convert/p4.py b/hgext/convert/p4.py --- a/hgext/convert/p4.py +++ b/hgext/convert/p4.py @@ -140,7 +140,7 @@ class p4_source(converter_source): date = (int(d["time"]), 0) # timezone not set c = commit(author=self.recode(d["user"]), date=util.datestr(date, '%Y-%m-%d %H:%M:%S %1%2'), - parents=parents, desc=desc, branch='', + parents=parents, desc=desc, branch=None, extra={"p4": change}) files = [] diff --git a/tests/test-convert-svn-branches.t b/tests/test-convert-svn-branches.t --- a/tests/test-convert-svn-branches.t +++ b/tests/test-convert-svn-branches.t @@ -99,7 +99,7 @@ Test hg failing to call itself Convert 'trunk' to branch other than 'default' $ cat > branchmap < None hgtrunk + > default hgtrunk > > > EOF @@ -121,9 +121,8 @@ Convert 'trunk' to branch other than 'de 0 last change to a $ cd C-hg - $ hg branches - hgtrunk 10:745f063703b4 - old 9:aa50d7b8d922 - old2 8:c85a22267b6e (inactive) + $ hg branches --template '{branch}\n' + hgtrunk + old + old2 $ cd .. - diff --git a/tests/test-doctest.py b/tests/test-doctest.py --- a/tests/test-doctest.py +++ b/tests/test-doctest.py @@ -31,6 +31,7 @@ testmod('mercurial.ui') testmod('mercurial.url') testmod('mercurial.util') testmod('mercurial.util', testtarget='platform') +testmod('hgext.convert.convcmd') testmod('hgext.convert.cvsps') testmod('hgext.convert.filemap') testmod('hgext.convert.p4')