# HG changeset patch # User Yuya Nishihara # Date 1462250172 -32400 # Node ID 89dbae952ec12a12834ef595c90ba18d437a5eb7 # Parent 5f56a3b9675ed095820fa7f717aa11cf0dfee76a revset: make reverse() noop depending on ordering requirement (BC) Because smartset.reverse() may modify the underlying subset, it should be called only if the set can define the ordering. In the following example, 'a' and 'c' is the same object, so 'b.reverse()' would reverse 'a' unexpectedly. # '0:2 & reverse(all())' , # a , # c >> diff -r 5f56a3b9675e -r 89dbae952ec1 mercurial/revset.py --- a/mercurial/revset.py Tue May 03 12:52:50 2016 +0900 +++ b/mercurial/revset.py Tue May 03 13:36:12 2016 +0900 @@ -1833,12 +1833,13 @@ return subset.filter(matches, condrepr=('', fields, revs)) -@predicate('reverse(set)', safe=True) -def reverse(repo, subset, x): +@predicate('reverse(set)', safe=True, takeorder=True) +def reverse(repo, subset, x, order): """Reverse order of set. """ l = getset(repo, subset, x) - l.reverse() + if order == defineorder: + l.reverse() return l @predicate('roots(set)', safe=True) diff -r 5f56a3b9675e -r 89dbae952ec1 tests/test-revset.t --- a/tests/test-revset.t Tue May 03 12:52:50 2016 +0900 +++ b/tests/test-revset.t Tue May 03 13:36:12 2016 +0900 @@ -1594,12 +1594,11 @@ define) * set: , + , > + 0 + 1 2 - 1 - 0 - BROKEN: should be '0 1 2' 'sort()' should take effect only if it is the outermost expression: