|
|
|
|
|
|
|
"""Module with our own gitdb implementation - it uses the git command.""" |
|
|
|
__all__ = ["GitCmdObjectDB", "GitDB"] |
|
|
|
from gitdb.base import OInfo, OStream |
|
from gitdb.db import GitDB, LooseObjectDB |
|
from gitdb.exc import BadObject |
|
|
|
from git.util import bin_to_hex, hex_to_bin |
|
from git.exc import GitCommandError |
|
|
|
|
|
|
|
from typing import TYPE_CHECKING |
|
|
|
from git.types import PathLike |
|
|
|
if TYPE_CHECKING: |
|
from git.cmd import Git |
|
|
|
|
|
|
|
|
|
class GitCmdObjectDB(LooseObjectDB): |
|
"""A database representing the default git object store, which includes loose |
|
objects, pack files and an alternates file. |
|
|
|
It will create objects only in the loose object database. |
|
""" |
|
|
|
def __init__(self, root_path: PathLike, git: "Git") -> None: |
|
"""Initialize this instance with the root and a git command.""" |
|
super().__init__(root_path) |
|
self._git = git |
|
|
|
def info(self, binsha: bytes) -> OInfo: |
|
"""Get a git object header (using git itself).""" |
|
hexsha, typename, size = self._git.get_object_header(bin_to_hex(binsha)) |
|
return OInfo(hex_to_bin(hexsha), typename, size) |
|
|
|
def stream(self, binsha: bytes) -> OStream: |
|
"""Get git object data as a stream supporting ``read()`` (using git itself).""" |
|
hexsha, typename, size, stream = self._git.stream_object_data(bin_to_hex(binsha)) |
|
return OStream(hex_to_bin(hexsha), typename, size, stream) |
|
|
|
|
|
|
|
def partial_to_complete_sha_hex(self, partial_hexsha: str) -> bytes: |
|
""" |
|
:return: |
|
Full binary 20 byte sha from the given partial hexsha |
|
|
|
:raise gitdb.exc.AmbiguousObjectName: |
|
|
|
:raise gitdb.exc.BadObject: |
|
|
|
:note: |
|
Currently we only raise :exc:`~gitdb.exc.BadObject` as git does not |
|
communicate ambiguous objects separately. |
|
""" |
|
try: |
|
hexsha, _typename, _size = self._git.get_object_header(partial_hexsha) |
|
return hex_to_bin(hexsha) |
|
except (GitCommandError, ValueError) as e: |
|
raise BadObject(partial_hexsha) from e |
|
|
|
|
|
|
|
|