D5496: revset: add "samebranch" keyword argument to the merge revset

angel.ezquerra (Angel Ezquerra) phabricator at mercurial-scm.org
Sun Jan 13 17:45:38 EST 2019


angel.ezquerra updated this revision to Diff 13205.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D5496?vs=13018&id=13205

REVISION DETAIL
  https://phab.mercurial-scm.org/D5496

AFFECTED FILES
  mercurial/revset.py

CHANGE DETAILS

diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -1249,7 +1249,7 @@
         pass
     return baseset(datarepr=('<max %r, %r>', subset, os))
 
- at predicate('merge(withbranch)', safe=True)
+ at predicate('merge(withbranch, samebranch=True)', safe=True)
 def merge(repo, subset, x):
     """Changeset is a merge changeset
 
@@ -1260,29 +1260,50 @@
     possible to specify a regular expression by starting the pattern
     with "re:". This can be used to match more than one branch
     (e.g. "re:branch1|branch2").
+
+    It is also possible to only return merges where both parents belong to
+    the same branch by specifying samebranch=True. If samebranch=False is
+    set then only merges where both parents do not belong to the same branch
+    will be returned.
     """
     # i18n: "merge" is a keyword
-    args = getargsdict(x, 'merge', 'withbranch')
+    args = getargsdict(x, 'merge', 'withbranch samebranch')
     withbranch = ''
     if 'withbranch' in args:
         withbranch = getstring(args['withbranch'],
                                _('withbranch argument must be a string'))
         kind, branchname, branchmatcher = stringutil.stringmatcher(withbranch)
+    samebranch = None
+    if 'samebranch' in args:
+        # i18n: "samebranch" is a keyword
+        samebranch = getboolean(args['samebranch'],
+            _('samebranch argument must be a True or False'))
     cl = repo.changelog
     # create the function that will be used to filter the subset
     if withbranch:
         # matchfn is a function that returns true when a revision
         # is a merge and the second parent belongs to a branch that
         # matches the withbranch pattern (which can be a literal or a regex)
         if kind == 'literal':
-            matchfn = lambda r: (cl.parentrevs(r)[1] != -1
-                                 and repo[r].p2().branch() == withbranch)
+            basematchfn = lambda r: (cl.parentrevs(r)[1] != -1
+                                     and repo[r].p2().branch() == withbranch)
         else:
-            matchfn = lambda r: (cl.parentrevs(r)[1] != -1
-                                 and branchmatcher(repo[r].p2().branch()))
-    else:
-        # matchfn is a function that returns true when a revision is a merge
-        matchfn = lambda r: cl.parentrevs(r)[1] != -1
+            basematchfn = lambda r: (cl.parentrevs(r)[1] != -1
+                                     and branchmatcher(repo[r].p2().branch()))
+    else:
+        basematchfn = lambda r: cl.parentrevs(r)[1] != -1
+    if samebranch is None:
+        matchfn = basematchfn
+    else:
+        # if samebranch was specified, build a new match function
+        # that on top of basematch checks if the parents belong (or not)
+        # to the same branch (depending on the value of samebranch)
+        def matchfn(r):
+            c = repo[r]
+            if not basematchfn(r):
+                return False
+            issamebranchmerge = c.p1().branch() == c.p2().branch()
+            return issamebranchmerge if samebranch else not issamebranchmerge
     return subset.filter(matchfn, condrepr='<merge>')
 
 @predicate('branchpoint()', safe=True)



To: angel.ezquerra, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list