Merge pull request #267669 from mweinelt/catch-python2-conflicts

python/hooks: restore catchConflictHook for python<3.10
This commit is contained in:
Martin Weinelt 2023-11-19 00:04:05 +01:00 committed by GitHub
commit 2203d3bf20
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 40 additions and 4 deletions

View File

@ -0,0 +1,30 @@
import pkg_resources
import collections
import sys
do_abort = False
packages = collections.defaultdict(list)
for f in sys.path:
for req in pkg_resources.find_distributions(f):
if req not in packages[req.project_name]:
# some exceptions inside buildPythonPackage
if req.project_name in ['setuptools', 'pip', 'wheel']:
continue
packages[req.project_name].append(req)
for name, duplicates in packages.items():
if len(duplicates) > 1:
do_abort = True
print("Found duplicated packages in closure for dependency '{}': ".format(name))
for dup in duplicates:
print(" " + repr(dup))
if do_abort:
print("")
print(
'Package duplicates found in closure, see above. Usually this '
'happens if two packages depend on different version '
'of the same dependency.')
sys.exit(1)

View File

@ -106,9 +106,16 @@ in {
pythonCatchConflictsHook = callPackage ({ makePythonHook, setuptools }:
makePythonHook {
name = "python-catch-conflicts-hook";
substitutions = {
substitutions = let
useLegacyHook = lib.versionOlder python.version "3.10";
in {
inherit pythonInterpreter pythonSitePackages;
catchConflicts=../catch_conflicts/catch_conflicts.py;
catchConflicts = if useLegacyHook then
../catch_conflicts/catch_conflicts_py2.py
else
../catch_conflicts/catch_conflicts.py;
} // lib.optionalAttrs useLegacyHook {
inherit setuptools;
};
} ./python-catch-conflicts-hook.sh) {};

View File

@ -57,8 +57,7 @@
# Raise an error if two packages are installed with the same name
# TODO: For cross we probably need a different PYTHONPATH, or not
# add the runtime deps until after buildPhase.
# FIXME: disabled for Python 2 because broken
, catchConflicts ? false
, catchConflicts ? (python.stdenv.hostPlatform == python.stdenv.buildPlatform)
# Additional arguments to pass to the makeWrapper function, which wraps
# generated binaries.