[PATCH] revset: make follow() reject more than one start revisions

Yuya Nishihara yuya at tcha.org
Wed Oct 12 13:07:59 UTC 2016


# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1476131409 -7200
#      Mon Oct 10 22:30:09 2016 +0200
# Node ID 4960509763a61ae3710346131f218cf3bf3f3d32
# Parent  30b2ca4bcf3588de9d949b3eefb2669cb6f8a18a
revset: make follow() reject more than one start revisions

Taking only the last revision is inconsistent because ancestors(set) follows
all revisions given, and theoretically follow(startrev=set) == ancestors(set).
I'm planning to add a support for multiple start revisions, but that won't fit
to the 4.0 time frame. So reject multiple revisions now to avoid future BC.

len(revs) might be slow if revs were large, but we don't care since a valid
revs should have only one element.

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -1027,10 +1027,11 @@ def _follow(repo, subset, x, name, follo
         x = getstring(l[0], _("%s expected a pattern") % name)
         rev = None
         if len(l) >= 2:
-            rev = getset(repo, fullreposet(repo), l[1]).last()
-            if rev is None:
+            revs = getset(repo, fullreposet(repo), l[1])
+            if len(revs) != 1:
                 raise error.RepoLookupError(
-                        _("%s: starting revision set cannot be empty") % name)
+                        _("%s expected one starting revision") % name)
+            rev = revs.last()
             c = repo[rev]
         matcher = matchmod.match(repo.root, repo.getcwd(), [x],
                                  ctx=repo[rev], default='path')


More information about the Mercurial-devel mailing list