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

yuja (Yuya Nishihara) phabricator at mercurial-scm.org
Sun Jan 13 22:11:20 EST 2019


yuja added a comment.


  > - at predicate('merge(withbranch)', safe=True)
  >  + at predicate('merge(withbranch, samebranch=True)', safe=True)
  
  `[, samebranch]` or [, samebranch=False]`.
  
  >   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
  
  These conditions can be formed as followed:
  
    matchfns = [lambda r: cl.parentrevs(r)[1] != -1]
    if withbranch:
        matchfns.append(lambda r: branchmatcher(repo[r].p2().branch()))
    if samebranch:
        matchfns.append(samebranchmatchfn)
    
    if len(matchfns) == 1:
        # fast path for common case
        return subset.filter(matchfn[0], ...)
    else:
        return subset.filter(lambda r: all(p(r) for p in matchfn), ...)

REPOSITORY
  rHG Mercurial

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

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


More information about the Mercurial-devel mailing list