summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Martz <matt@sivel.net>2020-07-21 13:23:55 -0500
committerGitHub <noreply@github.com>2020-07-21 11:23:55 -0700
commit448f17e9a5c8a85f4cb0d8f17f5c27178b3ed60a (patch)
treea2b846a812e4fb610cae1b5f72852c0f77b43a7a
parentffd3757fc35468a97791e452e7f2d14c3e3fcb80 (diff)
downloadansible-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.yml7
-rw-r--r--setup.py90
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)
diff --git a/setup.py b/setup.py
index 0398473d5e..55dd2d357d 100644
--- a/setup.py
+++ b/setup.py
@@ -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