view hgext/largefiles/wirestore.py @ 49680:40e24d82b513

delta-find: make sure we only use newer full snapshot as candidate The current code does not needs to protect against this, as there are no older snapshot in the current cache. However as we are getting ready to reuse this cache from one revision to another, we need the code to protect itself about what's coming.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sun, 06 Nov 2022 17:55:55 -0500
parents 6000f5b25c9b
children f4733654f144
line wrap: on
line source

# 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'''

from . import (
    lfutil,
    remotestore,
)


class wirestore(remotestore.remotestore):
    def __init__(self, ui, repo, remote):
        cap = remote.capable(b'largefiles')
        if not cap:
            raise lfutil.storeprotonotcapable([])
        storetypes = cap.split(b',')
        if b'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."""

        with self.remote.commandexecutor() as e:
            fs = []
            for hash in hashes:
                fs.append(
                    (
                        hash,
                        e.callcommand(
                            b'statlfile',
                            {
                                b'sha': hash,
                            },
                        ),
                    )
                )

            return {hash: f.result() for hash, f in fs}