mercurial/namespaces.py
author Augie Fackler <augie@google.com>
Wed, 03 Apr 2019 11:46:29 -0400
changeset 42054 399ed3e86a49
parent 38486 4c0683655599
child 43076 2372284d9457
permissions -rw-r--r--
py2exe: add workaround to allow bundling of hgext3rd.* extensions py2exe doesn't know how to handle namespace packages *at all*, so it treats them like normal packages. As a result, if we try and bundle hgext3rd.evolve in a py2exe build, it won't work if we install evolve into the virtualenv. In order to work around this, tortoisehg installs hgext3rd.evolve etc into its staged hg directory, since it doesn't use a virtualenv. As a workaround for us, we'll just allow any extra packages users want bundled are part of hg during the pseudo-install phase that py2exe uses. I'm not happy about this, but it *works*. As a sample of how you'd make an MSI with evolve bundled: import os import shutil import subprocess import tempfile def stage_evolve(version): """Stage evolve for inclusion in py2exe binary.""" with tempfile.TemporaryDirectory() as temp: evolve = os.path.join(temp, "evolve") subprocess.check_call([ "hg.exe", "clone", "https://www.mercurial-scm.org/repo/evolve/", "--update", version, evolve, ]) dest = os.path.join('..', 'hgext3rd', 'evolve') if os.path.exists(dest): shutil.rmtree(dest) shutil.copytree(os.path.join(evolve, "hgext3rd", "evolve"), dest) def main(): stage_evolve('tip') print("\0") print("hgext3rd") print("hgext3rd.evolve") print("hgext3rd.evolve.hack") print("hgext3rd.evolve.thirdparty") if __name__ == "__main__": main() is a script you can pass to the wix/build.py as --extra-packages-script, and the resulting .msi will have an hg binary with evolve baked in. users will still need to enable evolve in their hgrc, so you'd probably also want to bundle configs in your msi for an enterprise environment, but that's already easy to do with the support for extra features and wxs files in the wix build process. Differential Revision: https://phab.mercurial-scm.org/D6189
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 (
36592
b0054f3c055a namespace: use registrar to add template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 35212
diff changeset
     5
    registrar,
25961
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     6
    templatekw,
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     7
    util,
c0c89b2d07be namespaces: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24180
diff changeset
     8
)
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
     9
23555
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    10
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
    11
    """
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    12
    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
    13
    """
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    14
    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
    15
        return []
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    16
    else:
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    17
        return [val]
f08f6a7d4d5f namespaces: add a function to turn single results into lists
Sean Farley <sean.michael.farley@gmail.com>
parents: 23554
diff changeset
    18
23553
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    19
class namespaces(object):
23718
42908c3275c6 namespaces: update documentation and code indentation
Sean Farley <sean.michael.farley@gmail.com>
parents: 23717
diff changeset
    20
    """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
    21
    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
    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
7cebb6a8c75f namespaces: introduce a generic way to map between names and nodes
Sean Farley <sean.michael.farley@gmail.com>
parents:
diff changeset
    25
    _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
    26
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23559
diff changeset
    27
    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
    28
        self._names = util.sortdict()
35212
c7b45db8f317 log: translate column labels at once (issue5750)
Yuya Nishihara <yuya@tcha.org>
parents: 33048
diff changeset
    29
        columns = templatekw.getlogcolumns()
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    30
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23557
diff changeset
    31
        # 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
    32
        # 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
    33
        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
    34
        bmknamemap = lambda repo, name: tolist(repo._bookmarks.get(name))
28567
ca52512ac709 namespaces: fix name/node confusion
timeless <timeless@mozdev.org>
parents: 25961
diff changeset
    35
        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
    36
        n = namespace("bookmarks", templatename="bookmark",
35212
c7b45db8f317 log: translate column labels at once (issue5750)
Yuya Nishihara <yuya@tcha.org>
parents: 33048
diff changeset
    37
                      logfmt=columns['bookmark'],
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
    38
                      listnames=bmknames,
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
    39
                      namemap=bmknamemap, nodemap=bmknodemap,
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
    40
                      builtin=True)
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    41
        self.addnamespace(n)
23562
59e703aecaf6 namespaces: add tags
Sean Farley <sean.michael.farley@gmail.com>
parents: 23561
diff changeset
    42
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    43
        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
    44
        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
    45
        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
    46
        n = namespace("tags", templatename="tag",
35212
c7b45db8f317 log: translate column labels at once (issue5750)
Yuya Nishihara <yuya@tcha.org>
parents: 33048
diff changeset
    47
                      logfmt=columns['tag'],
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
    48
                      listnames=tagnames,
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
    49
                      namemap=tagnamemap, nodemap=tagnodemap,
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
    50
                      deprecated={'tip'},
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
    51
                      builtin=True)
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    52
        self.addnamespace(n)
23558
3198aac7a95d namespaces: add bookmarks to the names data structure
Sean Farley <sean.michael.farley@gmail.com>
parents: 23557
diff changeset
    53
23873
9ef234021667 namespaces: use named args for namespace api
Sean Farley <sean.michael.farley@gmail.com>
parents: 23872
diff changeset
    54
        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
    55
        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
    56
        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
    57
        n = namespace("branches", templatename="branch",
35212
c7b45db8f317 log: translate column labels at once (issue5750)
Yuya Nishihara <yuya@tcha.org>
parents: 33048
diff changeset
    58
                      logfmt=columns['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
    59
                      listnames=bnames,
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
    60
                      namemap=bnamemap, nodemap=bnodemap,
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
    61
                      builtin=True)
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    62
        self.addnamespace(n)
23563
114992041625 namespaces: add branches
Sean Farley <sean.michael.farley@gmail.com>
parents: 23562
diff changeset
    63
23736
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
    64
    def __getitem__(self, namespace):
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
    65
        """returns the namespace object"""
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
    66
        return self._names[namespace]
d7324c242c3f namespaces: add __getitem__ property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23718
diff changeset
    67
23761
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    68
    def __iter__(self):
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    69
        return self._names.__iter__()
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    70
32550
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32291
diff changeset
    71
    def items(self):
23761
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    72
        return self._names.iteritems()
19d6271a70db namespaces: add __iter__ and iteritems methods
Sean Farley <sean.michael.farley@gmail.com>
parents: 23760
diff changeset
    73
32550
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32291
diff changeset
    74
    iteritems = items
b98199a5c3e1 cleanup: rename all iteritems methods to items and add iteritems alias
Augie Fackler <raf@durin42.com>
parents: 32291
diff changeset
    75
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    76
    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
    77
        """register a namespace
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    78
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    79
        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
    80
        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
    81
               (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
    82
23554
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    83
        """
75f9643cab1b namespaces: add a method to register new namespaces
Sean Farley <sean.michael.farley@gmail.com>
parents: 23553
diff changeset
    84
        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
    85
            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
    86
        else:
23717
d8663e6153c1 namespaces: use namespace object instead of dictionary
Sean Farley <sean.michael.farley@gmail.com>
parents: 23716
diff changeset
    87
            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
    88
23610
9266d1dd6a6e namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23608
diff changeset
    89
        # 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
    90
        if namespace.name not in templatekw.keywords:
36592
b0054f3c055a namespace: use registrar to add template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 35212
diff changeset
    91
            templatekeyword = registrar.templatekeyword(templatekw.keywords)
37068
aa97e06a1912 templater: use template context to render old-style list template
Yuya Nishihara <yuya@tcha.org>
parents: 36593
diff changeset
    92
            @templatekeyword(namespace.name, requires={'repo', 'ctx'})
36593
900e5ee44307 templatekw: switch namespace template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36592
diff changeset
    93
            def generatekw(context, mapping):
900e5ee44307 templatekw: switch namespace template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36592
diff changeset
    94
                return templatekw.shownames(context, mapping, namespace.name)
23610
9266d1dd6a6e namespaces: generate template keyword when registering a namespace
Sean Farley <sean.michael.farley@gmail.com>
parents: 23608
diff changeset
    95
23561
3c2419e07df5 namespaces: remove weakref; always pass in repo
Ryan McElroy <rmcelroy@fb.com>
parents: 23559
diff changeset
    96
    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
    97
        """
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
    98
        Return the 'best' node for the given name. What's best is defined
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
    99
        by the namespace's singlenode() function. The first match returned by
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   100
        a namespace in the defined precedence order is used.
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
   101
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
        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
   103
        """
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
        for ns, v in self._names.iteritems():
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   105
            n = v.singlenode(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
   106
            if n:
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   107
                return n
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
   108
        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
   109
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   110
class namespace(object):
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   111
    """provides an interface to a namespace
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   112
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   113
    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
   114
    (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
   115
    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
   116
    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
   117
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   118
    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
   119
    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
   120
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   121
    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
   122
    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
   123
    and not raise an error.
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   124
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   125
    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
   126
      'name': the namespace (plural form)
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   127
      '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
   128
                      of the plural namespace name)
23760
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
   129
      '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
   130
                   dictionary)
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   131
      '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
   132
      '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
   133
      'deprecated': set of names to be masked for ordinary use
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
   134
      'builtin': bool indicating if this namespace is supported by core
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
   135
                 Mercurial.
23715
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,
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   140
                 deprecated=None, builtin=False, singlenode=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
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
   155
        builtin: whether namespace is implemented by core Mercurial
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   156
        singlenode: function that inputs a name, output best node (or None)
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   157
        """
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   158
        self.name = name
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   159
        self.templatename = templatename
23874
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   160
        self.logname = logname
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   161
        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
   162
        self.logfmt = logfmt
23760
50229b4c33be namespaces: add 'listnames' property
Sean Farley <sean.michael.farley@gmail.com>
parents: 23739
diff changeset
   163
        self.listnames = listnames
23715
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   164
        self.namemap = namemap
eee55c09010a namespaces: add a namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23610
diff changeset
   165
        self.nodemap = nodemap
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   166
        if singlenode:
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   167
            self.singlenode = singlenode
23716
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   168
23874
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   169
        # 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
   170
        if self.logname is None:
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   171
            self.logname = self.templatename
fef1146b8442 namespaces: add logname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23873
diff changeset
   172
23875
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   173
        # 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
   174
        if self.colorname is None:
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   175
            self.colorname = self.logname
e573dd08aeaf namespaces: add colorname member to namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23874
diff changeset
   176
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
   177
        # 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
   178
        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
   179
            # 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
   180
            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
   181
24151
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   182
        if deprecated is None:
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   183
            self.deprecated = set()
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   184
        else:
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   185
            self.deprecated = deprecated
38824c53c2f1 revset: mask specific names for named() predicate
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23967
diff changeset
   186
33048
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
   187
        self.builtin = builtin
46fa46608ca5 namespaces: record and expose whether namespace is built-in
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32550
diff changeset
   188
23716
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   189
    def names(self, repo, node):
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   190
        """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
   191
        match a given node"""
f4828a8f6ae9 namespaces: copy implementation to new namespace object
Sean Farley <sean.michael.farley@gmail.com>
parents: 23715
diff changeset
   192
        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
   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
    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
   195
        """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
   196
        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
   197
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
   198
        """
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
   199
        return sorted(self.namemap(repo, name))
38486
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   200
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   201
    def singlenode(self, repo, name):
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   202
        """returns the best node for the given name
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   203
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   204
        By default, the best node is the node from nodes() with the highest
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   205
        revision number. It can be overriden by the namespace."""
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   206
        n = self.namemap(repo, name)
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   207
        if n:
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   208
            # return max revision number
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   209
            if len(n) > 1:
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   210
                cl = repo.changelog
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   211
                maxrev = max(cl.rev(node) for node in n)
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   212
                return cl.node(maxrev)
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   213
            return n[0]
4c0683655599 namespaces: let namespaces override singlenode() definition
Martin von Zweigbergk <martinvonz@google.com>
parents: 37068
diff changeset
   214
        return None