Source code for datalad_next.annexbackends.xdlra

"""git-annex external backend XDLRA for git-remote-datalad-annex"""

from pathlib import Path
import zipfile

from .base import (
    Backend,
    BackendError,
    Master,
)


[docs] class DataladRepoAnnexBackend(Backend): """Implementation of an external git-annex backend This backend is tightly coupled to the `git-remote-datalad-annex` and hardly of any general utility. It is essentially aiming to be the leanest possible implementation to get git-annex to transport the content of two distinct files to and from a special remote. This backend is unlike most backends, because there is no fixed association of a particular file content to a particular key. In other words, the key content is expected to change without any change in the key name. Only two keys are supported: - ``XDLRA--refs`` - ``XDLRA--repo-export`` ``XDLRA--refs`` contains a "refs" list of a Git repository, similar to the output of ``git for-each-ref``. ``XDLRA--repo-export`` hold a ZIP archive of a bare Git repository. """
[docs] def can_verify(self): # we can verify that a key matches the type of content # this is basically no more than a sanity check that a # download yielded something that we can work with for # downstream clone processing return True
[docs] def is_stable(self): # the content behind a key is not always the same # in fact, it is typically different each time return False
[docs] def is_cryptographically_secure(self): # we are not using any hashes return False
[docs] def gen_key(self, local_file): localfile = Path(local_file) if _is_component_repoexport(localfile): return "XDLRA--repo-export" elif _is_component_refs(localfile): return "XDLRA--refs" else: # local_file is a TMP location, no use in reporting it raise BackendError('Unrecognized repository clone component')
[docs] def verify_content(self, key, content_file): return self.gen_key(content_file) == key
def _is_component_refs(path): return path.read_text().endswith(' HEAD\n') def _is_component_repoexport(path): return zipfile.is_zipfile(path)
[docs] def main(): """Entry point for the backend utility""" master = Master() backend = DataladRepoAnnexBackend(master) master.LinkBackend(backend) master.Listen()