Show More
@@ -532,6 +532,13 b" coreconfigitem('experimental', 'evolutio" | |||||
532 | coreconfigitem('experimental', 'evolution.track-operation', |
|
532 | coreconfigitem('experimental', 'evolution.track-operation', | |
533 | default=True, |
|
533 | default=True, | |
534 | ) |
|
534 | ) | |
|
535 | # repo-level config to exclude a revset visibility | |||
|
536 | # | |||
|
537 | # The target use case is to use `share` to expose different subset of the same | |||
|
538 | # repository, especially server side. See also `server.view`. | |||
|
539 | coreconfigitem('experimental', 'extra-filter-revs', | |||
|
540 | default=None, | |||
|
541 | ) | |||
535 | coreconfigitem('experimental', 'maxdeltachainspan', |
|
542 | coreconfigitem('experimental', 'maxdeltachainspan', | |
536 | default=-1, |
|
543 | default=-1, | |
537 | ) |
|
544 | ) |
@@ -1050,6 +1050,8 b' class localrepository(object):' | |||||
1050 | # Signature to cached matcher instance. |
|
1050 | # Signature to cached matcher instance. | |
1051 | self._sparsematchercache = {} |
|
1051 | self._sparsematchercache = {} | |
1052 |
|
1052 | |||
|
1053 | self._extrafilterid = repoview.extrafilter(ui) | |||
|
1054 | ||||
1053 | def _getvfsward(self, origfunc): |
|
1055 | def _getvfsward(self, origfunc): | |
1054 | """build a ward for self.vfs""" |
|
1056 | """build a ward for self.vfs""" | |
1055 | rref = weakref.ref(self) |
|
1057 | rref = weakref.ref(self) | |
@@ -1197,6 +1199,9 b' class localrepository(object):' | |||||
1197 |
|
1199 | |||
1198 | In other word, there is always only one level of `repoview` "filtering". |
|
1200 | In other word, there is always only one level of `repoview` "filtering". | |
1199 | """ |
|
1201 | """ | |
|
1202 | if self._extrafilterid is not None and '%' not in name: | |||
|
1203 | name = name + '%' + self._extrafilterid | |||
|
1204 | ||||
1200 | cls = repoview.newtype(self.unfiltered().__class__) |
|
1205 | cls = repoview.newtype(self.unfiltered().__class__) | |
1201 | return cls(self, name, visibilityexceptions) |
|
1206 | return cls(self, name, visibilityexceptions) | |
1202 |
|
1207 |
@@ -17,6 +17,10 b' from . import (' | |||||
17 | phases, |
|
17 | phases, | |
18 | pycompat, |
|
18 | pycompat, | |
19 | tags as tagsmod, |
|
19 | tags as tagsmod, | |
|
20 | util, | |||
|
21 | ) | |||
|
22 | from .utils import ( | |||
|
23 | repoviewutil, | |||
20 | ) |
|
24 | ) | |
21 |
|
25 | |||
22 | def hideablerevs(repo): |
|
26 | def hideablerevs(repo): | |
@@ -154,6 +158,35 b" filtertable = {'visible': computehidden," | |||||
154 | 'immutable': computemutable, |
|
158 | 'immutable': computemutable, | |
155 | 'base': computeimpactable} |
|
159 | 'base': computeimpactable} | |
156 |
|
160 | |||
|
161 | _basefiltername = list(filtertable) | |||
|
162 | ||||
|
163 | def extrafilter(ui): | |||
|
164 | """initialize extra filter and return its id | |||
|
165 | ||||
|
166 | If extra filtering is configured, we make sure the associated filtered view | |||
|
167 | are declared and return the associated id. | |||
|
168 | """ | |||
|
169 | frevs = ui.config('experimental', 'extra-filter-revs') | |||
|
170 | if frevs is None: | |||
|
171 | return None | |||
|
172 | ||||
|
173 | fid = pycompat.sysbytes(util.DIGESTS['sha1'](frevs).hexdigest())[:12] | |||
|
174 | ||||
|
175 | combine = lambda fname: fname + '%' + fid | |||
|
176 | ||||
|
177 | subsettable = repoviewutil.subsettable | |||
|
178 | ||||
|
179 | if combine('base') not in filtertable: | |||
|
180 | for name in _basefiltername: | |||
|
181 | def extrafilteredrevs(repo, *args, **kwargs): | |||
|
182 | baserevs = filtertable[name](repo, *args, **kwargs) | |||
|
183 | extrarevs = frozenset(repo.revs(frevs)) | |||
|
184 | return baserevs | extrarevs | |||
|
185 | filtertable[combine(name)] = extrafilteredrevs | |||
|
186 | if name in subsettable: | |||
|
187 | subsettable[combine(name)] = combine(subsettable[name]) | |||
|
188 | return fid | |||
|
189 | ||||
157 | def filterrevs(repo, filtername, visibilityexceptions=None): |
|
190 | def filterrevs(repo, filtername, visibilityexceptions=None): | |
158 | """returns set of filtered revision for this filter name |
|
191 | """returns set of filtered revision for this filter name | |
159 |
|
192 |
@@ -155,6 +155,7 b' class statichttprepository(localrepo.loc' | |||||
155 |
|
155 | |||
156 | self.names = namespaces.namespaces() |
|
156 | self.names = namespaces.namespaces() | |
157 | self.filtername = None |
|
157 | self.filtername = None | |
|
158 | self._extrafilterid = None | |||
158 |
|
159 | |||
159 | try: |
|
160 | try: | |
160 | requirements = set(self.vfs.read(b'requires').splitlines()) |
|
161 | requirements = set(self.vfs.read(b'requires').splitlines()) |
@@ -34,5 +34,29 b'' | |||||
34 | date: Thu Jan 01 00:00:00 1970 +0000 |
|
34 | date: Thu Jan 01 00:00:00 1970 +0000 | |
35 | summary: r0 |
|
35 | summary: r0 | |
36 |
|
36 | |||
|
37 | ||||
|
38 | Check same result using `experimental.extra-filter-revs` | |||
|
39 | ||||
|
40 | $ hg -R test --config experimental.extra-filter-revs='not public()' serve -p $HGPORT1 -d --pid-file=hg2.pid -E errors.log | |||
|
41 | $ cat hg2.pid >> $DAEMON_PIDS | |||
|
42 | $ hg -R test2 incoming http://foo:xyzzy@localhost:$HGPORT1/ | |||
|
43 | comparing with http://foo:***@localhost:$HGPORT1/ | |||
|
44 | changeset: 0:1ea73414a91b | |||
|
45 | tag: tip | |||
|
46 | user: debugbuilddag | |||
|
47 | date: Thu Jan 01 00:00:00 1970 +0000 | |||
|
48 | summary: r0 | |||
|
49 | ||||
|
50 | $ hg -R test --config experimental.extra-filter-revs='not public()' debugupdatecache | |||
|
51 | $ ls -1 test/.hg/cache/ | |||
|
52 | branch2-base%89c45d2fa07e | |||
|
53 | branch2-served | |||
|
54 | rbc-names-v1 | |||
|
55 | rbc-revs-v1 | |||
|
56 | tags2 | |||
|
57 | tags2-served%89c45d2fa07e | |||
|
58 | ||||
|
59 | cleanup | |||
|
60 | ||||
37 |
$ |
|
61 | $ cat errors.log | |
38 | $ killdaemons.py |
|
62 | $ killdaemons.py |
General Comments 0
You need to be logged in to leave comments.
Login now