--- a/hgext3rd/evolve/__init__.py Fri Jan 19 15:55:38 2018 +0530
+++ b/hgext3rd/evolve/__init__.py Fri Jan 19 16:00:21 2018 +0530
@@ -947,107 +947,6 @@
_deprecatealias('gup', 'next')
_deprecatealias('gdown', 'previous')
-def _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat):
- """Used by the evolve function to display an error message when
- no troubles can be resolved"""
- troublecategories = ['phasedivergent', 'contentdivergent', 'orphan']
- unselectedcategories = [c for c in troublecategories if c != targetcat]
- msg = None
- hint = None
-
- troubled = {
- "orphan": repo.revs("orphan()"),
- "contentdivergent": repo.revs("contentdivergent()"),
- "phasedivergent": repo.revs("phasedivergent()"),
- "all": repo.revs("troubled()"),
- }
-
- hintmap = {
- 'phasedivergent': _("do you want to use --phase-divergent"),
- 'phasedivergent+contentdivergent': _("do you want to use "
- "--phase-divergent or"
- " --content-divergent"),
- 'phasedivergent+orphan': _("do you want to use --phase-divergent"
- " or --orphan"),
- 'contentdivergent': _("do you want to use --content-divergent"),
- 'contentdivergent+orphan': _("do you want to use --content-divergent"
- " or --orphan"),
- 'orphan': _("do you want to use --orphan"),
- 'any+phasedivergent': _("do you want to use --any (or --rev) and"
- " --phase-divergent"),
- 'any+phasedivergent+contentdivergent': _("do you want to use --any"
- " (or --rev) and"
- " --phase-divergent or"
- " --content-divergent"),
- 'any+phasedivergent+orphan': _("do you want to use --any (or --rev)"
- " and --phase-divergent or --orphan"),
- 'any+contentdivergent': _("do you want to use --any (or --rev) and"
- " --content-divergent"),
- 'any+contentdivergent+orphan': _("do you want to use --any (or --rev)"
- " and --content-divergent or "
- "--orphan"),
- 'any+orphan': _("do you want to use --any (or --rev)"
- "and --orphan"),
- }
-
- if revopt:
- revs = scmutil.revrange(repo, revopt)
- if not revs:
- msg = _("set of specified revisions is empty")
- else:
- msg = _("no %s changesets in specified revisions") % targetcat
- othertroubles = []
- for cat in unselectedcategories:
- if revs & troubled[cat]:
- othertroubles.append(cat)
- if othertroubles:
- hint = hintmap['+'.join(othertroubles)]
-
- elif anyopt:
- msg = _("no %s changesets to evolve") % targetcat
- othertroubles = []
- for cat in unselectedcategories:
- if troubled[cat]:
- othertroubles.append(cat)
- if othertroubles:
- hint = hintmap['+'.join(othertroubles)]
-
- else:
- # evolve without any option = relative to the current wdir
- if targetcat == 'orphan':
- msg = _("nothing to evolve on current working copy parent")
- else:
- msg = _("current working copy parent is not %s") % targetcat
-
- p1 = repo['.'].rev()
- othertroubles = []
- for cat in unselectedcategories:
- if p1 in troubled[cat]:
- othertroubles.append(cat)
- if othertroubles:
- hint = hintmap['+'.join(othertroubles)]
- else:
- length = len(troubled[targetcat])
- if length:
- hint = _("%d other %s in the repository, do you want --any "
- "or --rev") % (length, targetcat)
- else:
- othertroubles = []
- for cat in unselectedcategories:
- if troubled[cat]:
- othertroubles.append(cat)
- if othertroubles:
- hint = hintmap['any+' + ('+'.join(othertroubles))]
- else:
- msg = _("no troubled changesets")
-
- assert msg is not None
- ui.write_err("%s\n" % msg)
- if hint:
- ui.write_err("(%s)\n" % hint)
- return 2
- else:
- return 1
def _cleanup(ui, repo, startnode, showprogress):
if showprogress:
@@ -1148,120 +1047,6 @@
ordering.extend(sorted(dependencies))
return ordering
-def divergentsets(repo, ctx):
- """Compute sets of commits divergent with a given one"""
- cache = {}
- base = {}
- for n in compat.allprecursors(repo.obsstore, [ctx.node()]):
- if n == ctx.node():
- # a node can't be a base for divergence with itself
- continue
- nsuccsets = compat.successorssets(repo, n, cache)
- for nsuccset in nsuccsets:
- if ctx.node() in nsuccset:
- # we are only interested in *other* successor sets
- continue
- if tuple(nsuccset) in base:
- # we already know the latest base for this divergency
- continue
- base[tuple(nsuccset)] = n
- divergence = []
- for divset, b in base.iteritems():
- divergence.append({
- 'divergentnodes': divset,
- 'commonprecursor': b
- })
-
- return divergence
-
-def _preparelistctxs(items, condition):
- return [item.hex() for item in items if condition(item)]
-
-def _formatctx(fm, ctx):
- fm.data(node=ctx.hex())
- fm.data(desc=ctx.description())
- fm.data(date=ctx.date())
- fm.data(user=ctx.user())
-
-def listtroubles(ui, repo, troublecategories, **opts):
- """Print all the troubles for the repo (or given revset)"""
- troublecategories = troublecategories or ['contentdivergent', 'orphan', 'phasedivergent']
- showunstable = 'orphan' in troublecategories
- showbumped = 'phasedivergent' in troublecategories
- showdivergent = 'contentdivergent' in troublecategories
-
- revs = repo.revs('+'.join("%s()" % t for t in troublecategories))
- if opts.get('rev'):
- revs = scmutil.revrange(repo, opts.get('rev'))
-
- fm = ui.formatter('evolvelist', opts)
- for rev in revs:
- ctx = repo[rev]
- unpars = _preparelistctxs(ctx.parents(), lambda p: p.orphan())
- obspars = _preparelistctxs(ctx.parents(), lambda p: p.obsolete())
- imprecs = _preparelistctxs(repo.set("allprecursors(%n)", ctx.node()),
- lambda p: not p.mutable())
- dsets = divergentsets(repo, ctx)
-
- fm.startitem()
- # plain formatter section
- hashlen, desclen = 12, 60
- desc = ctx.description()
- if desc:
- desc = desc.splitlines()[0]
- desc = (desc[:desclen] + '...') if len(desc) > desclen else desc
- fm.plain('%s: ' % ctx.hex()[:hashlen])
- fm.plain('%s\n' % desc)
- fm.data(node=ctx.hex(), rev=ctx.rev(), desc=desc, phase=ctx.phasestr())
-
- for unpar in unpars if showunstable else []:
- fm.plain(' %s: %s (%s parent)\n' % (TROUBLES['ORPHAN'],
- unpar[:hashlen],
- TROUBLES['ORPHAN']))
- for obspar in obspars if showunstable else []:
- fm.plain(' %s: %s (obsolete parent)\n' % (TROUBLES['ORPHAN'],
- obspar[:hashlen]))
- for imprec in imprecs if showbumped else []:
- fm.plain(' %s: %s (immutable precursor)\n' %
- (TROUBLES['PHASEDIVERGENT'], imprec[:hashlen]))
-
- if dsets and showdivergent:
- for dset in dsets:
- fm.plain(' %s: ' % TROUBLES['CONTENTDIVERGENT'])
- first = True
- for n in dset['divergentnodes']:
- t = "%s (%s)" if first else " %s (%s)"
- first = False
- fm.plain(t % (node.hex(n)[:hashlen], repo[n].phasestr()))
- comprec = node.hex(dset['commonprecursor'])[:hashlen]
- fm.plain(" (precursor %s)\n" % comprec)
- fm.plain("\n")
-
- # templater-friendly section
- _formatctx(fm, ctx)
- troubles = []
- for unpar in unpars:
- troubles.append({'troubletype': TROUBLES['ORPHAN'],
- 'sourcenode': unpar, 'sourcetype': 'orphanparent'})
- for obspar in obspars:
- troubles.append({'troubletype': TROUBLES['ORPHAN'],
- 'sourcenode': obspar,
- 'sourcetype': 'obsoleteparent'})
- for imprec in imprecs:
- troubles.append({'troubletype': TROUBLES['PHASEDIVERGENT'],
- 'sourcenode': imprec,
- 'sourcetype': 'immutableprecursor'})
- for dset in dsets:
- divnodes = [{'node': node.hex(n),
- 'phase': repo[n].phasestr(),
- } for n in dset['divergentnodes']]
- troubles.append({'troubletype': TROUBLES['CONTENTDIVERGENT'],
- 'commonprecursor': node.hex(dset['commonprecursor']),
- 'divergentnodes': divnodes})
- fm.data(troubles=troubles)
-
- fm.end()
-
@eh.command(
'^evolve|stabilize|solve',
[('n', 'dry-run', False,
@@ -1371,7 +1156,7 @@
if opts[t]]
if opts['list']:
compat.startpager(ui, 'evolve')
- listtroubles(ui, repo, specifiedcategories, **opts)
+ evolvecmd.listtroubles(ui, repo, specifiedcategories, **opts)
return
targetcat = 'orphan'
@@ -1453,7 +1238,7 @@
revs = evolvecmd._selectrevs(repo, allopt, revopt, anyopt, targetcat)
if not revs:
- return _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat)
+ return evolvecmd._handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat)
# For the progress bar to show
count = len(revs)
--- a/hgext3rd/evolve/evolvecmd.py Fri Jan 19 15:55:38 2018 +0530
+++ b/hgext3rd/evolve/evolvecmd.py Fri Jan 19 16:00:21 2018 +0530
@@ -652,3 +652,219 @@
for n in ss:
dest.add(torev(n))
return dest
+
+def _handlenotrouble(ui, repo, allopt, revopt, anyopt, targetcat):
+ """Used by the evolve function to display an error message when
+ no troubles can be resolved"""
+ troublecategories = ['phasedivergent', 'contentdivergent', 'orphan']
+ unselectedcategories = [c for c in troublecategories if c != targetcat]
+ msg = None
+ hint = None
+
+ troubled = {
+ "orphan": repo.revs("orphan()"),
+ "contentdivergent": repo.revs("contentdivergent()"),
+ "phasedivergent": repo.revs("phasedivergent()"),
+ "all": repo.revs("troubled()"),
+ }
+
+ hintmap = {
+ 'phasedivergent': _("do you want to use --phase-divergent"),
+ 'phasedivergent+contentdivergent': _("do you want to use "
+ "--phase-divergent or"
+ " --content-divergent"),
+ 'phasedivergent+orphan': _("do you want to use --phase-divergent"
+ " or --orphan"),
+ 'contentdivergent': _("do you want to use --content-divergent"),
+ 'contentdivergent+orphan': _("do you want to use --content-divergent"
+ " or --orphan"),
+ 'orphan': _("do you want to use --orphan"),
+ 'any+phasedivergent': _("do you want to use --any (or --rev) and"
+ " --phase-divergent"),
+ 'any+phasedivergent+contentdivergent': _("do you want to use --any"
+ " (or --rev) and"
+ " --phase-divergent or"
+ " --content-divergent"),
+ 'any+phasedivergent+orphan': _("do you want to use --any (or --rev)"
+ " and --phase-divergent or --orphan"),
+ 'any+contentdivergent': _("do you want to use --any (or --rev) and"
+ " --content-divergent"),
+ 'any+contentdivergent+orphan': _("do you want to use --any (or --rev)"
+ " and --content-divergent or "
+ "--orphan"),
+ 'any+orphan': _("do you want to use --any (or --rev)"
+ "and --orphan"),
+ }
+
+ if revopt:
+ revs = scmutil.revrange(repo, revopt)
+ if not revs:
+ msg = _("set of specified revisions is empty")
+ else:
+ msg = _("no %s changesets in specified revisions") % targetcat
+ othertroubles = []
+ for cat in unselectedcategories:
+ if revs & troubled[cat]:
+ othertroubles.append(cat)
+ if othertroubles:
+ hint = hintmap['+'.join(othertroubles)]
+
+ elif anyopt:
+ msg = _("no %s changesets to evolve") % targetcat
+ othertroubles = []
+ for cat in unselectedcategories:
+ if troubled[cat]:
+ othertroubles.append(cat)
+ if othertroubles:
+ hint = hintmap['+'.join(othertroubles)]
+
+ else:
+ # evolve without any option = relative to the current wdir
+ if targetcat == 'orphan':
+ msg = _("nothing to evolve on current working copy parent")
+ else:
+ msg = _("current working copy parent is not %s") % targetcat
+
+ p1 = repo['.'].rev()
+ othertroubles = []
+ for cat in unselectedcategories:
+ if p1 in troubled[cat]:
+ othertroubles.append(cat)
+ if othertroubles:
+ hint = hintmap['+'.join(othertroubles)]
+ else:
+ length = len(troubled[targetcat])
+ if length:
+ hint = _("%d other %s in the repository, do you want --any "
+ "or --rev") % (length, targetcat)
+ else:
+ othertroubles = []
+ for cat in unselectedcategories:
+ if troubled[cat]:
+ othertroubles.append(cat)
+ if othertroubles:
+ hint = hintmap['any+' + ('+'.join(othertroubles))]
+ else:
+ msg = _("no troubled changesets")
+
+ assert msg is not None
+ ui.write_err("%s\n" % msg)
+ if hint:
+ ui.write_err("(%s)\n" % hint)
+ return 2
+ else:
+ return 1
+
+def _preparelistctxs(items, condition):
+ return [item.hex() for item in items if condition(item)]
+
+def _formatctx(fm, ctx):
+ fm.data(node=ctx.hex())
+ fm.data(desc=ctx.description())
+ fm.data(date=ctx.date())
+ fm.data(user=ctx.user())
+
+def listtroubles(ui, repo, troublecategories, **opts):
+ """Print all the troubles for the repo (or given revset)"""
+ troublecategories = troublecategories or ['contentdivergent', 'orphan', 'phasedivergent']
+ showunstable = 'orphan' in troublecategories
+ showbumped = 'phasedivergent' in troublecategories
+ showdivergent = 'contentdivergent' in troublecategories
+
+ revs = repo.revs('+'.join("%s()" % t for t in troublecategories))
+ if opts.get('rev'):
+ revs = scmutil.revrange(repo, opts.get('rev'))
+
+ fm = ui.formatter('evolvelist', opts)
+ for rev in revs:
+ ctx = repo[rev]
+ unpars = _preparelistctxs(ctx.parents(), lambda p: p.orphan())
+ obspars = _preparelistctxs(ctx.parents(), lambda p: p.obsolete())
+ imprecs = _preparelistctxs(repo.set("allprecursors(%n)", ctx.node()),
+ lambda p: not p.mutable())
+ dsets = divergentsets(repo, ctx)
+
+ fm.startitem()
+ # plain formatter section
+ hashlen, desclen = 12, 60
+ desc = ctx.description()
+ if desc:
+ desc = desc.splitlines()[0]
+ desc = (desc[:desclen] + '...') if len(desc) > desclen else desc
+ fm.plain('%s: ' % ctx.hex()[:hashlen])
+ fm.plain('%s\n' % desc)
+ fm.data(node=ctx.hex(), rev=ctx.rev(), desc=desc, phase=ctx.phasestr())
+
+ for unpar in unpars if showunstable else []:
+ fm.plain(' %s: %s (%s parent)\n' % (TROUBLES['ORPHAN'],
+ unpar[:hashlen],
+ TROUBLES['ORPHAN']))
+ for obspar in obspars if showunstable else []:
+ fm.plain(' %s: %s (obsolete parent)\n' % (TROUBLES['ORPHAN'],
+ obspar[:hashlen]))
+ for imprec in imprecs if showbumped else []:
+ fm.plain(' %s: %s (immutable precursor)\n' %
+ (TROUBLES['PHASEDIVERGENT'], imprec[:hashlen]))
+
+ if dsets and showdivergent:
+ for dset in dsets:
+ fm.plain(' %s: ' % TROUBLES['CONTENTDIVERGENT'])
+ first = True
+ for n in dset['divergentnodes']:
+ t = "%s (%s)" if first else " %s (%s)"
+ first = False
+ fm.plain(t % (node.hex(n)[:hashlen], repo[n].phasestr()))
+ comprec = node.hex(dset['commonprecursor'])[:hashlen]
+ fm.plain(" (precursor %s)\n" % comprec)
+ fm.plain("\n")
+
+ # templater-friendly section
+ _formatctx(fm, ctx)
+ troubles = []
+ for unpar in unpars:
+ troubles.append({'troubletype': TROUBLES['ORPHAN'],
+ 'sourcenode': unpar, 'sourcetype': 'orphanparent'})
+ for obspar in obspars:
+ troubles.append({'troubletype': TROUBLES['ORPHAN'],
+ 'sourcenode': obspar,
+ 'sourcetype': 'obsoleteparent'})
+ for imprec in imprecs:
+ troubles.append({'troubletype': TROUBLES['PHASEDIVERGENT'],
+ 'sourcenode': imprec,
+ 'sourcetype': 'immutableprecursor'})
+ for dset in dsets:
+ divnodes = [{'node': node.hex(n),
+ 'phase': repo[n].phasestr(),
+ } for n in dset['divergentnodes']]
+ troubles.append({'troubletype': TROUBLES['CONTENTDIVERGENT'],
+ 'commonprecursor': node.hex(dset['commonprecursor']),
+ 'divergentnodes': divnodes})
+ fm.data(troubles=troubles)
+
+ fm.end()
+
+def divergentsets(repo, ctx):
+ """Compute sets of commits divergent with a given one"""
+ cache = {}
+ base = {}
+ for n in compat.allprecursors(repo.obsstore, [ctx.node()]):
+ if n == ctx.node():
+ # a node can't be a base for divergence with itself
+ continue
+ nsuccsets = compat.successorssets(repo, n, cache)
+ for nsuccset in nsuccsets:
+ if ctx.node() in nsuccset:
+ # we are only interested in *other* successor sets
+ continue
+ if tuple(nsuccset) in base:
+ # we already know the latest base for this divergency
+ continue
+ base[tuple(nsuccset)] = n
+ divergence = []
+ for divset, b in base.iteritems():
+ divergence.append({
+ 'divergentnodes': divset,
+ 'commonprecursor': b
+ })
+
+ return divergence