[PATCH RESEND] revset: predicate to avoid lookup errors

Wagner Bruna wagner.bruna+mercurial at gmail.com
Thu Jul 8 16:04:11 CDT 2010


# HG changeset patch
# User Wagner Bruna <wbruna at softwareexpress.com.br>
# Date 1278622969 10800
# Branch stable
# Node ID 14ce1c1dc730776ef4a92493557cb4f022f1e8fd
# Parent  ee876e42dd742f4dd7d9309cd964733c45e75af6
revset: predicate to avoid lookup errors

A query like

head() and (descendants("bad") and not descendants("fix"))

(testing if repo heads are affected by a bug) will abort with a
RepoLookupError if either badrev or fixrev aren't found inside
the repository, which is not very informative.

The new predicate returns an empty set for lookup errors, so

head() and (descendants(present("bad")) and not descendants(present("fix")))

will behave as wanted even if those revisions are not found.

diff --git a/mercurial/help/revsets.txt b/mercurial/help/revsets.txt
--- a/mercurial/help/revsets.txt
+++ b/mercurial/help/revsets.txt
@@ -119,6 +119,10 @@
 ``parents(set)``
   The set of all parents for all changesets in set.
 
+``present(set)``
+  An empty set, if any revision in set isn't found; otherwise,
+  all revisions in set.
+
 ``removes(pattern)``
   Changesets which remove files matching pattern.
 
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -367,6 +367,12 @@
     l.reverse()
     return l
 
+def present(repo, subset, x):
+    try:
+        return getset(repo, subset, x)
+    except error.RepoLookupError:
+        return []
+
 def sort(repo, subset, x):
     l = getargs(x, 1, 2, _("sort wants one or two arguments"))
     keys = "rev"
@@ -469,6 +475,7 @@
     "p1": p1,
     "p2": p2,
     "parents": parents,
+    "present": present,
     "removes": removes,
     "reverse": reverse,
     "roots": roots,


More information about the Mercurial-devel mailing list