[PATCH 3 of 5 v2] revset: add pattern matching to 'bookmarks' revset expression

Simon King simon at simonking.org.uk
Sat May 26 19:06:39 CDT 2012


# HG changeset patch
# User Simon King <simon at simonking.org.uk>
# Date 1338074453 -3600
# Node ID d8d8378f4c9d617328a99cd88c3353f0b28b3b0b
# Parent  011d34e5304ba13f722d306d3045a7713adb2b6d
revset: add pattern matching to 'bookmarks' revset expression

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -305,6 +305,10 @@
 def bookmark(repo, subset, x):
     """``bookmark([name])``
     The named bookmark or all bookmarks.
+
+    If `name` starts with `re:`, the remainder of the name is treated as
+    a regular expression. To match a bookmark that actually starts with `re:`,
+    use the prefix `literal:`.
     """
     # i18n: "bookmark" is a keyword
     args = getargs(x, 0, 1, _('bookmark takes one or no arguments'))
@@ -312,11 +316,22 @@
         bm = getstring(args[0],
                        # i18n: "bookmark" is a keyword
                        _('the argument to bookmark must be a string'))
-        bmrev = bookmarksmod.listbookmarks(repo).get(bm, None)
-        if not bmrev:
-            raise util.Abort(_("bookmark '%s' does not exist") % bm)
-        bmrev = repo[bmrev].rev()
-        return [r for r in subset if r == bmrev]
+        kind, pattern, matcher = _stringmatcher(bm)
+        matchrevs = set()
+        for name, bmrev in bookmarksmod.listbookmarks(repo).iteritems():
+            if matcher(name):
+                matchrevs.add(bmrev)
+        if not matchrevs:
+            if kind == 'literal':
+                errmsg = _("bookmark '%s' does not exist") % pattern
+            else:
+                errmsg = _("no bookmarks exist that match '%s'") % pattern
+            raise util.Abort(errmsg)
+
+        bmrevs = set()
+        for bmrev in matchrevs:
+            bmrevs.add(repo[bmrev].rev())
+        return [r for r in subset if r in bmrevs]
     bms = set([repo[r].rev()
                for r in bookmarksmod.listbookmarks(repo).values()])
     return [r for r in subset if r in bms]
diff --git a/tests/test-bookmarks.t b/tests/test-bookmarks.t
--- a/tests/test-bookmarks.t
+++ b/tests/test-bookmarks.t
@@ -84,6 +84,20 @@
   date:        Thu Jan 01 00:00:00 1970 +0000
   summary:     1
   
+  $ hg log -r 'bookmark("re:X")'
+  changeset:   0:f7b1eb17ad24
+  bookmark:    X
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     0
+  
+  changeset:   1:925d80f479bb
+  bookmark:    X2
+  tag:         tip
+  user:        test
+  date:        Thu Jan 01 00:00:00 1970 +0000
+  summary:     1
+  
   $ hg log -r 'bookmark(unknown)'
   abort: bookmark 'unknown' does not exist
   [255]


More information about the Mercurial-devel mailing list