certbot/tools/pip_install.py
ohemorange 16f858547f
Add --use-pep517 flag to pip to silence warning in tools/venv.py, and switch codebase to src-layout (#10249)
Fixes #10252.

See further discussion here: https://github.com/pypa/pip/issues/11457

We are doing option:

> Alternatively, enable the --use-pep517 pip option, possibly with
--no-build-isolation. The --use-pip517 flag will force pip to use the
modern mechanism for editable installs. --no-build-isolation may be
needed if your project has build-time requirements beyond setuptools and
wheel. By passing this flag, you are responsible for making sure your
environment already has the required dependencies to build your package.
Once the legacy mechanism is removed, --use-pep517 will have no effect
and will essentially be enabled by default in this context.

Major changes made here include:
- Add `--use-pep517` to use the modern mechanism, which will be the only
mechanism in future pip releases
- Change to `/src` layout to appease mypy, and because for editable
installs that really is the normal way these days.
  - `cd acme && mkdir src && mv acme src/` etc.
- add `where='src'` argument to `find_packages` and add
`package_dir={'': 'src'},` in `setup.py`s
  - update `MANIFEST.in` files with new path locations 
- Update our many hardcoded filepaths
- Update `importlib-metadata` requirement to fix
double-plugin-entry-point problem in oldest tests
2025-04-11 19:30:33 +00:00

68 lines
2.2 KiB
Python
Executable file

#!/usr/bin/env python
# pip installs packages using pinned package versions. If CERTBOT_OLDEST is set
# to 1, tools/oldest_constraints.txt is used, otherwise, tools/requirements.txt
# is used. Before installing the requested packages, core Python packaging
# tools like pip, setuptools, and wheel are updated to pinned versions to
# increase stability of the install.
#
# cryptography is currently using this script in their CI at
# https://github.com/pyca/cryptography/blob/14d45c2259b01f1459eeab8bb7d85ce4cfb0841b/.github/downstream.d/certbot.sh#L8-L9.
# We should try to remember to keep their repo updated if we make any changes
# to this script which may break things for them.
from __future__ import absolute_import
from __future__ import print_function
import os
import subprocess
import sys
def find_tools_path():
return os.path.dirname(os.path.realpath(__file__))
def call_with_print(command, env):
assert env is not None
print(command)
subprocess.check_call(command, shell=True, env=env)
def pip_install_with_print(args_str, env):
command = ['"', sys.executable, '" -m pip install --disable-pip-version-check --use-pep517 ', args_str]
call_with_print(''.join(command), env=env)
def pip_constrained_environ():
tools_path = find_tools_path()
repo_path = os.path.dirname(tools_path)
if os.environ.get('CERTBOT_OLDEST') == '1':
constraints_path = os.path.normpath(os.path.join(
repo_path, 'tools', 'oldest_constraints.txt'))
else:
constraints_path = os.path.normpath(os.path.join(
repo_path, 'tools', 'requirements.txt'))
env = os.environ.copy()
# We set constraints for pip using an environment variable so that they
# are also used when installing build dependencies. See
# https://github.com/certbot/certbot/pull/8443 for more info.
env["PIP_CONSTRAINT"] = constraints_path
return env
def pipstrap(env=None):
if env is None:
env = pip_constrained_environ()
pip_install_with_print('pip setuptools wheel', env=env)
def main(args):
env = pip_constrained_environ()
pipstrap(env)
pip_install_with_print(' '.join(args), env=env)
if __name__ == '__main__':
main(sys.argv[1:])