# HG changeset patch # User Pierre-Yves David # Date 1435714332 25200 # Node ID c3f6e97c71b1bf469528ca43c2a716527e1da2d7 # Parent 5dfb18b98a5547ee1e4dced590d4e0151446e050# Parent fa1a27009c7653116d6dd1c25b1be4bf4e452e79 merge with stable diff --git a/hgext/evolve.py b/hgext/evolve.py --- a/hgext/evolve.py +++ b/hgext/evolve.py @@ -1178,10 +1178,10 @@ # cluster handling nodes = set(mark[1]) nodes.add(mark[0]) - _updateclustermap(nodes, mark, clustersmap) + _updateclustermap(nodes, mark, clustersmap) # same with parent data nodes.update(parents) - _updateclustermap(nodes, mark, pclustersmap) + _updateclustermap(nodes, mark, pclustersmap) # freezing the result for c in clustersmap.values(): @@ -1415,6 +1415,24 @@ rdependencies[succ].add(r) return dependencies, rdependencies +def _dedupedivergents(repo, revs): + """Dedupe the divergents revs in revs to get one from each group with the + lowest revision numbers + """ + repo = repo.unfiltered() + res = set() + # To not reevaluate divergents of the same group once one is encountered + discarded = set() + for rev in revs: + if rev in discarded: + continue + divergent = repo[rev] + base, others = divergentdata(divergent) + othersrevs = [o.rev() for o in others] + res.add(min([divergent.rev()] + othersrevs)) + discarded.update(othersrevs) + return res + def _selectrevs(repo, allopt, revopt, anyopt, targetcat): """select troubles in repo matching according to given options""" revs = set() @@ -1424,6 +1442,9 @@ revs = scmutil.revrange(repo, revopt) & revs elif not anyopt and targetcat == 'unstable': revs = set(_aspiringdescendant(repo, repo.revs('(.::) - obsolete()::'))) + if targetcat == 'divergent': + # Pick one divergent per group of divergents + revs = _dedupedivergents(repo, revs) elif anyopt: revs = repo.revs('first(%s())' % (targetcat)) elif targetcat == 'unstable': @@ -1849,12 +1870,6 @@ ui.write_err(msg) return 2 other = others[0] - if divergent.phase() <= phases.public: - msg = _("skipping %s: we can't resolve divergence from the public side\n") % divergent - ui.write_err(msg) - hint = _("(%s is public, try from %s)\n" % (divergent, other)) - ui.write_err(hint) - return 2 if len(other.parents()) > 1: msg = _("skipping %s: divergent changeset can't be a merge (yet)\n" % divergent) ui.write_err(msg) @@ -2253,7 +2268,7 @@ # create markers obsolete.createmarkers(repo, relations, metadata=metadata) - + # informs that changeset have been pruned ui.status(_('%i changesets pruned\n') % len(precs)) @@ -2609,9 +2624,8 @@ def fold(ui, repo, *revs, **opts): """fold multiple revisions into a single one - Folds a set of revisions with the parent of the working directory. - All revisions linearly between the given revisions and the parent - of the working directory will also be folded. + By default, folds all the revisions linearly between the given revisions + and the parent of the working directory. Use --exact for folding only the specified revisions while ignoring the parent of the working directory. In this case, the given revisions must @@ -2632,9 +2646,13 @@ See :hg:`help phases` for more about draft revisions and :hg:`help revsets` for more about the `draft()` keyword - - Fold revisions 3, 4, 5, and 6 with the working directory parent:: - - hg fold 3:6 + - Fold revisions between 3 and 6 with the working directory parent:: + + hg fold 3::6 + + - Fold revisions 3 and 4: + + hg fold "3 + 4" --exact - Only fold revisions linearly between foo and @:: @@ -3333,7 +3351,7 @@ if new_format == repo.obsstore._version: msg = _('New format is the same as the old format, not upgrading!') raise util.Abort(msg) - f = repo.sopener('obsstore', 'wb', atomictemp=True) + f = repo.svfs('obsstore', 'wb', atomictemp=True) origmarkers = repo.obsstore._all known = set() markers = [] diff --git a/hgext/inhibit.py b/hgext/inhibit.py --- a/hgext/inhibit.py +++ b/hgext/inhibit.py @@ -36,7 +36,7 @@ def _obsinhibit(self): # XXX we should make sure it is invalidated by transaction failure obsinhibit = set() - raw = self.sopener.tryread('obsinhibit') + raw = self.svfs.tryread('obsinhibit') for i in xrange(0, len(raw), 20): obsinhibit.add(raw[i:i+20]) return obsinhibit diff --git a/hgext/obsolete.py b/hgext/obsolete.py --- a/hgext/obsolete.py +++ b/hgext/obsolete.py @@ -48,7 +48,7 @@ else: data = repo.opener.tryread('obsolete-relations') if not data: - data = repo.sopener.tryread('obsoletemarkers') + data = repo.svfs.tryread('obsoletemarkers') if data: raise util.Abort('old format of obsolete marker detected!\n' 'run `hg debugconvertobsolete` once.') @@ -110,7 +110,7 @@ except IOError: pass ### second (json) format - data = repo.sopener.tryread('obsoletemarkers') + data = repo.svfs.tryread('obsoletemarkers') if data: some = True for oldmark in json.loads(data): diff --git a/hgext/pushexperiment.py b/hgext/pushexperiment.py --- a/hgext/pushexperiment.py +++ b/hgext/pushexperiment.py @@ -80,7 +80,7 @@ and remote.capable('_push_experiment_pushobsmarkers_0')): # push marker early to limit damage of pushing too early. try: - obsfp = repo.sopener('obsstore') + obsfp = repo.svfs('obsstore') except IOError as e: if e.errno != errno.ENOENT: raise diff --git a/tests/test-divergent.t b/tests/test-divergent.t new file mode 100644 --- /dev/null +++ b/tests/test-divergent.t @@ -0,0 +1,70 @@ +Tests the resolution of divergence + + $ cat >> $HGRCPATH < [defaults] + > amend=-d "0 0" + > fold=-d "0 0" + > [web] + > push_ssl = false + > allow_push = * + > [phases] + > publish = False + > [diff] + > git = 1 + > unified = 0 + > [ui] + > logtemplate = {rev}:{node|short}@{branch}({phase}) {desc|firstline} [{troubles}]\n + > [extensions] + > hgext.graphlog= + > EOF + $ echo "evolve=$(echo $(dirname $TESTDIR))/hgext/evolve.py" >> $HGRCPATH + $ mkcommit() { + > echo "$1" > "$1" + > hg add "$1" + > hg ci -m "add $1" + > } + + $ mkcommits() { + > for i in $@; do mkcommit $i ; done + > } + +Basic test of divergence: two divergent changesets with the same parents +With --all --any we dedupe the divergent and solve the divergence once + + $ hg init test1 + $ cd test1 + $ mkcommits _a _b + $ hg up "desc(_a)" + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit bdivergent1 + created new head + $ hg up "desc(_a)" + 0 files updated, 0 files merged, 1 files removed, 0 files unresolved + $ mkcommit bdivergent2 + created new head + $ hg prune -s "desc(bdivergent1)" "desc(_b)" + 1 changesets pruned + $ hg prune -s "desc(bdivergent2)" "desc(_b)" --hidden + 1 changesets pruned + 2 new divergent changesets + $ hg log -G + @ 3:e708fd28d5cf@default(draft) add bdivergent2 [divergent] + | + | o 2:c2f698071cba@default(draft) add bdivergent1 [divergent] + |/ + o 0:135f39f4bd78@default(draft) add _a [] + + $ hg evolve --all --any --divergent + merge:[2] add bdivergent1 + with: [3] add bdivergent2 + base: [1] add _b + updating to "local" conflict + 1 files updated, 0 files merged, 1 files removed, 0 files unresolved + 1 files updated, 0 files merged, 0 files removed, 0 files unresolved + working directory is now at c26f1d3baed2 + $ hg log -G + @ 5:c26f1d3baed2@default(draft) add bdivergent1 [] + | + o 0:135f39f4bd78@default(draft) add _a [] + + $ cd .. diff --git a/tests/test-tutorial.t b/tests/test-tutorial.t --- a/tests/test-tutorial.t +++ b/tests/test-tutorial.t @@ -480,9 +480,8 @@ fold multiple revisions into a single one - Folds a set of revisions with the parent of the working directory. All - revisions linearly between the given revisions and the parent of the - working directory will also be folded. + By default, folds all the revisions linearly between the given revisions + and the parent of the working directory. Use --exact for folding only the specified revisions while ignoring the parent of the working directory. In this case, the given revisions must