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