|
|
# Copyright 2010-2011 Fog Creek Software
|
|
|
#
|
|
|
# This software may be used and distributed according to the terms of the
|
|
|
# GNU General Public License version 2 or any later version.
|
|
|
|
|
|
'''largefile store working over Mercurial's wire protocol'''
|
|
|
|
|
|
import lfutil
|
|
|
import remotestore
|
|
|
|
|
|
class wirestore(remotestore.remotestore):
|
|
|
def __init__(self, ui, repo, remote):
|
|
|
cap = remote.capable('largefiles')
|
|
|
if not cap:
|
|
|
raise lfutil.storeprotonotcapable([])
|
|
|
storetypes = cap.split(',')
|
|
|
if 'serve' not in storetypes:
|
|
|
raise lfutil.storeprotonotcapable(storetypes)
|
|
|
self.remote = remote
|
|
|
super(wirestore, self).__init__(ui, repo, remote.url())
|
|
|
|
|
|
def _put(self, hash, fd):
|
|
|
return self.remote.putlfile(hash, fd)
|
|
|
|
|
|
def _get(self, hash):
|
|
|
return self.remote.getlfile(hash)
|
|
|
|
|
|
def _stat(self, hashes):
|
|
|
'''For each hash, return 0 if it is available, other values if not.
|
|
|
It is usually 2 if the largefile is missing, but might be 1 the server
|
|
|
has a corrupted copy.'''
|
|
|
batch = self.remote.batch()
|
|
|
futures = {}
|
|
|
for hash in hashes:
|
|
|
futures[hash] = batch.statlfile(hash)
|
|
|
batch.submit()
|
|
|
retval = {}
|
|
|
for hash in hashes:
|
|
|
retval[hash] = futures[hash].value
|
|
|
return retval
|
|
|
|