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 |