diff -r 045f7de9e4d3 -r 5d063fed9e3d hgext/evolve.py --- a/hgext/evolve.py Wed Aug 20 21:14:49 2014 -0700 +++ b/hgext/evolve.py Wed Aug 20 20:49:48 2014 -0700 @@ -70,6 +70,9 @@ from mercurial.hgweb import hgweb_mod from mercurial import bundle2 +cmdtable = {} +command = cmdutil.command(cmdtable) + _pack = struct.pack if gboptsmap is not None: @@ -357,52 +360,96 @@ if not opts.get('user') and opts.get('current_user'): opts['user'] = ui.username() -@eh.wrapfunction(mercurial.obsolete, 'createmarkers') -def _createmarkers(orig, repo, relations, *args, **kwargs): - """register parent information at prune time""" - # every time this test is run, a kitten is slain. - # Change it as soon as possible - if '[,{metadata}]' in orig.__doc__: - relations = list(relations) - for idx, rel in enumerate(relations): - prec = rel[0] - sucs = rel[1] - if not sucs: - meta = {} - if 2 < len(rel): - meta.update(rel[2]) - for i, p in enumerate(prec.parents(), 1): - meta['p%i' % i] = p.hex() - relations[idx] = (prec, sucs, meta) - return orig(repo, relations, *args, **kwargs) - -def createmarkers(*args, **kwargs): - return obsolete.createmarkers(*args, **kwargs) - -class pruneobsstore(obsolete.obsstore): - - def __init__(self, *args, **kwargs): - self.prunedchildren = {} - return super(pruneobsstore, self).__init__(*args, **kwargs) - - def _load(self, markers): - markers = self._prunedetectingmarkers(markers) - return super(pruneobsstore, self)._load(markers) - - - def _prunedetectingmarkers(self, markers): - for m in markers: - if not m[1]: # no successors - meta = obsolete.decodemeta(m[3]) - if 'p1' in meta: - p1 = node.bin(meta['p1']) - self.prunedchildren.setdefault(p1, set()).add(m) - if 'p2' in meta: - p2 = node.bin(meta['p2']) - self.prunedchildren.setdefault(p2, set()).add(m) - yield m - -obsolete.obsstore = pruneobsstore + +createmarkers = obsolete.createmarkers +if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'): + + @eh.wrapfunction(mercurial.obsolete, 'createmarkers') + def _createmarkers(orig, repo, relations, *args, **kwargs): + """register parent information at prune time""" + # every time this test is run, a kitten is slain. + # Change it as soon as possible + if '[,{metadata}]' in orig.__doc__: + relations = list(relations) + for idx, rel in enumerate(relations): + prec = rel[0] + sucs = rel[1] + if not sucs: + meta = {} + if 2 < len(rel): + meta.update(rel[2]) + for i, p in enumerate(prec.parents(), 1): + meta['p%i' % i] = p.hex() + relations[idx] = (prec, sucs, meta) + return orig(repo, relations, *args, **kwargs) + + def createmarkers(*args, **kwargs): + return obsolete.createmarkers(*args, **kwargs) + + class pruneobsstore(obsolete.obsstore): + + def __init__(self, *args, **kwargs): + self.prunedchildren = {} + return super(pruneobsstore, self).__init__(*args, **kwargs) + + def _load(self, markers): + markers = self._prunedetectingmarkers(markers) + return super(pruneobsstore, self)._load(markers) + + + def _prunedetectingmarkers(self, markers): + for m in markers: + if not m[1]: # no successors + meta = obsolete.decodemeta(m[3]) + if 'p1' in meta: + p1 = node.bin(meta['p1']) + self.prunedchildren.setdefault(p1, set()).add(m) + if 'p2' in meta: + p2 = node.bin(meta['p2']) + self.prunedchildren.setdefault(p2, set()).add(m) + yield m + + obsolete.obsstore = pruneobsstore + + @eh.addattr(obsolete.obsstore, 'relevantmarkers') + def relevantmarkers(self, nodes): + """return a set of all obsolescence marker relevant to a set of node. + + "relevant" to a set of node mean: + + - marker that use this changeset as successors + - prune marker of direct children on this changeset. + - recursive application of the two rules on precursors of these markers + + It a set so you cannot rely on order""" + seennodes = set(nodes) + seenmarkers = set() + pendingnodes = set(nodes) + precursorsmarkers = self.precursors + prunedchildren = self.prunedchildren + while pendingnodes: + direct = set() + for current in pendingnodes: + direct.update(precursorsmarkers.get(current, ())) + direct.update(prunedchildren.get(current, ())) + direct -= seenmarkers + pendingnodes = set([m[0] for m in direct]) + seenmarkers |= direct + pendingnodes -= seennodes + seennodes |= pendingnodes + return seenmarkers + +@command('debugobsoleterelevant', + [], + 'REVSET') +def debugobsoleterelevant(ui, repo, *revsets): + """print allobsolescence marker relevant to a set of revision""" + nodes = [ctx.node() for ctx in repo.set('%lr', revsets)] + markers = repo.obsstore.relevantmarkers(nodes) + for rawmarker in sorted(markers): + marker = obsolete.marker(repo, rawmarker) + cmdutil.showmarker(ui, marker) + ##################################################################### ### Critical fix ### @@ -913,8 +960,6 @@ ### new command ############################# -cmdtable = {} -command = cmdutil.command(cmdtable) metadataopts = [ ('d', 'date', '', _('record the specified date in metadata'), _('DATE')), @@ -2285,44 +2330,6 @@ ui.progress(topic, *args, **kwargs) -@command('debugobsoleterelevant', - [], - 'REVSET') -def debugobsoleterelevant(ui, repo, *revsets): - """print allobsolescence marker relevant to a set of revision""" - nodes = [ctx.node() for ctx in repo.set('%lr', revsets)] - markers = repo.obsstore.relevantmarkers(nodes) - for rawmarker in sorted(markers): - marker = obsolete.marker(repo, rawmarker) - cmdutil.showmarker(ui, marker) - -@eh.addattr(obsolete.obsstore, 'relevantmarkers') -def relevantmarkers(self, nodes): - """return a set of all obsolescence marker relevant to a set of node. - - "relevant" to a set of node mean: - - - marker that use this changeset as successors - - prune marker of direct children on this changeset. - - recursive application of the two rules on precursors of these markers - - It a set so you cannot rely on order""" - seennodes = set(nodes) - seenmarkers = set() - pendingnodes = set(nodes) - precursorsmarkers = self.precursors - prunedchildren = self.prunedchildren - while pendingnodes: - direct = set() - for current in pendingnodes: - direct.update(precursorsmarkers.get(current, ())) - direct.update(prunedchildren.get(current, ())) - direct -= seenmarkers - pendingnodes = set([m[0] for m in direct]) - seenmarkers |= direct - pendingnodes -= seennodes - seennodes |= pendingnodes - return seenmarkers _pushkeyescape = getattr(obsolete, '_pushkeyescape', None)