From 00aee49d2027bdf9c0f1c8c2065aa1b67b5ecb2e Mon Sep 17 00:00:00 2001 From: Eliah Kagan Date: Fri, 20 Oct 2023 05:32:01 -0400 Subject: [PATCH] Never modify sys.path This removes the logic that, under some (most) circumstances when not using a version from PyPI, would insert the location of the gitdb git-submodule near the front of sys.path. (As noted in #1717, the specific way this was being done was not causing the git-submodule's version of gitdb to actually be used. But it was still modifying sys.path, which this now prevents.) The installation test, which had verified the insertion into sys.path, is modified accordingly, except that for now the check that the very first sys.path entry is undisturbed is kept in place. --- git/__init__.py | 29 ----------------------------- test/test_installation.py | 24 ++++++++++++++++++++++-- 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/git/__init__.py b/git/__init__.py index 05a02a7ff..5b55e59eb 100644 --- a/git/__init__.py +++ b/git/__init__.py @@ -6,38 +6,11 @@ # flake8: noqa # @PydevCodeAnalysisIgnore from git.exc import * # @NoMove @IgnorePep8 -import os -import os.path as osp -import sys - from typing import List, Optional, Sequence, Tuple, Union, TYPE_CHECKING from git.types import PathLike __version__ = "git" - -# { Initialization -def _init_externals() -> None: - """Initialize external projects by putting them into the path""" - if __version__ == "git" and "PYOXIDIZER" not in os.environ: - sys.path.insert(1, osp.join(osp.dirname(__file__), "ext", "gitdb")) - - try: - import gitdb - except ImportError as e: - raise ImportError("'gitdb' could not be found in your PYTHONPATH") from e - # END verify import - - -# } END initialization - - -################# -_init_externals() -################# - -# { Imports - from gitdb.util import to_hex_sha try: @@ -62,8 +35,6 @@ def _init_externals() -> None: except GitError as _exc: raise ImportError("%s: %s" % (_exc.__class__.__name__, _exc)) from _exc -# } END imports - # __all__ must be statically defined by py.typed support # __all__ = [name for name, obj in locals().items() if not (name.startswith("_") or inspect.ismodule(obj))] __all__ = [ diff --git a/test/test_installation.py b/test/test_installation.py index 0cb0c71fa..3a0e43973 100644 --- a/test/test_installation.py +++ b/test/test_installation.py @@ -25,6 +25,7 @@ def setUp_venv(self, rw_dir): @with_rw_directory def test_installation(self, rw_dir): self.setUp_venv(rw_dir) + result = subprocess.run( [self.pip, "install", "."], stdout=subprocess.PIPE, @@ -35,12 +36,32 @@ def test_installation(self, rw_dir): result.returncode, msg=result.stderr or result.stdout or "Can't install project", ) - result = subprocess.run([self.python, "-c", "import git"], stdout=subprocess.PIPE, cwd=self.sources) + + result = subprocess.run( + [self.python, "-c", "import git"], + stdout=subprocess.PIPE, + cwd=self.sources, + ) self.assertEqual( 0, result.returncode, msg=result.stderr or result.stdout or "Selftest failed", ) + + result = subprocess.run( + [self.python, "-c", "import gitdb; import smmap"], + stdout=subprocess.PIPE, + cwd=self.sources, + ) + self.assertEqual( + 0, + result.returncode, + msg=result.stderr or result.stdout or "Dependencies not installed", + ) + + # Even IF gitdb or any other dependency is supplied during development + # by inserting its location into PYTHONPATH or otherwise patched into + # sys.path, make sure it is not wrongly inserted as the *first* entry. result = subprocess.run( [self.python, "-c", "import sys;import git; print(sys.path)"], stdout=subprocess.PIPE, @@ -53,4 +74,3 @@ def test_installation(self, rw_dir): syspath[0], msg="Failed to follow the conventions for https://docs.python.org/3/library/sys.html#sys.path", ) - self.assertTrue(syspath[1].endswith("gitdb"), msg="Failed to add gitdb to sys.path")