# HG changeset patch # User Yuya Nishihara # Date 1428592456 -32400 # Node ID 9b7d615108d77d885d54a6b8709419485dfc8cbd # Parent 653d60455dbe1c71d0aaea1481ab02f622189927 smartset: micro optimize spanset.slice() to narrow range accordingly -1ms isn't significant, but seems not bad. revset #0: limit(0:9999, 100, 9000) 6) 0.001145 7) 0.000214 revset #3: last(0:9999, 100) 6) 0.000197 7) 0.000171 diff -r 653d60455dbe -r 9b7d615108d7 mercurial/smartset.py --- a/mercurial/smartset.py Thu Apr 09 23:56:06 2015 +0900 +++ b/mercurial/smartset.py Fri Apr 10 00:14:16 2015 +0900 @@ -1056,6 +1056,18 @@ return x return None + def _slice(self, start, stop): + if self._hiddenrevs: + # unoptimized since all hidden revisions in range has to be scanned + return super(_spanset, self)._slice(start, stop) + if self._ascending: + x = min(self._start + start, self._end) + y = min(self._start + stop, self._end) + else: + x = max(self._end - stop, self._start) + y = max(self._end - start, self._start) + return _spanset(x, y, self._ascending, self._hiddenrevs) + def __repr__(self): d = {False: '-', True: '+'}[self._ascending] return '<%s%s %d:%d>' % (type(self).__name__.lstrip('_'), d, diff -r 653d60455dbe -r 9b7d615108d7 tests/test-revset.t --- a/tests/test-revset.t Thu Apr 09 23:56:06 2015 +0900 +++ b/tests/test-revset.t Fri Apr 10 00:14:16 2015 +0900 @@ -1080,13 +1080,54 @@ * set: + (using spanset) + + $ hg debugrevspec --no-show-revs -s 0:7 + * set: + + $ log 'limit(0:7, 3, 4)' + 4 + 5 + 6 + $ log 'limit(7:0, 3, 4)' + 3 + 2 + 1 + $ log 'limit(0:7, 3, 6)' + 6 + 7 + $ log 'limit(7:0, 3, 6)' + 1 + 0 + $ log 'last(0:7, 2)' + 6 + 7 + $ hg debugrevspec -s 'limit(0:7, 3, 6)' + * set: + + 6 + 7 + $ hg debugrevspec -s 'limit(0:7, 3, 9)' + * set: + + $ hg debugrevspec -s 'limit(7:0, 3, 6)' + * set: + + 1 + 0 + $ hg debugrevspec -s 'limit(7:0, 3, 9)' + * set: + + $ hg debugrevspec -s 'limit(0:7, 0)' + * set: + + Test order of first/last revisions $ hg debugrevspec -s 'first(4:0, 3) & 3:' * set: >, + , > 4 3 @@ -1095,16 +1136,14 @@ * set: , - >> + > 3 4 $ hg debugrevspec -s 'last(4:0, 3) & :1' * set: >, + , > 1 0 @@ -1113,8 +1152,7 @@ * set: , - >> + > 0 1