Browse code

Calculate package directory correctly in pip_install

Strip the [<extras>] string from a <package_dir>[<extras>] argument
when looking for the package directory. Explain what the heck is
going on.

Change-Id: I79beb5c3e9e7c35c91cdd0d5a1d91532bebc4b6d
Closes-Bug: #1721638

Zane Bitter authored on 2017/10/06 05:51:09
Showing 1 changed files
... ...
@@ -219,7 +219,8 @@ function disable_python3_package {
219 219
 # Wrapper for ``pip install`` to set cache and proxy environment variables
220 220
 # Uses globals ``OFFLINE``, ``PIP_VIRTUAL_ENV``,
221 221
 # ``PIP_UPGRADE``, ``TRACK_DEPENDS``, ``*_proxy``,
222
-# pip_install package [package ...]
222
+# Usage:
223
+#  pip_install pip_arguments
223 224
 function pip_install {
224 225
     local xtrace result
225 226
     xtrace=$(set +o | grep xtrace)
... ...
@@ -241,6 +242,26 @@ function pip_install {
241 241
     if [[ -z "$os_PACKAGE" ]]; then
242 242
         GetOSVersion
243 243
     fi
244
+
245
+    # Try to extract the path of the package we are installing into
246
+    # package_dir.  We need this to check for test-requirements.txt,
247
+    # at least.
248
+    #
249
+    # ${!#} expands to the last positional argument to this function.
250
+    # With "extras" syntax included, our arguments might be something
251
+    # like:
252
+    #  -e /path/to/fooproject[extra]
253
+    # Thus this magic line grabs just the path without extras
254
+    #
255
+    # Note that this makes no sense if this is a pypi (rather than
256
+    # local path) install; ergo you must check this path exists before
257
+    # use.  Also, if we had multiple or mixed installs, we would also
258
+    # likely break.  But for historical reasons, it's basically only
259
+    # the other wrapper functions in here calling this to install
260
+    # local packages, and they do so with single call per install.  So
261
+    # this works (for now...)
262
+    local package_dir=${!#%\[*\]}
263
+
244 264
     if [[ $TRACK_DEPENDS = True && ! "$@" =~ virtualenv ]]; then
245 265
         # TRACK_DEPENDS=True installation creates a circular dependency when
246 266
         # we attempt to install virtualenv into a virtualenv, so we must global
... ...
@@ -261,7 +282,6 @@ function pip_install {
261 261
                 # versions supported, and if we find the version of
262 262
                 # python3 we've been told to use, use that instead of the
263 263
                 # default pip
264
-                local package_dir=${!#}
265 264
                 local python_versions
266 265
 
267 266
                 # Special case some services that have experimental
... ...
@@ -323,7 +343,7 @@ function pip_install {
323 323
 
324 324
     # Also install test requirements
325 325
     local install_test_reqs=""
326
-    local test_req="${!#}/test-requirements.txt"
326
+    local test_req="${package_dir}/test-requirements.txt"
327 327
     if [[ -e "$test_req" ]]; then
328 328
         install_test_reqs="-r $test_req"
329 329
     fi