hgext3rd/evolve/obshistory.py
author Anton Shestakov <av6@dwimlabs.net>
Sat, 11 Jan 2020 20:06:26 +0700
changeset 5067 e07f6af3cfec
parent 5066 8dc865544aa1
child 5068 715c85f250e0
permissions -rw-r--r--
obshistory: make a {flag value: description} dict for _markerseffects()
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     1
# Code dedicated to display and exploration of the obsolescence history
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     2
#
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     3
# This module content aims at being upstreamed enventually.
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     4
#
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     5
# Copyright 2017 Octobus SAS <contact@octobus.net>
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     6
#
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     7
# This software may be used and distributed according to the terms of the
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     8
# GNU General Public License version 2 or any later version.
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
     9
2522
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
    10
import re
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
    11
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    12
from mercurial import (
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    13
    commands,
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    14
    error,
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
    15
    graphmod,
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
    16
    patch,
3883
ed460e7ee8aa compat: drop compatibility hack for mercurial <4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3838
diff changeset
    17
    obsutil,
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    18
    node as nodemod,
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
    19
    pycompat,
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    20
    scmutil,
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3080
diff changeset
    21
    util,
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    22
)
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    23
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    24
from mercurial.i18n import _
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    25
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    26
from . import (
2693
f4b0351fa813 evolve: adapt to function migrate to obsutil
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2678
diff changeset
    27
    compat,
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    28
    exthelper,
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    29
)
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    30
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    31
eh = exthelper.exthelper()
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    32
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    33
# Config
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
    34
efd = {b'default': True} # pass a default value unless the config is registered
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    35
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    36
@eh.extsetup
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    37
def enableeffectflags(ui):
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    38
    item = (getattr(ui, '_knownconfig', {})
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
    39
            .get(b'experimental', {})
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
    40
            .get(b'evolution.effect-flags'))
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    41
    if item is not None:
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    42
        item.default = True
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    43
        efd.clear()
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    44
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    45
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    46
    b'obslog|olog',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    47
    [(b'G', b'graph', True, _(b"show the revision DAG")),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    48
     (b'r', b'rev', [], _(b'show the specified revision or revset'), _(b'REV')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    49
     (b'a', b'all', False, _(b'show all related changesets, not only precursors')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    50
     (b'p', b'patch', False, _(b'show the patch between two obs versions')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    51
     (b'f', b'filternonlocal', False, _(b'filter out non local commits')),
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    52
     ] + commands.formatteropts,
4921
a7c01a2a3974 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4918 4915
diff changeset
    53
    _(b'hg olog [OPTION]... [[-r] REV]...'),
4894
f9743b13de6d help: categorizing evolve and topic commands
Rodrigo Damazio <rdamazio@google.com>
parents: 4827
diff changeset
    54
    **compat.helpcategorykwargs('CATEGORY_CHANGE_NAVIGATION'))
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    55
def cmdobshistory(ui, repo, *revs, **opts):
3454
56277182c029 obslog: drop period from summary line in accordance with convention
Martin von Zweigbergk <martinvonz@google.com>
parents: 3407
diff changeset
    56
    """show the obsolescence history of the specified revisions
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    57
2418
4993d1812311 olog: document the default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2416
diff changeset
    58
    If no revision range is specified, we display the log for the current
4993d1812311 olog: document the default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2416
diff changeset
    59
    working copy parent.
4993d1812311 olog: document the default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2416
diff changeset
    60
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    61
    By default this command prints the selected revisions and all its
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    62
    precursors. For precursors pointing on existing revisions in the repository,
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    63
    it will display revisions node id, revision number and the first line of the
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    64
    description. For precursors pointing on non existing revisions in the
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    65
    repository (that can happen when exchanging obsolescence-markers), display
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    66
    only the node id.
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    67
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    68
    In both case, for each node, its obsolescence marker will be displayed with
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    69
    the obsolescence operation (rewritten or pruned) in addition of the user and
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    70
    date of the operation.
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    71
2678
da2b3e5e4f69 docs: some fixes to the help text
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2640
diff changeset
    72
    The output is a graph by default but can deactivated with the option
da2b3e5e4f69 docs: some fixes to the help text
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2640
diff changeset
    73
    '--no-graph'.
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    74
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    75
    'o' is a changeset, '@' is a working directory parent, 'x' is obsolete,
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    76
    and '+' represents a fork where the changeset from the lines below is a
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    77
    parent of the 'o' merge on the same line.
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    78
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    79
    Paths in the DAG are represented with '|', '/' and so forth.
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    80
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    81
    Returns 0 on success.
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    82
    """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
    83
    ui.pager(b'obslog')
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    84
    revs = list(revs) + opts['rev']
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    85
    if not revs:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
    86
        revs = [b'.']
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    87
    revs = scmutil.revrange(repo, revs)
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    88
4949
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
    89
    # Use the default template unless the user provided one, but not if
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
    90
    # -f was given, because that doesn't work with templates yet. Note
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
    91
    # that --no-graph doesn't support -f (it ignores it), so we also
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
    92
    # don't use templating with --no-graph.
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
    93
    if not opts['template'] and not (opts['filternonlocal'] and opts['graph']):
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
    94
        opts['template'] = DEFAULT_TEMPLATE
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
    95
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    96
    if opts['graph']:
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    97
        return _debugobshistorygraph(ui, repo, revs, opts)
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    98
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    99
    revs.reverse()
2955
b899a94472fd obslog: uniformize `_debugobshistoryrevs` and `_debugobshistorygraph` arguments
Alain Leufroy
parents: 2954
diff changeset
   100
    _debugobshistoryrevs(ui, repo, revs, opts)
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
   101
4983
6d40e0166522 obslog: make {node} the full node and leave shortening to template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4953
diff changeset
   102
TEMPLATE_MISSING_NODE = b"""{label("evolve.node evolve.missing_change_ctx", node|short)}"""
6d40e0166522 obslog: make {node} the full node and leave shortening to template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4953
diff changeset
   103
TEMPLATE_PRESENT_NODE = b"""{label("evolve.node", node|short)} {label("evolve.rev", "({rev})")} {label("evolve.short_description", desc|firstline)}"""
4949
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   104
TEMPLATE_FIRST_LINE = b"""{if(rev, "%(presentnode)s", "%(missingnode)s")}""" % {
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   105
    b"presentnode": TEMPLATE_PRESENT_NODE,
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   106
    b"missingnode": TEMPLATE_MISSING_NODE
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   107
}
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   108
TEMPLATE_VERB = b"""{label("evolve.verb", verb)}"""
4951
7bfd3fed5d1f obslog: make {succnodes} be full hex nodes
Martin von Zweigbergk <martinvonz@google.com>
parents: 4950
diff changeset
   109
TEMPLATE_SUCCNODES = b"""{label("evolve.node", join(succnodes % "{succnode|short}", ", "))}"""
4949
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   110
TEMPLATE_REWRITE = b"""{if(succnodes, "%(verb)s{if(effects, "({join(effects, ", ")})")} as %(succnodes)s", "pruned")}""" % {
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   111
    b"verb": TEMPLATE_VERB,
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   112
    b"succnodes": TEMPLATE_SUCCNODES
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   113
}
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   114
TEMPLATE_OPERATION = b"""{if(operation, "using {label("evolve.operation", operation)}")}"""
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   115
TEMPLATE_USER = b"""by {label("evolve.user", user)}"""
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   116
TEMPLATE_DATE = b"""{label("evolve.date", "({date(date, "%a %b %d %H:%M:%S %Y %1%2")})")}"""
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   117
TEMPLATE_NOTE = b"""{if(note, "\n    note: {label("evolve.note", note)}")}"""
4952
b135591bec1a obslog: make {patch} not be indented and leave that to the template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4951
diff changeset
   118
TEMPLATE_PATCH = b"""{if(patch, "{patch}")}{if(nopatchreason, "\n(No patch available, {nopatchreason})")}"""
4949
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   119
DEFAULT_TEMPLATE = (b"""%(firstline)s
4953
5c41bb482867 obslog: make {descdiff} not be indented and leave that to the template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4952
diff changeset
   120
{markers %% "  {separate(" ", "%(rewrite)s", "%(operation)s", "%(user)s", "%(date)s")}%(note)s{indent(descdiff, "    ")}{indent("%(patch)s", "    ")}\n"}
4949
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   121
""") % {
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   122
    b"firstline": TEMPLATE_FIRST_LINE,
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   123
    b"rewrite": TEMPLATE_REWRITE,
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   124
    b"operation": TEMPLATE_OPERATION,
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   125
    b"user": TEMPLATE_USER,
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   126
    b"date": TEMPLATE_DATE,
4952
b135591bec1a obslog: make {patch} not be indented and leave that to the template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4951
diff changeset
   127
    b"note": TEMPLATE_NOTE,
b135591bec1a obslog: make {patch} not be indented and leave that to the template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4951
diff changeset
   128
    b"patch": TEMPLATE_PATCH,
4949
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   129
}
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   130
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3407
diff changeset
   131
class obsmarker_printer(compat.changesetprinter):
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   132
    """show (available) information about a node
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   133
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   134
    We display the node, description (if available) and various information
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   135
    about obsolescence markers affecting it"""
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   136
3921
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   137
    def __init__(self, ui, repo, *args, **kwargs):
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   138
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   139
        if kwargs.pop('obspatch', False):
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   140
            if compat.changesetdiffer is None:
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   141
                kwargs['matchfn'] = scmutil.matchall(repo)
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   142
            else:
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   143
                kwargs['differ'] = scmutil.matchall(repo)
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   144
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   145
        super(obsmarker_printer, self).__init__(ui, repo, *args, **kwargs)
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   146
        diffopts = kwargs.get('diffopts', {})
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   147
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   148
        # Compat 4.6
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   149
        if not util.safehasattr(self, "_includediff"):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   150
            self._includediff = diffopts and diffopts.get(b'patch')
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   151
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   152
        self.template = diffopts and diffopts.get(b'template')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   153
        self.filter = diffopts and diffopts.get(b'filternonlocal')
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   154
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   155
    def show(self, ctx, copies=None, matchfn=None, **props):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   156
        if self.buffered:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   157
            self.ui.pushbuffer(labeled=True)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   158
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   159
            changenode = ctx.node()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   160
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   161
            _props = {b"template": self.template}
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   162
            fm = self.ui.formatter(b'debugobshistory', _props)
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   163
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   164
            _debugobshistorydisplaynode(fm, self.repo, changenode)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   165
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   166
            markerfm = fm.nested(b"markers")
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   167
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   168
            # Succs markers
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   169
            if self.filter is False:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   170
                succs = self.repo.obsstore.successors.get(changenode, ())
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   171
                succs = sorted(succs)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   172
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   173
                for successor in succs:
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   174
                    _debugobshistorydisplaymarker(self.ui, markerfm, successor,
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   175
                                                  ctx.node(), self.repo,
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   176
                                                  self._includediff)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   177
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   178
            else:
5056
456129fdcf93 obshistory: use successorsandmarkers() from obsutil, drop local variant
Anton Shestakov <av6@dwimlabs.net>
parents: 5055
diff changeset
   179
                r = obsutil.successorsandmarkers(self.repo, ctx)
456129fdcf93 obshistory: use successorsandmarkers() from obsutil, drop local variant
Anton Shestakov <av6@dwimlabs.net>
parents: 5055
diff changeset
   180
                if r is None:
456129fdcf93 obshistory: use successorsandmarkers() from obsutil, drop local variant
Anton Shestakov <av6@dwimlabs.net>
parents: 5055
diff changeset
   181
                    r = []
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   182
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   183
                for succset in sorted(r):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   184
                    markers = succset[b"markers"]
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   185
                    if not markers:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   186
                        continue
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   187
                    successors = succset[b"successors"]
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   188
                    _debugobshistorydisplaysuccsandmarkers(self.ui, markerfm, successors, markers, ctx.node(), self.repo, self._includediff)
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   189
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   190
            markerfm.end()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   191
4940
93c89814a5d8 obslog: avoid using a formatter after calling end() on it
Martin von Zweigbergk <martinvonz@google.com>
parents: 4939
diff changeset
   192
            fm.plain(b'\n')
2955
b899a94472fd obslog: uniformize `_debugobshistoryrevs` and `_debugobshistorygraph` arguments
Alain Leufroy
parents: 2954
diff changeset
   193
            fm.end()
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   194
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   195
            self.hunk[ctx.node()] = self.ui.popbuffer()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   196
        else:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   197
            ### graph output is buffered only
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   198
            msg = b'cannot be used outside of the graphlog (yet)'
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   199
            raise error.ProgrammingError(msg)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   200
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   201
    def flush(self, ctx):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   202
        ''' changeset_printer has some logic around buffering data
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   203
        in self.headers that we don't use
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   204
        '''
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   205
        pass
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   206
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   207
def patchavailable(node, repo, successors):
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   208
    if node not in repo:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   209
        return False, b"context is not local"
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   210
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   211
    if len(successors) == 0:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   212
        return False, b"no successors"
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   213
    elif len(successors) > 1:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   214
        return False, b"too many successors (%d)" % len(successors)
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   215
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   216
    succ = successors[0]
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   217
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   218
    if succ not in repo:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   219
        return False, b"successor is unknown locally"
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   220
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   221
    # Check that both node and succ have the same parents
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   222
    nodep1, nodep2 = repo[node].p1(), repo[node].p2()
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   223
    succp1, succp2 = repo[succ].p1(), repo[succ].p2()
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   224
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   225
    if nodep1 != succp1 or nodep2 != succp2:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   226
        return False, b"changesets rebased"
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   227
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   228
    return True, succ
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   229
3402
7a322f58fee3 obshistory: pass the csets description in getmarkerdescriptionpatch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3401
diff changeset
   230
def getmarkerdescriptionpatch(repo, basedesc, succdesc):
2640
e278271d2391 obslog: add a comment about the final new line of descriptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2639
diff changeset
   231
    # description are stored without final new line,
e278271d2391 obslog: add a comment about the final new line of descriptions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2639
diff changeset
   232
    # add one to avoid ugly diff
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   233
    basedesc += b'\n'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   234
    succdesc += b'\n'
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   235
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   236
    # fake file name
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   237
    basename = b"changeset-description"
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   238
    succname = b"changeset-description"
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   239
3499
512706514555 obsfate: fix changeset description diff computing
Boris Feld <boris.feld@octobus.net>
parents: 3484
diff changeset
   240
    d = compat.strdiff(basedesc, succdesc, basename, succname)
3604
d24ba168a532 obslog: cleanup patch handling after 4.1 compat drop
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3519
diff changeset
   241
    uheaders, hunks = d
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   242
3604
d24ba168a532 obslog: cleanup patch handling after 4.1 compat drop
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3519
diff changeset
   243
    # Copied from patch.diff
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   244
    text = b''.join(sum((list(hlines) for hrange, hlines in hunks), []))
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   245
    patch = b"\n".join(uheaders + [text])
3400
6d345d7ca682 obslog: add header to the changeset description diff
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3399
diff changeset
   246
3399
4adf46158b9b obslog: colorize the description diff shown in obslog -p
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3398
diff changeset
   247
    return patch
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   248
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   249
class missingchangectx(object):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   250
    ''' a minimal object mimicking changectx for change contexts
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   251
    references by obs markers but not available locally '''
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   252
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   253
    def __init__(self, repo, nodeid):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   254
        self._repo = repo
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   255
        self._node = nodeid
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   256
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   257
    def node(self):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   258
        return self._node
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   259
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   260
    def obsolete(self):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   261
        # If we don't have it locally, it's obsolete
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   262
        return True
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   263
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   264
def cyclic(graph):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   265
    """Return True if the directed graph has a cycle.
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   266
    The graph must be represented as a dictionary mapping vertices to
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   267
    iterables of neighbouring vertices. For example:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   268
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   269
    >>> cyclic({1: (2,), 2: (3,), 3: (1,)})
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   270
    True
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   271
    >>> cyclic({1: (2,), 2: (3,), 3: (4,)})
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   272
    False
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   273
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   274
    Taken from: https://codereview.stackexchange.com/a/86067
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   275
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   276
    """
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   277
    visited = set()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   278
    o = object()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   279
    path = [o]
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   280
    path_set = set(path)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   281
    stack = [iter(graph)]
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   282
    while stack:
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   283
        for v in sorted(stack[-1]):
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   284
            if v in path_set:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   285
                path_set.remove(o)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   286
                return path_set
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   287
            elif v not in visited:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   288
                visited.add(v)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   289
                path.append(v)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   290
                path_set.add(v)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   291
                stack.append(iter(graph.get(v, ())))
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   292
                break
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   293
        else:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   294
            path_set.remove(path.pop())
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   295
            stack.pop()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   296
    return False
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   297
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   298
def _obshistorywalker(repo, revs, walksuccessors=False, filternonlocal=False):
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   299
    """ Directly inspired by graphmod.dagwalker,
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   300
    walk the obs marker tree and yield
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   301
    (id, CHANGESET, ctx, [parentinfo]) tuples
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   302
    """
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   303
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   304
    # Get the list of nodes and links between them
2484
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   305
    candidates, nodesucc, nodeprec = _obshistorywalker_links(repo, revs, walksuccessors)
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   306
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   307
    # Shown, set of nodes presents in items
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   308
    shown = set()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   309
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   310
    def isvalidcandidate(candidate):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   311
        """ Function to filter candidates, check the candidate succ are
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   312
        in shown set
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   313
        """
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   314
        return nodesucc.get(candidate, set()).issubset(shown)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   315
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   316
    # While we have some nodes to show
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   317
    while candidates:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   318
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   319
        # Filter out candidates, returns only nodes with all their successors
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   320
        # already shown
4741
e8727a27e380 py3: filter() now returns a generator, so wrap when we need a list
Martin von Zweigbergk <martinvonz@google.com>
parents: 4738
diff changeset
   321
        validcandidates = list(filter(isvalidcandidate, candidates))
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   322
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   323
        # If we likely have a cycle
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   324
        if not validcandidates:
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   325
            cycle = cyclic(nodesucc)
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   326
            assert cycle
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   327
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   328
            # Then choose a random node from the cycle
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   329
            breaknode = sorted(cycle)[0]
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   330
            # And display it by force
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   331
            repo.ui.debug(b'obs-cycle detected, forcing display of %s\n'
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   332
                          % nodemod.short(breaknode))
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   333
            validcandidates = [breaknode]
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   334
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   335
        # Display all valid candidates
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   336
        for cand in sorted(validcandidates):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   337
            # Remove candidate from candidates set
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   338
            candidates.remove(cand)
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   339
            # And remove it from nodesucc in case of future cycle detected
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   340
            try:
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   341
                del nodesucc[cand]
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   342
            except KeyError:
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   343
                pass
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   344
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   345
            shown.add(cand)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   346
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   347
            # Add the right changectx class
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   348
            if cand in repo:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   349
                changectx = repo[cand]
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   350
            else:
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   351
                if filternonlocal is False:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   352
                    changectx = missingchangectx(repo, cand)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   353
                else:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   354
                    continue
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   355
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   356
            if filternonlocal is False:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   357
                relations = nodeprec.get(cand, ())
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   358
            else:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   359
                relations = obsutil.closestpredecessors(repo, cand)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   360
            # print("RELATIONS", relations, list(closestpred))
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   361
            childrens = [(graphmod.PARENT, x) for x in relations]
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   362
            # print("YIELD", changectx, childrens)
3728
0fc78fdca4b8 obshistory: use a more appropriate type for obslog entries
Anton Shestakov <av6@dwimlabs.net>
parents: 3701
diff changeset
   363
            yield (cand, graphmod.CHANGESET, changectx, childrens)
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   364
2484
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   365
def _obshistorywalker_links(repo, revs, walksuccessors=False):
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   366
    """ Iterate the obs history tree starting from revs, traversing
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   367
    each revision precursors recursively.
2484
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   368
    If walksuccessors is True, also check that every successor has been
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   369
    walked, which ends up walking on all connected obs markers. It helps
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   370
    getting a better view with splits and divergences.
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   371
    Return a tuple of:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   372
    - The list of node crossed
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   373
    - The dictionnary of each node successors, values are a set
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   374
    - The dictionnary of each node precursors, values are a list
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   375
    """
2840
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2832
diff changeset
   376
    precursors = repo.obsstore.predecessors
2484
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   377
    successors = repo.obsstore.successors
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   378
    nodec = repo.changelog.node
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   379
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   380
    # Parents, set of parents nodes seen during walking the graph for node
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   381
    nodesucc = dict()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   382
    # Childrens
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   383
    nodeprec = dict()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   384
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   385
    nodes = [nodec(r) for r in revs]
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   386
    seen = set(nodes)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   387
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   388
    # Iterate on each node
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   389
    while nodes:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   390
        node = nodes.pop()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   391
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   392
        precs = precursors.get(node, ())
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   393
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   394
        nodeprec[node] = []
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   395
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   396
        for prec in sorted(precs):
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   397
            precnode = prec[0]
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   398
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   399
            # Mark node as prec successor
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   400
            nodesucc.setdefault(precnode, set()).add(node)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   401
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   402
            # Mark precnode as node precursor
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   403
            nodeprec[node].append(precnode)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   404
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   405
            # Add prec for future processing if not node already processed
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   406
            if precnode not in seen:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   407
                seen.add(precnode)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   408
                nodes.append(precnode)
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   409
2484
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   410
        # Also walk on successors if the option is enabled
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   411
        if walksuccessors:
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   412
            for successor in successors.get(node, ()):
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   413
                for succnodeid in successor[1]:
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   414
                    if succnodeid not in seen:
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   415
                        seen.add(succnodeid)
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   416
                        nodes.append(succnodeid)
262d684851dc obshistory: add the all option to obslog to show the while obs tree
Boris Feld <boris.feld@octobus.net>
parents: 2463
diff changeset
   417
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   418
    return sorted(seen), nodesucc, nodeprec
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   419
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   420
def _debugobshistorygraph(ui, repo, revs, opts):
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   421
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   422
    displayer = obsmarker_printer(ui, repo.unfiltered(), obspatch=True,
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   423
                                  diffopts=pycompat.byteskwargs(opts),
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   424
                                  buffered=True)
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   425
    edges = graphmod.asciiedges
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   426
    walker = _obshistorywalker(repo.unfiltered(), revs, opts.get('all', False),
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   427
                               opts.get('filternonlocal', False))
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3407
diff changeset
   428
    compat.displaygraph(ui, repo, walker, displayer, edges)
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   429
2955
b899a94472fd obslog: uniformize `_debugobshistoryrevs` and `_debugobshistorygraph` arguments
Alain Leufroy
parents: 2954
diff changeset
   430
def _debugobshistoryrevs(ui, repo, revs, opts):
2633
59e85fbb31b6 obslog: small renaming of _debugobshistorysingle
Boris Feld <boris.feld@octobus.net>
parents: 2610
diff changeset
   431
    """ Display the obsolescence history for revset
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   432
    """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   433
    fm = ui.formatter(b'debugobshistory', pycompat.byteskwargs(opts))
2840
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2832
diff changeset
   434
    precursors = repo.obsstore.predecessors
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   435
    successors = repo.obsstore.successors
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   436
    nodec = repo.changelog.node
2635
9ab35c37b85a obslog: pass directly unfiltered_repo
Boris Feld <boris.feld@octobus.net>
parents: 2634
diff changeset
   437
    unfi = repo.unfiltered()
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   438
    nodes = [nodec(r) for r in revs]
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   439
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   440
    seen = set(nodes)
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   441
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   442
    while nodes:
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   443
        ctxnode = nodes.pop()
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   444
2635
9ab35c37b85a obslog: pass directly unfiltered_repo
Boris Feld <boris.feld@octobus.net>
parents: 2634
diff changeset
   445
        _debugobshistorydisplaynode(fm, unfi, ctxnode)
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   446
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   447
        succs = successors.get(ctxnode, ())
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   448
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   449
        markerfm = fm.nested(b"markers")
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   450
        for successor in sorted(succs):
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   451
            includediff = opts and opts.get("patch")
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   452
            _debugobshistorydisplaymarker(ui, markerfm, successor, ctxnode, unfi, includediff)
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   453
        markerfm.end()
4948
069cfc5301fb obslog: add newline after all markers in non-graphlog to match graphlog
Martin von Zweigbergk <martinvonz@google.com>
parents: 4947
diff changeset
   454
        fm.plain(b'\n')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   455
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   456
        precs = precursors.get(ctxnode, ())
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   457
        for p in sorted(precs):
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   458
            # Only show nodes once
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   459
            if p[0] not in seen:
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   460
                seen.add(p[0])
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   461
                nodes.append(p[0])
2955
b899a94472fd obslog: uniformize `_debugobshistoryrevs` and `_debugobshistorygraph` arguments
Alain Leufroy
parents: 2954
diff changeset
   462
    fm.end()
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   463
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   464
def _debugobshistorydisplaynode(fm, repo, node):
2635
9ab35c37b85a obslog: pass directly unfiltered_repo
Boris Feld <boris.feld@octobus.net>
parents: 2634
diff changeset
   465
    if node in repo:
9ab35c37b85a obslog: pass directly unfiltered_repo
Boris Feld <boris.feld@octobus.net>
parents: 2634
diff changeset
   466
        _debugobshistorydisplayctx(fm, repo[node])
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   467
    else:
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   468
        _debugobshistorydisplaymissingctx(fm, node)
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   469
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   470
def _debugobshistorydisplayctx(fm, ctx):
3729
1b1badb3d2fc obshistory: make obslog work when a commit doesn't have any description
Anton Shestakov <av6@dwimlabs.net>
parents: 3728
diff changeset
   471
    shortdescription = ctx.description().strip()
1b1badb3d2fc obshistory: make obslog work when a commit doesn't have any description
Anton Shestakov <av6@dwimlabs.net>
parents: 3728
diff changeset
   472
    if shortdescription:
1b1badb3d2fc obshistory: make obslog work when a commit doesn't have any description
Anton Shestakov <av6@dwimlabs.net>
parents: 3728
diff changeset
   473
        shortdescription = shortdescription.splitlines()[0]
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   474
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   475
    fm.startitem()
4917
d1d8e97d32af obslog: make changeset available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4894
diff changeset
   476
    fm.context(ctx=ctx)
4983
6d40e0166522 obslog: make {node} the full node and leave shortening to template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4953
diff changeset
   477
    fm.data(node=ctx.hex())
6d40e0166522 obslog: make {node} the full node and leave shortening to template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4953
diff changeset
   478
    fm.plain(b'%s' % bytes(ctx), label=b"evolve.node")
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   479
    fm.plain(b' ')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   480
4918
f16274729530 obslog: don't overwrite {rev} keyword from changeset context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4917
diff changeset
   481
    fm.plain(b'(%d)' % ctx.rev(), label=b"evolve.rev")
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   482
    fm.plain(b' ')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   483
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   484
    fm.write(b'shortdescription', b'%s', shortdescription,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   485
             label=b"evolve.short_description")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   486
    fm.plain(b'\n')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   487
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   488
def _debugobshistorydisplaymissingctx(fm, nodewithoutctx):
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   489
    fm.startitem()
4983
6d40e0166522 obslog: make {node} the full node and leave shortening to template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4953
diff changeset
   490
    fm.data(node=nodemod.hex(nodewithoutctx))
6d40e0166522 obslog: make {node} the full node and leave shortening to template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4953
diff changeset
   491
    fm.plain(nodemod.short(nodewithoutctx),
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   492
             label=b"evolve.node evolve.missing_change_ctx")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   493
    fm.plain(b'\n')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   494
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   495
def _debugobshistorydisplaymarker(ui, fm, marker, node, repo, includediff=False):
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   496
    succnodes = marker[1]
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   497
    date = marker[4]
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   498
    metadata = dict(marker[3])
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   499
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   500
    fm.startitem()
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   501
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   502
    # Detect pruned revisions
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   503
    if len(succnodes) == 0:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   504
        verb = b'pruned'
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   505
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   506
        verb = b'rewritten'
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   507
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   508
    fm.data(verb=verb)
2453
ad08aedf25ac obshistory: display informations from the obs marker effect flag
Boris Feld <boris.feld@octobus.net>
parents: 2450
diff changeset
   509
5066
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   510
    effects = _markerseffects([marker])
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   511
    if effects:
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   512
        fmteffect = fm.formatlist(effects, b'effect', sep=b', ')
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   513
        fm.write(b'effects', b'(%s)', fmteffect)
2453
ad08aedf25ac obshistory: display informations from the obs marker effect flag
Boris Feld <boris.feld@octobus.net>
parents: 2450
diff changeset
   514
2832
07b9fcf8b6d3 output: update obsfate / obslog output order
Boris Feld <boris.feld@octobus.net>
parents: 2697
diff changeset
   515
    if len(succnodes) > 0:
4951
7bfd3fed5d1f obslog: make {succnodes} be full hex nodes
Martin von Zweigbergk <martinvonz@google.com>
parents: 4950
diff changeset
   516
        hexnodes = (nodemod.hex(succnode) for succnode in sorted(succnodes))
7bfd3fed5d1f obslog: make {succnodes} be full hex nodes
Martin von Zweigbergk <martinvonz@google.com>
parents: 4950
diff changeset
   517
        nodes = fm.formatlist(hexnodes, b'succnode')
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   518
        fm.write(b'succnodes', b'%s', nodes)
2832
07b9fcf8b6d3 output: update obsfate / obslog output order
Boris Feld <boris.feld@octobus.net>
parents: 2697
diff changeset
   519
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   520
    operation = metadata.get(b'operation')
3519
2823c82ad8a4 obslog: add the operation to the Obslog output
Boris Feld <boris.feld@octobus.net>
parents: 3506
diff changeset
   521
    if operation:
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   522
        fm.data(operation=operation)
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   523
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   524
    fm.data(user=metadata[b'user'])
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   525
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   526
    fm.data(date=date)
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   527
3214
9fe2b3fd7fc7 obslog: add initial support for showing note in obslog
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3181
diff changeset
   528
    # initial support for showing note
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   529
    if metadata.get(b'note'):
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   530
        fm.data(note=metadata[b'note'])
3214
9fe2b3fd7fc7 obslog: add initial support for showing note in obslog
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3181
diff changeset
   531
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   532
    # Patch display
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   533
    if includediff is True:
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   534
        _patchavailable = patchavailable(node, repo, marker[1])
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   535
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   536
        if _patchavailable[0] is True:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   537
            succ = _patchavailable[1]
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   538
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   539
            basectx = repo[node]
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   540
            succctx = repo[succ]
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   541
            # Description patch
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   542
            descriptionpatch = getmarkerdescriptionpatch(repo,
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   543
                                                         basectx.description(),
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   544
                                                         succctx.description())
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   545
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   546
            if descriptionpatch:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   547
                # add the diffheader
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   548
                diffheader = b"diff -r %s -r %s changeset-description\n" %\
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   549
                             (basectx, succctx)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   550
                descriptionpatch = diffheader + descriptionpatch
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   551
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   552
                def tolist(text):
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   553
                    return [text]
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   554
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   555
                ui.pushbuffer(labeled=True)
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   556
                ui.write(b"\n")
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   557
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   558
                for chunk, label in patch.difflabel(tolist, descriptionpatch):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   559
                    chunk = chunk.strip(b'\t')
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   560
                    ui.write(chunk, label=label)
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   561
                fm.write(b'descdiff', b'%s', ui.popbuffer())
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   562
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   563
            # Content patch
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   564
            ui.pushbuffer(labeled=True)
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   565
            diffopts = patch.diffallopts(repo.ui, {})
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   566
            matchfn = scmutil.matchall(repo)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   567
            firstline = True
4823
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   568
            linestart = True
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   569
            for chunk, label in patch.diffui(repo, node, succ, matchfn,
4399
3722557b008c obshistory: omit keyword arguments with default values in patch.diffui() calls
Anton Shestakov <av6@dwimlabs.net>
parents: 4260
diff changeset
   570
                                             opts=diffopts):
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   571
                if firstline:
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   572
                    ui.write(b'\n')
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   573
                    firstline = False
4823
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   574
                if linestart:
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   575
                    linestart = False
4827
4c6dd20e8cc2 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4823
diff changeset
   576
                if chunk == b'\n':
4823
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   577
                    linestart = True
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   578
                ui.write(chunk, label=label)
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   579
            fm.data(patch=ui.popbuffer())
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   580
        else:
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   581
            fm.data(nopatchreason=_patchavailable[1])
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   582
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   583
def _debugobshistorydisplaysuccsandmarkers(ui, fm, succnodes, markers, node, repo, includediff=False):
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   584
    """
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   585
    This function is a duplication of _debugobshistorydisplaymarker modified
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   586
    to accept multiple markers as input.
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   587
    """
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   588
    fm.startitem()
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   589
    fm.plain(b'  ')
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   590
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   591
    # Detect pruned revisions
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   592
    verb = _successorsetverb(succnodes, markers)[b"verb"]
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   593
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   594
    fm.write(b'verb', b'%s', verb,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   595
             label=b"evolve.verb")
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   596
5066
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   597
    effects = _markerseffects(markers)
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   598
    if effects:
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   599
        fmteffect = fm.formatlist(effects, b'effect', sep=b', ')
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   600
        fm.write(b'effects', b'(%s)', fmteffect)
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   601
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   602
    if len(succnodes) > 0:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   603
        fm.plain(b' as ')
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   604
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   605
        shortsnodes = (nodemod.short(succnode) for succnode in sorted(succnodes))
4938
d8033f75a52e obslog: use singular name "succnode" for each element of {succnodes}
Martin von Zweigbergk <martinvonz@google.com>
parents: 4921
diff changeset
   606
        nodes = fm.formatlist(shortsnodes, b'succnode', sep=b', ')
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   607
        fm.write(b'succnodes', b'%s', nodes,
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   608
                 label=b"evolve.node")
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   609
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   610
    # Operations
5055
5187cb1fd905 compat: drop code from 35b2d201eb71 (compatibility with hg 4.3)
Anton Shestakov <av6@dwimlabs.net>
parents: 5053
diff changeset
   611
    operations = obsutil.markersoperations(markers)
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   612
    if operations:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   613
        fm.plain(b' using ')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   614
        fm.write(b'operation', b'%s', b", ".join(operations), label=b"evolve.operation")
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   615
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   616
    fm.plain(b' by ')
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   617
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   618
    # Users
5055
5187cb1fd905 compat: drop code from 35b2d201eb71 (compatibility with hg 4.3)
Anton Shestakov <av6@dwimlabs.net>
parents: 5053
diff changeset
   619
    users = obsutil.markersusers(markers)
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   620
    fm.write(b'user', b'%s', b", ".join(users),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   621
             label=b"evolve.user")
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   622
    fm.plain(b' ')
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   623
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   624
    # Dates
5055
5187cb1fd905 compat: drop code from 35b2d201eb71 (compatibility with hg 4.3)
Anton Shestakov <av6@dwimlabs.net>
parents: 5053
diff changeset
   625
    dates = obsutil.markersdates(markers)
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   626
    if dates:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   627
        min_date = min(dates)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   628
        max_date = max(dates)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   629
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   630
        if min_date == max_date:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   631
            fm.write(b"date", b"(at %s)", fm.formatdate(min_date), label=b"evolve.date")
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   632
        else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   633
            fm.write(b"date", b"(between %s and %s)", fm.formatdate(min_date),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   634
                     fm.formatdate(max_date), label=b"evolve.date")
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   635
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   636
    # initial support for showing note
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   637
    # if metadata.get('note'):
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   638
    #     fm.plain('\n    note: ')
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   639
    #     fm.write('note', "%s", metadata['note'], label="evolve.note")
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   640
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   641
    # Patch display
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   642
    if includediff is True:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   643
        _patchavailable = patchavailable(node, repo, succnodes)
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   644
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   645
        if _patchavailable[0] is True:
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   646
            succ = _patchavailable[1]
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   647
3402
7a322f58fee3 obshistory: pass the csets description in getmarkerdescriptionpatch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3401
diff changeset
   648
            basectx = repo[node]
7a322f58fee3 obshistory: pass the csets description in getmarkerdescriptionpatch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3401
diff changeset
   649
            succctx = repo[succ]
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   650
            # Description patch
3402
7a322f58fee3 obshistory: pass the csets description in getmarkerdescriptionpatch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3401
diff changeset
   651
            descriptionpatch = getmarkerdescriptionpatch(repo,
7a322f58fee3 obshistory: pass the csets description in getmarkerdescriptionpatch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3401
diff changeset
   652
                                                         basectx.description(),
7a322f58fee3 obshistory: pass the csets description in getmarkerdescriptionpatch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3401
diff changeset
   653
                                                         succctx.description())
3399
4adf46158b9b obslog: colorize the description diff shown in obslog -p
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3398
diff changeset
   654
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   655
            if descriptionpatch:
3400
6d345d7ca682 obslog: add header to the changeset description diff
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3399
diff changeset
   656
                # add the diffheader
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   657
                diffheader = b"diff -r %s -r %s changeset-description\n" %\
3402
7a322f58fee3 obshistory: pass the csets description in getmarkerdescriptionpatch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3401
diff changeset
   658
                             (basectx, succctx)
3400
6d345d7ca682 obslog: add header to the changeset description diff
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3399
diff changeset
   659
                descriptionpatch = diffheader + descriptionpatch
3399
4adf46158b9b obslog: colorize the description diff shown in obslog -p
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3398
diff changeset
   660
4adf46158b9b obslog: colorize the description diff shown in obslog -p
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3398
diff changeset
   661
                def tolist(text):
4adf46158b9b obslog: colorize the description diff shown in obslog -p
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3398
diff changeset
   662
                    return [text]
4adf46158b9b obslog: colorize the description diff shown in obslog -p
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3398
diff changeset
   663
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   664
                ui.pushbuffer(labeled=True)
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   665
                ui.write(b"\n")
3400
6d345d7ca682 obslog: add header to the changeset description diff
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3399
diff changeset
   666
3399
4adf46158b9b obslog: colorize the description diff shown in obslog -p
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3398
diff changeset
   667
                for chunk, label in patch.difflabel(tolist, descriptionpatch):
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   668
                    chunk = chunk.strip(b'\t')
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   669
                    if chunk and chunk != b'\n':
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   670
                        ui.write(b'    ')
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   671
                    ui.write(chunk, label=label)
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   672
                fm.write(b'descdiff', b'%s', ui.popbuffer())
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   673
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   674
            # Content patch
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   675
            ui.pushbuffer(labeled=True)
3398
d67e6080e11b obslog: colorize the patch shown using `hg obslog -p`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3223
diff changeset
   676
            diffopts = patch.diffallopts(repo.ui, {})
d67e6080e11b obslog: colorize the patch shown using `hg obslog -p`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3223
diff changeset
   677
            matchfn = scmutil.matchall(repo)
d67e6080e11b obslog: colorize the patch shown using `hg obslog -p`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3223
diff changeset
   678
            firstline = True
4823
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   679
            linestart = True
3398
d67e6080e11b obslog: colorize the patch shown using `hg obslog -p`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3223
diff changeset
   680
            for chunk, label in patch.diffui(repo, node, succ, matchfn,
4399
3722557b008c obshistory: omit keyword arguments with default values in patch.diffui() calls
Anton Shestakov <av6@dwimlabs.net>
parents: 4260
diff changeset
   681
                                             opts=diffopts):
3398
d67e6080e11b obslog: colorize the patch shown using `hg obslog -p`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3223
diff changeset
   682
                if firstline:
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   683
                    ui.write(b'\n')
3398
d67e6080e11b obslog: colorize the patch shown using `hg obslog -p`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3223
diff changeset
   684
                    firstline = False
4823
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   685
                if linestart:
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   686
                    ui.write(b'    ')
4823
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   687
                    linestart = False
4827
4c6dd20e8cc2 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4823
diff changeset
   688
                if chunk == b'\n':
4823
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   689
                    linestart = True
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   690
                ui.write(chunk, label=label)
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   691
            fm.write(b'patch', b'%s', ui.popbuffer())
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   692
        else:
4947
0ad2000854c4 obslog: make reason for unavailable patch part of template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4946
diff changeset
   693
            fm.write(b'nopatchreason', b"\n    (No patch available, %s)",
0ad2000854c4 obslog: make reason for unavailable patch part of template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4946
diff changeset
   694
                     _patchavailable[1])
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   695
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   696
    fm.plain(b"\n")
2446
4b2f4da124a2 effectflag: allow to save effect of change in obsmarkers
Boris Feld <boris.feld@octobus.net>
parents: 2441
diff changeset
   697
2454
400dbec0849c effetflag: move the flag back with the test of the creation logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2453
diff changeset
   698
# logic around storing and using effect flags
400dbec0849c effetflag: move the flag back with the test of the creation logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2453
diff changeset
   699
DESCCHANGED = 1 << 0 # action changed the description
2522
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   700
METACHANGED = 1 << 1 # action change the meta
2454
400dbec0849c effetflag: move the flag back with the test of the creation logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2453
diff changeset
   701
PARENTCHANGED = 1 << 2 # action change the parent
400dbec0849c effetflag: move the flag back with the test of the creation logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2453
diff changeset
   702
DIFFCHANGED = 1 << 3 # action change diff introduced by the changeset
2492
c9f1118b33d6 effectflag: split effect flag meta
Boris Feld <boris.feld@octobus.net>
parents: 2490
diff changeset
   703
USERCHANGED = 1 << 4 # the user changed
c9f1118b33d6 effectflag: split effect flag meta
Boris Feld <boris.feld@octobus.net>
parents: 2490
diff changeset
   704
DATECHANGED = 1 << 5 # the date changed
c9f1118b33d6 effectflag: split effect flag meta
Boris Feld <boris.feld@octobus.net>
parents: 2490
diff changeset
   705
BRANCHCHANGED = 1 << 6 # the branch changed
2454
400dbec0849c effetflag: move the flag back with the test of the creation logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2453
diff changeset
   706
2522
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   707
METABLACKLIST = [
4801
16c1398b0063 python3: prefix all regex to work with python 2 and 3
Raphaël Gomès <rgomes@octobus.net>
parents: 4752
diff changeset
   708
    re.compile(br'^__touch-noise__$'),
16c1398b0063 python3: prefix all regex to work with python 2 and 3
Raphaël Gomès <rgomes@octobus.net>
parents: 4752
diff changeset
   709
    re.compile(br'^branch$'),
16c1398b0063 python3: prefix all regex to work with python 2 and 3
Raphaël Gomès <rgomes@octobus.net>
parents: 4752
diff changeset
   710
    re.compile(br'^.*-source$'),
16c1398b0063 python3: prefix all regex to work with python 2 and 3
Raphaël Gomès <rgomes@octobus.net>
parents: 4752
diff changeset
   711
    re.compile(br'^.*_source$'),
16c1398b0063 python3: prefix all regex to work with python 2 and 3
Raphaël Gomès <rgomes@octobus.net>
parents: 4752
diff changeset
   712
    re.compile(br'^source$'),
2522
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   713
]
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   714
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   715
def ismetablacklisted(metaitem):
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   716
    """ Check that the key of a meta item (extrakey, extravalue) does not
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   717
    match at least one of the blacklist pattern
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   718
    """
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   719
    metakey = metaitem[0]
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   720
    for pattern in METABLACKLIST:
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   721
        if pattern.match(metakey):
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   722
            return False
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   723
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   724
    return True
a1cc2a0b9f6f effetflag: detect other meta (extra) changes
Boris Feld <boris.feld@octobus.net>
parents: 2520
diff changeset
   725
2520
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   726
def _prepare_hunk(hunk):
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   727
    """Drop all information but the username and patch"""
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   728
    cleanunk = []
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   729
    for line in hunk.splitlines():
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   730
        if line.startswith(b'# User') or not line.startswith(b'#'):
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   731
            if line.startswith(b'@@'):
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   732
                line = b'@@\n'
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   733
            cleanunk.append(line)
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   734
    return cleanunk
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   735
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   736
def _getdifflines(iterdiff):
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   737
    """return a cleaned up lines"""
2450
98613938d098 effectflag: basic diff change detection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2449
diff changeset
   738
    try:
4738
45508676ed00 py3: replace iter.next() by next(iter)
Martin von Zweigbergk <martinvonz@google.com>
parents: 4715
diff changeset
   739
        lines = next(iterdiff)
2450
98613938d098 effectflag: basic diff change detection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2449
diff changeset
   740
    except StopIteration:
98613938d098 effectflag: basic diff change detection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2449
diff changeset
   741
        return None
2520
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   742
    return _prepare_hunk(lines)
2450
98613938d098 effectflag: basic diff change detection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2449
diff changeset
   743
5057
da5cc4e493ff obshistory: drop unused keyword argument to _getobsfateandsuccs()
Anton Shestakov <av6@dwimlabs.net>
parents: 5056
diff changeset
   744
def _getobsfateandsuccs(repo, revnode):
2488
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   745
    """ Return a tuple containing:
5053
196ed65594dc evolve: correct spelling of superseded everywhere else
Anton Shestakov <av6@dwimlabs.net>
parents: 5052
diff changeset
   746
    - the reason a revision is obsolete (diverged, pruned or superseded)
2488
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   747
    - the list of successors short node if the revision is neither pruned
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   748
    or has diverged
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   749
    """
5057
da5cc4e493ff obshistory: drop unused keyword argument to _getobsfateandsuccs()
Anton Shestakov <av6@dwimlabs.net>
parents: 5056
diff changeset
   750
    successorssets = obsutil.successorssets(repo, revnode)
5052
b9a7fb0a0a49 evolve: use obsutil._getobsfate() directly
Anton Shestakov <av6@dwimlabs.net>
parents: 4983
diff changeset
   751
    fate = obsutil._getobsfate(successorssets)
2488
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   752
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   753
    # Apply node.short if we have no divergence
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   754
    if len(successorssets) == 1:
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   755
        successors = [nodemod.short(node_id) for node_id in successorssets[0]]
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   756
    else:
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   757
        successors = []
2490
94f171534918 template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   758
        for succset in successorssets:
94f171534918 template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   759
            successors.append([nodemod.short(node_id) for node_id in succset])
2488
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   760
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   761
    return (fate, successors)
2490
94f171534918 template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   762
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   763
def _successorsetdates(successorset, markers):
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   764
    """returns the max date and the min date of the markers list
2490
94f171534918 template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   765
    """
94f171534918 template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   766
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   767
    if not markers:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   768
        return {}
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   769
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   770
    dates = [m[4] for m in markers]
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   771
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   772
    return {
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   773
        b'min_date': min(dates),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   774
        b'max_date': max(dates)
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   775
    }
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   776
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   777
def _successorsetusers(successorset, markers):
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   778
    """ Returns a sorted list of markers users without duplicates
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   779
    """
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   780
    if not markers:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   781
        return {}
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   782
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   783
    # Check that user is present in meta
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   784
    markersmeta = [dict(m[3]) for m in markers]
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   785
    users = set(meta.get(b'user') for meta in markersmeta if meta.get(b'user'))
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   786
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   787
    return {b'users': sorted(users)}
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   788
5067
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   789
EFFECTMAPPING = util.sortdict([
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   790
    (DESCCHANGED, b'description'),
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   791
    (METACHANGED, b'meta'),
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   792
    (USERCHANGED, b'user'),
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   793
    (DATECHANGED, b'date'),
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   794
    (BRANCHCHANGED, b'branch'),
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   795
    (PARENTCHANGED, b'parent'),
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   796
    (DIFFCHANGED, b'content'),
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   797
])
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   798
5066
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   799
def _markerseffects(markers):
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   800
    """ Return a list of effects as strings based on effect flags in markers
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   801
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   802
    Return None if verb cannot be more precise than just "rewritten", i.e. when
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   803
    markers collectively have more than one effect in the flags.
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   804
    """
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   805
    metadata = [dict(marker[3]) for marker in markers]
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   806
    ef1 = [data.get(b'ef1') for data in metadata]
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   807
    effects = []
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   808
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   809
    combined = 0
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   810
    for ef in ef1:
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   811
        if ef:
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   812
            combined |= int(ef)
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   813
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   814
    if combined:
5067
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   815
        for key, value in EFFECTMAPPING.items():
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   816
            if combined & key:
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   817
                effects.append(value)
5066
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   818
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   819
    return effects
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   820
2896
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   821
VERBMAPPING = {
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   822
    DESCCHANGED: b"reworded",
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   823
    METACHANGED: b"meta-changed",
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   824
    USERCHANGED: b"reauthored",
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   825
    DATECHANGED: b"date-changed",
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   826
    BRANCHCHANGED: b"branch-changed",
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   827
    PARENTCHANGED: b"rebased",
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   828
    DIFFCHANGED: b"amended"
2896
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   829
}
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   830
5065
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   831
def _markerspreciseverb(markers):
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   832
    """ Return a more precise verb based on effect flags in markers
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   833
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   834
    Return None if verb cannot be more precise than just "rewritten", i.e. when
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   835
    markers collectively have more than one effect in the flags.
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   836
    """
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   837
    metadata = [dict(marker[3]) for marker in markers]
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   838
    ef1 = [data.get(b'ef1') for data in metadata]
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   839
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   840
    if all(ef1):
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   841
        combined = 0
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   842
        for ef in ef1:
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   843
            combined |= int(ef)
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   844
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   845
        # Combined will be in VERBMAPPING only if one bit is set
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   846
        if combined in VERBMAPPING:
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   847
            return VERBMAPPING[combined]
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   848
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   849
def _successorsetverb(successorset, markers):
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   850
    """ Return the verb summarizing the successorset
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   851
    """
2896
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   852
    verb = None
2606
02129bed002c obsfate: improve prune support in _successorsetverb
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2604
diff changeset
   853
    if not successorset:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   854
        verb = b'pruned'
2607
054d92586e43 obsfate: use 'split' as verb when appropriate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2606
diff changeset
   855
    elif len(successorset) == 1:
5065
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   856
        verb = _markerspreciseverb(markers)
2896
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   857
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   858
        if verb is None:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   859
            verb = b'rewritten'
2606
02129bed002c obsfate: improve prune support in _successorsetverb
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2604
diff changeset
   860
    else:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   861
        verb = b'split'
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   862
    return {b'verb': verb}
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   863
3181
5db76f35efce effect-flag: fix obsfate verb hooking
Boris Feld <boris.feld@octobus.net>
parents: 3115
diff changeset
   864
# Use a more advanced version of obsfateverb that uses effect-flag
5058
c95e68e8a219 obshistory: remove obsfateverb/obsfateprinter patching compatibility
Anton Shestakov <av6@dwimlabs.net>
parents: 5057
diff changeset
   865
@eh.wrapfunction(obsutil, 'obsfateverb')
c95e68e8a219 obshistory: remove obsfateverb/obsfateprinter patching compatibility
Anton Shestakov <av6@dwimlabs.net>
parents: 5057
diff changeset
   866
def obsfateverb(orig, *args, **kwargs):
c95e68e8a219 obshistory: remove obsfateverb/obsfateprinter patching compatibility
Anton Shestakov <av6@dwimlabs.net>
parents: 5057
diff changeset
   867
    return _successorsetverb(*args, **kwargs)[b'verb']
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3080
diff changeset
   868
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   869
FORMATSSETSFUNCTIONS = [
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   870
    _successorsetdates,
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   871
    _successorsetusers,
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   872
    _successorsetverb
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   873
]
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   874
2609
81a94da65dca obsfate: mark successorsetallmarkers public
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2608
diff changeset
   875
def successorsetallmarkers(successorset, pathscache):
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   876
    """compute all successors of a successorset.
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   877
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   878
    pathscache must contains all successors starting from selected nodes
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   879
    or revision. This way, iterating on each successor, we can take all
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   880
    precursors and have the subgraph of all obsmarkers between roots to
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   881
    successors.
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   882
    """
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   883
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   884
    markers = set()
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   885
    seen = set()
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   886
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   887
    for successor in successorset:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   888
        stack = [successor]
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   889
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   890
        while stack:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   891
            element = stack.pop()
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   892
            seen.add(element)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   893
            for prec, mark in pathscache.get(element, []):
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   894
                if prec not in seen:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   895
                    # Process element precursors
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   896
                    stack.append(prec)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   897
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   898
                if mark not in markers:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   899
                    markers.add(mark)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   900
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   901
    return markers
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   902
2610
ee37ab3de5f7 obsfate: split markers fetch from successor set annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2609
diff changeset
   903
def preparesuccessorset(successorset, rawmarkers):
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   904
    """ For a successor set, get all related markers, compute the set of user,
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   905
    the min date and the max date
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   906
    """
2604
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   907
    hex = nodemod.hex
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   908
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   909
    successorset = [hex(n) for n in successorset]
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   910
2604
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   911
    # hex the binary nodes in the markers
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   912
    markers = []
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   913
    for m in rawmarkers:
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   914
        hexprec = hex(m[0])
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   915
        hexsucs = tuple(hex(n) for n in m[1])
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   916
        hexparents = None
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   917
        if m[5] is not None:
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   918
            hexparents = tuple(hex(n) for n in m[5])
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   919
        newmarker = (hexprec, hexsucs) + m[2:5] + (hexparents,) + m[6:]
3bcc9d3bac33 template: use hex node in the obsmarkers used in the obsfate template
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   920
        markers.append(newmarker)
2603
23f1c3b9052f template: use hex successors in obsfate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2592
diff changeset
   921
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   922
    # Format basic data
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   923
    data = {
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   924
        b"successors": sorted(successorset),
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   925
        b"markers": sorted(markers)
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   926
    }
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   927
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   928
    # Call an extensible list of functions to override or add new data
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   929
    for function in FORMATSSETSFUNCTIONS:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   930
        data.update(function(successorset, markers))
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   931
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   932
    return data