localstore.py
73 lines
| 2.5 KiB
| text/x-python
|
PythonLexer
various
|
r15168 | # Copyright 2009-2010 Gregory P. Ward | ||
# Copyright 2009-2010 Intelerad Medical Systems Incorporated | ||||
# Copyright 2010-2011 Fog Creek Software | ||||
# Copyright 2010-2011 Unity Technologies | ||||
# | ||||
# This software may be used and distributed according to the terms of the | ||||
# GNU General Public License version 2 or any later version. | ||||
Greg Ward
|
r15252 | '''store class for local filesystem''' | ||
liscju
|
r29310 | from __future__ import absolute_import | ||
various
|
r15168 | |||
from mercurial.i18n import _ | ||||
Gregory Szorc
|
r43355 | from mercurial.pycompat import open | ||
Mads Kiilerich
|
r30180 | from mercurial import util | ||
various
|
r15168 | |||
liscju
|
r29310 | from . import ( | ||
basestore, | ||||
lfutil, | ||||
) | ||||
various
|
r15168 | |||
Augie Fackler
|
r43346 | |||
various
|
r15168 | class localstore(basestore.basestore): | ||
Benjamin Pollack
|
r15317 | '''localstore first attempts to grab files out of the store in the remote | ||
Mads Kiilerich
|
r17424 | Mercurial repository. Failing that, it attempts to grab the files from | ||
Benjamin Pollack
|
r15317 | the user cache.''' | ||
various
|
r15168 | |||
def __init__(self, ui, repo, remote): | ||||
Sune Foldager
|
r17191 | self.remote = remote.local() | ||
Mads Kiilerich
|
r18155 | super(localstore, self).__init__(ui, repo, self.remote.url()) | ||
various
|
r15168 | |||
Benjamin Pollack
|
r15317 | def put(self, source, hash): | ||
if lfutil.instore(self.remote, hash): | ||||
return | ||||
Mads Kiilerich
|
r19007 | lfutil.link(source, lfutil.storepath(self.remote, hash)) | ||
various
|
r15168 | |||
Matt Harbison
|
r17411 | def exists(self, hashes): | ||
retval = {} | ||||
for hash in hashes: | ||||
retval[hash] = lfutil.instore(self.remote, hash) | ||||
return retval | ||||
various
|
r15168 | def _getfile(self, tmpfile, filename, hash): | ||
Mads Kiilerich
|
r19000 | path = lfutil.findfile(self.remote, hash) | ||
if not path: | ||||
Augie Fackler
|
r43346 | raise basestore.StoreError( | ||
Augie Fackler
|
r43347 | filename, hash, self.url, _(b"can't get file locally") | ||
Augie Fackler
|
r43346 | ) | ||
Augie Fackler
|
r43347 | with open(path, b'rb') as fd: | ||
Augie Fackler
|
r43346 | return lfutil.copyandhash(util.filechunkiter(fd), tmpfile) | ||
various
|
r15168 | |||
liscju
|
r29067 | def _verifyfiles(self, contents, filestocheck): | ||
failed = False | ||||
for cset, filename, expectedhash in filestocheck: | ||||
liscju
|
r29421 | storepath, exists = lfutil.findstorepath(self.repo, expectedhash) | ||
if not exists: | ||||
storepath, exists = lfutil.findstorepath( | ||||
Augie Fackler
|
r43346 | self.remote, expectedhash | ||
) | ||||
liscju
|
r29067 | if not exists: | ||
various
|
r15168 | self.ui.warn( | ||
Augie Fackler
|
r43347 | _(b'changeset %s: %s references missing %s\n') | ||
Augie Fackler
|
r43346 | % (cset, filename, storepath) | ||
) | ||||
liscju
|
r29067 | failed = True | ||
elif contents: | ||||
actualhash = lfutil.hashfile(storepath) | ||||
if actualhash != expectedhash: | ||||
self.ui.warn( | ||||
Augie Fackler
|
r43347 | _(b'changeset %s: %s references corrupted %s\n') | ||
Augie Fackler
|
r43346 | % (cset, filename, storepath) | ||
) | ||||
liscju
|
r29067 | failed = True | ||
return failed | ||||