78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
import logging
|
|
import os
|
|
from typing import Optional
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
def get_git_repo_url(path: str) -> Optional[str]:
|
|
"""
|
|
Obtains the url of the git repository associated with the specified path,
|
|
returning ``None`` if the path does not correspond to a git repository.
|
|
"""
|
|
try:
|
|
from git import Repo
|
|
except ImportError as e:
|
|
_logger.warning(
|
|
"Failed to import Git (the Git executable is probably not on your PATH),"
|
|
" so Git SHA is not available. Error: %s",
|
|
e,
|
|
)
|
|
return None
|
|
|
|
try:
|
|
repo = Repo(path, search_parent_directories=True)
|
|
return next((remote.url for remote in repo.remotes), None)
|
|
except Exception:
|
|
return None
|
|
|
|
|
|
def get_git_commit(path: str) -> Optional[str]:
|
|
"""
|
|
Obtains the hash of the latest commit on the current branch of the git repository associated
|
|
with the specified path, returning ``None`` if the path does not correspond to a git
|
|
repository.
|
|
"""
|
|
try:
|
|
from git import Repo
|
|
except ImportError as e:
|
|
_logger.warning(
|
|
"Failed to import Git (the Git executable is probably not on your PATH),"
|
|
" so Git SHA is not available. Error: %s",
|
|
e,
|
|
)
|
|
return None
|
|
try:
|
|
if os.path.isfile(path):
|
|
path = os.path.dirname(os.path.abspath(path))
|
|
repo = Repo(path, search_parent_directories=True)
|
|
if path in repo.ignored(path):
|
|
return None
|
|
return repo.head.commit.hexsha
|
|
except Exception:
|
|
return None
|
|
|
|
|
|
def get_git_branch(path: str) -> Optional[str]:
|
|
"""
|
|
Obtains the name of the current branch of the git repository associated with the specified
|
|
path, returning ``None`` if the path does not correspond to a git repository.
|
|
"""
|
|
try:
|
|
from git import Repo
|
|
except ImportError as e:
|
|
_logger.warning(
|
|
"Failed to import Git (the Git executable is probably not on your PATH),"
|
|
" so Git SHA is not available. Error: %s",
|
|
e,
|
|
)
|
|
return None
|
|
|
|
try:
|
|
if os.path.isfile(path):
|
|
path = os.path.dirname(path)
|
|
repo = Repo(path, search_parent_directories=True)
|
|
return repo.active_branch.name
|
|
except Exception:
|
|
return None
|