mirror of
https://github.com/kennethreitz/heroku-buildpack-python.git
synced 2026-06-05 23:10:16 +00:00
221722fb27
With inspiration from @KevinBrolly, this patch uses the stack image SQLite3 package but also still providing the dev headers and binary that users may still be using today. The benefit is that we won't need to rebuild all the python binaries for this to take affect. We can just stop shipping SQLite3 from future binaries. In addition, we don't need to worry about what version and when to update SQLite3 and maintaining the packages ourselves. This also includes updates to Python 2.7.15 and Python 3.6.6 so they can rebuilt with the stack image dev headers instead of building our own vendored SQLite3.
99 lines
2.1 KiB
Bash
Executable File
99 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
shopt -s extglob
|
|
shopt -s nullglob
|
|
|
|
# The standard library.
|
|
if [[ ! -f /tmp/stdlib.sh ]]; then
|
|
curl --retry 3 -s https://lang-common.s3.amazonaws.com/buildpack-stdlib/v8/stdlib.sh > /tmp/stdlib.sh
|
|
fi
|
|
# shellcheck source=/dev/null
|
|
source /tmp/stdlib.sh
|
|
|
|
if [ "$(uname)" == Darwin ]; then
|
|
sed() { command sed -l "$@"; }
|
|
else
|
|
sed() { command sed -u "$@"; }
|
|
fi
|
|
|
|
# Syntax sugar.
|
|
indent() {
|
|
sed "s/^/ /"
|
|
}
|
|
|
|
|
|
# Clean up pip output
|
|
cleanup() {
|
|
sed -e 's/\.\.\.\+/.../g' | sed -e '/already satisfied/Id' | sed -e '/No files were found to uninstall/Id' | sed -e '/Overwriting/Id' | sed -e '/python executable/Id' | sed -e '/no previously-included files/Id'
|
|
}
|
|
|
|
# Buildpack Steps.
|
|
puts-step() {
|
|
echo "-----> $*"
|
|
}
|
|
|
|
# Buildpack Warnings.
|
|
puts-warn() {
|
|
echo " ! $*"
|
|
}
|
|
|
|
# Does some serious copying.
|
|
deep-cp() {
|
|
declare source="$1" target="$2"
|
|
|
|
mkdir -p "$target"
|
|
|
|
# cp doesn't like being called without source params,
|
|
# so make sure they expand to something first.
|
|
# subshell to avoid surprising caller with shopts.
|
|
(
|
|
shopt -s nullglob dotglob
|
|
set -- "$source"/!(tmp|.|..)
|
|
[[ $# == 0 ]] || cp -a "$@" "$target"
|
|
)
|
|
}
|
|
|
|
|
|
# Measure the size of the Python installation.
|
|
measure-size() {
|
|
echo "$(du -s .heroku/python 2>/dev/null || echo 0) | awk '{print $1}')"
|
|
}
|
|
|
|
# Python version operator >
|
|
version_gt() {
|
|
test "$(printf '%s\n' "$@" | sort -V | head -n 1)" != "$1";
|
|
}
|
|
|
|
# Python verison operator >=
|
|
version_gte() {
|
|
if [ "$1" == "$2" ]; then
|
|
return 0
|
|
fi
|
|
|
|
version_gt "$1" "$2"
|
|
}
|
|
|
|
# Check if Python 2
|
|
python2_check() {
|
|
VERSION="$1"
|
|
|
|
version_gte "$VERSION" "python-2.7.0" && version_gt "python-3.0.0" "$VERSION"
|
|
}
|
|
|
|
# Check if Python 3
|
|
python3_check() {
|
|
VERSION="$1"
|
|
|
|
version_gte "$VERSION" "python-3.0.0" && version_gt "python-4.0.0" "$VERSION"
|
|
}
|
|
|
|
# Check if Python version needs to install SQLite3
|
|
python_sqlite3_check() {
|
|
VERSION="$1"
|
|
MIN_PYTHON_3="python-3.6.6"
|
|
MIN_PYTHON_2="python-2.7.15"
|
|
|
|
( python2_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_2" ) \
|
|
|| ( python3_check "$VERSION" && version_gte "$VERSION" "$MIN_PYTHON_3" ) \
|
|
|| ( version_gte "$VERSION" "3.7.0" )
|
|
}
|