| | from __future__ import annotations
|
| |
|
| | import io
|
| | import subprocess
|
| |
|
| | import git
|
| |
|
| |
|
| | class Git(git.Git):
|
| | """
|
| | Git subclassed to never use persistent processes.
|
| | """
|
| |
|
| | def _get_persistent_cmd(self, attr_name, cmd_name, *args, **kwargs):
|
| | raise NotImplementedError(f"Refusing to use persistent process: {attr_name} ({cmd_name} {args} {kwargs})")
|
| |
|
| | def get_object_header(self, ref: str | bytes) -> tuple[str, str, int]:
|
| | ret = subprocess.check_output(
|
| | [self.GIT_PYTHON_GIT_EXECUTABLE, "cat-file", "--batch-check"],
|
| | input=self._prepare_ref(ref),
|
| | cwd=self._working_dir,
|
| | timeout=2,
|
| | )
|
| | return self._parse_object_header(ret)
|
| |
|
| | def stream_object_data(self, ref: str) -> tuple[str, str, int, Git.CatFileContentStream]:
|
| |
|
| |
|
| |
|
| | ret = subprocess.check_output(
|
| | [self.GIT_PYTHON_GIT_EXECUTABLE, "cat-file", "--batch"],
|
| | input=self._prepare_ref(ref),
|
| | cwd=self._working_dir,
|
| | timeout=30,
|
| | )
|
| | bio = io.BytesIO(ret)
|
| | hexsha, typename, size = self._parse_object_header(bio.readline())
|
| | return (hexsha, typename, size, self.CatFileContentStream(size, bio))
|
| |
|
| |
|
| | class Repo(git.Repo):
|
| | GitCommandWrapperType = Git
|
| |
|