Changeset View
Changeset View
Standalone View
Standalone View
swh/vault/cookers/git_bare.py
Show First 20 Lines • Show All 54 Lines • ▼ Show 20 Lines | |||||
logger = logging.getLogger(__name__) | logger = logging.getLogger(__name__) | ||||
class GitBareCooker(BaseVaultCooker): | class GitBareCooker(BaseVaultCooker): | ||||
use_fsck = True | use_fsck = True | ||||
def cache_type_key(self) -> str: | def cache_type_key(self) -> str: | ||||
return self.obj_type | return self.bundle_type | ||||
def check_exists(self): | def check_exists(self): | ||||
obj_type = self.obj_type.split("_")[0] | obj_type = self.bundle_type.split("_")[0] | ||||
if obj_type == "revision": | if obj_type == "revision": | ||||
return not list(self.storage.revision_missing([self.obj_id])) | return not list(self.storage.revision_missing([self.obj_id])) | ||||
elif obj_type == "directory": | elif obj_type == "directory": | ||||
return not list(self.storage.directory_missing([self.obj_id])) | return not list(self.storage.directory_missing([self.obj_id])) | ||||
if obj_type == "snapshot": | if obj_type == "snapshot": | ||||
return not list(self.storage.snapshot_missing([self.obj_id])) | return not list(self.storage.snapshot_missing([self.obj_id])) | ||||
else: | else: | ||||
raise NotImplementedError(f"GitBareCooker for {obj_type}") | raise NotImplementedError(f"GitBareCooker for {obj_type}") | ||||
def obj_swhid(self) -> identifiers.CoreSWHID: | def obj_swhid(self) -> identifiers.CoreSWHID: | ||||
obj_type = self.obj_type.split("_")[0] | obj_type = self.bundle_type.split("_")[0] | ||||
return identifiers.CoreSWHID( | return identifiers.CoreSWHID( | ||||
object_type=identifiers.ObjectType[obj_type.upper()], object_id=self.obj_id, | object_type=identifiers.ObjectType[obj_type.upper()], object_id=self.obj_id, | ||||
) | ) | ||||
def _push(self, stack: List[Sha1Git], obj_ids: Iterable[Sha1Git]) -> None: | def _push(self, stack: List[Sha1Git], obj_ids: Iterable[Sha1Git]) -> None: | ||||
assert not isinstance(obj_ids, bytes) | assert not isinstance(obj_ids, bytes) | ||||
revision_ids = [id_ for id_ in obj_ids if id_ not in self._seen] | revision_ids = [id_ for id_ in obj_ids if id_ not in self._seen] | ||||
self._seen.update(revision_ids) | self._seen.update(revision_ids) | ||||
Show All 21 Lines | def prepare_bundle(self): | ||||
with tempfile.TemporaryDirectory(prefix="swh-vault-gitbare-") as workdir: | with tempfile.TemporaryDirectory(prefix="swh-vault-gitbare-") as workdir: | ||||
# Initialize a Git directory | # Initialize a Git directory | ||||
self.workdir = workdir | self.workdir = workdir | ||||
self.gitdir = os.path.join(workdir, "clone.git") | self.gitdir = os.path.join(workdir, "clone.git") | ||||
os.mkdir(self.gitdir) | os.mkdir(self.gitdir) | ||||
self.init_git() | self.init_git() | ||||
# Add the root object to the stack of objects to visit | # Add the root object to the stack of objects to visit | ||||
self.push_subgraph(self.obj_type.split("_")[0], self.obj_id) | self.push_subgraph(self.bundle_type.split("_")[0], self.obj_id) | ||||
# Load and write all the objects to disk | # Load and write all the objects to disk | ||||
self.load_objects() | self.load_objects() | ||||
# Write the root object as a ref (this step is skipped if it's a snapshot) | # Write the root object as a ref (this step is skipped if it's a snapshot) | ||||
# This must be done before repacking; git-repack ignores orphan objects. | # This must be done before repacking; git-repack ignores orphan objects. | ||||
self.write_refs() | self.write_refs() | ||||
▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | def git_fsck(self) -> None: | ||||
raise Exception( | raise Exception( | ||||
"\n".join( | "\n".join( | ||||
["Unexpected errors from git-fsck:"] + sorted(unexpected_errors) | ["Unexpected errors from git-fsck:"] + sorted(unexpected_errors) | ||||
) | ) | ||||
) | ) | ||||
def write_refs(self, snapshot=None): | def write_refs(self, snapshot=None): | ||||
refs: Dict[bytes, bytes] # ref name -> target | refs: Dict[bytes, bytes] # ref name -> target | ||||
obj_type = self.obj_type.split("_")[0] | obj_type = self.bundle_type.split("_")[0] | ||||
if obj_type == "directory": | if obj_type == "directory": | ||||
# We need a synthetic revision pointing to the directory | # We need a synthetic revision pointing to the directory | ||||
author = Person.from_fullname( | author = Person.from_fullname( | ||||
b"swh-vault, git-bare cooker <robot@softwareheritage.org>" | b"swh-vault, git-bare cooker <robot@softwareheritage.org>" | ||||
) | ) | ||||
dt = datetime.datetime.now(tz=datetime.timezone.utc) | dt = datetime.datetime.now(tz=datetime.timezone.utc) | ||||
dt = dt.replace(microsecond=0) # not supported by git | dt = dt.replace(microsecond=0) # not supported by git | ||||
date = TimestampWithTimezone.from_datetime(dt) | date = TimestampWithTimezone.from_datetime(dt) | ||||
▲ Show 20 Lines • Show All 361 Lines • Show Last 20 Lines |