Show More
@@ -171,6 +171,32 b' class partialdiscovery(object):' | |||
|
171 | 171 | return getrev(r)[5:6] |
|
172 | 172 | return getparents |
|
173 | 173 | |
|
174 | def _childrengetter(self, revs): | |
|
175 | ||
|
176 | # _updatesample() essentially does interaction over revisions to look | |
|
177 | # up their children. This lookup is expensive and doing it in a loop is | |
|
178 | # quadratic. We precompute the children for all relevant revisions and | |
|
179 | # make the lookup in _updatesample() a simple dict lookup. | |
|
180 | # | |
|
181 | # Because this function can be called multiple times during discovery, | |
|
182 | # we may still perform redundant work and there is room to optimize | |
|
183 | # this by keeping a persistent cache of children across invocations. | |
|
184 | children = {} | |
|
185 | ||
|
186 | parentrevs = self._parentsgetter() | |
|
187 | ||
|
188 | for rev in sorted(revs): | |
|
189 | # Always ensure revision has an entry so we don't need to worry | |
|
190 | # about missing keys. | |
|
191 | children[rev] = [] | |
|
192 | for prev in parentrevs(rev): | |
|
193 | if prev == nullrev: | |
|
194 | continue | |
|
195 | c = children.get(prev) | |
|
196 | if c is not None: | |
|
197 | c.append(rev) | |
|
198 | return children.__getitem__ | |
|
199 | ||
|
174 | 200 | def takequicksample(self, headrevs, size): |
|
175 | 201 | """takes a quick sample of size <size> |
|
176 | 202 | |
@@ -206,28 +232,9 b' class partialdiscovery(object):' | |||
|
206 | 232 | # update from roots |
|
207 | 233 | revsroots = set(repo.revs('roots(%ld)', revs)) |
|
208 | 234 | |
|
209 | # _updatesample() essentially does interaction over revisions to look | |
|
210 | # up their children. This lookup is expensive and doing it in a loop is | |
|
211 | # quadratic. We precompute the children for all relevant revisions and | |
|
212 | # make the lookup in _updatesample() a simple dict lookup. | |
|
213 | # | |
|
214 | # Because this function can be called multiple times during discovery, | |
|
215 | # we may still perform redundant work and there is room to optimize | |
|
216 | # this by keeping a persistent cache of children across invocations. | |
|
217 | children = {} | |
|
235 | childrenrevs = self._childrengetter(revs) | |
|
218 | 236 | |
|
219 | for rev in sorted(revs): | |
|
220 | # Always ensure revision has an entry so we don't need to worry | |
|
221 | # about missing keys. | |
|
222 | children[rev] = [] | |
|
223 | for prev in parentrevs(rev): | |
|
224 | if prev == nullrev: | |
|
225 | continue | |
|
226 | c = children.get(prev) | |
|
227 | if c is not None: | |
|
228 | c.append(rev) | |
|
229 | ||
|
230 | _updatesample(revs, revsroots, sample, children.__getitem__) | |
|
237 | _updatesample(revs, revsroots, sample, childrenrevs) | |
|
231 | 238 | assert sample |
|
232 | 239 | sample = _limitsample(sample, size) |
|
233 | 240 | if len(sample) < size: |
General Comments 0
You need to be logged in to leave comments.
Login now