diff options
author | Matt Martz <matt@sivel.net> | 2020-07-21 13:23:55 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-07-21 11:23:55 -0700 |
commit | 448f17e9a5c8a85f4cb0d8f17f5c27178b3ed60a (patch) | |
tree | a2b846a812e4fb610cae1b5f72852c0f77b43a7a | |
parent | ffd3757fc35468a97791e452e7f2d14c3e3fcb80 (diff) | |
download | ansible-448f17e9a5c8a85f4cb0d8f17f5c27178b3ed60a.tar.gz |
[stable-2.10] Guard against allowing ansible to ansible-base upgrades (#70529) (#70760)
* Fix building Ansible dist w/ setuptools>=48,<49.1 (#70525)
* Fix building Ansible dist w/ setuptools>=48,<49.1
This change addresses the deprecation of the use of stdlib
`distutils`. It's a short-term hotfix for the problem and we'll
need to consider dropping the use of `distutils` from our `setup.py`.
Refs:
* https://github.com/ansible/ansible/issues/70456
* https://github.com/pypa/setuptools/issues/2230
* https://github.com/pypa/setuptools/commit/bd110264
Co-Authored-By: Jason R. Coombs <jaraco@jaraco.com>
* Add a change note for PR #70525
Co-authored-by: Jason R. Coombs <jaraco@jaraco.com>
(cherry picked from commit 918388b85f516116e2cd7dcf0c12eeb19ab561e9)
* Guard against allowing ansible to ansible-base upgrades (#70529)
* Guard against allowing ansible to ansible-base upgrades
* newline
* use alias
* Add an explicit line detailing this is a 1 time thing
* period
* Read __version__ and __author__ rather than import, update working, and add ability to skip conflict checks
* Remove commented code
* Re introduce removed changes from rebase
* Just use open
* Nuke unused import
(cherry picked from commit 54b002e1acad1e8d88e81965323d47ddb8c234fb)
Co-authored-by: Sviatoslav Sydorenko <webknjaz@redhat.com>
-rw-r--r-- | changelogs/fragments/70525-setuptools-disutils-reorder.yml | 7 | ||||
-rw-r--r-- | setup.py | 90 |
2 files changed, 93 insertions, 4 deletions
diff --git a/changelogs/fragments/70525-setuptools-disutils-reorder.yml b/changelogs/fragments/70525-setuptools-disutils-reorder.yml new file mode 100644 index 0000000000..756cf13bc7 --- /dev/null +++ b/changelogs/fragments/70525-setuptools-disutils-reorder.yml @@ -0,0 +1,7 @@ +bugfixes: +- > + Address the deprecation of the use of stdlib + distutils in packaging. It's a short-term hotfix for the problem + (https://github.com/ansible/ansible/issues/70456, + https://github.com/pypa/setuptools/issues/2230, + https://github.com/pypa/setuptools/commit/bd110264) @@ -9,8 +9,6 @@ import sys import warnings from collections import defaultdict -from distutils.command.build_scripts import build_scripts as BuildScripts -from distutils.command.sdist import sdist as SDist try: from setuptools import setup, find_packages @@ -23,8 +21,90 @@ except ImportError: " install setuptools).", file=sys.stderr) sys.exit(1) -sys.path.insert(0, os.path.abspath('lib')) -from ansible.release import __version__, __author__ +# `distutils` must be imported after `setuptools` or it will cause explosions +# with `setuptools >=48.0.0, <49.1`. +# Refs: +# * https://github.com/ansible/ansible/issues/70456 +# * https://github.com/pypa/setuptools/issues/2230 +# * https://github.com/pypa/setuptools/commit/bd110264 +from distutils.command.build_scripts import build_scripts as BuildScripts +from distutils.command.sdist import sdist as SDist + + +def find_package_info(*file_paths): + try: + with open(os.path.join(*file_paths), 'r') as f: + info_file = f.read() + except Exception: + raise RuntimeError("Unable to find package info.") + + # The version line must have the form + # __version__ = 'ver' + version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", + info_file, re.M) + author_match = re.search(r"^__author__ = ['\"]([^'\"]*)['\"]", + info_file, re.M) + + if version_match and author_match: + return version_match.group(1), author_match.group(1) + raise RuntimeError("Unable to find package info.") + + +def _validate_install_ansible_base(): + """Validate that we can install ansible-base. Currently this only + cares about upgrading to ansible-base from ansible<2.10 + """ + if os.getenv('ANSIBLE_SKIP_CONFLICT_CHECK', '') not in ('', '0'): + return + + # Save these for later restoring things to pre invocation + sys_modules = sys.modules.copy() + sys_modules_keys = set(sys_modules) + + # Make sure `lib` isn't in `sys.path` that could confuse this + sys_path = sys.path[:] + abspath = os.path.abspath + sys.path[:] = [p for p in sys.path if abspath(p) != abspath('lib')] + + try: + from ansible.release import __version__ + except ImportError: + pass + else: + version_tuple = tuple(int(v) for v in __version__.split('.')[:2]) + if version_tuple < (2, 10): + stars = '*' * 76 + raise RuntimeError( + ''' + + %s + + Cannot install ansible-base with a pre-existing ansible==%s + installation. + + Installing ansible-base with ansible-2.9 or older currently installed with + pip is known to cause problems. Please uninstall ansible and install the new + version: + + pip uninstall ansible + pip install ansible-base + + If you want to skip the conflict checks and manually resolve any issues + afterwards, set the ANSIBLE_SKIP_CONFLICT_CHECK environment variable: + + ANSIBLE_SKIP_CONFLICT_CHECK=1 pip install ansible-base + + %s + ''' % (stars, __version__, stars) + ) + finally: + sys.path[:] = sys_path + for key in sys_modules_keys.symmetric_difference(sys.modules): + sys.modules.pop(key, None) + sys.modules.update(sys_modules) + + +_validate_install_ansible_base() SYMLINK_CACHE = 'SYMLINK_CACHE.json' @@ -247,6 +327,8 @@ def get_dynamic_setup_params(): } +here = os.path.abspath(os.path.dirname(__file__)) +__version__, __author__ = find_package_info(here, 'lib', 'ansible', 'release.py') static_setup_params = dict( # Use the distutils SDist so that symlinks are not expanded # Use a custom Build for the same reason |