obshistory: import 'node' as 'nodemod'
This simplify the next changeset.
# Code dedicated to display and exploration of the obsolescence history
#
# This module content aims at being upstreamed enventually.
#
# Copyright 2017 Octobus SAS <contact@octobus.net>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from mercurial import (
node as nodemod,
)
def _debugobshistorysingle(fm, repo, revs):
""" Display the obsolescence history for a single revision
"""
precursors = repo.obsstore.precursors
successors = repo.obsstore.successors
nodec = repo.changelog.node
nodes = [nodec(r) for r in revs]
seen = set(nodes)
while nodes:
ctxnode = nodes.pop()
_debugobshistorydisplaynode(fm, repo, ctxnode)
succs = successors.get(ctxnode, ())
markerfm = fm.nested("debugobshistory.markers")
for successor in sorted(succs):
_debugobshistorydisplaymarker(markerfm, repo, successor)
markerfm.end()
precs = precursors.get(ctxnode, ())
for p in sorted(precs):
# Only show nodes once
if p[0] not in seen:
seen.add(p[0])
nodes.append(p[0])
def _debugobshistorydisplaynode(fm, repo, node):
if node in repo.unfiltered():
_debugobshistorydisplayctx(fm, repo.unfiltered()[node])
else:
_debugobshistorydisplaymissingctx(fm, node)
def _debugobshistorydisplayctx(fm, ctx):
shortdescription = ctx.description().splitlines()[0]
fm.startitem()
fm.write('debugobshistory.node', '%s', str(ctx),
label="evolve.node")
fm.plain(' ')
fm.write('debugobshistory.rev', '(%d)', int(ctx),
label="evolve.rev")
fm.plain(' ')
fm.write('debugobshistory.shortdescription', '%s', shortdescription,
label="evolve.short_description")
fm.plain('\n')
def _debugobshistorydisplaymissingctx(fm, nodewithoutctx):
hexnode = nodemod.short(nodewithoutctx)
fm.startitem()
fm.write('debugobshistory.node', '%s', hexnode,
label="evolve.node evolve.missing_change_ctx")
fm.plain('\n')
def _debugobshistorydisplaymarker(fm, repo, marker):
succnodes = marker[1]
date = marker[4]
metadata = dict(marker[3])
fm.startitem()
fm.plain(' ')
# Detect pruned revisions
if len(succnodes) == 0:
verb = 'pruned'
else:
verb = 'rewritten'
fm.write('debugobshistory.verb', '%s', verb,
label="evolve.verb")
fm.plain(' by ')
fm.write('debugobshistory.marker_user', '%s', metadata['user'],
label="evolve.user")
fm.plain(' ')
fm.write('debugobshistory.marker_date', '(%s)', fm.formatdate(date),
label="evolve.date")
if len(succnodes) > 0:
fm.plain(' as ')
shortsnodes = (nodemod.short(succnode) for succnode in sorted(succnodes))
nodes = fm.formatlist(shortsnodes, 'debugobshistory.succnodes', sep=', ')
fm.write('debugobshistory.succnodes', '%s', nodes,
label="evolve.node")
fm.plain("\n")