hgext/largefiles/wirestore.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Thu, 07 Mar 2024 10:55:22 +0100
changeset 51531 f85f23f1479b
parent 48875 6000f5b25c9b
permissions -rw-r--r--
branchcache: skip entries that are topological heads in the on disk file In the majority of cases, topological heads are also branch heads. We have efficient way to get the topological heads and efficient way to retrieve their branch information. So there is little value in putting them in the branch cache file explicitly. On the contrary, writing them explicitly tend to create very large cache file that are inefficient to read and update. So the branch cache v3 format is no longer including them. This changeset focus on the format aspect and have no focus on the performance aspect. We will cover that later.

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