revrange: drop unnecessary deduplication of revisions
authorYuya Nishihara <yuya@tcha.org>
Sun, 24 May 2015 17:53:22 +0900
changeset 25383 5909ac39b86a
parent 25382 6084926366b9
child 25384 99d3ca7d67e4
revrange: drop unnecessary deduplication of revisions Because "l" is a smartset, duplicated entries are omitted by addsets.
mercurial/scmutil.py
tests/test-revset.t
--- a/mercurial/scmutil.py	Fri May 29 22:23:58 2015 +0200
+++ b/mercurial/scmutil.py	Sun May 24 17:53:22 2015 +0900
@@ -709,14 +709,12 @@
             return defval
         return repo[val].rev()
 
-    seen, l = set(), revset.baseset([])
+    l = revset.baseset([])
 
     revsetaliases = [alias for (alias, _) in
                      repo.ui.configitems("revsetalias")]
 
     for spec in revs:
-        if l and not seen:
-            seen = set(l)
         # attempt to parse old-style ranges first to deal with
         # things like old-tag which contain query metacharacters
         try:
@@ -727,7 +725,6 @@
                 raise error.RepoLookupError
 
             if isinstance(spec, int):
-                seen.add(spec)
                 l = l + revset.baseset([spec])
                 continue
 
@@ -741,24 +738,15 @@
                 if end == nullrev and start < 0:
                     start = nullrev
                 rangeiter = repo.changelog.revs(start, end)
-                if not seen and not l:
+                if not l:
                     # by far the most common case: revs = ["-1:0"]
                     l = revset.baseset(rangeiter)
-                    # defer syncing seen until next iteration
                     continue
                 newrevs = set(rangeiter)
-                if seen:
-                    newrevs.difference_update(seen)
-                    seen.update(newrevs)
-                else:
-                    seen = newrevs
                 l = l + revset.baseset(sorted(newrevs, reverse=start > end))
                 continue
             elif spec and spec in repo: # single unquoted rev
                 rev = revfix(repo, spec, None)
-                if rev in seen:
-                    continue
-                seen.add(rev)
                 l = l + revset.baseset([rev])
                 continue
         except error.RepoLookupError:
@@ -766,10 +754,9 @@
 
         # fall through to new-style queries if old-style fails
         m = revset.match(repo.ui, spec, repo)
-        if seen or l:
-            dl = [r for r in m(repo) if r not in seen]
+        if l:
+            dl = [r for r in m(repo)]
             l = l + revset.baseset(dl)
-            seen.update(dl)
         else:
             l = m(repo)
 
--- a/tests/test-revset.t	Fri May 29 22:23:58 2015 +0200
+++ b/tests/test-revset.t	Sun May 24 17:53:22 2015 +0900
@@ -858,6 +858,16 @@
   4
   5
 
+test that more than one `-r`s are combined in the right order and deduplicated:
+
+  $ hg log -T '{rev}\n' -r 3 -r 3 -r 4 -r 5:2 -r 'ancestors(4)'
+  3
+  4
+  5
+  2
+  0
+  1
+
 test that `or` operation skips duplicated revisions from right-hand side
 
   $ try 'reverse(1::5) or ancestors(4)'