hgext3rd/evolve/obshistory.py
changeset 5251 353e546ab324
parent 5250 265f30e3c50d
child 5252 1fda186ae6b7
equal deleted inserted replaced
5250:265f30e3c50d 5251:353e546ab324
    50     b'obslog|olog',
    50     b'obslog|olog',
    51     [(b'G', b'graph', True, _(b"show the revision DAG")),
    51     [(b'G', b'graph', True, _(b"show the revision DAG")),
    52      (b'r', b'rev', [], _(b'show the specified revision or revset'), _(b'REV')),
    52      (b'r', b'rev', [], _(b'show the specified revision or revset'), _(b'REV')),
    53      (b'a', b'all', False, _(b'show all related changesets, not only precursors')),
    53      (b'a', b'all', False, _(b'show all related changesets, not only precursors')),
    54      (b'p', b'patch', False, _(b'show the patch between two obs versions')),
    54      (b'p', b'patch', False, _(b'show the patch between two obs versions')),
       
    55      (b'', b'successors', True, _(b'output successors of each revision')),
       
    56      (b'', b'precursors', False, _(b'output precursors of each revision')),
    55      (b'f', b'filternonlocal', False, _(b'filter out non local commits')),
    57      (b'f', b'filternonlocal', False, _(b'filter out non local commits')),
    56      ] + commands.formatteropts,
    58      ] + commands.formatteropts,
    57     _(b'hg olog [OPTION]... [[-r] REV]...'),
    59     _(b'hg olog [OPTION]... [[-r] REV]...'),
    58     **compat.helpcategorykwargs('CATEGORY_CHANGE_NAVIGATION'))
    60     **compat.helpcategorykwargs('CATEGORY_CHANGE_NAVIGATION'))
    59 def cmdobshistory(ui, repo, *revs, **opts):
    61 def cmdobshistory(ui, repo, *revs, **opts):
   151 
   153 
   152         # Compat 4.6
   154         # Compat 4.6
   153         if not util.safehasattr(self, "_includediff"):
   155         if not util.safehasattr(self, "_includediff"):
   154             self._includediff = diffopts and diffopts.get(b'patch')
   156             self._includediff = diffopts and diffopts.get(b'patch')
   155 
   157 
       
   158         self._includesucc = not diffopts or diffopts.get(b'successors', True)
       
   159         self._includeprec = diffopts and diffopts.get(b'precursors')
   156         self.template = diffopts and diffopts.get(b'template')
   160         self.template = diffopts and diffopts.get(b'template')
   157         self.filter = diffopts and diffopts.get(b'filternonlocal')
   161         self.filter = diffopts and diffopts.get(b'filternonlocal')
   158 
   162 
   159     def show(self, ctx, copies=None, matchfn=None, **props):
   163     def show(self, ctx, copies=None, matchfn=None, **props):
   160         if self.buffered:
   164         if self.buffered:
   165             _props = {b"template": self.template}
   169             _props = {b"template": self.template}
   166             fm = self.ui.formatter(b'debugobshistory', _props)
   170             fm = self.ui.formatter(b'debugobshistory', _props)
   167 
   171 
   168             _debugobshistorydisplaynode(fm, self.repo, changenode)
   172             _debugobshistorydisplaynode(fm, self.repo, changenode)
   169             _debugobshistorydisplaymarkers(self.ui, self.repo, fm, ctx,
   173             _debugobshistorydisplaymarkers(self.ui, self.repo, fm, ctx,
   170                                            self.filter, self._includediff)
   174                                            self.filter, self._includesucc,
       
   175                                            self._includeprec, self._includediff)
   171 
   176 
   172             fm.plain(b'\n')
   177             fm.plain(b'\n')
   173             fm.end()
   178             fm.end()
   174 
   179 
   175             self.hunk[changenode] = self.ui.popbuffer()
   180             self.hunk[changenode] = self.ui.popbuffer()
   471     fm.plain(nodemod.short(nodewithoutctx),
   476     fm.plain(nodemod.short(nodewithoutctx),
   472              label=b"evolve.node evolve.missing_change_ctx")
   477              label=b"evolve.node evolve.missing_change_ctx")
   473     fm.plain(b'\n')
   478     fm.plain(b'\n')
   474 
   479 
   475 def _debugobshistorydisplaymarkers(ui, repo, fm, ctx, filter_,
   480 def _debugobshistorydisplaymarkers(ui, repo, fm, ctx, filter_,
       
   481                                    includesuccessors=True,
       
   482                                    includeprecursors=False,
   476                                    includediff=False):
   483                                    includediff=False):
   477     changenode = ctx.node()
   484     changenode = ctx.node()
   478     markerfm = fm.nested(b"markers")
   485     markerfm = fm.nested(b"markers")
   479 
   486 
   480     # Succs markers
   487     # Succs markers
   481     if filter_ is False:
   488     if filter_ is False:
   482         succs = repo.obsstore.successors.get(changenode, ())
   489         succs = precs = set()
   483         succs = sorted(succs)
   490         if includesuccessors:
   484 
   491             succs = repo.obsstore.successors.get(changenode, set())
   485         for successor in succs:
   492         if includeprecursors:
   486             _debugobshistorydisplaymarker(ui, markerfm, successor, changenode,
   493             precs = repo.obsstore.predecessors.get(changenode, set())
       
   494         markers = sorted(set.union(succs, precs))
       
   495 
       
   496         for marker in markers:
       
   497             _debugobshistorydisplaymarker(ui, markerfm, marker, changenode,
   487                                           repo, includediff)
   498                                           repo, includediff)
   488 
   499 
   489     else:
   500     else:
   490         r = obsutil.successorsandmarkers(repo, ctx) or []
   501         r = obsutil.successorsandmarkers(repo, ctx) or []
   491 
   502 
   500 
   511 
   501     markerfm.end()
   512     markerfm.end()
   502 
   513 
   503 def _debugobshistorydisplaymarker(ui, fm, marker, node, repo,
   514 def _debugobshistorydisplaymarker(ui, fm, marker, node, repo,
   504                                   includediff=False):
   515                                   includediff=False):
       
   516     precnode = marker[0]
   505     succnodes = marker[1]
   517     succnodes = marker[1]
   506     date = marker[4]
   518     date = marker[4]
   507     metadata = dict(marker[3])
   519     metadata = dict(marker[3])
   508 
   520 
   509     fm.startitem()
   521     fm.startitem()
       
   522 
       
   523     if precnode == node:
       
   524         # This marker links to a successor of node.
       
   525         nodetype = b'precursor'
       
   526     else:
       
   527         assert node in succnodes
       
   528         # This marker links from a precursor of node.
       
   529         nodetype = b'successor'
       
   530 
       
   531     fm.data(nodetype=nodetype)
   510 
   532 
   511     # Detect pruned revisions
   533     # Detect pruned revisions
   512     if len(succnodes) == 0:
   534     if len(succnodes) == 0:
   513         verb = b'pruned'
   535         verb = b'pruned'
   514     else:
   536     else:
   523 
   545 
   524     if len(succnodes) > 0:
   546     if len(succnodes) > 0:
   525         hexnodes = (nodemod.hex(succnode) for succnode in sorted(succnodes))
   547         hexnodes = (nodemod.hex(succnode) for succnode in sorted(succnodes))
   526         nodes = fm.formatlist(hexnodes, b'succnode')
   548         nodes = fm.formatlist(hexnodes, b'succnode')
   527         fm.write(b'succnodes', b'%s', nodes)
   549         fm.write(b'succnodes', b'%s', nodes)
       
   550     fm.data(precnode=nodemod.hex(precnode))
   528 
   551 
   529     operation = metadata.get(b'operation')
   552     operation = metadata.get(b'operation')
   530     if operation:
   553     if operation:
   531         fm.data(operation=operation)
   554         fm.data(operation=operation)
   532 
   555