[PATCH] largefiles: check file in the repo store before checking remotely (issue4686)

Yuya Nishihara yuya at tcha.org
Sun Jun 26 11:00:06 EDT 2016


On Fri, 24 Jun 2016 09:47:16 +0200, liscju wrote:
> # HG changeset patch
> # User liscju <piotr.listkiewicz at gmail.com>
> # Date 1466714237 -7200
> #      Thu Jun 23 22:37:17 2016 +0200
> # Node ID 2670e4331e0c763b04c0de2e1149917ccca42364
> # Parent  6d96658a22b0fc1eb210c99c5629dd69fedf3006
> largefiles: check file in the repo store before checking remotely (issue4686)
> 
> Problem was files to check were gathered in the repository where
> the verify was launched but verification was done on the remote
> store. It was observed when user committed in cloned repository
> and ran verify before pushing - committed files were marked
> as non existing.
> 
> This commit fixes this by checking in the remote store only files
> that are not existing in the repository store where verify was launched.

I'm not pretty sure, but this patch seems good because the docstring says
"localstore first attempts to grab files out of the store in the remote",
which would imply in-store files precede remote files.

> --- a/hgext/largefiles/localstore.py
> +++ b/hgext/largefiles/localstore.py
> @@ -45,10 +45,23 @@ class localstore(basestore.basestore):
>          with open(path, 'rb') as fd:
>              return lfutil.copyandhash(fd, tmpfile)
>  
> +    def _hashesavailablelocally(self, hashes):
> +        localhashes = [hash for hash in hashes
> +                       if lfutil.instore(self.repo, hash)]
> +        return localhashes
> +
>      def _verifyfiles(self, contents, filestocheck):
>          failed = False
> +        expectedhashes = [expectedhash
> +                          for cset, filename, expectedhash in filestocheck]
> +        localhashes = self._hashesavailablelocally(expectedhashes)
>          for cset, filename, expectedhash in filestocheck:
> -            storepath, exists = lfutil.findstorepath(self.remote, expectedhash)
> +            if expectedhash in localhashes:
> +                storepath, exists = lfutil.findstorepath(
> +                    self.repo, expectedhash)
> +            else:
> +                storepath, exists = lfutil.findstorepath(
> +                    self.remote, expectedhash)

Is there any reason to build localhashes list?

I think "expectedhash in localhashes" can be simply written as
"lfutil.instore(self.repo, expectedhash)".


More information about the Mercurial-devel mailing list