revset: add regular expression support to 'desc'
authorMatt Harbison <matt_harbison@yahoo.com>
Sat, 07 Jan 2017 21:26:32 -0500
changeset 30783 931a60880df4
parent 30782 db38cfc7c29d
child 30784 5dd67f0993ce
revset: add regular expression support to 'desc' This is a case insensitive predicate like 'author', so it conforms to the existing behavior of performing a case insensitive regex.
mercurial/revset.py
tests/test-revset.t
--- a/mercurial/revset.py	Wed Jan 11 22:42:10 2017 -0500
+++ b/mercurial/revset.py	Sat Jan 07 21:26:32 2017 -0500
@@ -814,15 +814,18 @@
 @predicate('desc(string)', safe=True)
 def desc(repo, subset, x):
     """Search commit message for string. The match is case-insensitive.
+
+    If `string` starts with `re:`, the remainder of the string is treated as
+    a regular expression. To match a substring that actually starts with `re:`,
+    use the prefix `literal:`.
     """
     # i18n: "desc" is a keyword
-    ds = encoding.lower(getstring(x, _("desc requires a string")))
-
-    def matches(x):
-        c = repo[x]
-        return ds in encoding.lower(c.description())
-
-    return subset.filter(matches, condrepr=('<desc %r>', ds))
+    ds = getstring(x, _("desc requires a string"))
+
+    kind, pattern, matcher = _substringmatcher(ds, casesensitive=False)
+
+    return subset.filter(lambda r: matcher(repo[r].description()),
+                         condrepr=('<desc %r>', ds))
 
 def _descendants(repo, subset, x, followfirst=False):
     roots = getset(repo, fullreposet(repo), x)
--- a/tests/test-revset.t	Wed Jan 11 22:42:10 2017 -0500
+++ b/tests/test-revset.t	Sat Jan 07 21:26:32 2017 -0500
@@ -912,6 +912,9 @@
   5
   $ log 'desc(B)'
   5
+  $ hg log -r 'desc(r"re:S?u")' --template "{rev} {desc|firstline}\n"
+  5 5 bug
+  6 6 issue619
   $ log 'descendants(2 or 3)'
   2
   3