2238 % (rev, dateutil.datestr(repo[rev].date())) |
2238 % (rev, dateutil.datestr(repo[rev].date())) |
2239 ) |
2239 ) |
2240 return b'%d' % rev |
2240 return b'%d' % rev |
2241 |
2241 |
2242 |
2242 |
2243 def increasingwindows(windowsize=8, sizelimit=512): |
|
2244 while True: |
|
2245 yield windowsize |
|
2246 if windowsize < sizelimit: |
|
2247 windowsize *= 2 |
|
2248 |
|
2249 |
|
2250 def walkchangerevs(repo, revs, makefilematcher, prepare): |
|
2251 '''Iterate over files and the revs in a "windowed" way. |
|
2252 |
|
2253 Callers most commonly need to iterate backwards over the history |
|
2254 in which they are interested. Doing so has awful (quadratic-looking) |
|
2255 performance, so we use iterators in a "windowed" way. |
|
2256 |
|
2257 We walk a window of revisions in the desired order. Within the |
|
2258 window, we first walk forwards to gather data, then in the desired |
|
2259 order (usually backwards) to display it. |
|
2260 |
|
2261 This function returns an iterator yielding contexts. Before |
|
2262 yielding each context, the iterator will first call the prepare |
|
2263 function on each context in the window in forward order.''' |
|
2264 |
|
2265 if not revs: |
|
2266 return [] |
|
2267 change = repo.__getitem__ |
|
2268 |
|
2269 def iterate(): |
|
2270 it = iter(revs) |
|
2271 stopiteration = False |
|
2272 for windowsize in increasingwindows(): |
|
2273 nrevs = [] |
|
2274 for i in pycompat.xrange(windowsize): |
|
2275 rev = next(it, None) |
|
2276 if rev is None: |
|
2277 stopiteration = True |
|
2278 break |
|
2279 nrevs.append(rev) |
|
2280 for rev in sorted(nrevs): |
|
2281 ctx = change(rev) |
|
2282 prepare(ctx, makefilematcher(ctx)) |
|
2283 for rev in nrevs: |
|
2284 yield change(rev) |
|
2285 |
|
2286 if stopiteration: |
|
2287 break |
|
2288 |
|
2289 return iterate() |
|
2290 |
|
2291 |
|
2292 def add(ui, repo, match, prefix, uipathfn, explicitonly, **opts): |
2243 def add(ui, repo, match, prefix, uipathfn, explicitonly, **opts): |
2293 bad = [] |
2244 bad = [] |
2294 |
2245 |
2295 badfn = lambda x, y: bad.append(x) or match.bad(x, y) |
2246 badfn = lambda x, y: bad.append(x) or match.bad(x, y) |
2296 names = [] |
2247 names = [] |