|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
__all__ = [ |
|
"Actor", |
|
"AmbiguousObjectName", |
|
"BadName", |
|
"BadObject", |
|
"BadObjectType", |
|
"BaseIndexEntry", |
|
"Blob", |
|
"BlobFilter", |
|
"BlockingLockFile", |
|
"CacheError", |
|
"CheckoutError", |
|
"CommandError", |
|
"Commit", |
|
"Diff", |
|
"DiffConstants", |
|
"DiffIndex", |
|
"Diffable", |
|
"FetchInfo", |
|
"Git", |
|
"GitCmdObjectDB", |
|
"GitCommandError", |
|
"GitCommandNotFound", |
|
"GitConfigParser", |
|
"GitDB", |
|
"GitError", |
|
"HEAD", |
|
"Head", |
|
"HookExecutionError", |
|
"INDEX", |
|
"IndexEntry", |
|
"IndexFile", |
|
"IndexObject", |
|
"InvalidDBRoot", |
|
"InvalidGitRepositoryError", |
|
"List", |
|
"LockFile", |
|
"NULL_TREE", |
|
"NoSuchPathError", |
|
"ODBError", |
|
"Object", |
|
"Optional", |
|
"ParseError", |
|
"PathLike", |
|
"PushInfo", |
|
"RefLog", |
|
"RefLogEntry", |
|
"Reference", |
|
"Remote", |
|
"RemoteProgress", |
|
"RemoteReference", |
|
"Repo", |
|
"RepositoryDirtyError", |
|
"RootModule", |
|
"RootUpdateProgress", |
|
"Sequence", |
|
"StageType", |
|
"Stats", |
|
"Submodule", |
|
"SymbolicReference", |
|
"TYPE_CHECKING", |
|
"Tag", |
|
"TagObject", |
|
"TagReference", |
|
"Tree", |
|
"TreeModifier", |
|
"Tuple", |
|
"Union", |
|
"UnmergedEntriesError", |
|
"UnsafeOptionError", |
|
"UnsafeProtocolError", |
|
"UnsupportedOperation", |
|
"UpdateProgress", |
|
"WorkTreeRepositoryUnsupported", |
|
"refresh", |
|
"remove_password_if_present", |
|
"rmtree", |
|
"safe_decode", |
|
"to_hex_sha", |
|
] |
|
|
|
__version__ = '3.1.43' |
|
|
|
from typing import Any, List, Optional, Sequence, TYPE_CHECKING, Tuple, Union |
|
|
|
if TYPE_CHECKING: |
|
from types import ModuleType |
|
|
|
import warnings |
|
|
|
from gitdb.util import to_hex_sha |
|
|
|
from git.exc import ( |
|
AmbiguousObjectName, |
|
BadName, |
|
BadObject, |
|
BadObjectType, |
|
CacheError, |
|
CheckoutError, |
|
CommandError, |
|
GitCommandError, |
|
GitCommandNotFound, |
|
GitError, |
|
HookExecutionError, |
|
InvalidDBRoot, |
|
InvalidGitRepositoryError, |
|
NoSuchPathError, |
|
ODBError, |
|
ParseError, |
|
RepositoryDirtyError, |
|
UnmergedEntriesError, |
|
UnsafeOptionError, |
|
UnsafeProtocolError, |
|
UnsupportedOperation, |
|
WorkTreeRepositoryUnsupported, |
|
) |
|
from git.types import PathLike |
|
|
|
try: |
|
from git.compat import safe_decode |
|
from git.config import GitConfigParser |
|
from git.objects import ( |
|
Blob, |
|
Commit, |
|
IndexObject, |
|
Object, |
|
RootModule, |
|
RootUpdateProgress, |
|
Submodule, |
|
TagObject, |
|
Tree, |
|
TreeModifier, |
|
UpdateProgress, |
|
) |
|
from git.refs import ( |
|
HEAD, |
|
Head, |
|
RefLog, |
|
RefLogEntry, |
|
Reference, |
|
RemoteReference, |
|
SymbolicReference, |
|
Tag, |
|
TagReference, |
|
) |
|
from git.diff import ( |
|
INDEX, |
|
NULL_TREE, |
|
Diff, |
|
DiffConstants, |
|
DiffIndex, |
|
Diffable, |
|
) |
|
from git.db import GitCmdObjectDB, GitDB |
|
from git.cmd import Git |
|
from git.repo import Repo |
|
from git.remote import FetchInfo, PushInfo, Remote, RemoteProgress |
|
from git.index import ( |
|
BaseIndexEntry, |
|
BlobFilter, |
|
CheckoutError, |
|
IndexEntry, |
|
IndexFile, |
|
StageType, |
|
|
|
|
|
util, |
|
) |
|
from git.util import ( |
|
Actor, |
|
BlockingLockFile, |
|
LockFile, |
|
Stats, |
|
remove_password_if_present, |
|
rmtree, |
|
) |
|
except GitError as _exc: |
|
raise ImportError("%s: %s" % (_exc.__class__.__name__, _exc)) from _exc |
|
|
|
|
|
def _warned_import(message: str, fullname: str) -> "ModuleType": |
|
import importlib |
|
|
|
warnings.warn(message, DeprecationWarning, stacklevel=3) |
|
return importlib.import_module(fullname) |
|
|
|
|
|
def _getattr(name: str) -> Any: |
|
|
|
|
|
if name == "util": |
|
return _warned_import( |
|
"The expression `git.util` and the import `from git import util` actually " |
|
"reference git.index.util, and not the git.util module accessed in " |
|
'`from git.util import XYZ` or `sys.modules["git.util"]`. This potentially ' |
|
"confusing behavior is currently preserved for compatibility, but may be " |
|
"changed in the future and should not be relied on.", |
|
fullname="git.index.util", |
|
) |
|
|
|
for names, prefix in ( |
|
({"head", "log", "reference", "symbolic", "tag"}, "git.refs"), |
|
({"base", "fun", "typ"}, "git.index"), |
|
): |
|
if name not in names: |
|
continue |
|
|
|
fullname = f"{prefix}.{name}" |
|
|
|
return _warned_import( |
|
f"{__name__}.{name} is a private alias of {fullname} and subject to " |
|
f"immediate removal. Use {fullname} instead.", |
|
fullname=fullname, |
|
) |
|
|
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}") |
|
|
|
|
|
if not TYPE_CHECKING: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
del util |
|
|
|
|
|
__getattr__ = _getattr |
|
|
|
|
|
|
|
GIT_OK = None |
|
|
|
|
|
def refresh(path: Optional[PathLike] = None) -> None: |
|
"""Convenience method for setting the git executable path. |
|
|
|
:param path: |
|
Optional path to the Git executable. If not absolute, it is resolved |
|
immediately, relative to the current directory. |
|
|
|
:note: |
|
The `path` parameter is usually omitted and cannot be used to specify a custom |
|
command whose location is looked up in a path search on each call. See |
|
:meth:`Git.refresh <git.cmd.Git.refresh>` for details on how to achieve this. |
|
|
|
:note: |
|
This calls :meth:`Git.refresh <git.cmd.Git.refresh>` and sets other global |
|
configuration according to the effect of doing so. As such, this function should |
|
usually be used instead of using :meth:`Git.refresh <git.cmd.Git.refresh>` or |
|
:meth:`FetchInfo.refresh <git.remote.FetchInfo.refresh>` directly. |
|
|
|
:note: |
|
This function is called automatically, with no arguments, at import time. |
|
""" |
|
global GIT_OK |
|
GIT_OK = False |
|
|
|
if not Git.refresh(path=path): |
|
return |
|
if not FetchInfo.refresh(): |
|
return |
|
|
|
GIT_OK = True |
|
|
|
|
|
try: |
|
refresh() |
|
except Exception as _exc: |
|
raise ImportError("Failed to initialize: {0}".format(_exc)) from _exc |
|
|
|
|
|
|