106 obsdata = StringIO() |
106 obsdata = StringIO() |
107 _encodemarkersstream(obsdata, markers) |
107 _encodemarkersstream(obsdata, markers) |
108 obsdata.seek(0) |
108 obsdata.seek(0) |
109 return obsdata |
109 return obsdata |
110 |
110 |
111 # from evolve extension: 1a23c7c52a43 |
111 if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'): |
112 class pruneobsstore(obsolete.obsstore): |
112 # from evolve extension: 1a23c7c52a43 |
113 """And extended obsstore class that read parent information from v1 format |
113 class pruneobsstore(obsolete.obsstore): |
114 |
114 """And extended obsstore class that read parent information from v1 format |
115 Evolve extension adds parent information in prune marker. We use it to make |
115 |
116 markers relevant to pushed changeset.""" |
116 Evolve extension adds parent information in prune marker. We use it to make |
117 |
117 markers relevant to pushed changeset.""" |
118 def __init__(self, *args, **kwargs): |
118 |
119 self.prunedchildren = {} |
119 def __init__(self, *args, **kwargs): |
120 return super(pruneobsstore, self).__init__(*args, **kwargs) |
120 self.prunedchildren = {} |
121 |
121 return super(pruneobsstore, self).__init__(*args, **kwargs) |
122 def _load(self, markers): |
122 |
123 markers = self._prunedetectingmarkers(markers) |
123 def _load(self, markers): |
124 return super(pruneobsstore, self)._load(markers) |
124 markers = self._prunedetectingmarkers(markers) |
125 |
125 return super(pruneobsstore, self)._load(markers) |
126 |
126 |
127 def _prunedetectingmarkers(self, markers): |
127 |
128 for m in markers: |
128 def _prunedetectingmarkers(self, markers): |
129 if not m[1]: # no successors |
129 for m in markers: |
130 meta = obsolete.decodemeta(m[3]) |
130 if not m[1]: # no successors |
131 if 'p1' in meta: |
131 meta = obsolete.decodemeta(m[3]) |
132 p1 = node.bin(meta['p1']) |
132 if 'p1' in meta: |
133 self.prunedchildren.setdefault(p1, set()).add(m) |
133 p1 = node.bin(meta['p1']) |
134 if 'p2' in meta: |
134 self.prunedchildren.setdefault(p1, set()).add(m) |
135 p2 = node.bin(meta['p2']) |
135 if 'p2' in meta: |
136 self.prunedchildren.setdefault(p2, set()).add(m) |
136 p2 = node.bin(meta['p2']) |
137 yield m |
137 self.prunedchildren.setdefault(p2, set()).add(m) |
138 |
138 yield m |
139 # from evolve extension: 1a23c7c52a43 |
139 |
140 def relevantmarkers(self, nodes): |
140 # from evolve extension: 1a23c7c52a43 |
141 """return a set of all obsolescence marker relevant to a set of node. |
141 def relevantmarkers(self, nodes): |
142 |
142 """return a set of all obsolescence marker relevant to a set of node. |
143 "relevant" to a set of node mean: |
143 |
144 |
144 "relevant" to a set of node mean: |
145 - marker that use this changeset as successors |
145 |
146 - prune marker of direct children on this changeset. |
146 - marker that use this changeset as successors |
147 - recursive application of the two rules on precursors of these markers |
147 - prune marker of direct children on this changeset. |
148 |
148 - recursive application of the two rules on precursors of these markers |
149 It is a set so you cannot rely on order""" |
149 |
150 seennodes = set(nodes) |
150 It is a set so you cannot rely on order""" |
151 seenmarkers = set() |
151 seennodes = set(nodes) |
152 pendingnodes = set(nodes) |
152 seenmarkers = set() |
153 precursorsmarkers = self.precursors |
153 pendingnodes = set(nodes) |
154 prunedchildren = self.prunedchildren |
154 precursorsmarkers = self.precursors |
155 while pendingnodes: |
155 prunedchildren = self.prunedchildren |
156 direct = set() |
156 while pendingnodes: |
157 for current in pendingnodes: |
157 direct = set() |
158 direct.update(precursorsmarkers.get(current, ())) |
158 for current in pendingnodes: |
159 direct.update(prunedchildren.get(current, ())) |
159 direct.update(precursorsmarkers.get(current, ())) |
160 direct -= seenmarkers |
160 direct.update(prunedchildren.get(current, ())) |
161 pendingnodes = set([m[0] for m in direct]) |
161 direct -= seenmarkers |
162 seenmarkers |= direct |
162 pendingnodes = set([m[0] for m in direct]) |
163 pendingnodes -= seennodes |
163 seenmarkers |= direct |
164 seennodes |= pendingnodes |
164 pendingnodes -= seennodes |
165 return seenmarkers |
165 seennodes |= pendingnodes |
|
166 return seenmarkers |
166 |
167 |
167 # from evolve extension: cf35f38d6a10 |
168 # from evolve extension: cf35f38d6a10 |
168 def srv_pullobsmarkers(repo, proto, others): |
169 def srv_pullobsmarkers(repo, proto, others): |
169 """serves a binary stream of markers. |
170 """serves a binary stream of markers. |
170 |
171 |
257 gboptsmap['evo_obsheads'] = 'plain' |
258 gboptsmap['evo_obsheads'] = 'plain' |
258 else: |
259 else: |
259 gboptslist.append('evo_obsheads') |
260 gboptslist.append('evo_obsheads') |
260 gboptslist.append('evo_obscommon') |
261 gboptslist.append('evo_obscommon') |
261 gboptslist.append('evo_obsmarker') |
262 gboptslist.append('evo_obsmarker') |
262 obsolete.obsstore = pruneobsstore |
263 if not util.safehasattr(obsolete.obsstore, 'relevantmarkers'): |
263 obsolete.obsstore.relevantmarkers = relevantmarkers |
264 obsolete.obsstore = pruneobsstore |
|
265 obsolete.obsstore.relevantmarkers = relevantmarkers |
264 hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push' |
266 hgweb_mod.perms['evoext_pushobsmarkers_0'] = 'push' |
265 hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull' |
267 hgweb_mod.perms['evoext_pullobsmarkers_0'] = 'pull' |
266 hgweb_mod.perms['evoext_obshash'] = 'pull' |
268 hgweb_mod.perms['evoext_obshash'] = 'pull' |
267 wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '') |
269 wireproto.commands['evoext_pushobsmarkers_0'] = (srv_pushobsmarkers, '') |
268 wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*') |
270 wireproto.commands['evoext_pullobsmarkers_0'] = (srv_pullobsmarkers, '*') |