679 histedit = extensions.find('histedit') |
679 histedit = extensions.find('histedit') |
680 if histedit: |
680 if histedit: |
681 extensions.wrapcommand(histedit.cmdtable, 'histedit', warnobserrors) |
681 extensions.wrapcommand(histedit.cmdtable, 'histedit', warnobserrors) |
682 except KeyError: |
682 except KeyError: |
683 pass # rebase not found |
683 pass # rebase not found |
684 |
|
685 |
684 |
686 ##################################################################### |
685 ##################################################################### |
687 ### Old Evolve extension content ### |
686 ### Old Evolve extension content ### |
688 ##################################################################### |
687 ##################################################################### |
689 |
688 |
2029 entry[1].append(('o', 'obsolete', [], |
2028 entry[1].append(('o', 'obsolete', [], |
2030 _("make graft obsoletes this revision"))) |
2029 _("make graft obsoletes this revision"))) |
2031 entry[1].append(('O', 'old-obsolete', False, |
2030 entry[1].append(('O', 'old-obsolete', False, |
2032 _("make graft obsoletes its source"))) |
2031 _("make graft obsoletes its source"))) |
2033 |
2032 |
|
2033 ##################################################################### |
|
2034 ### Obsolescence marker exchange experimenation ### |
|
2035 ##################################################################### |
|
2036 |
|
2037 @command('debugobsoleterelevant', |
|
2038 [], |
|
2039 'REVSET') |
|
2040 def debugobsoleterelevant(ui, repo, *revsets): |
|
2041 """print allobsolescence marker relevant to a set of revision""" |
|
2042 nodes = [ctx.node() for ctx in repo.set('%lr', revsets)] |
|
2043 markers = repo.obsstore.relevantmarkers(nodes) |
|
2044 for rawmarker in sorted(markers): |
|
2045 marker = obsolete.marker(repo, rawmarker) |
|
2046 cmdutil.showmarker(ui, marker) |
|
2047 |
|
2048 @eh.addattr(obsolete.obsstore, 'relevantmarkers') |
|
2049 def relevantmarkers(self, nodes): |
|
2050 """return a set of all obsolescence marker relevant to a set of node. |
|
2051 |
|
2052 "relevant" to a set of node mean: |
|
2053 |
|
2054 - marker that use this changeset as successors |
|
2055 - prune marker of direct children on this changeset. |
|
2056 - recursive application of the two rules on precursors of these markers |
|
2057 |
|
2058 It a set so you cannot rely on order""" |
|
2059 seennodes = set(nodes) |
|
2060 seenmarkers = set() |
|
2061 pendingnodes = set(nodes) |
|
2062 precursorsmarkers = self.precursors |
|
2063 prunedchildren = self.prunedchildren |
|
2064 while pendingnodes: |
|
2065 direct = set() |
|
2066 for current in pendingnodes: |
|
2067 direct.update(precursorsmarkers.get(current, ())) |
|
2068 direct.update(prunedchildren.get(current, ())) |
|
2069 direct -= seenmarkers |
|
2070 pendingnodes = set([m[0] for m in direct]) |
|
2071 seenmarkers |= direct |
|
2072 pendingnodes -= seennodes |
|
2073 seennodes |= pendingnodes |
|
2074 return seenmarkers |
|
2075 |
|
2076 |