diff --git a/git/__init__.py b/git/__init__.py index 1b2360e3a..27c7208c6 100644 --- a/git/__init__.py +++ b/git/__init__.py @@ -86,15 +86,16 @@ "to_hex_sha", ] -__version__ = "git" +__version__: str + +import sys +import warnings 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 ( @@ -193,7 +194,13 @@ def _warned_import(message: str, fullname: str) -> "ModuleType": def _getattr(name: str) -> Any: - # TODO: If __version__ is made dynamic and lazily fetched, put that case right here. + if name == "__version__": + if sys.version_info >= (3, 8): + from importlib.metadata import version + else: + from importlib_metadata import version + + return version("GitPython") if name == "util": return _warned_import( diff --git a/requirements.txt b/requirements.txt index 7159416a9..31f150906 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ gitdb>=4.0.1,<5 +importlib-metadata;python_version<"3.8" typing-extensions>=3.7.4.3;python_version<"3.8" diff --git a/setup.py b/setup.py index f28fedb85..d9f8fb47c 100755 --- a/setup.py +++ b/setup.py @@ -1,13 +1,8 @@ #!/usr/bin/env python -import os from pathlib import Path -import sys -from typing import Sequence from setuptools import setup, find_packages -from setuptools.command.build_py import build_py as _build_py -from setuptools.command.sdist import sdist as _sdist def _read_content(path: str) -> str: @@ -21,50 +16,8 @@ def _read_content(path: str) -> str: long_description = _read_content("README.md") -class build_py(_build_py): - def run(self) -> None: - init = os.path.join(self.build_lib, "git", "__init__.py") - if os.path.exists(init): - os.unlink(init) - _build_py.run(self) - _stamp_version(init) - self.byte_compile([init]) - - -class sdist(_sdist): - def make_release_tree(self, base_dir: str, files: Sequence) -> None: - _sdist.make_release_tree(self, base_dir, files) - orig = os.path.join("git", "__init__.py") - assert os.path.exists(orig), orig - dest = os.path.join(base_dir, orig) - if hasattr(os, "link") and os.path.exists(dest): - os.unlink(dest) - self.copy_file(orig, dest) - _stamp_version(dest) - - -def _stamp_version(filename: str) -> None: - found, out = False, [] - try: - with open(filename) as f: - for line in f: - if "__version__ =" in line: - line = line.replace('"git"', "'%s'" % version) - found = True - out.append(line) - except OSError: - print("Couldn't find file %s to stamp version" % filename, file=sys.stderr) - - if found: - with open(filename, "w") as f: - f.writelines(out) - else: - print("WARNING: Couldn't find version line in file %s" % filename, file=sys.stderr) - - setup( name="GitPython", - cmdclass={"build_py": build_py, "sdist": sdist}, version=version, description="GitPython is a Python library used to interact with Git repositories", author="Sebastian Thiel, Michael Trier",