hgext/largefiles/localstore.py
author Greg Ward <greg@gerg.ca>
Sat, 01 Oct 2011 16:39:51 -0400
changeset 15188 8e115063950d
parent 15168 cfccd3bee7b3
child 15252 6e809bb4f969
permissions -rw-r--r--
largefiles: don't break existing tests (syntax error, bad imports)
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
15168
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     1
# Copyright 2009-2010 Gregory P. Ward
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     2
# Copyright 2009-2010 Intelerad Medical Systems Incorporated
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     3
# Copyright 2010-2011 Fog Creek Software
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     4
# Copyright 2010-2011 Unity Technologies
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     5
#
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     8
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
     9
'''Store class for local filesystem.'''
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    10
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    11
import os
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    12
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    13
from mercurial import util
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    14
from mercurial.i18n import _
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    15
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    16
import lfutil
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    17
import basestore
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    18
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    19
class localstore(basestore.basestore):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    20
    '''Because there is a system wide cache, the local store always uses that
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    21
    cache.  Since the cache is updated elsewhere, we can just read from it here
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    22
    as if it were the store.'''
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    23
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    24
    def __init__(self, ui, repo, remote):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    25
        url = os.path.join(remote.path, '.hg', lfutil.longname)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    26
        super(localstore, self).__init__(ui, repo, util.expandpath(url))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    27
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    28
    def put(self, source, filename, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    29
        '''Any file that is put must already be in the system wide cache so do
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    30
        nothing.'''
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    31
        return
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    32
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    33
    def exists(self, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    34
        return lfutil.insystemcache(self.repo.ui, hash)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    35
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    36
    def _getfile(self, tmpfile, filename, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    37
        if lfutil.insystemcache(self.ui, hash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    38
            return lfutil.systemcachepath(self.ui, hash)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    39
        raise basestore.StoreError(filename, hash, '',
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    40
            _("Can't get file locally"))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    41
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    42
    def _verifyfile(self, cctx, cset, contents, standin, verified):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    43
        filename = lfutil.splitstandin(standin)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    44
        if not filename:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    45
            return False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    46
        fctx = cctx[standin]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    47
        key = (filename, fctx.filenode())
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    48
        if key in verified:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    49
            return False
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    50
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    51
        expecthash = fctx.data()[0:40]
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    52
        verified.add(key)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    53
        if not lfutil.insystemcache(self.ui, expecthash):
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    54
            self.ui.warn(
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    55
                _('changeset %s: %s missing\n'
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    56
                  '  (looked for hash %s)\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    57
                % (cset, filename, expecthash))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    58
            return True                 # failed
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    59
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    60
        if contents:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    61
            storepath = lfutil.systemcachepath(self.ui, expecthash)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    62
            actualhash = lfutil.hashfile(storepath)
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    63
            if actualhash != expecthash:
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    64
                self.ui.warn(
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    65
                    _('changeset %s: %s: contents differ\n'
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    66
                      '  (%s:\n'
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    67
                      '  expected hash %s,\n'
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    68
                      '  but got %s)\n')
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    69
                    % (cset, filename, storepath, expecthash, actualhash))
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    70
                return True             # failed
cfccd3bee7b3 hgext: add largefiles extension
various
parents:
diff changeset
    71
        return False