mercurial/repoview.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sun, 21 May 2017 15:21:46 +0200
changeset 32475 1d70ec85ae00
parent 32427 8db2feb04ceb
child 32476 e5e31b0fc924
permissions -rw-r--r--
hidden: add a function returning ancestors of revs within a domain See documentation for details. This will be used to improve the hidden computation algorithm. See new changesets for usage.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     1
# repoview.py - Filtered view of a localrepo object
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     2
#
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     3
# Copyright 2012 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     4
#                Logilab SA        <contact@logilab.fr>
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     5
#
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
     8
25972
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
     9
from __future__ import absolute_import
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    10
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
    11
import copy
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29040
diff changeset
    12
import hashlib
25972
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    13
import heapq
22150
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
    14
import struct
25972
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    15
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    16
from .node import nullrev
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    17
from . import (
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    18
    error,
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    19
    obsolete,
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    20
    phases,
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    21
    tags as tagsmod,
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    22
)
18242
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
    23
18293
1f35d6737ed8 repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18274
diff changeset
    24
def hideablerevs(repo):
28780
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    25
    """Revision candidates to be hidden
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    26
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    27
    This is a standalone function to allow extensions to wrap it.
18293
1f35d6737ed8 repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18274
diff changeset
    28
28780
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    29
    Because we use the set of immutable changesets as a fallback subset in
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    30
    branchmap (see mercurial.branchmap.subsettable), you cannot set "public"
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    31
    changesets as "hideable". Doing so would break multiple code assertions and
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    32
    lead to crashes."""
18293
1f35d6737ed8 repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18274
diff changeset
    33
    return obsolete.getrevs(repo, 'obsolete')
1f35d6737ed8 repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18274
diff changeset
    34
32427
8db2feb04ceb repoview: rename '_getdynamicblockers' to 'revealedrevs' (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32426
diff changeset
    35
def revealedrevs(repo):
32426
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    36
    """Non-cacheable revisions blocking hidden changesets from being filtered.
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    37
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    38
    Get revisions that will block hidden changesets and are likely to change,
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    39
    but unlikely to create hidden blockers. They won't be cached, so be careful
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    40
    with adding additional computation."""
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    41
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    42
    cl = repo.changelog
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    43
    blockers = set()
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    44
    blockers.update([par.rev() for par in repo[None].parents()])
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    45
    blockers.update([cl.rev(bm) for bm in repo._bookmarks.values()])
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    46
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    47
    tags = {}
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    48
    tagsmod.readlocaltags(repo.ui, repo, tags, {})
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    49
    if tags:
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    50
        rev, nodemap = cl.rev, cl.nodemap
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    51
        blockers.update(rev(t[0]) for t in tags.values() if t[0] in nodemap)
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    52
    return blockers
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31444
diff changeset
    53
24565
2f7cb6e6acdd repoview: improve compute staticblockers perf
Durham Goode <durham@fb.com>
parents: 24154
diff changeset
    54
def _getstatichidden(repo):
24615
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    55
    """Revision to be hidden (disregarding dynamic blocker)
20940
b0822c23e80a repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents: 20939
diff changeset
    56
24615
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    57
    To keep a consistent graph, we cannot hide any revisions with
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    58
    non-hidden descendants. This function computes the set of
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    59
    revisions that could be hidden while keeping the graph consistent.
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    60
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    61
    A second pass will be done to apply "dynamic blocker" like bookmarks or
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    62
    working directory parents.
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    63
9e558b788daa repoview: update documentation of _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24565
diff changeset
    64
    """
20940
b0822c23e80a repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents: 20939
diff changeset
    65
    assert not repo.changelog.filteredrevs
24617
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    66
    hidden = set(hideablerevs(repo))
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    67
    if hidden:
24565
2f7cb6e6acdd repoview: improve compute staticblockers perf
Durham Goode <durham@fb.com>
parents: 24154
diff changeset
    68
        getphase = repo._phasecache.phase
2f7cb6e6acdd repoview: improve compute staticblockers perf
Durham Goode <durham@fb.com>
parents: 24154
diff changeset
    69
        getparentrevs = repo.changelog.parentrevs
24618
cde57a8d8fe7 repoview: directly skip public head in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24617
diff changeset
    70
        # Skip heads which are public (guaranteed to not be hidden)
cde57a8d8fe7 repoview: directly skip public head in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24617
diff changeset
    71
        heap = [-r for r in repo.changelog.headrevs() if getphase(repo, r)]
24616
72d34c5a6614 repoview: use a heap in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24615
diff changeset
    72
        heapq.heapify(heap)
72d34c5a6614 repoview: use a heap in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24615
diff changeset
    73
        heappop = heapq.heappop
72d34c5a6614 repoview: use a heap in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24615
diff changeset
    74
        heappush = heapq.heappush
24620
7c6f9097e2e0 repoview: avoid processing the same rev twice in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24619
diff changeset
    75
        seen = set() # no need to init it with heads, they have no children
24616
72d34c5a6614 repoview: use a heap in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24615
diff changeset
    76
        while heap:
24617
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    77
            rev = -heappop(heap)
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    78
            # All children have been processed so at that point, if no children
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    79
            # removed 'rev' from the 'hidden' set, 'rev' is going to be hidden.
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    80
            blocker = rev not in hidden
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    81
            for parent in getparentrevs(rev):
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    82
                if parent == nullrev:
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    83
                    continue
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    84
                if blocker:
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    85
                    # If visible, ensure parent will be visible too
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    86
                    hidden.discard(parent)
24620
7c6f9097e2e0 repoview: avoid processing the same rev twice in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24619
diff changeset
    87
                # - Avoid adding the same revision twice
7c6f9097e2e0 repoview: avoid processing the same rev twice in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24619
diff changeset
    88
                # - Skip nodes which are public (guaranteed to not be hidden)
7c6f9097e2e0 repoview: avoid processing the same rev twice in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24619
diff changeset
    89
                pre = len(seen)
7c6f9097e2e0 repoview: avoid processing the same rev twice in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24619
diff changeset
    90
                seen.add(parent)
7c6f9097e2e0 repoview: avoid processing the same rev twice in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24619
diff changeset
    91
                if pre < len(seen) and getphase(repo, rev):
24619
ad6dea5d96f2 repoview: skip public parent earlier in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24618
diff changeset
    92
                    heappush(heap, -parent)
24617
f76595f6ed7c repoview: simplify process in _getstatichidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24616
diff changeset
    93
    return hidden
22149
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
    94
32475
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
    95
def _domainancestors(pfunc, revs, domain):
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
    96
    """return ancestors of 'revs' within 'domain'
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
    97
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
    98
    - pfunc(r): a funtion returning parent of 'r',
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
    99
    - revs: iterable of revnum,
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   100
    - domain: consistent set of revnum.
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   101
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   102
    The domain must be consistent: no connected subset are the ancestors of
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   103
    another connected subset. In other words, if the parents of a revision are
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   104
    not in the domains, no other ancestors of that revision. For example, with
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   105
    the following graph:
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   106
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   107
        F
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   108
        |
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   109
        E
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   110
        | D
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   111
        | |
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   112
        | C
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   113
        |/
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   114
        B
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   115
        |
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   116
        A
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   117
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   118
    If C, D, E and F are in the domain but B is not, A cannot be ((A) is an
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   119
    ancestors disconnected subset disconnected of (C+D)).
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   120
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   121
    (Ancestors are returned inclusively)
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   122
    """
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   123
    stack = list(revs)
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   124
    ancestors = set(stack)
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   125
    while stack:
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   126
        for p in pfunc(stack.pop()):
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   127
            if p != nullrev and p in domain and p not in ancestors:
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   128
                ancestors.add(p)
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   129
                stack.append(p)
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   130
    return ancestors
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32427
diff changeset
   131
22150
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   132
cacheversion = 1
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   133
cachefile = 'cache/hidden'
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   134
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   135
def cachehash(repo, hideable):
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   136
    """return sha1 hash of repository data to identify a valid cache.
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   137
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   138
    We calculate a sha1 of repo heads and the content of the obsstore and write
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   139
    it to the cache. Upon reading we can easily validate by checking the hash
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   140
    against the stored one and discard the cache in case the hashes don't match.
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   141
    """
29341
0d83ad967bf8 cleanup: replace uses of util.(md5|sha1|sha256|sha512) with hashlib.\1
Augie Fackler <raf@durin42.com>
parents: 29040
diff changeset
   142
    h = hashlib.sha1()
22282
4092d12ba18a repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents: 22261
diff changeset
   143
    h.update(''.join(repo.heads()))
31444
55390e97fdd2 py3: use portable way to stringify cache key of repoview
Yuya Nishihara <yuya@tcha.org>
parents: 31358
diff changeset
   144
    h.update('%d' % hash(frozenset(hideable)))
22150
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   145
    return h.digest()
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   146
23378
47091002ae62 repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22773
diff changeset
   147
def _writehiddencache(cachefile, cachehash, hidden):
47091002ae62 repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22773
diff changeset
   148
    """write hidden data to a cache file"""
47091002ae62 repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22773
diff changeset
   149
    data = struct.pack('>%ii' % len(hidden), *sorted(hidden))
47091002ae62 repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22773
diff changeset
   150
    cachefile.write(struct.pack(">H", cacheversion))
47091002ae62 repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22773
diff changeset
   151
    cachefile.write(cachehash)
47091002ae62 repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22773
diff changeset
   152
    cachefile.write(data)
47091002ae62 repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22773
diff changeset
   153
22150
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   154
def trywritehiddencache(repo, hideable, hidden):
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   155
    """write cache of hidden changesets to disk
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   156
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   157
    Will not write the cache if a wlock cannot be obtained lazily.
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   158
    The cache consists of a head of 22byte:
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   159
       2 byte    version number of the cache
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   160
      20 byte    sha1 to validate the cache
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   161
     n*4 byte    hidden revs
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   162
    """
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   163
    wlock = fh = None
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   164
    try:
25086
140c2d1e57e7 repoview: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24620
diff changeset
   165
        wlock = repo.wlock(wait=False)
140c2d1e57e7 repoview: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24620
diff changeset
   166
        # write cache to file
140c2d1e57e7 repoview: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24620
diff changeset
   167
        newhash = cachehash(repo, hideable)
140c2d1e57e7 repoview: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24620
diff changeset
   168
        fh = repo.vfs.open(cachefile, 'w+b', atomictemp=True)
140c2d1e57e7 repoview: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24620
diff changeset
   169
        _writehiddencache(fh, newhash, hidden)
29040
a4dc5fe7bf54 repoview: ignore unwritable hidden cache
Matt Mackall <mpm@selenic.com>
parents: 28780
diff changeset
   170
        fh.close()
25086
140c2d1e57e7 repoview: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24620
diff changeset
   171
    except (IOError, OSError):
27916
9a09a9cfa503 repoview: add missing newline character in debug prints
Laurent Charignon <lcharignon@fb.com>
parents: 27258
diff changeset
   172
        repo.ui.debug('error writing hidden changesets cache\n')
25086
140c2d1e57e7 repoview: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 24620
diff changeset
   173
    except error.LockHeld:
27916
9a09a9cfa503 repoview: add missing newline character in debug prints
Laurent Charignon <lcharignon@fb.com>
parents: 27258
diff changeset
   174
        repo.ui.debug('cannot obtain lock to write hidden changesets cache\n')
22150
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   175
    finally:
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   176
        if wlock:
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   177
            wlock.release()
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   178
31049
20027be9f23d repoview: separate cache hash computation from cache reading
Stanislau Hlebik <stash@fb.com>
parents: 29341
diff changeset
   179
def _readhiddencache(repo, cachefilename, newhash):
22150
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   180
    hidden = fh = None
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   181
    try:
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   182
        if repo.vfs.exists(cachefile):
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   183
            fh = repo.vfs.open(cachefile, 'rb')
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   184
            version, = struct.unpack(">H", fh.read(2))
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   185
            oldhash = fh.read(20)
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   186
            if (cacheversion, oldhash) == (version, newhash):
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   187
                # cache is valid, so we can start reading the hidden revs
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   188
                data = fh.read()
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   189
                count = len(data) / 4
22282
4092d12ba18a repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents: 22261
diff changeset
   190
                hidden = frozenset(struct.unpack('>%ii' % count, data))
22150
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   191
        return hidden
27917
97e0dc6d248c repoview: fix corrupted hiddencache crash Mercurial (issue5042)
Laurent Charignon <lcharignon@fb.com>
parents: 27916
diff changeset
   192
    except struct.error:
97e0dc6d248c repoview: fix corrupted hiddencache crash Mercurial (issue5042)
Laurent Charignon <lcharignon@fb.com>
parents: 27916
diff changeset
   193
        repo.ui.debug('corrupted hidden cache\n')
97e0dc6d248c repoview: fix corrupted hiddencache crash Mercurial (issue5042)
Laurent Charignon <lcharignon@fb.com>
parents: 27916
diff changeset
   194
        # No need to fix the content as it will get rewritten
97e0dc6d248c repoview: fix corrupted hiddencache crash Mercurial (issue5042)
Laurent Charignon <lcharignon@fb.com>
parents: 27916
diff changeset
   195
        return None
97e0dc6d248c repoview: fix corrupted hiddencache crash Mercurial (issue5042)
Laurent Charignon <lcharignon@fb.com>
parents: 27916
diff changeset
   196
    except (IOError, OSError):
97e0dc6d248c repoview: fix corrupted hiddencache crash Mercurial (issue5042)
Laurent Charignon <lcharignon@fb.com>
parents: 27916
diff changeset
   197
        repo.ui.debug('cannot read hidden cache\n')
97e0dc6d248c repoview: fix corrupted hiddencache crash Mercurial (issue5042)
Laurent Charignon <lcharignon@fb.com>
parents: 27916
diff changeset
   198
        return None
22150
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   199
    finally:
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   200
        if fh:
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   201
            fh.close()
45b5cd948a4d repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents: 22149
diff changeset
   202
31049
20027be9f23d repoview: separate cache hash computation from cache reading
Stanislau Hlebik <stash@fb.com>
parents: 29341
diff changeset
   203
def tryreadcache(repo, hideable):
20027be9f23d repoview: separate cache hash computation from cache reading
Stanislau Hlebik <stash@fb.com>
parents: 29341
diff changeset
   204
    """read a cache if the cache exists and is valid, otherwise returns None."""
20027be9f23d repoview: separate cache hash computation from cache reading
Stanislau Hlebik <stash@fb.com>
parents: 29341
diff changeset
   205
    newhash = cachehash(repo, hideable)
20027be9f23d repoview: separate cache hash computation from cache reading
Stanislau Hlebik <stash@fb.com>
parents: 29341
diff changeset
   206
    return _readhiddencache(repo, cachefile, newhash)
20027be9f23d repoview: separate cache hash computation from cache reading
Stanislau Hlebik <stash@fb.com>
parents: 29341
diff changeset
   207
18242
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
   208
def computehidden(repo):
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
   209
    """compute the set of hidden revision to filter
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
   210
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
   211
    During most operation hidden should be filtered."""
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
   212
    assert not repo.changelog.filteredrevs
22151
c0c369aec643 repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents: 22150
diff changeset
   213
22149
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
   214
    hidden = frozenset()
18293
1f35d6737ed8 repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18274
diff changeset
   215
    hideable = hideablerevs(repo)
18272
95ef7a87c053 performance: speedup computation of hidden revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18250
diff changeset
   216
    if hideable:
95ef7a87c053 performance: speedup computation of hidden revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18250
diff changeset
   217
        cl = repo.changelog
22151
c0c369aec643 repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents: 22150
diff changeset
   218
        hidden = tryreadcache(repo, hideable)
c0c369aec643 repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents: 22150
diff changeset
   219
        if hidden is None:
24565
2f7cb6e6acdd repoview: improve compute staticblockers perf
Durham Goode <durham@fb.com>
parents: 24154
diff changeset
   220
            hidden = frozenset(_getstatichidden(repo))
22151
c0c369aec643 repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents: 22150
diff changeset
   221
            trywritehiddencache(repo, hideable, hidden)
22149
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
   222
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
   223
        # check if we have wd parents, bookmarks or tags pointing to hidden
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
   224
        # changesets and remove those.
32427
8db2feb04ceb repoview: rename '_getdynamicblockers' to 'revealedrevs' (API)
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32426
diff changeset
   225
        dynamic = hidden & revealedrevs(repo)
22149
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
   226
        if dynamic:
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
   227
            blocked = cl.ancestors(dynamic, inclusive=True)
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
   228
            hidden = frozenset(r for r in hidden if r not in blocked)
16ef2c485f03 repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents: 22148
diff changeset
   229
    return hidden
18242
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
   230
18102
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   231
def computeunserved(repo):
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   232
    """compute the set of revision that should be filtered when used a server
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   233
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   234
    Secret and hidden changeset should not pretend to be here."""
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   235
    assert not repo.changelog.filteredrevs
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   236
    # fast path in simple case to avoid impact of non optimised code
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18293
diff changeset
   237
    hiddens = filterrevs(repo, 'visible')
18273
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   238
    if phases.hassecret(repo):
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   239
        cl = repo.changelog
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   240
        secret = phases.secret
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   241
        getphase = repo._phasecache.phase
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   242
        first = min(cl.rev(n) for n in repo._phasecache.phaseroots[secret])
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   243
        revs = cl.revs(start=first)
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   244
        secrets = set(r for r in revs if getphase(repo, r) >= secret)
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   245
        return frozenset(hiddens | secrets)
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   246
    else:
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   247
        return hiddens
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   248
18245
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   249
def computemutable(repo):
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   250
    """compute the set of revision that should be filtered when used a server
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   251
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   252
    Secret and hidden changeset should not pretend to be here."""
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   253
    assert not repo.changelog.filteredrevs
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   254
    # fast check to avoid revset call on huge repo
25149
3f0744eeaeaf cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents: 25086
diff changeset
   255
    if any(repo._phasecache.phaseroots[1:]):
18274
254b708fd37d performance: speedup computation of mutable revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18273
diff changeset
   256
        getphase = repo._phasecache.phase
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18293
diff changeset
   257
        maymutable = filterrevs(repo, 'base')
18274
254b708fd37d performance: speedup computation of mutable revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18273
diff changeset
   258
        return frozenset(r for r in maymutable if getphase(repo, r))
18245
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   259
    return frozenset()
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   260
18246
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   261
def computeimpactable(repo):
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   262
    """Everything impactable by mutable revision
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   263
18462
593eb3786165 documentation: update to new filter names
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18445
diff changeset
   264
    The immutable filter still have some chance to get invalidated. This will
18246
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   265
    happen when:
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   266
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   267
    - you garbage collect hidden changeset,
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   268
    - public phase is moved backward,
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   269
    - something is changed in the filtering (this could be fixed)
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   270
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   271
    This filter out any mutable changeset and any public changeset that may be
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   272
    impacted by something happening to a mutable revision.
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   273
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   274
    This is achieved by filtered everything with a revision number egal or
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   275
    higher than the first mutable changeset is filtered."""
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   276
    assert not repo.changelog.filteredrevs
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   277
    cl = repo.changelog
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   278
    firstmutable = len(cl)
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   279
    for roots in repo._phasecache.phaseroots[1:]:
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   280
        if roots:
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   281
            firstmutable = min(firstmutable, min(cl.rev(r) for r in roots))
18443
64848f7fb764 repoview: protect `base` computation from weird phase root
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18382
diff changeset
   282
    # protect from nullrev root
64848f7fb764 repoview: protect `base` computation from weird phase root
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18382
diff changeset
   283
    firstmutable = max(0, firstmutable)
18246
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   284
    return frozenset(xrange(firstmutable, len(cl)))
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   285
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   286
# function to compute filtered set
20196
59198508b0bd filter: add a comment so that people do not forget to update subsettable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20032
diff changeset
   287
#
20549
2025315cfb0c comments: fix minor spelling issues found with spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20405
diff changeset
   288
# When adding a new filter you MUST update the table at:
20196
59198508b0bd filter: add a comment so that people do not forget to update subsettable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20032
diff changeset
   289
#     mercurial.branchmap.subsettable
59198508b0bd filter: add a comment so that people do not forget to update subsettable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20032
diff changeset
   290
# Otherwise your filter will have to recompute all its branches cache
59198508b0bd filter: add a comment so that people do not forget to update subsettable
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20032
diff changeset
   291
# from scratch (very slow).
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18293
diff changeset
   292
filtertable = {'visible': computehidden,
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18293
diff changeset
   293
               'served': computeunserved,
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18293
diff changeset
   294
               'immutable':  computemutable,
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18293
diff changeset
   295
               'base':  computeimpactable}
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   296
18382
f3b21beb9802 filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents: 18293
diff changeset
   297
def filterrevs(repo, filtername):
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   298
    """returns set of filtered revision for this filter name"""
18101
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
   299
    if filtername not in repo.filteredrevcache:
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
   300
        func = filtertable[filtername]
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
   301
        repo.filteredrevcache[filtername] = func(repo.unfiltered())
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18100
diff changeset
   302
    return repo.filteredrevcache[filtername]
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   303
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   304
class repoview(object):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   305
    """Provide a read/write view of a repo through a filtered changelog
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   306
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   307
    This object is used to access a filtered version of a repository without
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   308
    altering the original repository object itself. We can not alter the
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   309
    original object for two main reasons:
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   310
    - It prevents the use of a repo with multiple filters at the same time. In
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   311
      particular when multiple threads are involved.
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   312
    - It makes scope of the filtering harder to control.
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   313
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   314
    This object behaves very closely to the original repository. All attribute
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   315
    operations are done on the original repository:
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   316
    - An access to `repoview.someattr` actually returns `repo.someattr`,
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   317
    - A write to `repoview.someattr` actually sets value of `repo.someattr`,
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   318
    - A deletion of `repoview.someattr` actually drops `someattr`
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   319
      from `repo.__dict__`.
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   320
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   321
    The only exception is the `changelog` property. It is overridden to return
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   322
    a (surface) copy of `repo.changelog` with some revisions filtered. The
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   323
    `filtername` attribute of the view control the revisions that need to be
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   324
    filtered.  (the fact the changelog is copied is an implementation detail).
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   325
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   326
    Unlike attributes, this object intercepts all method calls. This means that
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   327
    all methods are run on the `repoview` object with the filtered `changelog`
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   328
    property. For this purpose the simple `repoview` class must be mixed with
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   329
    the actual class of the repository. This ensures that the resulting
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   330
    `repoview` object have the very same methods than the repo object. This
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   331
    leads to the property below.
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   332
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   333
        repoview.method() --> repo.__class__.method(repoview)
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   334
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   335
    The inheritance has to be done dynamically because `repo` can be of any
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18495
diff changeset
   336
    subclasses of `localrepo`. Eg: `bundlerepo` or `statichttprepo`.
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   337
    """
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   338
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   339
    def __init__(self, repo, filtername):
31221
2faf233b88e4 repoview: convert attribute names to unicodes on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31049
diff changeset
   340
        object.__setattr__(self, r'_unfilteredrepo', repo)
2faf233b88e4 repoview: convert attribute names to unicodes on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31049
diff changeset
   341
        object.__setattr__(self, r'filtername', filtername)
2faf233b88e4 repoview: convert attribute names to unicodes on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31049
diff changeset
   342
        object.__setattr__(self, r'_clcachekey', None)
2faf233b88e4 repoview: convert attribute names to unicodes on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31049
diff changeset
   343
        object.__setattr__(self, r'_clcache', None)
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   344
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18495
diff changeset
   345
    # not a propertycache on purpose we shall implement a proper cache later
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   346
    @property
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   347
    def changelog(self):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   348
        """return a filtered version of the changeset
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   349
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   350
        this changelog must not be used for writing"""
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   351
        # some cache may be implemented later
18445
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   352
        unfi = self._unfilteredrepo
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   353
        unfichangelog = unfi.changelog
27258
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   354
        # bypass call to changelog.method
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   355
        unfiindex = unfichangelog.index
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   356
        unfilen = len(unfiindex) - 1
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   357
        unfinode = unfiindex[unfilen - 1][7]
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   358
18445
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   359
        revs = filterrevs(unfi, self.filtername)
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   360
        cl = self._clcache
27258
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   361
        newkey = (unfilen, unfinode, hash(revs), unfichangelog._delayed)
28265
332926212ef8 repoview: discard filtered changelog if index isn't shared with unfiltered
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27917
diff changeset
   362
        # if cl.index is not unfiindex, unfi.changelog would be
332926212ef8 repoview: discard filtered changelog if index isn't shared with unfiltered
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27917
diff changeset
   363
        # recreated, and our clcache refers to garbage object
332926212ef8 repoview: discard filtered changelog if index isn't shared with unfiltered
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27917
diff changeset
   364
        if (cl is not None and
332926212ef8 repoview: discard filtered changelog if index isn't shared with unfiltered
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 27917
diff changeset
   365
            (cl.index is not unfiindex or newkey != self._clcachekey)):
27258
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   366
            cl = None
18445
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   367
        # could have been made None by the previous if
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   368
        if cl is None:
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   369
            cl = copy.copy(unfichangelog)
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   370
            cl.filteredrevs = revs
31358
4015dfc899bb repoview: specify setattr values as native strings
Augie Fackler <augie@google.com>
parents: 31221
diff changeset
   371
            object.__setattr__(self, r'_clcache', cl)
4015dfc899bb repoview: specify setattr values as native strings
Augie Fackler <augie@google.com>
parents: 31221
diff changeset
   372
            object.__setattr__(self, r'_clcachekey', newkey)
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   373
        return cl
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   374
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   375
    def unfiltered(self):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   376
        """Return an unfiltered version of a repo"""
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   377
        return self._unfilteredrepo
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   378
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   379
    def filtered(self, name):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   380
        """Return a filtered version of a repository"""
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   381
        if name == self.filtername:
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   382
            return self
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   383
        return self.unfiltered().filtered(name)
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   384
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   385
    # everything access are forwarded to the proxied repo
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   386
    def __getattr__(self, attr):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   387
        return getattr(self._unfilteredrepo, attr)
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   388
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   389
    def __setattr__(self, attr, value):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   390
        return setattr(self._unfilteredrepo, attr, value)
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   391
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   392
    def __delattr__(self, attr):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   393
        return delattr(self._unfilteredrepo, attr)
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   394
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18495
diff changeset
   395
    # The `requirements` attribute is initialized during __init__. But
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   396
    # __getattr__ won't be called as it also exists on the class. We need
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   397
    # explicit forwarding to main repo here
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   398
    @property
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   399
    def requirements(self):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   400
        return self._unfilteredrepo.requirements