123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- """
- Different remote repositories have to be cached in different
- local repositories to avoid conflicts in reference name space
- """
- import hashlib
- from pathlib import Path
- import appdirs
- from .gitbackend.subprocess import (
- git_fetch_object,
- git_fetch_reference,
- git_init,
- git_object_exists_locally,
- )
- cache_repository_base = (
- Path(appdirs.user_cache_dir("datalad-metalad"))
- / "local-git-cache"
- )
- def get_name_hash(name: str) -> str:
- return hashlib.sha256(name.encode()).hexdigest()
- def get_repo_cache_path(remote_repo: str) -> Path:
- return cache_repository_base / get_name_hash(remote_repo)
- def ensure_cache_exists(remote_repo: str):
- cache_path = get_repo_cache_path(remote_repo)
- if not cache_path.exists():
- git_init(str(cache_path))
- def cache_object(remote_repo: str, object_id: str):
- ensure_cache_exists(remote_repo)
- cache_repo = str(get_repo_cache_path(remote_repo))
- if object_id.startswith("refs"):
- git_fetch_reference(
- cache_repo,
- remote_repo,
- object_id,
- object_id)
- elif not git_object_exists_locally(cache_repo, object_id):
- git_fetch_object(
- cache_repo,
- remote_repo,
- object_id)
- def get_cache_realm(remote_repo: str) -> Path:
- return get_repo_cache_path(remote_repo)
|