comparison mercurial/revset.py @ 20722:6894223ebc38

revset: changed _iterator() method on addset to work with a given order If the two collections are in ascending order, yield their values in an ordered way by iterating both at the same time and picking the values to yield.
author Lucas Moscovicz <lmoscovicz@fb.com>
date Thu, 13 Mar 2014 13:29:04 -0700
parents d642f176df52
children fb9852c46a42
comparison
equal deleted inserted replaced
20721:d642f176df52 20722:6894223ebc38
2338 if not self._genlist: 2338 if not self._genlist:
2339 self._genlist = baseset(self._iterator()) 2339 self._genlist = baseset(self._iterator())
2340 return self._genlist 2340 return self._genlist
2341 2341
2342 def _iterator(self): 2342 def _iterator(self):
2343 """Iterate over both collections without repeating elements
2344
2345 If the ascending attribute is not set, iterate over the first one and
2346 then over the second one checking for membership on the first one so we
2347 dont yield any duplicates.
2348
2349 If the ascending attribute is set, iterate over both collections at the
2350 same time, yielding only one value at a time in the given order.
2351 """
2343 if not self._iter: 2352 if not self._iter:
2344 def gen(): 2353 def gen():
2345 for r in self._r1: 2354 if self._ascending is None:
2346 yield r 2355 for r in self._r1:
2347 s = self._r1.set()
2348 for r in self._r2:
2349 if r not in s:
2350 yield r 2356 yield r
2357 s = self._r1.set()
2358 for r in self._r2:
2359 if r not in s:
2360 yield r
2361 else:
2362 iter1 = iter(self._r1)
2363 iter2 = iter(self._r2)
2364
2365 val1 = None
2366 val2 = None
2367
2368 choice = max
2369 if self._ascending:
2370 choice = min
2371 try:
2372 # Consume both iterators in an ordered way until one is
2373 # empty
2374 while True:
2375 if val1 is None:
2376 val1 = iter1.next()
2377 if val2 is None:
2378 val2 = iter2.next()
2379 next = choice(val1, val2)
2380 yield next
2381 if val1 == next:
2382 val1 = None
2383 if val2 == next:
2384 val2 = None
2385 except StopIteration:
2386 # Flush any remaining values and consume the other one
2387 it = iter2
2388 if val1 is not None:
2389 yield val1
2390 it = iter1
2391 elif val2 is not None:
2392 # might have been equality and both are empty
2393 yield val2
2394 for val in it:
2395 yield val
2396
2351 self._iter = _generatorset(gen()) 2397 self._iter = _generatorset(gen())
2352 2398
2353 return self._iter 2399 return self._iter
2354 2400
2355 def __iter__(self): 2401 def __iter__(self):