hgext3rd/evolve/templatekw.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sun, 04 Mar 2018 17:41:45 -0500
changeset 3517 dc31ec3ef042
parent 3516 359734049764
child 3606 9f2ba8ef517b
permissions -rw-r--r--
compat: register a version of 'obsfatedata' template that works with 4.6 Since showlist is deprecated, let us use compatlist.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#                Logilab SA        <contact@logilab.fr>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
#                Pierre-Yves David <pierre-yves.david@ens-lyon.org>
519
9825c7da5b54 ensure all file have a copyright notice
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 517
diff changeset
     4
#                Patrick Mezard <patrick@mezard.eu>
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
#
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
     8
"""evolve templates
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
     9
"""
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
    10
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
    11
from . import (
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3378
diff changeset
    12
    compat,
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
    13
    error,
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
    14
    exthelper,
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
    15
    obshistory
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
    16
)
617
469befc27b26 detect incompatibility with future mercurial 2.5
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 616
diff changeset
    17
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    18
from mercurial import (
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    19
    templatekw,
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
    20
    node,
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
    21
    util
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    22
)
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
    23
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
    24
eh = exthelper.exthelper()
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    25
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    26
### template keywords
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    27
# XXX it does not handle troubles well :-/
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    28
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    29
@eh.templatekw('obsolete')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    30
def obsoletekw(repo, ctx, templ, **args):
2926
1abafae41fe2 evolve: use registrar.templatekeyword to register template keyword functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2840
diff changeset
    31
    """String. Whether the changeset is ``obsolete``.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    32
    """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    33
    if ctx.obsolete():
1732
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
    34
        return 'obsolete'
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
    35
    return ''
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
    36
3516
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    37
if util.safehasattr(templatekw, 'compatlist'):
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    38
    @eh.templatekw('troubles', requires=set(['ctx', 'templ']))
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    39
    def showtroubles(context, mapping):
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    40
        ctx = context.resource(mapping, 'ctx')
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    41
        return templatekw.compatlist(context, mapping, 'trouble',
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    42
                                     ctx.instabilities(), plural='troubles')
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    43
else:
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    44
    # older template API in hg < 4.6
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    45
    @eh.templatekw('troubles')
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    46
    def showtroubles(**args):
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    47
        """List of strings. Evolution troubles affecting the changeset
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    48
        (zero or more of "unstable", "divergent" or "bumped")."""
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    49
        ctx = args['ctx']
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    50
        try:
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    51
            # specify plural= explicitly to trigger TypeError on hg < 4.2
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    52
            return templatekw.showlist('trouble', ctx.instabilities(), args,
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    53
                                       plural='troubles')
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    54
        except TypeError:
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    55
            return templatekw.showlist('trouble', ctx.instabilities(), plural='troubles',
359734049764 compat: register a version of 'troubles' template that works with 4.6 API
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3512
diff changeset
    56
                                       **args)
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
    57
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    58
if util.safehasattr(templatekw, 'showpredecessors'):
3512
57033b0bd347 compat: more straight forward alias for old template names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3483
diff changeset
    59
    templatekw.keywords["precursors"] = templatekw.showpredecessors
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    60
else:
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    61
    # for version <= hg4.3
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    62
    def closestprecursors(repo, nodeid):
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    63
        """ Yield the list of next precursors pointing on visible changectx nodes
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    64
        """
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
    65
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    66
        precursors = repo.obsstore.predecessors
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    67
        stack = [nodeid]
3378
577bfc34e19b test: add missing cycle test
Boris Feld <boris.feld@octobus.net>
parents: 3083
diff changeset
    68
        seen = set(stack)
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
    69
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    70
        while stack:
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    71
            current = stack.pop()
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    72
            currentpreccs = precursors.get(current, ())
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    73
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    74
            for prec in currentpreccs:
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    75
                precnodeid = prec[0]
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
    76
3378
577bfc34e19b test: add missing cycle test
Boris Feld <boris.feld@octobus.net>
parents: 3083
diff changeset
    77
                # Basic cycle protection
577bfc34e19b test: add missing cycle test
Boris Feld <boris.feld@octobus.net>
parents: 3083
diff changeset
    78
                if precnodeid in seen:
577bfc34e19b test: add missing cycle test
Boris Feld <boris.feld@octobus.net>
parents: 3083
diff changeset
    79
                    continue
577bfc34e19b test: add missing cycle test
Boris Feld <boris.feld@octobus.net>
parents: 3083
diff changeset
    80
                seen.add(precnodeid)
577bfc34e19b test: add missing cycle test
Boris Feld <boris.feld@octobus.net>
parents: 3083
diff changeset
    81
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    82
                if precnodeid in repo:
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    83
                    yield precnodeid
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    84
                else:
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    85
                    stack.append(precnodeid)
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
    86
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    87
    @eh.templatekw("precursors")
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    88
    def shownextvisibleprecursors(repo, ctx, **args):
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    89
        """Returns a string containing the list of the closest precursors
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    90
        """
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    91
        precursors = sorted(closestprecursors(repo, ctx.node()))
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    92
        precursors = [node.hex(p) for p in precursors]
2528
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
    93
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    94
        # <= hg-4.1 requires an explicite gen.
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    95
        # we can use None once the support is dropped
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    96
        #
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    97
        # They also requires an iterator instead of an iterable.
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    98
        gen = iter(" ".join(p[:12] for p in precursors))
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
    99
        return templatekw._hybrid(gen.__iter__(), precursors, lambda x: {'precursor': x},
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   100
                                  lambda d: d['precursor'][:12])
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   101
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   102
def closestsuccessors(repo, nodeid):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   103
    """ returns the closest visible successors sets instead.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   104
    """
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   105
    return directsuccessorssets(repo, nodeid)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   106
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   107
if util.safehasattr(templatekw, 'showsuccessorssets'):
3512
57033b0bd347 compat: more straight forward alias for old template names
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3483
diff changeset
   108
    templatekw.keywords["successors"] = templatekw.showsuccessorssets
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   109
else:
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   110
    # for version <= hg4.3
2601
20c1e035101b template: update successors doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2600
diff changeset
   111
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   112
    @eh.templatekw("successors")
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   113
    def shownextvisiblesuccessors(repo, ctx, templ, **args):
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   114
        """Returns a string of sets of successors for a changectx
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   115
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   116
        Format used is: [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   117
        ctx2 while also diverged into ctx3"""
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   118
        if not ctx.obsolete():
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   119
            return ''
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   120
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   121
        ssets, _ = closestsuccessors(repo, ctx.node())
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   122
        ssets = [[node.hex(n) for n in ss] for ss in ssets]
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   123
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   124
        data = []
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   125
        gen = []
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   126
        for ss in ssets:
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   127
            subgen = '[%s]' % ', '.join(n[:12] for n in ss)
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   128
            gen.append(subgen)
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   129
            h = templatekw._hybrid(iter(subgen), ss, lambda x: {'successor': x},
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   130
                                   lambda d: "%s" % d["successor"])
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   131
            data.append(h)
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   132
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   133
        gen = ', '.join(gen)
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   134
        return templatekw._hybrid(iter(gen), data, lambda x: {'successorset': x},
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   135
                                  lambda d: d["successorset"])
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   136
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   137
def _getusername(ui):
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   138
    """the default username in the config or None"""
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   139
    try:
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   140
        return ui.username()
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   141
    except error.Abort: # no easy way to avoid ui raising Abort here :-/
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   142
        return None
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   143
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   144
def obsfatedefaulttempl(ui):
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   145
    """ Returns a dict with the default templates for obs fate
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   146
    """
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   147
    # Prepare templates
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   148
    verbtempl = '{verb}'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   149
    usertempl = '{if(users, " by {join(users, ", ")}")}'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   150
    succtempl = '{if(successors, " as ")}{successors}' # Bypass if limitation
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   151
    datetempleq = ' (at {min_date|isodate})'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   152
    datetemplnoteq = ' (between {min_date|isodate} and {max_date|isodate})'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   153
    datetempl = '{if(max_date, "{ifeq(min_date, max_date, "%s", "%s")}")}' % (datetempleq, datetemplnoteq)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   154
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   155
    optionalusertempl = usertempl
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   156
    username = _getusername(ui)
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   157
    if username is not None:
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   158
        optionalusertempl = ('{ifeq(join(users, "\0"), "%s", "", "%s")}'
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   159
                             % (username, usertempl))
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   160
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   161
    # Assemble them
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   162
    return {
2629
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   163
        'obsfate_quiet': verbtempl + succtempl,
2832
07b9fcf8b6d3 output: update obsfate / obslog output order
Boris Feld <boris.feld@octobus.net>
parents: 2690
diff changeset
   164
        'obsfate': verbtempl + succtempl + optionalusertempl,
07b9fcf8b6d3 output: update obsfate / obslog output order
Boris Feld <boris.feld@octobus.net>
parents: 2690
diff changeset
   165
        'obsfate_verbose': verbtempl + succtempl + usertempl + datetempl,
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   166
    }
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   167
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   168
def obsfatedata(repo, ctx):
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   169
    """compute the raw data needed for computing obsfate
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   170
    Returns a list of dict
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   171
    """
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
   172
    if not ctx.obsolete():
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   173
        return None
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
   174
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   175
    successorssets, pathcache = closestsuccessors(repo, ctx.node())
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   176
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   177
    # closestsuccessors returns an empty list for pruned revisions, remap it
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   178
    # into a list containing en empty list for future processing
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   179
    if successorssets == []:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   180
        successorssets = [[]]
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   181
2611
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   182
    succsmap = repo.obsstore.successors
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   183
    fullsuccessorsets = [] # successor set + markers
2605
7d9608219362 obsfate: rename 'successorsset' to 'sset' in the loop
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
   184
    for sset in successorssets:
2611
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   185
        if sset:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   186
            markers = obshistory.successorsetallmarkers(sset, pathcache)
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   187
            fullsuccessorsets.append((sset, markers))
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   188
        else:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   189
            # XXX we do not catch all prune markers (eg rewritten then pruned)
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   190
            # (fix me later)
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   191
            foundany = False
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   192
            for mark in succsmap.get(ctx.node(), ()):
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   193
                if not mark[1]:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   194
                    foundany = True
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   195
                    fullsuccessorsets.append((sset, [mark]))
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   196
            if not foundany:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   197
                fullsuccessorsets.append(([], []))
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   198
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   199
    values = []
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
   200
    for sset, rawmarkers in fullsuccessorsets:
2610
ee37ab3de5f7 obsfate: split markers fetch from successor set annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2608
diff changeset
   201
        raw = obshistory.preparesuccessorset(sset, rawmarkers)
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   202
        values.append(raw)
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   203
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   204
    return values
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   205
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   206
def obsfatelineprinter(obsfateline, ui):
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   207
    quiet = ui.quiet
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   208
    verbose = ui.verbose
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   209
    normal = not verbose and not quiet
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   210
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   211
    # Build the line step by step
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   212
    line = []
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   213
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   214
    # Verb
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   215
    line.append(obsfateline['verb'])
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   216
3042
93ea1d9d6ad3 log: update obsfate output order
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   217
    # Successors
93ea1d9d6ad3 log: update obsfate output order
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   218
    successors = obsfateline["successors"]
93ea1d9d6ad3 log: update obsfate output order
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   219
93ea1d9d6ad3 log: update obsfate output order
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   220
    if successors:
93ea1d9d6ad3 log: update obsfate output order
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   221
        fmtsuccessors = map(lambda s: s[:12], successors)
93ea1d9d6ad3 log: update obsfate output order
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   222
        line.append(" as %s" % ", ".join(fmtsuccessors))
93ea1d9d6ad3 log: update obsfate output order
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   223
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   224
    # Users
2690
5d839e1f0ce9 template: handle lack of "users" in the obsfate data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2688
diff changeset
   225
    if (verbose or normal) and 'users' in obsfateline:
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   226
        users = obsfateline['users']
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   227
3051
204a6947a920 obsfate: fix user filtering in obsfate-printer
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   228
        if not verbose:
204a6947a920 obsfate: fix user filtering in obsfate-printer
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   229
            # If current user is the only user, do not show anything if not in
204a6947a920 obsfate: fix user filtering in obsfate-printer
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   230
            # verbose mode
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   231
            username = _getusername(ui)
3051
204a6947a920 obsfate: fix user filtering in obsfate-printer
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   232
            if len(users) == 1 and users[0] == username:
204a6947a920 obsfate: fix user filtering in obsfate-printer
Boris Feld <boris.feld@octobus.net>
parents: 2926
diff changeset
   233
                users = None
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   234
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   235
        if users:
3052
3f85f25b36ed obsfate: make the user list more readable
Boris Feld <boris.feld@octobus.net>
parents: 3051
diff changeset
   236
            line.append(" by %s" % ", ".join(users))
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   237
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   238
    # Date
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   239
    if verbose:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   240
        min_date = obsfateline['min_date']
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   241
        max_date = obsfateline['max_date']
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   242
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   243
        if min_date == max_date:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   244
            fmtmin_date = util.datestr(min_date, '%Y-%m-%d %H:%M %1%2')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   245
            line.append(" (at %s)" % fmtmin_date)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   246
        else:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   247
            fmtmin_date = util.datestr(min_date, '%Y-%m-%d %H:%M %1%2')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   248
            fmtmax_date = util.datestr(max_date, '%Y-%m-%d %H:%M %1%2')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   249
            line.append(" (between %s and %s)" % (fmtmin_date, fmtmax_date))
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   250
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   251
    return "".join(line)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   252
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   253
def obsfateprinter(obsfate, ui, prefix=""):
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   254
    lines = []
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   255
    for raw in obsfate:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   256
        lines.append(obsfatelineprinter(raw, ui))
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   257
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   258
    if prefix:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   259
        lines = [prefix + line for line in lines]
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   260
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   261
    return "\n".join(lines)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   262
3517
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   263
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   264
if util.safehasattr(templatekw, 'compatlist'):
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   265
    @eh.templatekw('obsfatedata', requires=set(['ctx', 'templ']))
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   266
    def showobsfatedata(context, mapping):
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   267
        ctx = context.resource(mapping, 'ctx')
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   268
        repo = ctx.repo()
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   269
        values = obsfatedata(repo, ctx)
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   270
3517
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   271
        if values is None:
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   272
            return templatekw.compatlist(context, mapping, "obsfatedata", [])
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   273
        args = mapping.copy()
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   274
        args.pop('ctx')
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   275
        args['templ'] = context.resource(mapping, 'templ')
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   276
        return _showobsfatedata(repo, ctx, values, **args)
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   277
else:
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   278
    # pre hg-4.6
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   279
    @eh.templatekw("obsfatedata")
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   280
    def showobsfatedata(repo, ctx, **args):
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   281
        # Get the needed obsfate data
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   282
        values = obsfatedata(repo, ctx)
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   283
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   284
        if values is None:
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   285
            return templatekw.showlist("obsfatedata", [], args)
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   286
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   287
        return _showobsfatedata(repo, ctx, values, **args)
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   288
dc31ec3ef042 compat: register a version of 'obsfatedata' template that works with 4.6
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3516
diff changeset
   289
def _showobsfatedata(repo, ctx, values, **args):
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   290
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   291
    # Format each successorset successors list
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   292
    for raw in values:
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   293
        # As we can't do something like
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   294
        # "{join(map(nodeshort, successors), ', '}" in template, manually
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   295
        # create a correct textual representation
2603
23f1c3b9052f template: use hex successors in obsfate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2602
diff changeset
   296
        gen = ', '.join(n[:12] for n in raw['successors'])
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   297
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   298
        makemap = lambda x: {'successor': x}
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   299
        joinfmt = lambda d: "%s" % d['successor']
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   300
        raw['successors'] = templatekw._hybrid(gen, raw['successors'], makemap,
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   301
                                               joinfmt)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   302
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
   303
    # And then format them
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   304
    # Insert default obsfate templates
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
   305
    args['templ'].cache.update(obsfatedefaulttempl(repo.ui))
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   306
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   307
    if repo.ui.quiet:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   308
        name = "obsfate_quiet"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   309
    elif repo.ui.verbose:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   310
        name = "obsfate_verbose"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   311
    elif repo.ui.debugflag:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   312
        name = "obsfate_debug"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   313
    else:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   314
        name = "obsfate"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   315
2629
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   316
    # Format a single value
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   317
    def fmt(d):
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   318
        nargs = args.copy()
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   319
        nargs.update(d[name])
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   320
        return args['templ'](name, **nargs)
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   321
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   322
    # Generate a good enough string representation using templater
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   323
    gen = []
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   324
    for d in values:
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   325
        chunk = fmt({name: d})
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   326
        chunkstr = []
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   327
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   328
        # Empty the generator
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   329
        try:
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   330
            while True:
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   331
                chunkstr.append(chunk.next())
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   332
        except StopIteration:
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   333
            pass
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   334
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   335
        gen.append("".join(chunkstr))
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   336
    gen = "; ".join(gen)
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   337
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
   338
    return templatekw._hybrid(gen, values, lambda x: {name: x}, fmt)
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
   339
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   340
# rely on core mercurial starting from 4.4 for the obsfate template
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   341
if not util.safehasattr(templatekw, 'showobsfate'):
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   342
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   343
    @eh.templatekw("obsfate")
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   344
    def showobsfate(*args, **kwargs):
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   345
        return showobsfatedata(*args, **kwargs)
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   346
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3378
diff changeset
   347
if util.safehasattr(compat.changesetprinter, '_showobsfate'):
3083
e91ca8b5ecf7 obsfate: use core version of obsfate if available
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 3057
diff changeset
   348
    pass # already included by default
3483
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3378
diff changeset
   349
elif util.safehasattr(compat.changesetprinter, '_exthook'):
f03845bfd015 compat: add wrapper for logcmdutil functions
Yuya Nishihara <yuya@tcha.org>
parents: 3378
diff changeset
   350
    @eh.wrapfunction(compat.changesetprinter, '_exthook')
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   351
    def exthook(original, self, ctx):
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   352
        # Call potential other extensions
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   353
        original(self, ctx)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   354
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   355
        obsfate = obsfatedata(self.repo, ctx)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   356
        if obsfate is None:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   357
            return ""
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   358
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   359
        output = obsfateprinter(obsfate, self.ui, prefix="obsolete:    ")
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   360
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   361
        self.ui.write(output, label='log.obsfate')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   362
        self.ui.write("\n")
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
   363
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   364
# copy from mercurial.obsolete with a small change to stop at first known changeset.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   365
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   366
def directsuccessorssets(repo, initialnode, cache=None):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   367
    """return set of all direct successors of initial nodes
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   368
    """
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   369
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   370
    succmarkers = repo.obsstore.successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   371
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   372
    # Stack of nodes we search successors sets for
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   373
    toproceed = [initialnode]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   374
    # set version of above list for fast loop detection
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   375
    # element added to "toproceed" must be added here
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   376
    stackedset = set(toproceed)
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   377
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   378
    pathscache = {}
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   379
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   380
    if cache is None:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   381
        cache = {}
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   382
    while toproceed:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   383
        current = toproceed[-1]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   384
        if current in cache:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   385
            stackedset.remove(toproceed.pop())
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   386
        elif current != initialnode and current in repo:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   387
            # We have a valid direct successors.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   388
            cache[current] = [(current,)]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   389
        elif current not in succmarkers:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   390
            if current in repo:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   391
                # We have a valid last successors.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   392
                cache[current] = [(current,)]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   393
            else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   394
                # Final obsolete version is unknown locally.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   395
                # Do not count that as a valid successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   396
                cache[current] = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   397
        else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   398
            for mark in sorted(succmarkers[current]):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   399
                for suc in mark[1]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   400
                    if suc not in cache:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   401
                        if suc in stackedset:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   402
                            # cycle breaking
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   403
                            cache[suc] = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   404
                        else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   405
                            # case (3) If we have not computed successors sets
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   406
                            # of one of those successors we add it to the
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   407
                            # `toproceed` stack and stop all work for this
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   408
                            # iteration.
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   409
                            pathscache.setdefault(suc, []).append((current, mark))
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   410
                            toproceed.append(suc)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   411
                            stackedset.add(suc)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   412
                            break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   413
                else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   414
                    continue
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   415
                break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   416
            else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   417
                succssets = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   418
                for mark in sorted(succmarkers[current]):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   419
                    # successors sets contributed by this marker
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   420
                    markss = [[]]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   421
                    for suc in mark[1]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   422
                        # cardinal product with previous successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   423
                        productresult = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   424
                        for prefix in markss:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   425
                            for suffix in cache[suc]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   426
                                newss = list(prefix)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   427
                                for part in suffix:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   428
                                    # do not duplicated entry in successors set
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   429
                                    # first entry wins.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   430
                                    if part not in newss:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   431
                                        newss.append(part)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   432
                                productresult.append(newss)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   433
                        markss = productresult
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   434
                    succssets.extend(markss)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   435
                # remove duplicated and subset
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   436
                seen = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   437
                final = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   438
                candidate = sorted(((set(s), s) for s in succssets if s),
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   439
                                   key=lambda x: len(x[1]), reverse=True)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   440
                for setversion, listversion in candidate:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   441
                    for seenset in seen:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   442
                        if setversion.issubset(seenset):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   443
                            break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   444
                    else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   445
                        final.append(listversion)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   446
                        seen.append(setversion)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   447
                final.reverse() # put small successors set first
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
   448
                cache[current] = final
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   449
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
   450
    return cache[initialnode], pathscache