Skip to content

Never modify sys.path #1720

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 20, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
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.
  • Loading branch information
EliahKagan committed Oct 20, 2023
commit 00aee49d2027bdf9c0f1c8c2065aa1b67b5ecb2e
29 changes: 0 additions & 29 deletions git/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand All @@ -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__ = [
Expand Down
24 changes: 22 additions & 2 deletions test/test_installation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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")