changeset 29945:89dbae952ec1

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())' <filteredset <spanset- 0:2>, # a <filteredset # b <spanset- 0:2>, # c <spanset+ 0:9>>>
author Yuya Nishihara <yuya@tcha.org>
date Tue, 03 May 2016 13:36:12 +0900
parents 5f56a3b9675e
children 285a8c3e53f2
files mercurial/revset.py tests/test-revset.t
diffstat 2 files changed, 7 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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=('<matching%r %r>', 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)
--- 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:
   <filteredset
-    <spanset- 0:2>,
+    <spanset+ 0:2>,
     <spanset+ 0:9>>
+  0
+  1
   2
-  1
-  0
- BROKEN: should be '0 1 2'
 
  'sort()' should take effect only if it is the outermost expression: