hgext3rd/evolve/obshistory.py
author Anton Shestakov <av6@dwimlabs.net>
Mon, 13 Jan 2020 16:32:25 +0700
changeset 5305 292de4cca111
parent 5303 61538e2db220
child 5306 1e2f3fa129f2
permissions -rw-r--r--
obshistory: make patchavailable() handle predecessors too
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,
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5173
diff changeset
    16
    logcmdutil,
5182
df5e6e3884bc compat: drop 4.5 compatibility for strdiff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5181
diff changeset
    17
    mdiff,
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5173
diff changeset
    18
    node as nodemod,
3883
ed460e7ee8aa compat: drop compatibility hack for mercurial <4.3
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3838
diff changeset
    19
    obsutil,
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5173
diff changeset
    20
    patch,
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
    21
    pycompat,
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    22
    scmutil,
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3080
diff changeset
    23
    util,
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    24
)
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 mercurial.i18n import _
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    27
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    28
from . import (
2693
f4b0351fa813 evolve: adapt to function migrate to obsutil
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2678
diff changeset
    29
    compat,
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    30
    exthelper,
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    31
)
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
    32
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    33
eh = exthelper.exthelper()
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    34
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    35
# 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
    36
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
    37
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    38
@eh.extsetup
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    39
def enableeffectflags(ui):
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    40
    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
    41
            .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
    42
            .get(b'evolution.effect-flags'))
3080
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    43
    if item is not None:
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    44
        item.default = True
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    45
        efd.clear()
461c9d940519 evolve: registed configitems if available
Boris Feld <boris.feld@octobus.net>
parents: 3071
diff changeset
    46
5072
3c1a5754d983 obshistory: remove unused ismetablacklisted()
Anton Shestakov <av6@dwimlabs.net>
parents: 5071
diff changeset
    47
@eh.extsetup
3c1a5754d983 obshistory: remove unused ismetablacklisted()
Anton Shestakov <av6@dwimlabs.net>
parents: 5071
diff changeset
    48
def addtouchnoise(ui):
3c1a5754d983 obshistory: remove unused ismetablacklisted()
Anton Shestakov <av6@dwimlabs.net>
parents: 5071
diff changeset
    49
    obsutil.METABLACKLIST.append(re.compile(br'^__touch-noise__$'))
3c1a5754d983 obshistory: remove unused ismetablacklisted()
Anton Shestakov <av6@dwimlabs.net>
parents: 5071
diff changeset
    50
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    51
@eh.command(
4715
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    52
    b'obslog|olog',
12c8b24757f4 py3: use byte strings for @command registrations
Martin von Zweigbergk <martinvonz@google.com>
parents: 4430
diff changeset
    53
    [(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
    54
     (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
    55
     (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
    56
     (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
    57
     (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
    58
     ] + commands.formatteropts,
4921
a7c01a2a3974 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4918 4915
diff changeset
    59
    _(b'hg olog [OPTION]... [[-r] REV]...'),
4894
f9743b13de6d help: categorizing evolve and topic commands
Rodrigo Damazio <rdamazio@google.com>
parents: 4827
diff changeset
    60
    **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
    61
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
    62
    """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
    63
2418
4993d1812311 olog: document the default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2416
diff changeset
    64
    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
    65
    working copy parent.
4993d1812311 olog: document the default value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2416
diff changeset
    66
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    67
    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
    68
    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
    69
    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
    70
    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
    71
    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
    72
    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
    73
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    74
    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
    75
    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
    76
    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
    77
2678
da2b3e5e4f69 docs: some fixes to the help text
Pulkit Goyal <7895pulkit@gmail.com>
parents: 2640
diff changeset
    78
    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
    79
    '--no-graph'.
2415
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
    '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
    82
    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
    83
    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
    84
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    85
    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
    86
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    87
    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
    88
    """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
    89
    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
    90
    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
    91
    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
    92
        revs = [b'.']
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    93
    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
    94
5173
dbbb48d93f18 obslog: remove the separate "obslog -f" implementation and use the common one
Anton Shestakov <av6@dwimlabs.net>
parents: 5172
diff changeset
    95
    # Use the default template unless the user provided one.
dbbb48d93f18 obslog: remove the separate "obslog -f" implementation and use the common one
Anton Shestakov <av6@dwimlabs.net>
parents: 5172
diff changeset
    96
    if not opts['template']:
4949
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
    97
        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
    98
2415
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
    99
    if opts['graph']:
5301
35c15057e2e5 obshistory: rename graph/revs-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5300
diff changeset
   100
        return displaygraph(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
89a5dabbb43d obshistory: move the command into the obshistory module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2411
diff changeset
   102
    revs.reverse()
5301
35c15057e2e5 obshistory: rename graph/revs-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5300
diff changeset
   103
    displayrevs(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
   104
4983
6d40e0166522 obslog: make {node} the full node and leave shortening to template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4953
diff changeset
   105
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
   106
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
   107
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
   108
    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
   109
    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
   110
}
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   111
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
   112
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
   113
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
   114
    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
   115
    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
   116
}
5169
897b371cd0c5 obslog: make operation template property into operations
Anton Shestakov <av6@dwimlabs.net>
parents: 5168
diff changeset
   117
TEMPLATE_OPERATIONS = b"""{if(operations, "using {label("evolve.operation", join(operations, ", "))}")}"""
5168
c7ca43bba6c5 obslog: make user template property into users
Anton Shestakov <av6@dwimlabs.net>
parents: 5166
diff changeset
   118
TEMPLATE_USERS = b"""by {label("evolve.user", join(users, ", "))}"""
5171
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   119
TEMPLATE_ONE_DATE = b"""({date(max(dates), "%a %b %d %H:%M:%S %Y %1%2")})"""
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   120
TEMPLATE_MANY_DATES = b"""(between {date(min(dates), "%a %b %d %H:%M:%S %Y %1%2")} and {date(max(dates), "%a %b %d %H:%M:%S %Y %1%2")})"""
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   121
TEMPLATE_DATES = b"""{label("evolve.date", ifeq(min(dates), max(dates), "%(onedate)s", "%(manydates)s"))}""" % {
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   122
    b"onedate": TEMPLATE_ONE_DATE,
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   123
    b"manydates": TEMPLATE_MANY_DATES
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   124
}
5170
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   125
TEMPLATE_NOTES = b"""{if(notes, notes % "\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
   126
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
   127
DEFAULT_TEMPLATE = (b"""%(firstline)s
5171
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   128
{markers %% "  {separate(" ", "%(rewrite)s", "%(operations)s", "%(users)s", "%(dates)s")}%(notes)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
   129
""") % {
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   130
    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
   131
    b"rewrite": TEMPLATE_REWRITE,
5169
897b371cd0c5 obslog: make operation template property into operations
Anton Shestakov <av6@dwimlabs.net>
parents: 5168
diff changeset
   132
    b"operations": TEMPLATE_OPERATIONS,
5168
c7ca43bba6c5 obslog: make user template property into users
Anton Shestakov <av6@dwimlabs.net>
parents: 5166
diff changeset
   133
    b"users": TEMPLATE_USERS,
5171
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   134
    b"dates": TEMPLATE_DATES,
5170
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   135
    b"notes": TEMPLATE_NOTES,
4952
b135591bec1a obslog: make {patch} not be indented and leave that to the template
Martin von Zweigbergk <martinvonz@google.com>
parents: 4951
diff changeset
   136
    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
   137
}
eb9bcef7cc5f obslog: redefine default output as a template, unless -f was given
Martin von Zweigbergk <martinvonz@google.com>
parents: 4948
diff changeset
   138
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5173
diff changeset
   139
class obsmarker_printer(logcmdutil.changesetprinter):
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   140
    """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
   141
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   142
    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
   143
    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
   144
3921
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   145
    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
   146
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   147
        if kwargs.pop('obspatch', False):
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5173
diff changeset
   148
            if logcmdutil.changesetdiffer is None:
3921
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   149
                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
   150
            else:
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   151
                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
   152
28824ad64a12 compat: restore compatibility with Mercurial <= 4.5
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3884
diff changeset
   153
        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
   154
        diffopts = kwargs.get('diffopts', {})
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   155
5193
a4d081923c81 compat: update hg-X.Y compat comments and test them
Anton Shestakov <av6@dwimlabs.net>
parents: 5182
diff changeset
   156
        # hg <= 4.6 (3fe1c9263024)
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   157
        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
   158
            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
   159
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   160
        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
   161
        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
   162
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   163
    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
   164
        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
   165
            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
   166
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   167
            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
   168
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   169
            _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
   170
            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
   171
5300
372dc6c5692a obshistory: rename node/ctx-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5216
diff changeset
   172
            displaynode(fm, self.repo, changenode)
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   173
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   174
            markerfm = fm.nested(b"markers")
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   175
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   176
            # Succs markers
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   177
            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
   178
                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
   179
                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
   180
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   181
                for successor in succs:
5302
f5d9b5771b45 obshistory: rename _debugobshistorydisplaymarker() to displaymarkers()
Anton Shestakov <av6@dwimlabs.net>
parents: 5301
diff changeset
   182
                    displaymarkers(self.ui, markerfm, successor[1],
f5d9b5771b45 obshistory: rename _debugobshistorydisplaymarker() to displaymarkers()
Anton Shestakov <av6@dwimlabs.net>
parents: 5301
diff changeset
   183
                                   [successor], ctx.node(), self.repo,
f5d9b5771b45 obshistory: rename _debugobshistorydisplaymarker() to displaymarkers()
Anton Shestakov <av6@dwimlabs.net>
parents: 5301
diff changeset
   184
                                   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
   185
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   186
            else:
5056
456129fdcf93 obshistory: use successorsandmarkers() from obsutil, drop local variant
Anton Shestakov <av6@dwimlabs.net>
parents: 5055
diff changeset
   187
                r = obsutil.successorsandmarkers(self.repo, ctx)
456129fdcf93 obshistory: use successorsandmarkers() from obsutil, drop local variant
Anton Shestakov <av6@dwimlabs.net>
parents: 5055
diff changeset
   188
                if r is None:
456129fdcf93 obshistory: use successorsandmarkers() from obsutil, drop local variant
Anton Shestakov <av6@dwimlabs.net>
parents: 5055
diff changeset
   189
                    r = []
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   190
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   191
                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
   192
                    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
   193
                    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
   194
                        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
   195
                    successors = succset[b"successors"]
5302
f5d9b5771b45 obshistory: rename _debugobshistorydisplaymarker() to displaymarkers()
Anton Shestakov <av6@dwimlabs.net>
parents: 5301
diff changeset
   196
                    displaymarkers(self.ui, markerfm, successors, markers,
f5d9b5771b45 obshistory: rename _debugobshistorydisplaymarker() to displaymarkers()
Anton Shestakov <av6@dwimlabs.net>
parents: 5301
diff changeset
   197
                                   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
   198
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   199
            markerfm.end()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   200
4940
93c89814a5d8 obslog: avoid using a formatter after calling end() on it
Martin von Zweigbergk <martinvonz@google.com>
parents: 4939
diff changeset
   201
            fm.plain(b'\n')
2955
b899a94472fd obslog: uniformize `_debugobshistoryrevs` and `_debugobshistorygraph` arguments
Alain Leufroy
parents: 2954
diff changeset
   202
            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
   203
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   204
            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
   205
        else:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   206
            ### 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
   207
            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
   208
            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
   209
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   210
    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
   211
        ''' 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
   212
        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
   213
        '''
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   214
        pass
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   215
5305
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   216
def patchavailable(node, repo, candidates, successive=True):
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   217
    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
   218
        return False, b"context is not local"
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   219
5305
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   220
    if len(candidates) == 0:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   221
        if successive:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   222
            msg = b"no successors"
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   223
        else:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   224
            msg = b"no predecessors"
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   225
        return False, msg
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   226
    elif len(candidates) > 1:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   227
        if successive:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   228
            msg = b"too many successors (%d)"
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   229
        else:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   230
            msg = b"too many predecessors (%d)"
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   231
        return False, msg % len(candidates)
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   232
5305
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   233
    cand = candidates[0]
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   234
5305
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   235
    if cand not in repo:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   236
        if successive:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   237
            msg = b"successor is unknown locally"
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   238
        else:
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   239
            msg = b"predecessor is unknown locally"
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   240
        return False, msg
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   241
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   242
    # Check that both node and cand have the same parents
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   243
    nodep1, nodep2 = repo[node].p1(), repo[node].p2()
5305
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   244
    candp1, candp2 = repo[cand].p1(), repo[cand].p2()
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   245
5305
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   246
    if nodep1 != candp1 or nodep2 != candp2:
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   247
        return False, b"changesets rebased"
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   248
5305
292de4cca111 obshistory: make patchavailable() handle predecessors too
Anton Shestakov <av6@dwimlabs.net>
parents: 5303
diff changeset
   249
    return True, cand
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   250
3402
7a322f58fee3 obshistory: pass the csets description in getmarkerdescriptionpatch
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3401
diff changeset
   251
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
   252
    # 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
   253
    # 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
   254
    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
   255
    succdesc += b'\n'
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   256
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   257
    # 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
   258
    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
   259
    succname = b"changeset-description"
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   260
5182
df5e6e3884bc compat: drop 4.5 compatibility for strdiff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5181
diff changeset
   261
    uheaders, hunks = mdiff.unidiff(basedesc, b'', succdesc, b'',
df5e6e3884bc compat: drop 4.5 compatibility for strdiff
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5181
diff changeset
   262
                                    basename, succname, False)
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   263
3604
d24ba168a532 obslog: cleanup patch handling after 4.1 compat drop
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3519
diff changeset
   264
    # 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
   265
    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
   266
    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
   267
3399
4adf46158b9b obslog: colorize the description diff shown in obslog -p
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3398
diff changeset
   268
    return patch
2639
a5d8062f55ba obslog: also display description patch with --patch
Boris Feld <boris.feld@octobus.net>
parents: 2638
diff changeset
   269
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   270
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
   271
    ''' 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
   272
    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
   273
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   274
    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
   275
        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
   276
        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
   277
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   278
    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
   279
        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
   280
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   281
    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
   282
        # 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
   283
        return True
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   284
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   285
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
   286
    """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
   287
    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
   288
    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
   289
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   290
    >>> 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
   291
    True
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   292
    >>> 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
   293
    False
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   294
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   295
    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
   296
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   297
    """
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   298
    visited = set()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   299
    o = object()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   300
    path = [o]
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   301
    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
   302
    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
   303
    while stack:
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   304
        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
   305
            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
   306
                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
   307
                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
   308
            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
   309
                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
   310
                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
   311
                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
   312
                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
   313
                break
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   314
        else:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   315
            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
   316
            stack.pop()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   317
    return False
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   318
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   319
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
   320
    """ 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
   321
    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
   322
    (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
   323
    """
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   324
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   325
    # 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
   326
    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
   327
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   328
    # 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
   329
    shown = set()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   330
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   331
    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
   332
        """ 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
   333
        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
   334
        """
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   335
        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
   336
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   337
    # 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
   338
    while candidates:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   339
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   340
        # 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
   341
        # 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
   342
        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
   343
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   344
        # If we likely have a cycle
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   345
        if not validcandidates:
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   346
            cycle = cyclic(nodesucc)
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   347
            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
   348
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   349
            # Then choose a random node from the cycle
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   350
            breaknode = sorted(cycle)[0]
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   351
            # 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
   352
            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
   353
                          % nodemod.short(breaknode))
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   354
            validcandidates = [breaknode]
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   355
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   356
        # 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
   357
        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
   358
            # 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
   359
            candidates.remove(cand)
2411
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   360
            # 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
   361
            try:
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   362
                del nodesucc[cand]
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   363
            except KeyError:
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   364
                pass
bd937b7ce7d2 debugobshistory: handle multiple cycles
Boris Feld <boris.feld@octobus.net>
parents: 2407
diff changeset
   365
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   366
            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
   367
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   368
            # 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
   369
            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
   370
                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
   371
            else:
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   372
                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
   373
                    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
   374
                else:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   375
                    continue
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   376
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   377
            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
   378
                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
   379
            else:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   380
                relations = obsutil.closestpredecessors(repo, cand)
5216
8c131b97e197 obshistory: give a more correct name to a variable
Anton Shestakov <av6@dwimlabs.net>
parents: 5193
diff changeset
   381
            parents = [(graphmod.PARENT, x) for x in relations]
8c131b97e197 obshistory: give a more correct name to a variable
Anton Shestakov <av6@dwimlabs.net>
parents: 5193
diff changeset
   382
            yield (cand, graphmod.CHANGESET, changectx, parents)
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   383
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
   384
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
   385
    """ 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
   386
    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
   387
    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
   388
    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
   389
    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
   390
    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
   391
    - 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
   392
    - 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
   393
    - 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
   394
    """
2840
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2832
diff changeset
   395
    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
   396
    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
   397
    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
   398
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   399
    # 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
   400
    nodesucc = dict()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   401
    # Childrens
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   402
    nodeprec = dict()
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   403
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   404
    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
   405
    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
   406
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   407
    # 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
   408
    while nodes:
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   409
        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
   410
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   411
        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
   412
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   413
        nodeprec[node] = []
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   414
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   415
        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
   416
            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
   417
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   418
            # 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
   419
            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
   420
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   421
            # 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
   422
            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
   423
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   424
            # 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
   425
            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
   426
                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
   427
                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
   428
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
   429
        # 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
   430
        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
   431
            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
   432
                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
   433
                    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
   434
                        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
   435
                        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
   436
2407
783a74c60a5e obshistory: add a graph option on the debugobshistory command
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2406
diff changeset
   437
    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
   438
5301
35c15057e2e5 obshistory: rename graph/revs-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5300
diff changeset
   439
def displaygraph(ui, repo, revs, opts):
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   440
4752
8a73a8df63b6 py3: convert opts keys to bytes before passing to core APIs
Martin von Zweigbergk <martinvonz@google.com>
parents: 4747
diff changeset
   441
    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
   442
                                  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
   443
                                  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
   444
    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
   445
    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
   446
                               opts.get('filternonlocal', False))
5181
c979d64a2589 compat: drop 4.5 compatibility layer for log utility
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 5173
diff changeset
   447
    logcmdutil.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
   448
5301
35c15057e2e5 obshistory: rename graph/revs-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5300
diff changeset
   449
def displayrevs(ui, repo, revs, opts):
2633
59e85fbb31b6 obslog: small renaming of _debugobshistorysingle
Boris Feld <boris.feld@octobus.net>
parents: 2610
diff changeset
   450
    """ Display the obsolescence history for revset
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   451
    """
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   452
    fm = ui.formatter(b'debugobshistory', pycompat.byteskwargs(opts))
5303
61538e2db220 obshistory: rename precursors to predecessors in displayrevs()
Anton Shestakov <av6@dwimlabs.net>
parents: 5302
diff changeset
   453
    predecessors = repo.obsstore.predecessors
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   454
    successors = repo.obsstore.successors
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   455
    nodec = repo.changelog.node
2635
9ab35c37b85a obslog: pass directly unfiltered_repo
Boris Feld <boris.feld@octobus.net>
parents: 2634
diff changeset
   456
    unfi = repo.unfiltered()
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   457
    nodes = [nodec(r) for r in revs]
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   458
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   459
    seen = set(nodes)
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   460
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   461
    while nodes:
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   462
        ctxnode = nodes.pop()
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   463
5300
372dc6c5692a obshistory: rename node/ctx-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5216
diff changeset
   464
        displaynode(fm, unfi, ctxnode)
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   465
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   466
        succs = successors.get(ctxnode, ())
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   467
4814
48b30ff742cb python3: use format-source to run byteify-strings in .py files
Raphaël Gomès <rgomes@octobus.net>
parents: 4801
diff changeset
   468
        markerfm = fm.nested(b"markers")
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   469
        for successor in sorted(succs):
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   470
            includediff = opts and opts.get("patch")
5302
f5d9b5771b45 obshistory: rename _debugobshistorydisplaymarker() to displaymarkers()
Anton Shestakov <av6@dwimlabs.net>
parents: 5301
diff changeset
   471
            displaymarkers(ui, markerfm, successor[1], [successor], ctxnode,
f5d9b5771b45 obshistory: rename _debugobshistorydisplaymarker() to displaymarkers()
Anton Shestakov <av6@dwimlabs.net>
parents: 5301
diff changeset
   472
                           unfi, includediff)
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   473
        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
   474
        fm.plain(b'\n')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   475
5303
61538e2db220 obshistory: rename precursors to predecessors in displayrevs()
Anton Shestakov <av6@dwimlabs.net>
parents: 5302
diff changeset
   476
        preds = predecessors.get(ctxnode, ())
61538e2db220 obshistory: rename precursors to predecessors in displayrevs()
Anton Shestakov <av6@dwimlabs.net>
parents: 5302
diff changeset
   477
        for p in sorted(preds):
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   478
            # Only show nodes once
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   479
            if p[0] not in seen:
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   480
                seen.add(p[0])
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   481
                nodes.append(p[0])
2955
b899a94472fd obslog: uniformize `_debugobshistoryrevs` and `_debugobshistorygraph` arguments
Alain Leufroy
parents: 2954
diff changeset
   482
    fm.end()
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   483
5300
372dc6c5692a obshistory: rename node/ctx-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5216
diff changeset
   484
def displaynode(fm, repo, node):
2635
9ab35c37b85a obslog: pass directly unfiltered_repo
Boris Feld <boris.feld@octobus.net>
parents: 2634
diff changeset
   485
    if node in repo:
5300
372dc6c5692a obshistory: rename node/ctx-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5216
diff changeset
   486
        displayctx(fm, repo[node])
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   487
    else:
5300
372dc6c5692a obshistory: rename node/ctx-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5216
diff changeset
   488
        displaymissingctx(fm, node)
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   489
5300
372dc6c5692a obshistory: rename node/ctx-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5216
diff changeset
   490
def displayctx(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
   491
    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
   492
    if shortdescription:
1b1badb3d2fc obshistory: make obslog work when a commit doesn't have any description
Anton Shestakov <av6@dwimlabs.net>
parents: 3728
diff changeset
   493
        shortdescription = shortdescription.splitlines()[0]
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   494
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   495
    fm.startitem()
4917
d1d8e97d32af obslog: make changeset available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4894
diff changeset
   496
    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
   497
    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
   498
    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
   499
    fm.plain(b' ')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   500
4918
f16274729530 obslog: don't overwrite {rev} keyword from changeset context
Martin von Zweigbergk <martinvonz@google.com>
parents: 4917
diff changeset
   501
    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
   502
    fm.plain(b' ')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   503
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
    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
   505
             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
   506
    fm.plain(b'\n')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   507
5300
372dc6c5692a obshistory: rename node/ctx-displaying functions
Anton Shestakov <av6@dwimlabs.net>
parents: 5216
diff changeset
   508
def displaymissingctx(fm, nodewithoutctx):
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   509
    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
   510
    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
   511
    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
   512
             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
   513
    fm.plain(b'\n')
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   514
5302
f5d9b5771b45 obshistory: rename _debugobshistorydisplaymarker() to displaymarkers()
Anton Shestakov <av6@dwimlabs.net>
parents: 5301
diff changeset
   515
def displaymarkers(ui, fm, succnodes, markers, node, repo, includediff=False):
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   516
    fm.startitem()
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   517
5172
52301aff269e obslog: provide successors and multiple markers to marker-displaying function
Anton Shestakov <av6@dwimlabs.net>
parents: 5171
diff changeset
   518
    verb = _successorsetverb(succnodes, markers)[b"verb"]
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   519
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   520
    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
   521
5172
52301aff269e obslog: provide successors and multiple markers to marker-displaying function
Anton Shestakov <av6@dwimlabs.net>
parents: 5171
diff changeset
   522
    effects = _markerseffects(markers)
5066
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   523
    if effects:
5166
27845c5aefb3 obslog: use fm.data() instead of fm.write() because it's all templates now
Anton Shestakov <av6@dwimlabs.net>
parents: 5123
diff changeset
   524
        fmteffects = fm.formatlist(effects, b'effect', sep=b', ')
27845c5aefb3 obslog: use fm.data() instead of fm.write() because it's all templates now
Anton Shestakov <av6@dwimlabs.net>
parents: 5123
diff changeset
   525
        fm.data(effects=fmteffects)
2453
ad08aedf25ac obshistory: display informations from the obs marker effect flag
Boris Feld <boris.feld@octobus.net>
parents: 2450
diff changeset
   526
2832
07b9fcf8b6d3 output: update obsfate / obslog output order
Boris Feld <boris.feld@octobus.net>
parents: 2697
diff changeset
   527
    if len(succnodes) > 0:
4951
7bfd3fed5d1f obslog: make {succnodes} be full hex nodes
Martin von Zweigbergk <martinvonz@google.com>
parents: 4950
diff changeset
   528
        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
   529
        nodes = fm.formatlist(hexnodes, b'succnode')
5166
27845c5aefb3 obslog: use fm.data() instead of fm.write() because it's all templates now
Anton Shestakov <av6@dwimlabs.net>
parents: 5123
diff changeset
   530
        fm.data(succnodes=nodes)
2832
07b9fcf8b6d3 output: update obsfate / obslog output order
Boris Feld <boris.feld@octobus.net>
parents: 2697
diff changeset
   531
5169
897b371cd0c5 obslog: make operation template property into operations
Anton Shestakov <av6@dwimlabs.net>
parents: 5168
diff changeset
   532
    # Operations
5172
52301aff269e obslog: provide successors and multiple markers to marker-displaying function
Anton Shestakov <av6@dwimlabs.net>
parents: 5171
diff changeset
   533
    operations = obsutil.markersoperations(markers)
5169
897b371cd0c5 obslog: make operation template property into operations
Anton Shestakov <av6@dwimlabs.net>
parents: 5168
diff changeset
   534
    if operations:
897b371cd0c5 obslog: make operation template property into operations
Anton Shestakov <av6@dwimlabs.net>
parents: 5168
diff changeset
   535
        fm.data(operations=fm.formatlist(operations, name=b'operation', sep=b', '))
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   536
5168
c7ca43bba6c5 obslog: make user template property into users
Anton Shestakov <av6@dwimlabs.net>
parents: 5166
diff changeset
   537
    # Users
5172
52301aff269e obslog: provide successors and multiple markers to marker-displaying function
Anton Shestakov <av6@dwimlabs.net>
parents: 5171
diff changeset
   538
    users = obsutil.markersusers(markers)
5168
c7ca43bba6c5 obslog: make user template property into users
Anton Shestakov <av6@dwimlabs.net>
parents: 5166
diff changeset
   539
    fm.data(users=fm.formatlist(users, name=b'user', sep=b', '))
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   540
5171
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   541
    # Dates
5172
52301aff269e obslog: provide successors and multiple markers to marker-displaying function
Anton Shestakov <av6@dwimlabs.net>
parents: 5171
diff changeset
   542
    dates = obsutil.markersdates(markers)
5171
7f7f40cc6c9b obslog: make date template property into dates
Anton Shestakov <av6@dwimlabs.net>
parents: 5170
diff changeset
   543
    fm.data(dates=fm.formatlist(dates, name=b'date'))
2403
1b348702d79e obshistory: refactor debugobshistory
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   544
5170
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   545
    # Notes
5172
52301aff269e obslog: provide successors and multiple markers to marker-displaying function
Anton Shestakov <av6@dwimlabs.net>
parents: 5171
diff changeset
   546
    notes = _markersnotes(markers)
5170
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   547
    if notes:
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   548
        fm.data(notes=fm.formatlist(notes, name=b'note', sep=b'\n'))
3214
9fe2b3fd7fc7 obslog: add initial support for showing note in obslog
Pulkit Goyal <7895pulkit@gmail.com>
parents: 3181
diff changeset
   549
2637
49f2741c4dd7 obslog: add a patch option
Boris Feld <boris.feld@octobus.net>
parents: 2636
diff changeset
   550
    # Patch display
3746
4dcf87849f9d compat: fix obslog with Mercurial 4.6+
Boris Feld <boris.feld@octobus.net>
parents: 3729
diff changeset
   551
    if includediff is True:
5172
52301aff269e obslog: provide successors and multiple markers to marker-displaying function
Anton Shestakov <av6@dwimlabs.net>
parents: 5171
diff changeset
   552
        _patchavailable = patchavailable(node, repo, succnodes)
3884
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   553
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   554
        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
   555
            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
   556
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   557
            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
   558
            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
   559
            # Description patch
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   560
            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
   561
                                                         basectx.description(),
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   562
                                                         succctx.description())
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   563
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   564
            if descriptionpatch:
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   565
                # 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
   566
                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
   567
                             (basectx, succctx)
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   568
                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
   569
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   570
                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
   571
                    return [text]
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   572
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   573
                ui.pushbuffer(labeled=True)
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   574
                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
   575
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   576
                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
   577
                    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
   578
                    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
   579
                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
   580
16bec7609a08 obslog: add a new flag to filter out non-local nodes
Boris Feld <boris.feld@octobus.net>
parents: 3883
diff changeset
   581
            # Content patch
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   582
            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
   583
            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
   584
            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
   585
            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
   586
            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
   587
            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
   588
                                             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
   589
                if firstline:
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   590
                    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
   591
                    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
   592
                if linestart:
c16fed4908d8 obslog: only indent the first chunk and chunks just after newlines (issue6175)
Anton Shestakov <av6@dwimlabs.net>
parents: 4752
diff changeset
   593
                    linestart = False
4827
4c6dd20e8cc2 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 4814 4823
diff changeset
   594
                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
   595
                    linestart = True
4946
bd992b1d4426 obslog: make content and description patches available to templater
Martin von Zweigbergk <martinvonz@google.com>
parents: 4945
diff changeset
   596
                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
   597
            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
   598
        else:
4950
60d2065b720b obslog: remove now-unused code for plain styling
Martin von Zweigbergk <martinvonz@google.com>
parents: 4949
diff changeset
   599
            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
   600
2520
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   601
def _prepare_hunk(hunk):
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   602
    """Drop all information but the username and patch"""
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   603
    cleanunk = []
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   604
    for line in hunk.splitlines():
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   605
        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
   606
            if line.startswith(b'@@'):
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   607
                line = b'@@\n'
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   608
            cleanunk.append(line)
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   609
    return cleanunk
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   610
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   611
def _getdifflines(iterdiff):
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   612
    """return a cleaned up lines"""
2450
98613938d098 effectflag: basic diff change detection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2449
diff changeset
   613
    try:
4738
45508676ed00 py3: replace iter.next() by next(iter)
Martin von Zweigbergk <martinvonz@google.com>
parents: 4715
diff changeset
   614
        lines = next(iterdiff)
2450
98613938d098 effectflag: basic diff change detection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2449
diff changeset
   615
    except StopIteration:
98613938d098 effectflag: basic diff change detection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2449
diff changeset
   616
        return None
2520
5fb5d096348c effectflag: better diff detection
Boris Feld <boris.feld@octobus.net>
parents: 2492
diff changeset
   617
    return _prepare_hunk(lines)
2450
98613938d098 effectflag: basic diff change detection
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2449
diff changeset
   618
5057
da5cc4e493ff obshistory: drop unused keyword argument to _getobsfateandsuccs()
Anton Shestakov <av6@dwimlabs.net>
parents: 5056
diff changeset
   619
def _getobsfateandsuccs(repo, revnode):
2488
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   620
    """ Return a tuple containing:
5053
196ed65594dc evolve: correct spelling of superseded everywhere else
Anton Shestakov <av6@dwimlabs.net>
parents: 5052
diff changeset
   621
    - 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
   622
    - 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
   623
    or has diverged
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   624
    """
5057
da5cc4e493ff obshistory: drop unused keyword argument to _getobsfateandsuccs()
Anton Shestakov <av6@dwimlabs.net>
parents: 5056
diff changeset
   625
    successorssets = obsutil.successorssets(repo, revnode)
5052
b9a7fb0a0a49 evolve: use obsutil._getobsfate() directly
Anton Shestakov <av6@dwimlabs.net>
parents: 4983
diff changeset
   626
    fate = obsutil._getobsfate(successorssets)
2488
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   627
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   628
    # 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
   629
    if len(successorssets) == 1:
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   630
        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
   631
    else:
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   632
        successors = []
2490
94f171534918 template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   633
        for succset in successorssets:
94f171534918 template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   634
            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
   635
1bdbe8f55339 refactor: extract obs fate algorithm from _getobsoletereason
Boris Feld <boris.feld@octobus.net>
parents: 2484
diff changeset
   636
    return (fate, successors)
2490
94f171534918 template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents: 2488
diff changeset
   637
5170
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   638
def _markersnotes(markers):
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   639
    markersmeta = [dict(m[3]) for m in markers]
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   640
    notes = [meta.get(b'note') for meta in markersmeta]
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   641
    return sorted(note for note in notes if note)
f8488bdc9e4b obslog: make note template property into notes
Anton Shestakov <av6@dwimlabs.net>
parents: 5169
diff changeset
   642
5067
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   643
EFFECTMAPPING = util.sortdict([
5068
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   644
    (obsutil.DESCCHANGED, b'description'),
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   645
    (obsutil.METACHANGED, b'meta'),
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   646
    (obsutil.USERCHANGED, b'user'),
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   647
    (obsutil.DATECHANGED, b'date'),
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   648
    (obsutil.BRANCHCHANGED, b'branch'),
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   649
    (obsutil.PARENTCHANGED, b'parent'),
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   650
    (obsutil.DIFFCHANGED, b'content'),
5067
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   651
])
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   652
5066
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   653
def _markerseffects(markers):
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   654
    """ 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
   655
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   656
    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
   657
    markers collectively have more than one effect in the flags.
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   658
    """
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   659
    metadata = [dict(marker[3]) for marker in markers]
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   660
    ef1 = [data.get(b'ef1') for data in metadata]
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   661
    effects = []
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   662
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   663
    combined = 0
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   664
    for ef in ef1:
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   665
        if ef:
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   666
            combined |= int(ef)
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   667
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   668
    if combined:
5067
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   669
        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
   670
            if combined & key:
e07f6af3cfec obshistory: make a {flag value: description} dict for _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5066
diff changeset
   671
                effects.append(value)
5066
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   672
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   673
    return effects
8dc865544aa1 obshistory: factor out _markerseffects()
Anton Shestakov <av6@dwimlabs.net>
parents: 5065
diff changeset
   674
2896
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   675
VERBMAPPING = {
5068
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   676
    obsutil.DESCCHANGED: b"reworded",
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   677
    obsutil.METACHANGED: b"meta-changed",
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   678
    obsutil.USERCHANGED: b"reauthored",
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   679
    obsutil.DATECHANGED: b"date-changed",
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   680
    obsutil.BRANCHCHANGED: b"branch-changed",
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   681
    obsutil.PARENTCHANGED: b"rebased",
715c85f250e0 obshistory: use effect flags from obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 5067
diff changeset
   682
    obsutil.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
   683
}
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   684
5065
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   685
def _markerspreciseverb(markers):
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   686
    """ 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
   687
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   688
    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
   689
    markers collectively have more than one effect in the flags.
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   690
    """
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   691
    metadata = [dict(marker[3]) for marker in markers]
5115
f44cc9abf21c obshistory: add 'folded' to the list of precise verbs
Anton Shestakov <av6@dwimlabs.net>
parents: 5072
diff changeset
   692
f44cc9abf21c obshistory: add 'folded' to the list of precise verbs
Anton Shestakov <av6@dwimlabs.net>
parents: 5072
diff changeset
   693
    if len(metadata) == 1 and metadata[0].get(b'fold-id') is not None:
f44cc9abf21c obshistory: add 'folded' to the list of precise verbs
Anton Shestakov <av6@dwimlabs.net>
parents: 5072
diff changeset
   694
        return b'folded'
f44cc9abf21c obshistory: add 'folded' to the list of precise verbs
Anton Shestakov <av6@dwimlabs.net>
parents: 5072
diff changeset
   695
5065
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   696
    ef1 = [data.get(b'ef1') for data in metadata]
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   697
    if all(ef1):
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   698
        combined = 0
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   699
        for ef in ef1:
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   700
            combined |= int(ef)
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   701
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   702
        # 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
   703
        if combined in VERBMAPPING:
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   704
            return VERBMAPPING[combined]
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   705
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   706
def _successorsetverb(successorset, markers):
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   707
    """ Return the verb summarizing the successorset
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   708
    """
2896
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   709
    verb = None
2606
02129bed002c obsfate: improve prune support in _successorsetverb
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2604
diff changeset
   710
    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
   711
        verb = b'pruned'
2607
054d92586e43 obsfate: use 'split' as verb when appropriate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2606
diff changeset
   712
    elif len(successorset) == 1:
5065
877d80a205d1 obshistory: factor out _markerspreciseverb()
Anton Shestakov <av6@dwimlabs.net>
parents: 5058
diff changeset
   713
        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
   714
462adae9fea7 obsfate: use effect flag information for computing a better verb
Boris Feld <boris.feld@octobus.net>
parents: 2840
diff changeset
   715
        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
   716
            verb = b'rewritten'
2606
02129bed002c obsfate: improve prune support in _successorsetverb
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2604
diff changeset
   717
    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
   718
        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
   719
    return {b'verb': verb}
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2586
diff changeset
   720
3181
5db76f35efce effect-flag: fix obsfate verb hooking
Boris Feld <boris.feld@octobus.net>
parents: 3115
diff changeset
   721
# 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
   722
@eh.wrapfunction(obsutil, 'obsfateverb')
c95e68e8a219 obshistory: remove obsfateverb/obsfateprinter patching compatibility
Anton Shestakov <av6@dwimlabs.net>
parents: 5057
diff changeset
   723
def obsfateverb(orig, *args, **kwargs):
c95e68e8a219 obshistory: remove obsfateverb/obsfateprinter patching compatibility
Anton Shestakov <av6@dwimlabs.net>
parents: 5057
diff changeset
   724
    return _successorsetverb(*args, **kwargs)[b'verb']