From 84a1827ed6d47025f9014fa8966a15c209aef75e Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Sun, 9 Jul 2017 13:20:31 +0200 Subject: [PATCH 01/10] Add PIP3 alien namespace --- bin/Alien-PIP | 49 +++++++++++++++++++++++++++++++++++-------------- bin/Alien-PIP3 | 10 ++++++++++ 2 files changed, 45 insertions(+), 14 deletions(-) create mode 100755 bin/Alien-PIP3 diff --git a/bin/Alien-PIP b/bin/Alien-PIP index aa433364..10998249 100755 --- a/bin/Alien-PIP +++ b/bin/Alien-PIP @@ -10,9 +10,22 @@ . ScriptFunctions Import Alien +PYTHON=${ALIEN_PYTHON:-python2} +case $PYTHON in + "python2") + PIP=pip2 + ;; + "python3") + PIP=pip3 + ;; + *) + exit 1 + ;; +esac + getversion() { local prog=$(echo "$1" | sed 's,\(.*\),\L\1,g') - local proginfo=$(pip list | sed 's,\(.*\),\L\1,g' | grep "^${prog} ") + local proginfo=$(${PIP} list | sed 's,\(.*\),\L\1,g' | grep "^${prog} ") if [ -z "$proginfo" ] then exit 1 else echo "$proginfo | cut -d\( -f2 | cut -d\) -f1" @@ -21,19 +34,27 @@ getversion() { getinstallversion() { prog="$1" - versions=($(python - << EOF -import json, urllib2 + versions=($(${PYTHON} - << EOF +import json from distutils.version import StrictVersion +try: + from urllib2 import urlopen, Request + def load_json(res): + return json.load(res) +except ModuleNotFoundError: + from urllib.request import urlopen, Request + def load_json(res): + return json.loads('\n'.join([l.decode() for l in res.readlines()])) def available_versions(prog): try: - url = "https://pypi.python.org/pypi/%s/json" %prog - data = json.load(urllib2.urlopen(urllib2.Request(url))) - versions = data["releases"].keys() - versions.sort(key=StrictVersion) - return versions - except: - return '' -print "\n".join(available_versions("$prog")) + url = "https://pypi.python.org/pypi/%s/json" %prog + data = load_json(urlopen(Request(url))) + versions = list(data["releases"].keys()) + versions.sort(key=StrictVersion) + return versions + except Exception as e: + return [] +print("\n".join(available_versions("$prog"))) EOF )) for V in ${versions[@]} @@ -55,7 +76,7 @@ install() { then mkdir -p "$target" || { echo "Failed to create $target."; exit 1; } fi - pip install --upgrade --prefix=$target --src=$srcdir "$prog" $ver + ${PIP} install --upgrade --prefix=$target --src=$srcdir "$prog" $ver Symlink_Aliens "$goboExecutables" "$goboSystem"/Aliens/PIP/bin } @@ -64,7 +85,7 @@ remove() { local prog="$1" local ver="$2" - pip uninstall "$prog" $ver + ${PIP} uninstall "$prog" $ver Cleanup_Aliens } @@ -92,7 +113,7 @@ case "$command" in In_Version_Range "$lower" "$ver" "$upper" ;; --have-manager) - which pip >/dev/null 2>&1 || exit 1 + which ${PIP} >/dev/null 2>&1 || exit 1 ;; --get-manager-rule) echo "PIP >= 7.0.0" diff --git a/bin/Alien-PIP3 b/bin/Alien-PIP3 new file mode 100755 index 00000000..9ea9693d --- /dev/null +++ b/bin/Alien-PIP3 @@ -0,0 +1,10 @@ +#!/bin/sh + +# Shell script implementing the Aliens interface for PIP3. +# Packages are installed onto /System/Aliens/PIP. The Python module search path +# must include that directory, either through PYTHONPATH or through a .pth file. +# +# Copyright 2017 Aitor P. Iturri. +# Released under the GNU GPL 2 or later. + +exec env ALIEN_PYTHON=python3 Alien-PIP $@ From 670a272722d0144f78d4f85c6ea20f314cd20b3d Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Sun, 9 Jul 2017 14:52:48 +0200 Subject: [PATCH 02/10] Sort versions in descending mode so by default we get the latest version --- bin/Alien-PIP | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bin/Alien-PIP b/bin/Alien-PIP index 10998249..1db8b2ef 100755 --- a/bin/Alien-PIP +++ b/bin/Alien-PIP @@ -50,7 +50,7 @@ def available_versions(prog): url = "https://pypi.python.org/pypi/%s/json" %prog data = load_json(urlopen(Request(url))) versions = list(data["releases"].keys()) - versions.sort(key=StrictVersion) + versions.sort(key=StrictVersion, reverse=True) return versions except Exception as e: return [] From 917e0187d7198a037ad0ec529aa33ac0585a79e7 Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Sun, 9 Jul 2017 15:02:04 +0200 Subject: [PATCH 03/10] Improve input detection for programs Before it was accepting 'PIP' for example as a valid program --- bin/Alien | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/bin/Alien b/bin/Alien index da061699..9e0c049e 100755 --- a/bin/Alien +++ b/bin/Alien @@ -28,12 +28,12 @@ fi mode="$1" prog="$2" -alientype="${prog%%:*}" -alienpkg="${prog#*:}" -if [[ -z "$alientype" || -z "$alienpkg" ]] +if [[ ! $prog =~ ^.+:.+$ ]] then - echo "Error: missing program name" + echo "Error: missing program name, format shoud be 'AlienType:program'" exit 1 fi +alientype="${prog%%:*}" +alienpkg="${prog#*:}" shift 2 exec Alien-$alientype $mode $alienpkg "$@" From a60bfc68df6bdb9199e2de2363f31cfcaeb1e9a7 Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Sun, 9 Jul 2017 15:06:28 +0200 Subject: [PATCH 04/10] Remove blanks --- bin/Alien-PIP | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/bin/Alien-PIP b/bin/Alien-PIP index 1db8b2ef..53f6a96a 100755 --- a/bin/Alien-PIP +++ b/bin/Alien-PIP @@ -77,7 +77,7 @@ install() { mkdir -p "$target" || { echo "Failed to create $target."; exit 1; } fi ${PIP} install --upgrade --prefix=$target --src=$srcdir "$prog" $ver - + Symlink_Aliens "$goboExecutables" "$goboSystem"/Aliens/PIP/bin } @@ -86,7 +86,7 @@ remove() { local ver="$2" ${PIP} uninstall "$prog" $ver - + Cleanup_Aliens } @@ -110,7 +110,7 @@ case "$command" in lower="$3" upper="$4" ver=$(getversion "$2") - In_Version_Range "$lower" "$ver" "$upper" + In_Version_Range "$lower" "$ver" "$upper" ;; --have-manager) which ${PIP} >/dev/null 2>&1 || exit 1 From b8995daddf25b69b4d8cf849572e486f66ac8d57 Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Sun, 9 Jul 2017 15:23:17 +0200 Subject: [PATCH 05/10] Check if the alientype is valid before trying to call it. This provides a less aggressive error output --- bin/Alien | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/bin/Alien b/bin/Alien index 9e0c049e..42c1a914 100755 --- a/bin/Alien +++ b/bin/Alien @@ -36,4 +36,9 @@ fi alientype="${prog%%:*}" alienpkg="${prog#*:}" shift 2 +if [[ ! -x /System/Index/bin/Alien-$alientype ]] +then + echo "Error: $alientype is not a valid alientype" + exit 1 +fi exec Alien-$alientype $mode $alienpkg "$@" From 6704640072d1d000e2e2d5791442bbe50fc9730e Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Sun, 9 Jul 2017 21:57:14 +0200 Subject: [PATCH 06/10] Fix bug when returning the installed pip version Propagate the error to the top level script so we can use it to check for installed versions --- bin/Alien-PIP | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/Alien-PIP b/bin/Alien-PIP index 53f6a96a..56a19668 100755 --- a/bin/Alien-PIP +++ b/bin/Alien-PIP @@ -25,10 +25,10 @@ esac getversion() { local prog=$(echo "$1" | sed 's,\(.*\),\L\1,g') - local proginfo=$(${PIP} list | sed 's,\(.*\),\L\1,g' | grep "^${prog} ") + local proginfo=$(${PIP} list 2>/dev/null | sed 's,\(.*\),\L\1,g' | grep "^${prog} ") if [ -z "$proginfo" ] then exit 1 - else echo "$proginfo | cut -d\( -f2 | cut -d\) -f1" + else echo "$proginfo" | cut -d\( -f2 | cut -d\) -f1 fi } @@ -95,7 +95,8 @@ prog="$2" case "$command" in --getversion) - echo $(getversion "$2") + ver=$(getversion "$2") + [ $? -eq 0 ] && echo $ver || exit $? # propagate the error ;; --getinstallversion) echo $(getinstallversion "$2" "$3" "$4") From df288fcba89c07882b0ae0fbaf138aa56e6ebeb6 Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Tue, 11 Jul 2017 19:59:34 +0200 Subject: [PATCH 07/10] Implement PEP440 versioning system --- bin/Alien-PIP | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/bin/Alien-PIP b/bin/Alien-PIP index 56a19668..72018c46 100755 --- a/bin/Alien-PIP +++ b/bin/Alien-PIP @@ -11,21 +11,28 @@ Import Alien PYTHON=${ALIEN_PYTHON:-python2} -case $PYTHON in +case ${ALIEN_PYTHON:-python2} in "python2") - PIP=pip2 + PYTHONVER=$(python2 --version 2>&1 | awk {'print $2'} | cut -b1-3) + ALIEN_PYTHON=python2 + ALIEN_PIP=pip2 ;; "python3") - PIP=pip3 + PYTHONVER=$(python3 --version 2>&1 | awk {'print $2'} | cut -b1-3) + ALIEN_PYTHON=python3 + ALIEN_PIP=pip3 ;; *) exit 1 ;; esac +PYTHON="PYTHONPATH=$goboSystem/Aliens/PIP/lib/python${PYTHONVER}/site-packages $ALIEN_PYTHON" +PIP="PYTHONPATH=$goboSystem/Aliens/PIP/lib/python${PYTHONVER}/site-packages $ALIEN_PIP" + getversion() { local prog=$(echo "$1" | sed 's,\(.*\),\L\1,g') - local proginfo=$(${PIP} list 2>/dev/null | sed 's,\(.*\),\L\1,g' | grep "^${prog} ") + local proginfo=$(eval ${PIP} list 2>/dev/null | sed 's,\(.*\),\L\1,g' | grep "^${prog} ") if [ -z "$proginfo" ] then exit 1 else echo "$proginfo" | cut -d\( -f2 | cut -d\) -f1 @@ -34,9 +41,9 @@ getversion() { getinstallversion() { prog="$1" - versions=($(${PYTHON} - << EOF + versions=($(eval ${PYTHON} - << EOF import json -from distutils.version import StrictVersion +from packaging.version import Version try: from urllib2 import urlopen, Request def load_json(res): @@ -50,7 +57,7 @@ def available_versions(prog): url = "https://pypi.python.org/pypi/%s/json" %prog data = load_json(urlopen(Request(url))) versions = list(data["releases"].keys()) - versions.sort(key=StrictVersion, reverse=True) + versions.sort(key=Version, reverse=True) return versions except Exception as e: return [] @@ -76,16 +83,15 @@ install() { then mkdir -p "$target" || { echo "Failed to create $target."; exit 1; } fi - ${PIP} install --upgrade --prefix=$target --src=$srcdir "$prog" $ver - - Symlink_Aliens "$goboExecutables" "$goboSystem"/Aliens/PIP/bin + eval ${PIP} install --upgrade --prefix=$target --src=$srcdir "$prog" $ver && \ + Symlink_Aliens "$goboExecutables" "$goboSystem"/Aliens/PIP/bin } remove() { local prog="$1" local ver="$2" - ${PIP} uninstall "$prog" $ver + eval ${PIP} uninstall "$prog" $ver Cleanup_Aliens } @@ -99,6 +105,10 @@ case "$command" in [ $? -eq 0 ] && echo $ver || exit $? # propagate the error ;; --getinstallversion) + [ -z $(getversion "packaging") ] && { + echo "pip module 'packaging' (see PEP440) not found, installing it first" + install packaging || exit 1 + } echo $(getinstallversion "$2" "$3" "$4") ;; --greater-than) @@ -114,7 +124,7 @@ case "$command" in In_Version_Range "$lower" "$ver" "$upper" ;; --have-manager) - which ${PIP} >/dev/null 2>&1 || exit 1 + eval which ${PIP} >/dev/null 2>&1 || exit 1 ;; --get-manager-rule) echo "PIP >= 7.0.0" From 690c420d4e0738d5985a33b00c1970336bc1aeb4 Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Tue, 11 Jul 2017 21:39:08 +0200 Subject: [PATCH 08/10] Add python3 as manager rule for PIP3 --- bin/Alien-PIP | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/Alien-PIP b/bin/Alien-PIP index 72018c46..8e433ba9 100755 --- a/bin/Alien-PIP +++ b/bin/Alien-PIP @@ -16,11 +16,13 @@ case ${ALIEN_PYTHON:-python2} in PYTHONVER=$(python2 --version 2>&1 | awk {'print $2'} | cut -b1-3) ALIEN_PYTHON=python2 ALIEN_PIP=pip2 + MANAGER_RULE="PIP >= 7.0.0" ;; "python3") PYTHONVER=$(python3 --version 2>&1 | awk {'print $2'} | cut -b1-3) ALIEN_PYTHON=python3 ALIEN_PIP=pip3 + MANAGER_RULE="Python >= 3.5.0" ;; *) exit 1 @@ -127,7 +129,7 @@ case "$command" in eval which ${PIP} >/dev/null 2>&1 || exit 1 ;; --get-manager-rule) - echo "PIP >= 7.0.0" + echo $MANAGER_RULE ;; --install) install "$2" "$3" From 73cf9877d65c6f8b78ffe51ce2ebc94658a4b5a0 Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Tue, 11 Jul 2017 22:24:34 +0200 Subject: [PATCH 09/10] Fix --have-manager --- bin/Alien-PIP | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/bin/Alien-PIP b/bin/Alien-PIP index 8e433ba9..64621b01 100755 --- a/bin/Alien-PIP +++ b/bin/Alien-PIP @@ -21,7 +21,7 @@ case ${ALIEN_PYTHON:-python2} in "python3") PYTHONVER=$(python3 --version 2>&1 | awk {'print $2'} | cut -b1-3) ALIEN_PYTHON=python3 - ALIEN_PIP=pip3 + ALIEN_PIP="python3 -m pip" MANAGER_RULE="Python >= 3.5.0" ;; *) @@ -32,6 +32,20 @@ esac PYTHON="PYTHONPATH=$goboSystem/Aliens/PIP/lib/python${PYTHONVER}/site-packages $ALIEN_PYTHON" PIP="PYTHONPATH=$goboSystem/Aliens/PIP/lib/python${PYTHONVER}/site-packages $ALIEN_PIP" +hasmanager() { + case ${ALIEN_PYTHON} in + "python2") + which $ALIEN_PIP > /dev/null 2>&1 + ;; + "python3") + which $ALIEN_PYTHON > /dev/null 2>&1 + ;; + *) + return 1 + esac + return $? +} + getversion() { local prog=$(echo "$1" | sed 's,\(.*\),\L\1,g') local proginfo=$(eval ${PIP} list 2>/dev/null | sed 's,\(.*\),\L\1,g' | grep "^${prog} ") @@ -126,7 +140,7 @@ case "$command" in In_Version_Range "$lower" "$ver" "$upper" ;; --have-manager) - eval which ${PIP} >/dev/null 2>&1 || exit 1 + hasmanager || exit 1 ;; --get-manager-rule) echo $MANAGER_RULE From cf55010a4503f00785b216db397c4496f24feeea Mon Sep 17 00:00:00 2001 From: AitorATuin Date: Wed, 12 Jul 2017 22:25:46 +0200 Subject: [PATCH 10/10] Fix version argument when calling pip --- bin/Alien-PIP | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bin/Alien-PIP b/bin/Alien-PIP index 64621b01..7a31e3ed 100755 --- a/bin/Alien-PIP +++ b/bin/Alien-PIP @@ -47,6 +47,7 @@ hasmanager() { } getversion() { + local prog=$(echo "$1" | sed 's,\(.*\),\L\1,g') local proginfo=$(eval ${PIP} list 2>/dev/null | sed 's,\(.*\),\L\1,g' | grep "^${prog} ") if [ -z "$proginfo" ] @@ -99,7 +100,8 @@ install() { then mkdir -p "$target" || { echo "Failed to create $target."; exit 1; } fi - eval ${PIP} install --upgrade --prefix=$target --src=$srcdir "$prog" $ver && \ + [ ! -z $ver ] && prog_with_ver="$prog==$ver" || prog_with_ver="$prog" + eval ${PIP} install --upgrade --prefix=$target --src=$srcdir "$prog_with_ver" && \ Symlink_Aliens "$goboExecutables" "$goboSystem"/Aliens/PIP/bin }