From df1556ceecf11eaf1e60f297b4b7943fdcbf9355 Mon Sep 17 00:00:00 2001
From: Ed Morley <501702+edmorley@users.noreply.github.com>
Date: Tue, 28 Jul 2020 21:02:13 +0100
Subject: [PATCH 01/11] Output the installed version of pip in the build log
(#1007)
Since:
* "explicit is better than implicit"
* we'll soon be upgrading pip, and debugging breakage caused by upgrades
will be easier if versions are visible in the build log
Closes #939.
---
CHANGELOG.md | 1 +
bin/steps/python | 2 +-
test/run-features | 1 +
test/run-versions | 9 +++++++++
4 files changed, 12 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6275cba2e..c2b7b74ae 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
# Master
+- Output the installed version of pip in the build log (#1007).
- Reduce the number of environment variables exposed to `bin/{pre,post}_compile` and other subprocesses (#1011)
# 173 (2020-07-21)
diff --git a/bin/steps/python b/bin/steps/python
index 068e147cc..23a1850b9 100755
--- a/bin/steps/python
+++ b/bin/steps/python
@@ -150,7 +150,7 @@ fi
# If a new Python has been installed or Pip isn't up to date:
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
- puts-step "Installing pip"
+ puts-step "Installing pip ${PIP_UPDATE}"
# Remove old installations.
rm -fr /app/.heroku/python/lib/python*/site-packages/pip-*
diff --git a/test/run-features b/test/run-features
index c50a8c33d..170a8a937 100755
--- a/test/run-features
+++ b/test/run-features
@@ -44,6 +44,7 @@ testStandardRequirements() {
testPipenv() {
compile "pipenv"
+ assertCaptured "Installing pip 9.0.2"
assertCapturedSuccess
}
diff --git a/test/run-versions b/test/run-versions
index 75f165b94..6fe7c1316 100755
--- a/test/run-versions
+++ b/test/run-versions
@@ -9,6 +9,7 @@ testPythonDefault() {
compile "pythonDefault"
assertCaptured $DEFAULT_PYTHON_VERSION
assertNotCaptured "security update"
+ assertCaptured "Installing pip 20.0.2"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
}
@@ -24,6 +25,7 @@ testPython2() {
assertNotCaptured "python-2-7-eol-faq";
fi
assertNotCaptured "security update"
+ assertCaptured "Installing pip 20.0.2"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
}
@@ -51,6 +53,7 @@ testPython3_4() {
compile "python3_4"
assertCaptured $LATEST_34
assertNotCaptured "security update"
+ assertCaptured "Installing pip 19.1.1"
# if cedar 14 and legacy binaries, fail. if cedar 14 and staging, succeed.
if [[ ! -n $USE_STAGING_BINARIES ]] && [[ $STACK == "cedar-14" ]]; then
assertCapturedError
@@ -86,6 +89,7 @@ testPython3_5() {
compile "python3_5"
assertCaptured $LATEST_35
assertNotCaptured "security update"
+ assertCaptured "Installing pip 20.0.2"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
}
@@ -108,6 +112,7 @@ testPython3_6() {
compile "python3_6"
assertCaptured $LATEST_36
assertNotCaptured "security update"
+ assertCaptured "Installing pip 20.0.2"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
}
@@ -134,6 +139,7 @@ testPython3_7() {
else
assertNotCaptured "security update"
assertCaptured $LATEST_37
+ assertCaptured "Installing pip 20.0.2"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
fi
@@ -177,6 +183,7 @@ testPython3_8() {
else
assertNotCaptured "security update"
assertCaptured $LATEST_38
+ assertCaptured "Installing pip 20.0.2"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
fi
@@ -195,6 +202,7 @@ testPypy3_6() {
else
assertCaptured "Installing pypy"
assertCaptured "$PYPY_36"
+ assertCaptured "Installing pip 20.0.2"
assertCapturedSuccess
fi
}
@@ -206,6 +214,7 @@ testPypy2_7() {
else
assertCaptured "Installing pypy"
assertCaptured "$PYPY_27"
+ assertCaptured "Installing pip 20.0.2"
assertCapturedSuccess
fi
}
From eb3514d2f9df1719d08da50ea6ed9cd6204b9842 Mon Sep 17 00:00:00 2001
From: Ed Morley <501702+edmorley@users.noreply.github.com>
Date: Tue, 28 Jul 2020 21:07:59 +0100
Subject: [PATCH 02/11] Move Pip version handling to bin/steps/python (#1007)
And use the `$PYTHON_VERSION` calculated in `bin/steps/python` instead
of re-implementing the Python version handling.
---
bin/compile | 20 --------------------
bin/steps/python | 18 +++++++++++++++---
2 files changed, 15 insertions(+), 23 deletions(-)
diff --git a/bin/compile b/bin/compile
index dd270d802..9a0a2d6f6 100755
--- a/bin/compile
+++ b/bin/compile
@@ -65,26 +65,6 @@ PYPY36="pypy3.6"
# Which stack is used (for binary downloading), if none is provided (e.g. outside of Heroku)?
DEFAULT_PYTHON_STACK="cedar-14"
-# If pip doesn't match this version (the version we install), run the installer.
-PIP_UPDATE="20.0.2"
-
-for file in "$BUILD_DIR/runtime.txt" "$CACHE_DIR/.heroku/python-version" ; do
- [ -f "$file" ] || continue
-
- version=$(tr -d '[:space:]' < "$file")
-
- case "$version" in "$PY34"*)
- # Python 3.4 support was dropped in pip >= 19.2.
- PIP_UPDATE="19.1.1"
- break
- ;;
- esac
-done
-
-if [[ -f "$BUILD_DIR/Pipfile" ]]; then
- # Do not force pipenv users to re-install pipenv locally.
- PIP_UPDATE="9.0.2"
-fi
# Common Problem Warnings:
# This section creates a temporary file in which to stick the output of `pip install`.
diff --git a/bin/steps/python b/bin/steps/python
index 23a1850b9..5129f5b36 100755
--- a/bin/steps/python
+++ b/bin/steps/python
@@ -136,6 +136,18 @@ if [ ! "$SKIP_INSTALL" ]; then
hash -r
fi
+PIP_VERSION='20.0.2'
+
+if [[ "${PYTHON_VERSION}" == ${PY34}* ]]; then
+ # Python 3.4 support was dropped in pip 19.2+.
+ PIP_VERSION='19.1.1'
+fi
+
+if [[ -f "$BUILD_DIR/Pipfile" ]]; then
+ # The buildpack is pinned to old pipenv, which requires older pip.
+ PIP_VERSION='9.0.2'
+fi
+
# Heroku uses the get-pip utility maintained by the Python community to vendor Pip.
# https://github.com/pypa/get-pip
GETPIP_URL="https://lang-python.s3.amazonaws.com/etc/get-pip.py"
@@ -148,15 +160,15 @@ if ! curl -s "${GETPIP_URL}" -o "$GETPIP_PY" &> /dev/null; then
fi
# If a new Python has been installed or Pip isn't up to date:
-if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *$PIP_UPDATE* ]]; then
+if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *${PIP_VERSION}* ]]; then
- puts-step "Installing pip ${PIP_UPDATE}"
+ puts-step "Installing pip ${PIP_VERSION}"
# Remove old installations.
rm -fr /app/.heroku/python/lib/python*/site-packages/pip-*
rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-*
- /app/.heroku/python/bin/python "$GETPIP_PY" pip=="$PIP_UPDATE" &> /dev/null
+ /app/.heroku/python/bin/python "$GETPIP_PY" pip=="${PIP_VERSION}" &> /dev/null
/app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl" &> /dev/null
fi
From 568c0b752b08b9a15d8865764b66eb191c8fdde8 Mon Sep 17 00:00:00 2001
From: Ed Morley <501702+edmorley@users.noreply.github.com>
Date: Tue, 28 Jul 2020 21:17:41 +0100
Subject: [PATCH 03/11] Output the installed version of setuptools in the build
log (#1007)
Since:
* "explicit is better than implicit"
* we'll soon be upgrading setuptools, and debugging breakage caused by
upgrades will be easier if versions are visible in the build log
---
CHANGELOG.md | 2 +-
bin/steps/python | 5 +++--
test/run-features | 2 +-
test/run-versions | 18 +++++++++---------
4 files changed, 14 insertions(+), 13 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c2b7b74ae..ef490fa94 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,7 +2,7 @@
# Master
-- Output the installed version of pip in the build log (#1007).
+- Output the installed version of pip and setuptools in the build log (#1007).
- Reduce the number of environment variables exposed to `bin/{pre,post}_compile` and other subprocesses (#1011)
# 173 (2020-07-21)
diff --git a/bin/steps/python b/bin/steps/python
index 5129f5b36..cab5f7907 100755
--- a/bin/steps/python
+++ b/bin/steps/python
@@ -137,6 +137,7 @@ if [ ! "$SKIP_INSTALL" ]; then
fi
PIP_VERSION='20.0.2'
+SETUPTOOLS_VERSION='39.0.1'
if [[ "${PYTHON_VERSION}" == ${PY34}* ]]; then
# Python 3.4 support was dropped in pip 19.2+.
@@ -162,14 +163,14 @@ fi
# If a new Python has been installed or Pip isn't up to date:
if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *${PIP_VERSION}* ]]; then
- puts-step "Installing pip ${PIP_VERSION}"
+ puts-step "Installing pip ${PIP_VERSION} and setuptools ${SETUPTOOLS_VERSION}"
# Remove old installations.
rm -fr /app/.heroku/python/lib/python*/site-packages/pip-*
rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-*
/app/.heroku/python/bin/python "$GETPIP_PY" pip=="${PIP_VERSION}" &> /dev/null
- /app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-39.0.1-py2.py3-none-any.whl" &> /dev/null
+ /app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-${SETUPTOOLS_VERSION}-py2.py3-none-any.whl" &> /dev/null
fi
set -e
diff --git a/test/run-features b/test/run-features
index 170a8a937..1c059c8f8 100755
--- a/test/run-features
+++ b/test/run-features
@@ -44,7 +44,7 @@ testStandardRequirements() {
testPipenv() {
compile "pipenv"
- assertCaptured "Installing pip 9.0.2"
+ assertCaptured "Installing pip 9.0.2 and setuptools 39.0.1"
assertCapturedSuccess
}
diff --git a/test/run-versions b/test/run-versions
index 6fe7c1316..49775d85a 100755
--- a/test/run-versions
+++ b/test/run-versions
@@ -9,7 +9,7 @@ testPythonDefault() {
compile "pythonDefault"
assertCaptured $DEFAULT_PYTHON_VERSION
assertNotCaptured "security update"
- assertCaptured "Installing pip 20.0.2"
+ assertCaptured "Installing pip 20.0.2 and setuptools 39.0.1"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
}
@@ -25,7 +25,7 @@ testPython2() {
assertNotCaptured "python-2-7-eol-faq";
fi
assertNotCaptured "security update"
- assertCaptured "Installing pip 20.0.2"
+ assertCaptured "Installing pip 20.0.2 and setuptools 39.0.1"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
}
@@ -53,7 +53,7 @@ testPython3_4() {
compile "python3_4"
assertCaptured $LATEST_34
assertNotCaptured "security update"
- assertCaptured "Installing pip 19.1.1"
+ assertCaptured "Installing pip 19.1.1 and setuptools 39.0.1"
# if cedar 14 and legacy binaries, fail. if cedar 14 and staging, succeed.
if [[ ! -n $USE_STAGING_BINARIES ]] && [[ $STACK == "cedar-14" ]]; then
assertCapturedError
@@ -89,7 +89,7 @@ testPython3_5() {
compile "python3_5"
assertCaptured $LATEST_35
assertNotCaptured "security update"
- assertCaptured "Installing pip 20.0.2"
+ assertCaptured "Installing pip 20.0.2 and setuptools 39.0.1"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
}
@@ -112,7 +112,7 @@ testPython3_6() {
compile "python3_6"
assertCaptured $LATEST_36
assertNotCaptured "security update"
- assertCaptured "Installing pip 20.0.2"
+ assertCaptured "Installing pip 20.0.2 and setuptools 39.0.1"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
}
@@ -139,7 +139,7 @@ testPython3_7() {
else
assertNotCaptured "security update"
assertCaptured $LATEST_37
- assertCaptured "Installing pip 20.0.2"
+ assertCaptured "Installing pip 20.0.2 and setuptools 39.0.1"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
fi
@@ -183,7 +183,7 @@ testPython3_8() {
else
assertNotCaptured "security update"
assertCaptured $LATEST_38
- assertCaptured "Installing pip 20.0.2"
+ assertCaptured "Installing pip 20.0.2 and setuptools 39.0.1"
assertCaptured "Installing SQLite3"
assertCapturedSuccess
fi
@@ -202,7 +202,7 @@ testPypy3_6() {
else
assertCaptured "Installing pypy"
assertCaptured "$PYPY_36"
- assertCaptured "Installing pip 20.0.2"
+ assertCaptured "Installing pip 20.0.2 and setuptools 39.0.1"
assertCapturedSuccess
fi
}
@@ -214,7 +214,7 @@ testPypy2_7() {
else
assertCaptured "Installing pypy"
assertCaptured "$PYPY_27"
- assertCaptured "Installing pip 20.0.2"
+ assertCaptured "Installing pip 20.0.2 and setuptools 39.0.1"
assertCapturedSuccess
fi
}
From 43fff31efed16bcf57541a39de48b54df0165716 Mon Sep 17 00:00:00 2001
From: Ed Morley <501702+edmorley@users.noreply.github.com>
Date: Tue, 28 Jul 2020 21:26:51 +0100
Subject: [PATCH 04/11] Install setuptools from PyPI rather than a vendored
copy (#1007)
Since:
* we'll be updating setuptools soon, and newer setuptools has dropped
support for Python versions this buildpack needs to support. As such
if we continued to vendor setuptools, we would need to vendor at
least three different versions.
* we want to try and update setuptools more frequently than we have
in the past, which will mean more repo bloat from binary churn.
* we're still pinning to a specific version, meaning vendoring doesn't
have determinism benefits.
* setuptools is only fetched from PyPI for new installs (or where
versions have changed), so this doesn't increase build time, load on
PyPI, or reliance on PyPI in the common case.
* setuptools is already being inadvertently installed from PyPI prior to
being installed from the vendored copy (see #1001), so we're in effect
already using/depending on PyPI here.
* switching to storing setuptools on S3 wouldn't help reliability as
much as it would appear at first glance, since the later `pip install`
of customer dependencies will fail if PyPI is down anyway.
---
CHANGELOG.md | 1 +
bin/steps/python | 2 +-
vendor/setuptools-39.0.1-py2.py3-none-any.whl | Bin 569436 -> 0 bytes
3 files changed, 2 insertions(+), 1 deletion(-)
delete mode 100644 vendor/setuptools-39.0.1-py2.py3-none-any.whl
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ef490fa94..a359d8f32 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -3,6 +3,7 @@
# Master
- Output the installed version of pip and setuptools in the build log (#1007).
+- Install setuptools from PyPI rather than a vendored copy (#1007).
- Reduce the number of environment variables exposed to `bin/{pre,post}_compile` and other subprocesses (#1011)
# 173 (2020-07-21)
diff --git a/bin/steps/python b/bin/steps/python
index cab5f7907..381cc2188 100755
--- a/bin/steps/python
+++ b/bin/steps/python
@@ -170,7 +170,7 @@ if [ "$FRESH_PYTHON" ] || [[ ! $(pip --version) == *${PIP_VERSION}* ]]; then
rm -fr /app/.heroku/python/lib/python*/site-packages/setuptools-*
/app/.heroku/python/bin/python "$GETPIP_PY" pip=="${PIP_VERSION}" &> /dev/null
- /app/.heroku/python/bin/pip install "$ROOT_DIR/vendor/setuptools-${SETUPTOOLS_VERSION}-py2.py3-none-any.whl" &> /dev/null
+ /app/.heroku/python/bin/pip install "setuptools==${SETUPTOOLS_VERSION}" &> /dev/null
fi
set -e
diff --git a/vendor/setuptools-39.0.1-py2.py3-none-any.whl b/vendor/setuptools-39.0.1-py2.py3-none-any.whl
deleted file mode 100644
index edc3ca2d8ec3e0af7a305c5b9cf0fe574069ae90..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 569436
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
z
zLy2eIZODncz=ZfMdKdzs(QF3FVzJ(^9^`zaLR}B@90qfZj91A%Dk+3bC8dA4V2}ip
z=u(3)Y@O+fW{LXtI&)E_kys88#QV0rG$yhR@ArD7$t5po-w@!EwJE17oao?7TI#|E
zAQ1iRpz!yUjTw3+g_zh!wX5>Fs>n)ew*SIN)Kc|gsj2fQPy22j1pc100s^gG@T=Z
zV-Ey8j|<-$kS)&FBHHMNV|qCv6ZQe{vQgKc&;T3=i>k~+UZGJQaFEQ%R4F>DpNpve
ziLf%_CWpGVxPd8I63K$8UCqL59L>Q%?lfv}j(0G_;{4Xp^$}tw@jc?WcR#>`2MHf5
zms|DW7+EE~EwBE>Yy^k89NS~qf>_y4%`BS~jMeK|*GRBYsaEAU=@}c?p7{Y#suKE@
zj^Sj7x3TaYYlT&jAMFbXntkxaX<??QJ`_eN++73
z{nbt^XUsRQEy#7dFgV%>j*D_?KsETRe1@r!VK;(TL;XIq#g#xFO_)bdK6BUhZ~r0y_>A+xMpoWN_>I
zUAv8&KKqgs4LO`ywJp5UrW3^G_CZsP)F_rE47YEut0&IOqKdfkhAo?%b`KCaR@fQO
zc>frqGs3lh{-n@p-5vcVGhPaYbx`9qCrY2QSL*l!YOW!5zp+=PyfgW9!kr@7i^XPu
zFWwFC%rz`Z;ERe^H^0|BeUk1b{~si1HsXd)m