diff options
author | AUTOMATIC1111 <16777216c@gmail.com> | 2023-05-31 16:15:21 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-05-31 16:15:21 +0000 |
commit | 52b8752e6201e24c783f674f8dc0681027e10ea9 (patch) | |
tree | 30470f64d84cadc4140023c0bf34c35bb68f79b0 /modules/gitpython_hack.py | |
parent | 00dfe27f59727407c5b408a80ff2a262934df495 (diff) | |
parent | 78a602ae8c006077ca93913576335a3a33dba7cb (diff) | |
download | stable-diffusion-webui-gfx803-52b8752e6201e24c783f674f8dc0681027e10ea9.tar.gz stable-diffusion-webui-gfx803-52b8752e6201e24c783f674f8dc0681027e10ea9.tar.bz2 stable-diffusion-webui-gfx803-52b8752e6201e24c783f674f8dc0681027e10ea9.zip |
Merge branch 'dev' into report-error
Diffstat (limited to 'modules/gitpython_hack.py')
-rw-r--r-- | modules/gitpython_hack.py | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/modules/gitpython_hack.py b/modules/gitpython_hack.py new file mode 100644 index 00000000..e537c1df --- /dev/null +++ b/modules/gitpython_hack.py @@ -0,0 +1,42 @@ +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"]: + # Not really streaming, per se; this buffers the entire object in memory. + # Shouldn't be a problem for our use case, since we're only using this for + # object headers (commit objects). + 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 |