[PATCH] revsets: makes follow() supports file patterns (issue4757)

Yuya Nishihara yuya at tcha.org
Mon Aug 24 08:57:17 CDT 2015


On Sun, 23 Aug 2015 18:45:00 +0200, liscju wrote:
> # HG changeset patch
> # User liscju <piotr.listkiewicz at gmail.com>
> # Date 1440083972 -7200
> #      Thu Aug 20 17:19:32 2015 +0200
> # Branch bug4757#followRevset
> # Node ID 9f24eb22079d0954abd5a429def3f38bd97aa1c1
> # Parent  d9d3d49c4cf77049d12920980e91bf8e4a4ecda2
> revsets: makes follow() supports file patterns (issue4757)
> 
> Before this patch, follow only supports full, exact filenames.
> This patch makes follow argument to be treated like file
> pattern same way like log treats their arguments.
> 
> It preserves current behaviour of follow() matching paths
> relative to the repository root.
> 
> diff -r d9d3d49c4cf7 -r 9f24eb22079d mercurial/revset.py
> --- a/mercurial/revset.py	Tue Aug 18 18:38:56 2015 -0500
> +++ b/mercurial/revset.py	Thu Aug 20 17:19:32 2015 +0200
> @@ -1037,34 +1037,36 @@
>      return limit(repo, subset, x)
>  
>  def _follow(repo, subset, x, name, followfirst=False):
> -    l = getargs(x, 0, 1, _("%s takes no arguments or a filename") % name)
> +    l = getargs(x, 0, 1, _("%s takes no arguments or a pattern") % name)
>      c = repo['.']
>      if l:
> -        x = getstring(l[0], _("%s expected a filename") % name)
> -        if x in c:
> -            cx = c[x]
> -            s = set(ctx.rev() for ctx in cx.ancestors(followfirst=followfirst))
> -            # include the revision responsible for the most recent version
> -            s.add(cx.introrev())
> -        else:
> -            return baseset()
> +        x = getstring(l[0], _("%s expected a pattern") % name)
> +        matcher = matchmod.match(repo.root, '', [x], ctx=repo[None],
> +                                 default='path')

cwd should be repo.getcwd() to handle relative paths.

My question was, why ctx=wctx instead of ctx=c ?
I might be wrong, but I couldn't figure out the need of wctx.

> +        s = set()
> +        for fname in c:
> +            if matcher(fname):
> +                fctx = c[fname]
> +                s = s.union(set(c.rev() for c in fctx.ancestors(followfirst)))

Comment removed unexpectedly?
"# include the revision responsible for the most recent version"

> +                s.add(fctx.introrev())
>      else:
>          s = _revancestors(repo, baseset([c.rev()]), followfirst)


More information about the Mercurial-devel mailing list