mercurial/repoview.py
author Martin von Zweigbergk <martinvonz@google.com>
Tue, 05 Nov 2019 14:16:46 -0800
changeset 43499 476754edac1f
parent 43498 5ade47284dda
child 43500 c31fa28d1843
permissions -rw-r--r--
repoview: move changelog.headrevs() override to filteredchangelog Differential Revision: https://phab.mercurial-scm.org/D7241
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
35257
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
    12
import weakref
25972
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    13
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    14
from .node import nullrev
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43087
diff changeset
    15
from .pycompat import (
43090
1f339b503a40 py3: manually import pycompat.delattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
    16
    delattr,
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43087
diff changeset
    17
    getattr,
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43087
diff changeset
    18
    setattr,
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43087
diff changeset
    19
)
25972
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    20
from . import (
43499
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
    21
    error,
25972
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    22
    obsolete,
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    23
    phases,
35258
d4ad9d695a9e repoview: include filter name in repr for debugging
Yuya Nishihara <yuya@tcha.org>
parents: 35257
diff changeset
    24
    pycompat,
43497
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
    25
    revlog,
25972
f279191124f3 repoview: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25149
diff changeset
    26
    tags as tagsmod,
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
    27
    util,
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
    28
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
    29
from .utils import repoviewutil
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
    30
18242
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
    31
18293
1f35d6737ed8 repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18274
diff changeset
    32
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
    33
    """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
    34
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    35
    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
    36
28780
faff8c2b5ee3 hideablerevs: expand docstring to warn about possible traps
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 28265
diff changeset
    37
    Because we use the set of immutable changesets as a fallback subset in
42138
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42126
diff changeset
    38
    branchmap (see mercurial.utils.repoviewutils.subsettable), you cannot set
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42126
diff changeset
    39
    "public" changesets as "hideable". Doing so would break multiple code
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42126
diff changeset
    40
    assertions and lead to crashes."""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    41
    obsoletes = obsolete.getrevs(repo, b'obsolete')
39324
06c976acc581 phases: add an internal phases
Boris Feld <boris.feld@octobus.net>
parents: 38890
diff changeset
    42
    internals = repo._phasecache.getrevset(repo, phases.localhiddenphases)
06c976acc581 phases: add an internal phases
Boris Feld <boris.feld@octobus.net>
parents: 38890
diff changeset
    43
    internals = frozenset(internals)
06c976acc581 phases: add an internal phases
Boris Feld <boris.feld@octobus.net>
parents: 38890
diff changeset
    44
    return obsoletes | internals
18293
1f35d6737ed8 repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18274
diff changeset
    45
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
    46
32612
47e4c6bb39f1 hidden: rename "revealedrevs" to "pinnedrevs" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32611
diff changeset
    47
def pinnedrevs(repo):
32611
bceb398e6d72 hidden: drop obsolete comment about cacheability
Martin von Zweigbergk <martinvonz@google.com>
parents: 32513
diff changeset
    48
    """revisions blocking hidden changesets from being filtered
32513
43ae9e6eaaba hidden: drop outdated comment about "dynamic" performance
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32512
diff changeset
    49
    """
32464
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31453
diff changeset
    50
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31453
diff changeset
    51
    cl = repo.changelog
32612
47e4c6bb39f1 hidden: rename "revealedrevs" to "pinnedrevs" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32611
diff changeset
    52
    pinned = set()
47e4c6bb39f1 hidden: rename "revealedrevs" to "pinnedrevs" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32611
diff changeset
    53
    pinned.update([par.rev() for par in repo[None].parents()])
47e4c6bb39f1 hidden: rename "revealedrevs" to "pinnedrevs" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32611
diff changeset
    54
    pinned.update([cl.rev(bm) for bm in repo._bookmarks.values()])
32464
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31453
diff changeset
    55
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31453
diff changeset
    56
    tags = {}
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31453
diff changeset
    57
    tagsmod.readlocaltags(repo.ui, repo, tags, {})
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31453
diff changeset
    58
    if tags:
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31453
diff changeset
    59
        rev, nodemap = cl.rev, cl.nodemap
32612
47e4c6bb39f1 hidden: rename "revealedrevs" to "pinnedrevs" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32611
diff changeset
    60
        pinned.update(rev(t[0]) for t in tags.values() if t[0] in nodemap)
47e4c6bb39f1 hidden: rename "revealedrevs" to "pinnedrevs" (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 32611
diff changeset
    61
    return pinned
32464
06aa645e2372 repoview: move '_getdynamicblock' next to 'hideablerevs'
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 31453
diff changeset
    62
32510
20c1c2fb8106 hidden: simplify the computation of consistency blocker
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32509
diff changeset
    63
32614
d964959cbf66 hidden: remove unnecessary 'domain' parameter from _revealancestors()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32613
diff changeset
    64
def _revealancestors(pfunc, hidden, revs):
d964959cbf66 hidden: remove unnecessary 'domain' parameter from _revealancestors()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32613
diff changeset
    65
    """reveals contiguous chains of hidden ancestors of 'revs' by removing them
d964959cbf66 hidden: remove unnecessary 'domain' parameter from _revealancestors()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32613
diff changeset
    66
    from 'hidden'
32508
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    67
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    68
    - pfunc(r): a funtion returning parent of 'r',
32613
b9b41d8f4522 hidden: change _domainancestors() to _revealancestors()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32612
diff changeset
    69
    - hidden: the (preliminary) hidden revisions, to be updated
32508
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    70
    - 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: 32465
diff changeset
    71
32617
2af0b9a02bf9 hidden: make _revealancestors() reveal ancestors exclusively
Martin von Zweigbergk <martinvonz@google.com>
parents: 32616
diff changeset
    72
    (Ancestors are revealed exclusively, i.e. the elements in 'revs' are
2af0b9a02bf9 hidden: make _revealancestors() reveal ancestors exclusively
Martin von Zweigbergk <martinvonz@google.com>
parents: 32616
diff changeset
    73
    *not* revealed)
32508
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    74
    """
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    75
    stack = list(revs)
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    76
    while stack:
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    77
        for p in pfunc(stack.pop()):
32614
d964959cbf66 hidden: remove unnecessary 'domain' parameter from _revealancestors()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32613
diff changeset
    78
            if p != nullrev and p in hidden:
32613
b9b41d8f4522 hidden: change _domainancestors() to _revealancestors()
Martin von Zweigbergk <martinvonz@google.com>
parents: 32612
diff changeset
    79
                hidden.remove(p)
32508
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    80
                stack.append(p)
1d70ec85ae00 hidden: add a function returning ancestors of revs within a domain
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32465
diff changeset
    81
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
    82
35497
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
    83
def computehidden(repo, visibilityexceptions=None):
18242
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
    84
    """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
    85
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
    86
    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
    87
    assert not repo.changelog.filteredrevs
22151
c0c369aec643 repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents: 22150
diff changeset
    88
32512
4c5bc7cbd989 hidden: unify the static and dynamic blocker logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32511
diff changeset
    89
    hidden = hideablerevs(repo)
4c5bc7cbd989 hidden: unify the static and dynamic blocker logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32511
diff changeset
    90
    if hidden:
32618
c37ca35b8450 hidden: subtract pinned revs from hidden earlier
Martin von Zweigbergk <martinvonz@google.com>
parents: 32617
diff changeset
    91
        hidden = set(hidden - pinnedrevs(repo))
35497
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
    92
        if visibilityexceptions:
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
    93
            hidden -= visibilityexceptions
32512
4c5bc7cbd989 hidden: unify the static and dynamic blocker logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32511
diff changeset
    94
        pfunc = repo.changelog.parentrevs
38190
02f992ac26e9 phases: define an official tuple of mutable phases
Boris Feld <boris.feld@octobus.net>
parents: 38189
diff changeset
    95
        mutable = repo._phasecache.getrevset(repo, phases.mutablephases)
32512
4c5bc7cbd989 hidden: unify the static and dynamic blocker logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32511
diff changeset
    96
32619
e4d0b2efb8b5 hidden: remove unnecessary guard condition
Martin von Zweigbergk <martinvonz@google.com>
parents: 32618
diff changeset
    97
        visible = mutable - hidden
e4d0b2efb8b5 hidden: remove unnecessary guard condition
Martin von Zweigbergk <martinvonz@google.com>
parents: 32618
diff changeset
    98
        _revealancestors(pfunc, hidden, visible)
32512
4c5bc7cbd989 hidden: unify the static and dynamic blocker logic
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32511
diff changeset
    99
    return frozenset(hidden)
18242
e4687edec014 clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18233
diff changeset
   100
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   101
42126
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   102
def computesecret(repo, visibilityexceptions=None):
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   103
    """compute the set of revision that can never be exposed through hgweb
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   104
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   105
    Changeset in the secret phase (or above) should stay unaccessible."""
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   106
    assert not repo.changelog.filteredrevs
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   107
    secrets = repo._phasecache.getrevset(repo, phases.remotehiddenphases)
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   108
    return frozenset(secrets)
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   109
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   110
35497
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   111
def computeunserved(repo, visibilityexceptions=None):
18102
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   112
    """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
   113
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   114
    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
   115
    assert not repo.changelog.filteredrevs
3c7b67b76190 clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18101
diff changeset
   116
    # fast path in simple case to avoid impact of non optimised code
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   117
    hiddens = filterrevs(repo, b'visible')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   118
    secrets = filterrevs(repo, b'served.hidden')
42125
bc15e37ecc16 repoview: fix conditional around unserved changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 39324
diff changeset
   119
    if secrets:
42126
ef0e3cc684b3 repoview: introduce a filter for serving hidden changesets
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42125
diff changeset
   120
        return frozenset(hiddens | secrets)
18273
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   121
    else:
a2d54f68e13c performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18272
diff changeset
   122
        return hiddens
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   123
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   124
35497
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   125
def computemutable(repo, visibilityexceptions=None):
18245
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   126
    assert not repo.changelog.filteredrevs
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   127
    # 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
   128
    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
   129
        getphase = repo._phasecache.phase
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
        maymutable = filterrevs(repo, b'base')
18274
254b708fd37d performance: speedup computation of mutable revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18273
diff changeset
   131
        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
   132
    return frozenset()
aff706b3a21c clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18242
diff changeset
   133
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   134
35497
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   135
def computeimpactable(repo, visibilityexceptions=None):
18246
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   136
    """Everything impactable by mutable revision
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   137
18462
593eb3786165 documentation: update to new filter names
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18445
diff changeset
   138
    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
   139
    happen when:
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   140
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   141
    - you garbage collect hidden changeset,
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   142
    - public phase is moved backward,
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   143
    - 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
   144
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   145
    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
   146
    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
   147
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   148
    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
   149
    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
   150
    assert not repo.changelog.filteredrevs
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   151
    cl = repo.changelog
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   152
    firstmutable = len(cl)
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   153
    for roots in repo._phasecache.phaseroots[1:]:
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   154
        if roots:
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   155
            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
   156
    # 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
   157
    firstmutable = max(0, firstmutable)
38823
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38191
diff changeset
   158
    return frozenset(pycompat.xrange(firstmutable, len(cl)))
18246
58ca19edc043 clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18245
diff changeset
   159
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   160
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   161
# 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
   162
#
20549
2025315cfb0c comments: fix minor spelling issues found with spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20405
diff changeset
   163
# When adding a new filter you MUST update the table at:
42138
caebe5e7f4bd repoview: move subsettable in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42126
diff changeset
   164
#     mercurial.utils.repoviewutil.subsettable
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
   165
# 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
   166
# from scratch (very slow).
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   167
filtertable = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   168
    b'visible': computehidden,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   169
    b'visible-hidden': computehidden,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   170
    b'served.hidden': computesecret,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   171
    b'served': computeunserved,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   172
    b'immutable': computemutable,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   173
    b'base': computeimpactable,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   174
}
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   175
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   176
_basefiltername = list(filtertable)
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   177
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   178
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   179
def extrafilter(ui):
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   180
    """initialize extra filter and return its id
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   181
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   182
    If extra filtering is configured, we make sure the associated filtered view
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   183
    are declared and return the associated id.
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   184
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   185
    frevs = ui.config(b'experimental', b'extra-filter-revs')
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   186
    if frevs is None:
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   187
        return None
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   188
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   189
    fid = pycompat.sysbytes(util.DIGESTS[b'sha1'](frevs).hexdigest())[:12]
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   190
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   191
    combine = lambda fname: fname + b'%' + fid
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   192
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   193
    subsettable = repoviewutil.subsettable
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   194
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   195
    if combine(b'base') not in filtertable:
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   196
        for name in _basefiltername:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   197
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   198
            def extrafilteredrevs(repo, *args, **kwargs):
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   199
                baserevs = filtertable[name](repo, *args, **kwargs)
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   200
                extrarevs = frozenset(repo.revs(frevs))
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   201
                return baserevs | extrarevs
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   202
42261
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   203
            filtertable[combine(name)] = extrafilteredrevs
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   204
            if name in subsettable:
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   205
                subsettable[combine(name)] = combine(subsettable[name])
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   206
    return fid
d345627d104b repoview: introduce a `experimental.extra-filter-revs` config
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42138
diff changeset
   207
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   208
35497
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   209
def filterrevs(repo, filtername, visibilityexceptions=None):
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   210
    """returns set of filtered revision for this filter name
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   211
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   212
    visibilityexceptions is a set of revs which must are exceptions for
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   213
    hidden-state and must be visible. They are dynamic and hence we should not
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   214
    cache it's result"""
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
   215
    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
   216
        func = filtertable[filtername]
35497
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   217
        if visibilityexceptions:
3c9c05a38d78 repoview: add visibilityexception argument to filterrevs() and related fns
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35496
diff changeset
   218
            return func(repo.unfiltered, visibilityexceptions)
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
   219
        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
   220
    return repo.filteredrevcache[filtername]
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   221
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   222
43493
d630c5710801 repoview: extract a function for wrapping changelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43240
diff changeset
   223
def wrapchangelog(unfichangelog, filteredrevs):
d630c5710801 repoview: extract a function for wrapping changelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43240
diff changeset
   224
    cl = copy.copy(unfichangelog)
d630c5710801 repoview: extract a function for wrapping changelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43240
diff changeset
   225
    cl.filteredrevs = filteredrevs
43494
625e7d1ffd1c repoview: wrap changelog class when filtering
Martin von Zweigbergk <martinvonz@google.com>
parents: 43493
diff changeset
   226
625e7d1ffd1c repoview: wrap changelog class when filtering
Martin von Zweigbergk <martinvonz@google.com>
parents: 43493
diff changeset
   227
    class filteredchangelog(cl.__class__):
43495
7bc8e49a7c35 repoview: move changelog.tiprev() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43494
diff changeset
   228
        def tiprev(self):
7bc8e49a7c35 repoview: move changelog.tiprev() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43494
diff changeset
   229
            """filtered version of revlog.tiprev"""
7bc8e49a7c35 repoview: move changelog.tiprev() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43494
diff changeset
   230
            for i in pycompat.xrange(len(self) - 1, -2, -1):
7bc8e49a7c35 repoview: move changelog.tiprev() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43494
diff changeset
   231
                if i not in self.filteredrevs:
7bc8e49a7c35 repoview: move changelog.tiprev() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43494
diff changeset
   232
                    return i
43494
625e7d1ffd1c repoview: wrap changelog class when filtering
Martin von Zweigbergk <martinvonz@google.com>
parents: 43493
diff changeset
   233
43496
c470e699cd00 repoview: move changelog.__contains__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43495
diff changeset
   234
        def __contains__(self, rev):
c470e699cd00 repoview: move changelog.__contains__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43495
diff changeset
   235
            """filtered version of revlog.__contains__"""
c470e699cd00 repoview: move changelog.__contains__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43495
diff changeset
   236
            return 0 <= rev < len(self) and rev not in self.filteredrevs
c470e699cd00 repoview: move changelog.__contains__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43495
diff changeset
   237
43497
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   238
        def __iter__(self):
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   239
            """filtered version of revlog.__iter__"""
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   240
            if len(self.filteredrevs) == 0:
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   241
                return revlog.revlog.__iter__(self)
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   242
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   243
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   244
            def filterediter():
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   245
                for i in pycompat.xrange(len(self)):
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   246
                    if i not in self.filteredrevs:
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   247
                        yield i
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   248
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   249
            return filterediter()
c093fb81404f repoview: move changelog.__iter__() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43496
diff changeset
   250
43498
5ade47284dda repoview: move changelog.revs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43497
diff changeset
   251
        def revs(self, start=0, stop=None):
5ade47284dda repoview: move changelog.revs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43497
diff changeset
   252
            """filtered version of revlog.revs"""
5ade47284dda repoview: move changelog.revs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43497
diff changeset
   253
            for i in super(filteredchangelog, self).revs(start, stop):
5ade47284dda repoview: move changelog.revs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43497
diff changeset
   254
                if i not in self.filteredrevs:
5ade47284dda repoview: move changelog.revs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43497
diff changeset
   255
                    yield i
5ade47284dda repoview: move changelog.revs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43497
diff changeset
   256
43499
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   257
        def _checknofilteredinrevs(self, revs):
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   258
            """raise the appropriate error if 'revs' contains a filtered revision
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   259
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   260
            This returns a version of 'revs' to be used thereafter by the caller.
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   261
            In particular, if revs is an iterator, it is converted into a set.
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   262
            """
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   263
            safehasattr = util.safehasattr
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   264
            if safehasattr(revs, '__next__'):
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   265
                # Note that inspect.isgenerator() is not true for iterators,
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   266
                revs = set(revs)
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   267
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   268
            filteredrevs = self.filteredrevs
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   269
            if safehasattr(revs, 'first'):  # smartset
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   270
                offenders = revs & filteredrevs
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   271
            else:
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   272
                offenders = filteredrevs.intersection(revs)
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   273
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   274
            for rev in offenders:
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   275
                raise error.FilteredIndexError(rev)
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   276
            return revs
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   277
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   278
        def headrevs(self, revs=None):
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   279
            if revs is None and self.filteredrevs:
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   280
                try:
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   281
                    return self.index.headrevsfiltered(self.filteredrevs)
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   282
                # AttributeError covers non-c-extension environments and
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   283
                # old c extensions without filter handling.
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   284
                except AttributeError:
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   285
                    return self._headrevs()
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   286
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   287
            if self.filteredrevs:
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   288
                revs = self._checknofilteredinrevs(revs)
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   289
            return super(filteredchangelog, self).headrevs(revs)
476754edac1f repoview: move changelog.headrevs() override to filteredchangelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43498
diff changeset
   290
43494
625e7d1ffd1c repoview: wrap changelog class when filtering
Martin von Zweigbergk <martinvonz@google.com>
parents: 43493
diff changeset
   291
    cl.__class__ = filteredchangelog
625e7d1ffd1c repoview: wrap changelog class when filtering
Martin von Zweigbergk <martinvonz@google.com>
parents: 43493
diff changeset
   292
43493
d630c5710801 repoview: extract a function for wrapping changelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43240
diff changeset
   293
    return cl
d630c5710801 repoview: extract a function for wrapping changelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43240
diff changeset
   294
d630c5710801 repoview: extract a function for wrapping changelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43240
diff changeset
   295
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   296
class repoview(object):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   297
    """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
   298
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   299
    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
   300
    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
   301
    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
   302
    - 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
   303
      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
   304
    - 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
   305
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   306
    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
   307
    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
   308
    - 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
   309
    - 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
   310
    - 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
   311
      from `repo.__dict__`.
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   312
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   313
    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
   314
    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
   315
    `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
   316
    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
   317
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   318
    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
   319
    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
   320
    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
   321
    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
   322
    `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
   323
    leads to the property below.
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   324
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   325
        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
   326
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   327
    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
   328
    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
   329
    """
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   330
35496
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35258
diff changeset
   331
    def __init__(self, repo, filtername, visibilityexceptions=None):
31231
2faf233b88e4 repoview: convert attribute names to unicodes on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31069
diff changeset
   332
        object.__setattr__(self, r'_unfilteredrepo', repo)
2faf233b88e4 repoview: convert attribute names to unicodes on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31069
diff changeset
   333
        object.__setattr__(self, r'filtername', filtername)
2faf233b88e4 repoview: convert attribute names to unicodes on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31069
diff changeset
   334
        object.__setattr__(self, r'_clcachekey', None)
2faf233b88e4 repoview: convert attribute names to unicodes on Python 3
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31069
diff changeset
   335
        object.__setattr__(self, r'_clcache', None)
35496
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35258
diff changeset
   336
        # revs which are exceptions and must not be hidden
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   337
        object.__setattr__(self, r'_visibilityexceptions', visibilityexceptions)
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   338
18644
3e92772d5383 spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents: 18495
diff changeset
   339
    # 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
   340
    @property
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   341
    def changelog(self):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   342
        """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
   343
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   344
        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
   345
        # some cache may be implemented later
18445
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   346
        unfi = self._unfilteredrepo
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   347
        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
   348
        # 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
   349
        unfiindex = unfichangelog.index
38890
781b2720d2ac index: don't include nullid in len()
Martin von Zweigbergk <martinvonz@google.com>
parents: 38823
diff changeset
   350
        unfilen = len(unfiindex)
27258
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   351
        unfinode = unfiindex[unfilen - 1][7]
43240
4353942be294 tracing: add a couple of trace points on obsolete and repoview
Augie Fackler <augie@google.com>
parents: 43090
diff changeset
   352
        with util.timedcm('repo filter for %s', self.filtername):
4353942be294 tracing: add a couple of trace points on obsolete and repoview
Augie Fackler <augie@google.com>
parents: 43090
diff changeset
   353
            revs = filterrevs(unfi, self.filtername, self._visibilityexceptions)
18445
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   354
        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
   355
        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
   356
        # 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
   357
        # recreated, and our clcache refers to garbage object
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   358
        if cl is not None and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   359
            cl.index is not unfiindex or newkey != self._clcachekey
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   360
        ):
27258
beda2c9dbbff repoview: bypass changelog method to computed cache key
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 27257
diff changeset
   361
            cl = None
18445
4d92e2d75cff repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18443
diff changeset
   362
        # 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
   363
        if cl is None:
43493
d630c5710801 repoview: extract a function for wrapping changelog
Martin von Zweigbergk <martinvonz@google.com>
parents: 43240
diff changeset
   364
            cl = wrapchangelog(unfichangelog, revs)
31367
4015dfc899bb repoview: specify setattr values as native strings
Augie Fackler <augie@google.com>
parents: 31231
diff changeset
   365
            object.__setattr__(self, r'_clcache', cl)
4015dfc899bb repoview: specify setattr values as native strings
Augie Fackler <augie@google.com>
parents: 31231
diff changeset
   366
            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
   367
        return cl
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   368
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   369
    def unfiltered(self):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   370
        """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
   371
        return self._unfilteredrepo
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   372
35496
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35258
diff changeset
   373
    def filtered(self, name, visibilityexceptions=None):
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   374
        """Return a filtered version of a repository"""
35496
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35258
diff changeset
   375
        if name == self.filtername and not visibilityexceptions:
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   376
            return self
35496
3ad582b2895c repoview: add visibilityexceptions as an optional argument to repo.filtered()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35258
diff changeset
   377
        return self.unfiltered().filtered(name, visibilityexceptions)
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   378
35258
d4ad9d695a9e repoview: include filter name in repr for debugging
Yuya Nishihara <yuya@tcha.org>
parents: 35257
diff changeset
   379
    def __repr__(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   380
        return r'<%s:%s %r>' % (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   381
            self.__class__.__name__,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   382
            pycompat.sysstr(self.filtername),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   383
            self.unfiltered(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   384
        )
35258
d4ad9d695a9e repoview: include filter name in repr for debugging
Yuya Nishihara <yuya@tcha.org>
parents: 35257
diff changeset
   385
18100
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   386
    # 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
   387
    def __getattr__(self, attr):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   388
        return getattr(self._unfilteredrepo, attr)
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   389
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   390
    def __setattr__(self, attr, value):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   391
        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
   392
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   393
    def __delattr__(self, attr):
3a6ddacb7198 clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
   394
        return delattr(self._unfilteredrepo, attr)
35257
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   395
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   396
35257
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   397
# Python <3.4 easily leaks types via __mro__. See
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   398
# https://bugs.python.org/issue17950. We cache dynamically created types
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   399
# so they won't be leaked on every invocation of repo.filtered().
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   400
_filteredrepotypes = weakref.WeakKeyDictionary()
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   401
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   402
35257
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   403
def newtype(base):
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   404
    """Create a new type with the repoview mixin and the given base class"""
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   405
    if base not in _filteredrepotypes:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   406
35257
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   407
        class filteredrepo(repoview, base):
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   408
            pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42261
diff changeset
   409
35257
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   410
        _filteredrepotypes[base] = filteredrepo
c752fbe228fb repoview: extract a factory function of proxy class
Yuya Nishihara <yuya@tcha.org>
parents: 34649
diff changeset
   411
    return _filteredrepotypes[base]