[PATCH 3 of 4] largefiles: shortcircuit status code also for non-matching patterns

Mads Kiilerich mads at kiilerich.com
Sun Nov 2 19:18:21 CST 2014


On 11/02/2014 10:43 PM, Martin von Zweigbergk wrote:
> # HG changeset patch
> # User Martin von Zweigbergk <martinvonz at google.com>
> # Date 1414789907 25200
> #      Fri Oct 31 14:11:47 2014 -0700
> # Branch stable
> # Node ID b89ddc59955d4ffc106c8566af52111f7d52f718
> # Parent  306755539e7e90d6ab8d5dccd68fc8b07042636a
> largefiles: shortcircuit status code also for non-matching patterns
>
> We currently shortcircuit the checking for large file standins if only
> patterns of type 'path' are given on the command line. That makes e.g.
> "hg st 'glob:foo/**'" unnecessarily slow when the only large files are
> in a sibling directory.
>
> Relax the check to be that it is not an always-matcher and that no
> large files match the patterns given on the command line.
>
> Note that before this change, only the latter of the following two
> would show the status of files in .hglf (since the -I makes
> match.anypats() true). After this change, they both display the
> status. This behavior doesn't seem correct, but it would be a separate
> change to explicitly filter out .hglf even in the shortcircuit case.
>
>    hg st .hglf/$file
>    hg st .hglf/$file -I .
> diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py
> --- a/hgext/largefiles/reposetup.py
> +++ b/hgext/largefiles/reposetup.py
> @@ -102,12 +102,12 @@
>                   except error.LockError:
>                       pass
>   
> -                # First check if there were files specified on the
> -                # command line.  If there were, and none of them were
> +                # First check if paths or patterns were specified on the
> +                # command line.  If there were, and they don't match any
>                   # largefiles, we should just bail here and let super
>                   # handle it -- thus gaining a big performance boost.
>                   lfdirstate = lfutil.openlfdirstate(ui, self)
> -                if match.files() and not match.anypats():
> +                if not match.always():
>                       for f in lfdirstate:
>                           if match(f):
>                               break

This all seems very reasonable ... and if not, we will find out and get 
a good test case.

But please, if this make us able to handle more cases, add test cases 
for them.

/Mads


More information about the Mercurial-devel mailing list