mercurial/namespaces.py
author Gregory Szorc <gregory.szorc@gmail.com>
Sat, 24 Sep 2016 12:22:30 -0700
changeset 30020 bd6df07ccc24
parent 28567 ca52512ac709
child 32331 bd872f64a8ba
permissions -rw-r--r--
perf: add perfchangegroupchangelog command This command can be used for testing the performance of producing the changelog portion of a changegroup. We could use additional perf* commands for testing other parts of changegroup. Those can be written another time, when they are needed. (And those may want to refactor the changegroup generation API so code can be reused.) Speaking of code reuse, yes, this command does reinvent a small wheel. I didn't want to scope bloat to change the changegroup API because that will invite bikeshedding.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25961
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     1
from __future__ import absolute_import
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     2
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     3
from .i18n import _
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     4
from . import (
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     5
    templatekw,
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     6
    util,
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     7
)
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
     8
23555
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
     9
def tolist(val):
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    10
    """
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    11
    a convenience method to return an empty list instead of None
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    12
    """
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    13
    if val is None:
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    14
        return []
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    15
    else:
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    16
        return [val]
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    17
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    18
class namespaces(object):
23718
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
    19
    """provides an interface to register and operate on multiple namespaces. See
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
    20
    the namespace class below for details on the namespace object.
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    21
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    22
    """
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    23
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    24
    _names_version = 0
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    25
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23559
diff changeset
    26
    def __init__(self):
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    27
        self._names = util.sortdict()
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    28
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23557
diff changeset
    29
        # we need current mercurial named objects (bookmarks, tags, and
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23557
diff changeset
    30
        # branches) to be initialized somewhere, so that place is here
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    31
        bmknames = lambda repo: repo._bookmarks.keys()
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    32
        bmknamemap = lambda repo, name: tolist(repo._bookmarks.get(name))
28567
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
    33
        bmknodemap = lambda repo, node: repo.nodebookmarks(node)
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    34
        n = namespace("bookmarks", templatename="bookmark",
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    35
                      # i18n: column positioning for "hg log"
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    36
                      logfmt=_("bookmark:    %s\n"),
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    37
                      listnames=bmknames,
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    38
                      namemap=bmknamemap, nodemap=bmknodemap)
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    39
        self.addnamespace(n)
23562
59e703aecaf6 namespaces: add tags
Sean Farley <sean.michael.farley@gmail.com>
parents: 23561
diff changeset
    40
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    41
        tagnames = lambda repo: [t for t, n in repo.tagslist()]
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    42
        tagnamemap = lambda repo, name: tolist(repo._tagscache.tags.get(name))
28567
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
    43
        tagnodemap = lambda repo, node: repo.nodetags(node)
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    44
        n = namespace("tags", templatename="tag",
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    45
                      # i18n: column positioning for "hg log"
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    46
                      logfmt=_("tag:         %s\n"),
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    47
                      listnames=tagnames,
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
    48
                      namemap=tagnamemap, nodemap=tagnodemap,
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
    49
                      deprecated=set(['tip']))
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    50
        self.addnamespace(n)
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23557
diff changeset
    51
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    52
        bnames = lambda repo: repo.branchmap().keys()
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    53
        bnamemap = lambda repo, name: tolist(repo.branchtip(name, True))
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    54
        bnodemap = lambda repo, node: [repo[node].branch()]
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    55
        n = namespace("branches", templatename="branch",
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    56
                      # i18n: column positioning for "hg log"
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    57
                      logfmt=_("branch:      %s\n"),
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
    58
                      listnames=bnames,
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    59
                      namemap=bnamemap, nodemap=bnodemap)
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    60
        self.addnamespace(n)
23563
114992041625 namespaces: add branches
Sean Farley <sean.michael.farley@gmail.com>
parents: 23562
diff changeset
    61
23736
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
    62
    def __getitem__(self, namespace):
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
    63
        """returns the namespace object"""
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
    64
        return self._names[namespace]
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
    65
23761
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    66
    def __iter__(self):
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    67
        return self._names.__iter__()
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    68
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    69
    def iteritems(self):
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    70
        return self._names.iteritems()
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    71
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    72
    def addnamespace(self, namespace, order=None):
23718
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
    73
        """register a namespace
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    74
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    75
        namespace: the name to be registered (in plural form)
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    76
        order: optional argument to specify the order of namespaces
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    77
               (e.g. 'branches' should be listed before 'bookmarks')
23718
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
    78
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    79
        """
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    80
        if order is not None:
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    81
            self._names.insert(order, namespace.name, namespace)
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    82
        else:
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    83
            self._names[namespace.name] = namespace
23559
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
    84
23610
9266d1dd6a6e namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23608
diff changeset
    85
        # we only generate a template keyword if one does not already exist
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    86
        if namespace.name not in templatekw.keywords:
23610
9266d1dd6a6e namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23608
diff changeset
    87
            def generatekw(**args):
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    88
                return templatekw.shownames(namespace.name, **args)
23610
9266d1dd6a6e namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23608
diff changeset
    89
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    90
            templatekw.keywords[namespace.name] = generatekw
23610
9266d1dd6a6e namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23608
diff changeset
    91
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23559
diff changeset
    92
    def singlenode(self, repo, name):
23559
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
    93
        """
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
    94
        Return the 'best' node for the given name. Best means the first node
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
    95
        in the first nonempty list returned by a name-to-nodes mapping function
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
    96
        in the defined precedence order.
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
    97
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
    98
        Raises a KeyError if there is no such node.
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
    99
        """
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
   100
        for ns, v in self._names.iteritems():
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
   101
            n = v.namemap(repo, name)
23559
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
   102
            if n:
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
   103
                # return max revision number
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
   104
                if len(n) > 1:
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23559
diff changeset
   105
                    cl = repo.changelog
23559
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
   106
                    maxrev = max(cl.rev(node) for node in n)
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
   107
                    return cl.node(maxrev)
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
   108
                return n[0]
3b3a962e3677 namespaces: add a method to the first matching node for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23558
diff changeset
   109
        raise KeyError(_('no such name: %s') % name)
23606
80e3cbe227d1 namespaces: add method to get template name of namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23605
diff changeset
   110
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   111
class namespace(object):
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   112
    """provides an interface to a namespace
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   113
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   114
    Namespaces are basically generic many-to-many mapping between some
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   115
    (namespaced) names and nodes. The goal here is to control the pollution of
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   116
    jamming things into tags or bookmarks (in extension-land) and to simplify
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   117
    internal bits of mercurial: log output, tab completion, etc.
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   118
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   119
    More precisely, we define a mapping of names to nodes, and a mapping from
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   120
    nodes to names. Each mapping returns a list.
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   121
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   122
    Furthermore, each name mapping will be passed a name to lookup which might
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   123
    not be in its domain. In this case, each method should return an empty list
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   124
    and not raise an error.
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   125
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   126
    This namespace object will define the properties we need:
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   127
      'name': the namespace (plural form)
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   128
      'templatename': name to use for templating (usually the singular form
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   129
                      of the plural namespace name)
23760
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
   130
      'listnames': list of all names in the namespace (usually the keys of a
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
   131
                   dictionary)
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   132
      'namemap': function that takes a name and returns a list of nodes
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   133
      'nodemap': function that takes a node and returns a list of names
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   134
      'deprecated': set of names to be masked for ordinary use
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   135
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   136
    """
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   137
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   138
    def __init__(self, name, templatename=None, logname=None, colorname=None,
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   139
                 logfmt=None, listnames=None, namemap=None, nodemap=None,
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   140
                 deprecated=None):
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   141
        """create a namespace
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   142
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   143
        name: the namespace to be registered (in plural form)
23872
9f48242929a9 namespaces: make the constructor into named args
Sean Farley <sean.michael.farley@gmail.com>
parents: 23775
diff changeset
   144
        templatename: the name to use for templating
23874
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   145
        logname: the name to use for log output; if not specified templatename
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   146
                 is used
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   147
        colorname: the name to use for colored log output; if not specified
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   148
                   logname is used
24180
d8e0c591781c spelling: fixes from proofreading of spell checker issues
Mads Kiilerich <madski@unity3d.com>
parents: 24151
diff changeset
   149
        logfmt: the format to use for (i18n-ed) log output; if not specified
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
   150
                it is composed from logname
23760
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
   151
        listnames: function to list all names
28567
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
   152
        namemap: function that inputs a name, output node(s)
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
   153
        nodemap: function that inputs a node, output name(s)
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   154
        deprecated: set of names to be masked for ordinary use
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   155
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   156
        """
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   157
        self.name = name
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   158
        self.templatename = templatename
23874
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   159
        self.logname = logname
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   160
        self.colorname = colorname
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
   161
        self.logfmt = logfmt
23760
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
   162
        self.listnames = listnames
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   163
        self.namemap = namemap
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   164
        self.nodemap = nodemap
23716
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   165
23874
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   166
        # if logname is not specified, use the template name as backup
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   167
        if self.logname is None:
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   168
            self.logname = self.templatename
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   169
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   170
        # if colorname is not specified, just use the logname as a backup
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   171
        if self.colorname is None:
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   172
            self.colorname = self.logname
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   173
23967
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
   174
        # if logfmt is not specified, compose it from logname as backup
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
   175
        if self.logfmt is None:
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
   176
            # i18n: column positioning for "hg log"
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
   177
            self.logfmt = ("%s:" % self.logname).ljust(13) + "%s\n"
448bb32b8ee6 namespace: introduce logfmt to show l10n-ed messages for hg log correctly
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23875
diff changeset
   178
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   179
        if deprecated is None:
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   180
            self.deprecated = set()
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   181
        else:
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   182
            self.deprecated = deprecated
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   183
23716
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   184
    def names(self, repo, node):
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   185
        """method that returns a (sorted) list of names in a namespace that
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   186
        match a given node"""
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   187
        return sorted(self.nodemap(repo, node))
23774
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
   188
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
   189
    def nodes(self, repo, name):
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
   190
        """method that returns a list of nodes in a namespace that
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
   191
        match a given name.
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
   192
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
   193
        """
b9537ee87961 namespaces: add method to return a list of nodes for a given name
Sean Farley <sean.michael.farley@gmail.com>
parents: 23761
diff changeset
   194
        return sorted(self.namemap(repo, name))