Show More
@@ -161,6 +161,28 b' def _limitsample(sample, desiredlen):' | |||||
161 | sample = set(random.sample(sample, desiredlen)) |
|
161 | sample = set(random.sample(sample, desiredlen)) | |
162 | return sample |
|
162 | return sample | |
163 |
|
163 | |||
|
164 | class partialdiscovery(object): | |||
|
165 | """an object representing ongoing discovery | |||
|
166 | ||||
|
167 | Feed with data from the remote repository, this object keep track of the | |||
|
168 | current set of changeset in various states: | |||
|
169 | ||||
|
170 | - common: own nodes I know we both know | |||
|
171 | """ | |||
|
172 | ||||
|
173 | def __init__(self, repo): | |||
|
174 | self._repo = repo | |||
|
175 | self._common = repo.changelog.incrementalmissingrevs() | |||
|
176 | ||||
|
177 | def addcommons(self, commons): | |||
|
178 | """registrer nodes known as common""" | |||
|
179 | self._common.addbases(commons) | |||
|
180 | ||||
|
181 | def hasinfo(self): | |||
|
182 | """return True is we have any clue about the remote state""" | |||
|
183 | return self._common.hasbases() | |||
|
184 | ||||
|
185 | ||||
164 | def findcommonheads(ui, local, remote, |
|
186 | def findcommonheads(ui, local, remote, | |
165 | initialsamplesize=100, |
|
187 | initialsamplesize=100, | |
166 | fullsamplesize=200, |
|
188 | fullsamplesize=200, | |
@@ -227,14 +249,14 b' def findcommonheads(ui, local, remote,' | |||||
227 |
|
249 | |||
228 | # full blown discovery |
|
250 | # full blown discovery | |
229 |
|
251 | |||
230 | # own nodes I know we both know |
|
252 | disco = partialdiscovery(local) | |
231 | # treat remote heads (and maybe own heads) as a first implicit sample |
|
253 | # treat remote heads (and maybe own heads) as a first implicit sample | |
232 | # response |
|
254 | # response | |
233 | common = cl.incrementalmissingrevs(srvheads) |
|
255 | disco.addcommons(srvheads) | |
234 | commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) |
|
256 | commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) | |
235 |
co |
|
257 | disco.addcommons(commoninsample) | |
236 | # own nodes where I don't know if remote knows them |
|
258 | # own nodes where I don't know if remote knows them | |
237 | undecided = set(common.missingancestors(ownheads)) |
|
259 | undecided = set(disco._common.missingancestors(ownheads)) | |
238 | # own nodes I know remote lacks |
|
260 | # own nodes I know remote lacks | |
239 | missing = set() |
|
261 | missing = set() | |
240 |
|
262 | |||
@@ -256,7 +278,7 b' def findcommonheads(ui, local, remote,' | |||||
256 | if not undecided: |
|
278 | if not undecided: | |
257 | break |
|
279 | break | |
258 |
|
280 | |||
259 |
if full or co |
|
281 | if full or disco.hasinfo(): | |
260 | if full: |
|
282 | if full: | |
261 | ui.note(_("sampling from both directions\n")) |
|
283 | ui.note(_("sampling from both directions\n")) | |
262 | else: |
|
284 | else: | |
@@ -286,13 +308,13 b' def findcommonheads(ui, local, remote,' | |||||
286 |
|
308 | |||
287 | if sample: |
|
309 | if sample: | |
288 | commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) |
|
310 | commoninsample = set(n for i, n in enumerate(sample) if yesno[i]) | |
289 |
co |
|
311 | disco.addcommons(commoninsample) | |
290 | common.removeancestorsfrom(undecided) |
|
312 | disco._common.removeancestorsfrom(undecided) | |
291 |
|
313 | |||
292 | # heads(common) == heads(common.bases) since common represents common.bases |
|
314 | # heads(common) == heads(common.bases) since common represents common.bases | |
293 | # and all its ancestors |
|
315 | # and all its ancestors | |
294 | # The presence of nullrev will confuse heads(). So filter it out. |
|
316 | # The presence of nullrev will confuse heads(). So filter it out. | |
295 | result = set(local.revs('heads(%ld)', common.bases - {nullrev})) |
|
317 | result = set(local.revs('heads(%ld)', disco._common.bases - {nullrev})) | |
296 | elapsed = util.timer() - start |
|
318 | elapsed = util.timer() - start | |
297 | progress.complete() |
|
319 | progress.complete() | |
298 | ui.debug("%d total queries in %.4fs\n" % (roundtrips, elapsed)) |
|
320 | ui.debug("%d total queries in %.4fs\n" % (roundtrips, elapsed)) |
General Comments 0
You need to be logged in to leave comments.
Login now