Mercurial > hg
annotate mercurial/repoview.py @ 23614:cd79fb4d75fd
share: add option to share bookmarks
This patch adds the -B/--bookmarks option to the share command added by the
share extension. All it does for now is create a marker, 'bookmarks.shared',
that will be used by future code to implement the sharing functionality.
author | Ryan McElroy <rmcelroy@fb.com> |
---|---|
date | Sat, 13 Dec 2014 11:32:46 -0800 |
parents | ced3ecfc2e57 |
children | ab3b8d8fd2a0 |
rev | line source |
---|---|
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 |
23502
ced3ecfc2e57
repoview: allow methods on the proxy class to be replaced
Matt Harbison <matt_harbison@yahoo.com>
parents:
23378
diff
changeset
|
9 import types |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
10 import copy |
22150
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
11 import error |
18102
3c7b67b76190
clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18101
diff
changeset
|
12 import phases |
18245
aff706b3a21c
clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18242
diff
changeset
|
13 import util |
20405
cb63aa14aaf7
repoview: use repo.revs() instead of a private revset method
Augie Fackler <raf@durin42.com>
parents:
20196
diff
changeset
|
14 import obsolete |
22150
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
15 import struct |
20939
388af5d4e90c
repoview: improve performance for computehidden (issue4206)
Sean Farley <sean.michael.farley@gmail.com>
parents:
20807
diff
changeset
|
16 import tags as tagsmod |
18242
e4687edec014
clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18233
diff
changeset
|
17 |
18293
1f35d6737ed8
repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18274
diff
changeset
|
18 def hideablerevs(repo): |
1f35d6737ed8
repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18274
diff
changeset
|
19 """Revisions candidates to be hidden |
1f35d6737ed8
repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18274
diff
changeset
|
20 |
1f35d6737ed8
repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18274
diff
changeset
|
21 This is a standalone function to help extensions to wrap it.""" |
1f35d6737ed8
repoview: extract hideable revision computation in a dedicated function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18274
diff
changeset
|
22 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
|
23 |
22149
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
24 def _getstaticblockers(repo): |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
25 """Cacheable revisions blocking hidden changesets from being filtered. |
20940
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
26 |
22149
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
27 Additional non-cached hidden blockers are computed in _getdynamicblockers. |
20940
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
28 This is a standalone function to help extensions to wrap it.""" |
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
29 assert not repo.changelog.filteredrevs |
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
30 hideable = hideablerevs(repo) |
22149
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
31 blockers = set() |
20940
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
32 if hideable: |
21059
d7e233df48e6
repoview: make the conversion from node to rev explicit while computing hidden
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
21058
diff
changeset
|
33 # We use cl to avoid recursive lookup from repo[xxx] |
20940
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
34 cl = repo.changelog |
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
35 firsthideable = min(hideable) |
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
36 revs = cl.revs(start=firsthideable) |
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
37 tofilter = repo.revs( |
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
38 '(%ld) and children(%ld)', list(revs), list(hideable)) |
22149
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
39 blockers.update([r for r in tofilter if r not in hideable]) |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
40 return blockers |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
41 |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
42 def _getdynamicblockers(repo): |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
43 """Non-cacheable revisions blocking hidden changesets from being filtered. |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
44 |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
45 Get revisions that will block hidden changesets and are likely to change, |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
46 but unlikely to create hidden blockers. They won't be cached, so be careful |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
47 with adding additional computation.""" |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
48 |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
49 cl = repo.changelog |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
50 blockers = set() |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
51 blockers.update([par.rev() for par in repo[None].parents()]) |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
52 blockers.update([cl.rev(bm) for bm in repo._bookmarks.values()]) |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
53 |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
54 tags = {} |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
55 tagsmod.readlocaltags(repo.ui, repo, tags, {}) |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
56 if tags: |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
57 rev, nodemap = cl.rev, cl.nodemap |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
58 blockers.update(rev(t[0]) for t in tags.values() if t[0] in nodemap) |
20940
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
59 return blockers |
b0822c23e80a
repoview: add _gethiddenblockers method
Sean Farley <sean.michael.farley@gmail.com>
parents:
20939
diff
changeset
|
60 |
22150
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
61 cacheversion = 1 |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
62 cachefile = 'cache/hidden' |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
63 |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
64 def cachehash(repo, hideable): |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
65 """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
|
66 |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
67 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
|
68 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
|
69 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
|
70 """ |
22282
4092d12ba18a
repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents:
22261
diff
changeset
|
71 h = util.sha1() |
4092d12ba18a
repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents:
22261
diff
changeset
|
72 h.update(''.join(repo.heads())) |
22150
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
73 h.update(str(hash(frozenset(hideable)))) |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
74 return h.digest() |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
75 |
23378
47091002ae62
repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22773
diff
changeset
|
76 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
|
77 """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
|
78 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
|
79 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
|
80 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
|
81 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
|
82 |
22150
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
83 def trywritehiddencache(repo, hideable, hidden): |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
84 """write cache of hidden changesets to disk |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
85 |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
86 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
|
87 The cache consists of a head of 22byte: |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
88 2 byte version number of the cache |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
89 20 byte sha1 to validate the cache |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
90 n*4 byte hidden revs |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
91 """ |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
92 wlock = fh = None |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
93 try: |
22174
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
94 try: |
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
95 wlock = repo.wlock(wait=False) |
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
96 # write cache to file |
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
97 newhash = cachehash(repo, hideable) |
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
98 fh = repo.vfs.open(cachefile, 'w+b', atomictemp=True) |
23378
47091002ae62
repoview: extract actual hidden cache writing in its own function
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22773
diff
changeset
|
99 _writehiddencache(fh, newhash, hidden) |
22174
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
100 except (IOError, OSError): |
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
101 repo.ui.debug('error writing hidden changesets cache') |
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
102 except error.LockHeld: |
0cc2db64c335
repoview: fix try/except/finally for py2.4
Matt Mackall <mpm@selenic.com>
parents:
22151
diff
changeset
|
103 repo.ui.debug('cannot obtain lock to write hidden changesets cache') |
22150
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
104 finally: |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
105 if fh: |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
106 fh.close() |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
107 if wlock: |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
108 wlock.release() |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
109 |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
110 def tryreadcache(repo, hideable): |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
111 """read a cache if the cache exists and is valid, otherwise returns None.""" |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
112 hidden = fh = None |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
113 try: |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
114 if repo.vfs.exists(cachefile): |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
115 fh = repo.vfs.open(cachefile, 'rb') |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
116 version, = struct.unpack(">H", fh.read(2)) |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
117 oldhash = fh.read(20) |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
118 newhash = cachehash(repo, hideable) |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
119 if (cacheversion, oldhash) == (version, newhash): |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
120 # 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
|
121 data = fh.read() |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
122 count = len(data) / 4 |
22282
4092d12ba18a
repoview: fix 0L with pack/unpack for 2.4
Matt Mackall <mpm@selenic.com>
parents:
22261
diff
changeset
|
123 hidden = frozenset(struct.unpack('>%ii' % count, data)) |
22150
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
124 return hidden |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
125 finally: |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
126 if fh: |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
127 fh.close() |
45b5cd948a4d
repoview: add caching bits
David Soria Parra <davidsp@fb.com>
parents:
22149
diff
changeset
|
128 |
18242
e4687edec014
clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18233
diff
changeset
|
129 def computehidden(repo): |
e4687edec014
clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18233
diff
changeset
|
130 """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
|
131 |
e4687edec014
clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18233
diff
changeset
|
132 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
|
133 assert not repo.changelog.filteredrevs |
22151
c0c369aec643
repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents:
22150
diff
changeset
|
134 |
22149
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
135 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
|
136 hideable = hideablerevs(repo) |
18272
95ef7a87c053
performance: speedup computation of hidden revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18250
diff
changeset
|
137 if hideable: |
95ef7a87c053
performance: speedup computation of hidden revisions
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18250
diff
changeset
|
138 cl = repo.changelog |
22151
c0c369aec643
repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents:
22150
diff
changeset
|
139 hidden = tryreadcache(repo, hideable) |
c0c369aec643
repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents:
22150
diff
changeset
|
140 if hidden is None: |
c0c369aec643
repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents:
22150
diff
changeset
|
141 blocked = cl.ancestors(_getstaticblockers(repo), inclusive=True) |
c0c369aec643
repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents:
22150
diff
changeset
|
142 hidden = frozenset(r for r in hideable if r not in blocked) |
c0c369aec643
repoview: cache hidden changesets
David Soria Parra <davidsp@fb.com>
parents:
22150
diff
changeset
|
143 trywritehiddencache(repo, hideable, hidden) |
22149
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
144 |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
145 # 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
|
146 # changesets and remove those. |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
147 dynamic = hidden & _getdynamicblockers(repo) |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
148 if dynamic: |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
149 blocked = cl.ancestors(dynamic, inclusive=True) |
16ef2c485f03
repoview: split _gethiddenblockers
David Soria Parra <davidsp@fb.com>
parents:
22148
diff
changeset
|
150 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
|
151 return hidden |
18242
e4687edec014
clfilter: introduces a hidden filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18233
diff
changeset
|
152 |
18102
3c7b67b76190
clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18101
diff
changeset
|
153 def computeunserved(repo): |
3c7b67b76190
clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18101
diff
changeset
|
154 """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
|
155 |
3c7b67b76190
clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18101
diff
changeset
|
156 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
|
157 assert not repo.changelog.filteredrevs |
3c7b67b76190
clfilter: introduce a "unserver" filtering mode
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18101
diff
changeset
|
158 # 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
|
159 hiddens = filterrevs(repo, 'visible') |
18273
a2d54f68e13c
performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18272
diff
changeset
|
160 if phases.hassecret(repo): |
a2d54f68e13c
performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18272
diff
changeset
|
161 cl = repo.changelog |
a2d54f68e13c
performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18272
diff
changeset
|
162 secret = phases.secret |
a2d54f68e13c
performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18272
diff
changeset
|
163 getphase = repo._phasecache.phase |
a2d54f68e13c
performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18272
diff
changeset
|
164 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
|
165 revs = cl.revs(start=first) |
a2d54f68e13c
performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18272
diff
changeset
|
166 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
|
167 return frozenset(hiddens | secrets) |
a2d54f68e13c
performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18272
diff
changeset
|
168 else: |
a2d54f68e13c
performance: speedup computation of unserved revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18272
diff
changeset
|
169 return hiddens |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
170 |
18245
aff706b3a21c
clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18242
diff
changeset
|
171 def computemutable(repo): |
aff706b3a21c
clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18242
diff
changeset
|
172 """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
|
173 |
aff706b3a21c
clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18242
diff
changeset
|
174 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
|
175 assert not repo.changelog.filteredrevs |
aff706b3a21c
clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18242
diff
changeset
|
176 # fast check to avoid revset call on huge repo |
aff706b3a21c
clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18242
diff
changeset
|
177 if util.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
|
178 getphase = repo._phasecache.phase |
18382
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18293
diff
changeset
|
179 maymutable = filterrevs(repo, 'base') |
18274
254b708fd37d
performance: speedup computation of mutable revisions
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18273
diff
changeset
|
180 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
|
181 return frozenset() |
aff706b3a21c
clfilter: add mutable filtering
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18242
diff
changeset
|
182 |
18246
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
183 def computeimpactable(repo): |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
184 """Everything impactable by mutable revision |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
185 |
18462
593eb3786165
documentation: update to new filter names
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18445
diff
changeset
|
186 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
|
187 happen when: |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
188 |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
189 - you garbage collect hidden changeset, |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
190 - public phase is moved backward, |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
191 - 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
|
192 |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
193 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
|
194 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
|
195 |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
196 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
|
197 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
|
198 assert not repo.changelog.filteredrevs |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
199 cl = repo.changelog |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
200 firstmutable = len(cl) |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
201 for roots in repo._phasecache.phaseroots[1:]: |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
202 if roots: |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
203 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
|
204 # 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
|
205 firstmutable = max(0, firstmutable) |
18246
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
206 return frozenset(xrange(firstmutable, len(cl))) |
58ca19edc043
clfilter: add impactable filter
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18245
diff
changeset
|
207 |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
208 # 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
|
209 # |
20549
2025315cfb0c
comments: fix minor spelling issues found with spell checker
Mads Kiilerich <madski@unity3d.com>
parents:
20405
diff
changeset
|
210 # 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
|
211 # 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
|
212 # 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
|
213 # from scratch (very slow). |
18382
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18293
diff
changeset
|
214 filtertable = {'visible': computehidden, |
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18293
diff
changeset
|
215 'served': computeunserved, |
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18293
diff
changeset
|
216 'immutable': computemutable, |
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18293
diff
changeset
|
217 'base': computeimpactable} |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
218 |
18382
f3b21beb9802
filtering: rename filters to their antonyms
Kevin Bullock <kbullock@ringworld.org>
parents:
18293
diff
changeset
|
219 def filterrevs(repo, filtername): |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
220 """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
|
221 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
|
222 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
|
223 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
|
224 return repo.filteredrevcache[filtername] |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
225 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
226 class repoview(object): |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
227 """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
|
228 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
229 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
|
230 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
|
231 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
|
232 - 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
|
233 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
|
234 - 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
|
235 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
236 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
|
237 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
|
238 - 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
|
239 - 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
|
240 - 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
|
241 from `repo.__dict__`. |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
242 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
243 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
|
244 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
|
245 `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
|
246 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
|
247 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
248 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
|
249 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
|
250 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
|
251 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
|
252 `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
|
253 leads to the property below. |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
254 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
255 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
|
256 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
257 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
|
258 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
|
259 """ |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
260 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
261 def __init__(self, repo, filtername): |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
262 object.__setattr__(self, '_unfilteredrepo', repo) |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
263 object.__setattr__(self, 'filtername', filtername) |
18445
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
264 object.__setattr__(self, '_clcachekey', None) |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
265 object.__setattr__(self, '_clcache', None) |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
266 |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18495
diff
changeset
|
267 # 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
|
268 @property |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
269 def changelog(self): |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
270 """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
|
271 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
272 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
|
273 # some cache may be implemented later |
18445
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
274 unfi = self._unfilteredrepo |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
275 unfichangelog = unfi.changelog |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
276 revs = filterrevs(unfi, self.filtername) |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
277 cl = self._clcache |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
278 newkey = (len(unfichangelog), unfichangelog.tip(), hash(revs)) |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
279 if cl is not None: |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
280 # we need to check curkey too for some obscure reason. |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
281 # MQ test show a corruption of the underlying repo (in _clcache) |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
282 # without change in the cachekey. |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
283 oldfilter = cl.filteredrevs |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
284 try: |
22317
e1d5fcab58b6
repoview: fix typo in repoview.changelog
Mike Hommey <mh@glandium.org>
parents:
22106
diff
changeset
|
285 cl.filteredrevs = () # disable filtering for tip |
18445
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
286 curkey = (len(cl), cl.tip(), hash(oldfilter)) |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
287 finally: |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
288 cl.filteredrevs = oldfilter |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
289 if newkey != self._clcachekey or newkey != curkey: |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
290 cl = None |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
291 # 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
|
292 if cl is None: |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
293 cl = copy.copy(unfichangelog) |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
294 cl.filteredrevs = revs |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
295 object.__setattr__(self, '_clcache', cl) |
4d92e2d75cff
repoview: cache filtered changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18443
diff
changeset
|
296 object.__setattr__(self, '_clcachekey', newkey) |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
297 return cl |
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 def unfiltered(self): |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
300 """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
|
301 return self._unfilteredrepo |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
302 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
303 def filtered(self, name): |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
304 """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
|
305 if name == self.filtername: |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
306 return self |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
307 return self.unfiltered().filtered(name) |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
308 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
309 # 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
|
310 def __getattr__(self, attr): |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
311 return getattr(self._unfilteredrepo, attr) |
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 def __setattr__(self, attr, value): |
23502
ced3ecfc2e57
repoview: allow methods on the proxy class to be replaced
Matt Harbison <matt_harbison@yahoo.com>
parents:
23378
diff
changeset
|
314 # Allow method replacement on filtered repos, like status() in |
ced3ecfc2e57
repoview: allow methods on the proxy class to be replaced
Matt Harbison <matt_harbison@yahoo.com>
parents:
23378
diff
changeset
|
315 # largefiles' purge override |
ced3ecfc2e57
repoview: allow methods on the proxy class to be replaced
Matt Harbison <matt_harbison@yahoo.com>
parents:
23378
diff
changeset
|
316 if type(value) == types.FunctionType: |
ced3ecfc2e57
repoview: allow methods on the proxy class to be replaced
Matt Harbison <matt_harbison@yahoo.com>
parents:
23378
diff
changeset
|
317 object.__setattr__(self, attr, value) |
18100
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
318 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
|
319 |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
320 def __delattr__(self, attr): |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
321 return delattr(self._unfilteredrepo, attr) |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
322 |
18644
3e92772d5383
spelling: fix some minor issues found by spell checker
Mads Kiilerich <mads@kiilerich.com>
parents:
18495
diff
changeset
|
323 # 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
|
324 # __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
|
325 # 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
|
326 @property |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
327 def requirements(self): |
3a6ddacb7198
clfilter: add actual repo filtering mechanism
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff
changeset
|
328 return self._unfilteredrepo.requirements |