hgext/directaccess.py
author Laurent Charignon <lcharignon@fb.com>
Sat, 08 Aug 2015 12:16:55 -0700
changeset 1483 dc1467a629ca
parent 1372 7023a01b9007
child 1489 2f8a4d496585
permissions -rw-r--r--
split: add more output to the test Before this patch, we were not displaying the final graph resulting from the tests but just the obsolscencence markers. This patch adds more output to the test to make it more descriptive.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     1
""" This extension provides direct access
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     2
It is the ability to refer and access hidden sha in commands provided that you 
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     3
know their value.
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     4
For example hg log -r xxx where xxx is a commit has should work whether xxx is
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     5
hidden or not as we assume that the user knows what he is doing when referring
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     6
to xxx.
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     7
"""
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     8
from mercurial import extensions
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
     9
from mercurial import cmdutil
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    10
from mercurial import repoview
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    11
from mercurial import branchmap
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    12
from mercurial import revset
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    13
from mercurial import error
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    14
from mercurial import commands
1367
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    15
from mercurial import hg
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    16
from mercurial.i18n import _
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    17
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    18
cmdtable = {}
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    19
command = cmdutil.command(cmdtable)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    20
1367
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    21
# By default, all the commands have directaccess with warnings
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    22
# List of commands that have no directaccess and directaccess with no warning
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    23
directaccesslevel = [
1371
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    24
    # Format:
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    25
    # ('nowarning', 'evolve', 'prune'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    26
    # means: no directaccess warning, for the command in evolve named prune
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    27
    #
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    28
    # ('error', None, 'serve'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    29
    # means: no directaccess for the command in core named serve
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    30
    #
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    31
    # The list is ordered alphabetically by command names, starting with all
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    32
    # the commands in core then all the commands in the extensions
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    33
    #
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    34
    # The general guideline is:
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    35
    # - remove directaccess warnings for read only commands
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    36
    # - no direct access for commands with consequences outside of the repo
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    37
    # - leave directaccess warnings for all the other commands
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    38
    #
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    39
    ('nowarning', None, 'annotate'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    40
    ('nowarning', None, 'archive'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    41
    ('nowarning', None, 'bisect'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    42
    ('nowarning', None, 'bookmarks'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    43
    ('nowarning', None, 'bundle'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    44
    ('nowarning', None, 'cat'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    45
    ('nowarning', None, 'diff'),
1367
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    46
    ('nowarning', None, 'export'),
1371
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    47
    ('nowarning', None, 'identify'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    48
    ('nowarning', None, 'incoming'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    49
    ('nowarning', None, 'log'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    50
    ('nowarning', None, 'manifest'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    51
    ('error', None, 'outgoing'), # confusing if push errors and not outgoing
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    52
    ('error', None, 'push'), # destructive
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    53
    ('nowarning', None, 'revert'),
1368
c02cdb97ebfa directaccess: disable directaccess for push and serve
Laurent Charignon <lcharignon@fb.com>
parents: 1367
diff changeset
    54
    ('error', None, 'serve'),
1371
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    55
    ('nowarning', None, 'tags'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    56
    ('nowarning', None, 'unbundle'),
30d42079f4a2 directaccess: add some commands to the directaccess list
Laurent Charignon <lcharignon@fb.com>
parents: 1368
diff changeset
    57
    ('nowarning', None, 'update'),
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    58
]
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    59
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    60
def reposetup(ui, repo):
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    61
    repo._explicitaccess = set()
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    62
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    63
def _computehidden(repo):
1363
2eaa2943f9f3 directaccess: use cached filteredrevs
Laurent Charignon <lcharignon@fb.com>
parents: 1360
diff changeset
    64
    hidden = repoview.filterrevs(repo, 'visible')
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    65
    cl = repo.changelog
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    66
    dynamic = hidden & repo._explicitaccess
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    67
    if dynamic:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    68
        blocked = cl.ancestors(dynamic, inclusive=True)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    69
        hidden = frozenset(r for r in hidden if r not in blocked)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    70
    return hidden
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    71
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    72
def setupdirectaccess():
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    73
    """ Add two new filtername that behave like visible to provide direct access
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    74
    and direct access with warning. Wraps the commands to setup direct access """
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    75
    repoview.filtertable.update({'visible-directaccess-nowarn': _computehidden})
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    76
    repoview.filtertable.update({'visible-directaccess-warn': _computehidden})
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    77
    branchmap.subsettable['visible-directaccess-nowarn'] = 'visible'
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    78
    branchmap.subsettable['visible-directaccess-warn'] = 'visible'
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    79
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    80
    for warn, ext, cmd in directaccesslevel:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    81
        try:
1347
b00c2fe51ac8 directaccess: don't crash when evolve is not loaded
Laurent Charignon <lcharignon@fb.com>
parents: 1339
diff changeset
    82
            cmdtable = extensions.find(ext).cmdtable if ext else commands.table
1367
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    83
            wrapper = wrapwitherror if warn == 'error' else wrapwithoutwarning
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    84
            extensions.wrapcommand(cmdtable, cmd, wrapper)
1347
b00c2fe51ac8 directaccess: don't crash when evolve is not loaded
Laurent Charignon <lcharignon@fb.com>
parents: 1339
diff changeset
    85
        except (error.UnknownCommand, KeyError):
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    86
            pass
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    87
1367
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    88
def wrapwitherror(orig, ui, repo, *args, **kwargs):
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    89
    if repo and repo.filtername == 'visible-directaccess-warn':
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    90
        repo = repo.filtered('visible')
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    91
    return orig(ui, repo, *args, **kwargs)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    92
1367
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    93
def wrapwithoutwarning(orig, ui, repo, *args, **kwargs):
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    94
    if repo and repo.filtername == 'visible-directaccess-warn':
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
    95
        repo = repo.filtered("visible-directaccess-nowarn")
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    96
    return orig(ui, repo, *args, **kwargs)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
    97
1360
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
    98
def uisetup(ui):
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
    99
    """ Change ordering of extensions to ensure that directaccess extsetup comes
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   100
    after the one of the extensions in the loadsafter list """
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   101
    loadsafter = ui.configlist('directaccess','loadsafter')
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   102
    order = list(extensions._order)
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   103
    directaccesidx = order.index('directaccess')
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   104
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   105
    # The min idx for directaccess to load after all the extensions in loadafter
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   106
    minidxdirectaccess = directaccesidx
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   107
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   108
    for ext in loadsafter:
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   109
        try:
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   110
            minidxdirectaccess = max(minidxdirectaccess, order.index(ext))
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   111
        except ValueError:
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   112
            pass # extension not loaded
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   113
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   114
    if minidxdirectaccess > directaccesidx:
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   115
        order.insert(minidxdirectaccess + 1, 'directaccess')
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   116
        order.remove('directaccess')
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   117
        extensions._order = order
5c13945b32fc directaccess: add mechanism to load directaccess after some other extensions
Laurent Charignon <lcharignon@fb.com>
parents: 1347
diff changeset
   118
1367
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
   119
def _repository(orig, *args, **kwargs):
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
   120
    """Make visible-directaccess-warn the default filter for new repos"""
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
   121
    repo = orig(*args, **kwargs)
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
   122
    return repo.filtered("visible-directaccess-warn")
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
   123
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   124
def extsetup(ui):
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   125
    extensions.wrapfunction(revset, 'posttreebuilthook', _posttreebuilthook)
1367
0c134ca37567 directaccess: change rule from opt-in to opt-out
Laurent Charignon <lcharignon@fb.com>
parents: 1363
diff changeset
   126
    extensions.wrapfunction(hg, 'repository', _repository)
1339
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   127
    setupdirectaccess()
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   128
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   129
def gethashsymbols(tree):
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   130
    # Returns the list of symbols of the tree that look like hashes
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   131
    # for example for the revset 3::abe3ff it will return ('abe3ff')
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   132
    if not tree:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   133
        return []
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   134
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   135
    if len(tree) == 2 and tree[0] == "symbol":
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   136
        try:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   137
            int(tree[1])
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   138
            return []
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   139
        except ValueError as e:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   140
            return [tree[1]]
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   141
    elif len(tree) == 3:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   142
        return gethashsymbols(tree[1]) + gethashsymbols(tree[2])
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   143
    else:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   144
        return []
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   145
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   146
def _posttreebuilthook(orig, tree, repo):
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   147
    # This is use to enabled direct hash access
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   148
    # We extract the symbols that look like hashes and add them to the
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   149
    # explicitaccess set
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   150
    orig(tree, repo)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   151
    filternm = ""
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   152
    if repo is not None:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   153
        filternm = repo.filtername
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   154
    if filternm is not None and filternm.startswith('visible-directaccess'):
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   155
        prelength = len(repo._explicitaccess)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   156
        accessbefore = set(repo._explicitaccess)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   157
        repo.symbols = gethashsymbols(tree)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   158
        cl = repo.unfiltered().changelog
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   159
        for node in repo.symbols:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   160
            try:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   161
                node = cl._partialmatch(node)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   162
            except error.LookupError:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   163
                node = None
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   164
            if node is not None:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   165
                rev = cl.rev(node)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   166
                if rev not in repo.changelog:
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   167
                    repo._explicitaccess.add(rev)
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   168
        if prelength != len(repo._explicitaccess):
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   169
            if repo.filtername != 'visible-directaccess-nowarn':
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   170
                unhiddencommits = repo._explicitaccess - accessbefore
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   171
                repo.ui.warn( _("Warning: accessing hidden changesets %s " 
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   172
                                "for write operation\n") % 
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   173
                                (",".join([str(repo.unfiltered()[l]) 
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   174
                                    for l in unhiddencommits])))
0e2eb196923a inhibit: create direct access extension
Laurent Charignon <lcharignon@fb.com>
parents:
diff changeset
   175
            repo.invalidatevolatilesets()