| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 1 | #!/bin/bash | 
 | 2 | # | 
 | 3 | # **inc/python** - Python-related functions | 
 | 4 | # | 
 | 5 | # Support for pip/setuptools interfaces and virtual environments | 
 | 6 | # | 
 | 7 | # External functions used: | 
 | 8 | # - GetOSVersion | 
 | 9 | # - is_fedora | 
 | 10 | # - is_suse | 
 | 11 | # - safe_chown | 
 | 12 |  | 
 | 13 | # Save trace setting | 
 | 14 | INC_PY_TRACE=$(set +o | grep xtrace) | 
 | 15 | set +o xtrace | 
 | 16 |  | 
 | 17 |  | 
| Dean Troyer | 8c2ce6e | 2015-02-18 14:47:54 -0600 | [diff] [blame] | 18 | # Global Config Variables | 
 | 19 |  | 
| Atsushi SAKAI | 5509ed5 | 2015-11-30 20:20:21 +0900 | [diff] [blame] | 20 | # PROJECT_VENV contains the name of the virtual environment for each | 
| Dean Troyer | 8c2ce6e | 2015-02-18 14:47:54 -0600 | [diff] [blame] | 21 | # project.  A null value installs to the system Python directories. | 
 | 22 | declare -A PROJECT_VENV | 
 | 23 |  | 
 | 24 |  | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 25 | # Python Functions | 
 | 26 | # ================ | 
 | 27 |  | 
 | 28 | # Get the path to the pip command. | 
 | 29 | # get_pip_command | 
 | 30 | function get_pip_command { | 
| Doug Hellmann | ddc3839 | 2015-05-07 21:06:24 +0000 | [diff] [blame] | 31 |     local version="$1" | 
 | 32 |     # NOTE(dhellmann): I don't know if we actually get a pip3.4-python | 
 | 33 |     # under any circumstances. | 
 | 34 |     which pip${version} || which pip${version}-python | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 35 |  | 
 | 36 |     if [ $? -ne 0 ]; then | 
| Doug Hellmann | ddc3839 | 2015-05-07 21:06:24 +0000 | [diff] [blame] | 37 |         die $LINENO "Unable to find pip${version}; cannot continue" | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 38 |     fi | 
 | 39 | } | 
 | 40 |  | 
| Atsushi SAKAI | 5509ed5 | 2015-11-30 20:20:21 +0900 | [diff] [blame] | 41 | # Get the path to the directory where python executables are installed. | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 42 | # get_python_exec_prefix | 
 | 43 | function get_python_exec_prefix { | 
| Ian Wienand | 433a9b1 | 2015-10-07 13:29:31 +1100 | [diff] [blame] | 44 |     local xtrace | 
 | 45 |     xtrace=$(set +o | grep xtrace) | 
| Dean Troyer | 2b56476 | 2015-02-11 17:01:02 -0600 | [diff] [blame] | 46 |     set +o xtrace | 
 | 47 |     if [[ -z "$os_PACKAGE" ]]; then | 
 | 48 |         GetOSVersion | 
 | 49 |     fi | 
 | 50 |     $xtrace | 
 | 51 |  | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 52 |     if is_fedora || is_suse; then | 
 | 53 |         echo "/usr/bin" | 
 | 54 |     else | 
 | 55 |         echo "/usr/local/bin" | 
 | 56 |     fi | 
 | 57 | } | 
 | 58 |  | 
| Sean Dague | 60996b1 | 2015-04-08 09:06:49 -0400 | [diff] [blame] | 59 | # Wrapper for ``pip install`` that only installs versions of libraries | 
 | 60 | # from the global-requirements specification. | 
 | 61 | # | 
 | 62 | # Uses globals ``REQUIREMENTS_DIR`` | 
 | 63 | # | 
 | 64 | # pip_install_gr packagename | 
 | 65 | function pip_install_gr { | 
 | 66 |     local name=$1 | 
| Ian Wienand | ada886d | 2015-10-07 14:06:26 +1100 | [diff] [blame] | 67 |     local clean_name | 
 | 68 |     clean_name=$(get_from_global_requirements $name) | 
| Sean Dague | 60996b1 | 2015-04-08 09:06:49 -0400 | [diff] [blame] | 69 |     pip_install $clean_name | 
 | 70 | } | 
 | 71 |  | 
| Doug Hellmann | ddc3839 | 2015-05-07 21:06:24 +0000 | [diff] [blame] | 72 | # Determine the python versions supported by a package | 
 | 73 | function get_python_versions_for_package { | 
 | 74 |     local name=$1 | 
 | 75 |     cd $name && python setup.py --classifiers \ | 
 | 76 |         | grep 'Language' | cut -f5 -d: | grep '\.' | tr '\n' ' ' | 
 | 77 | } | 
 | 78 |  | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 79 | # Wrapper for ``pip install`` to set cache and proxy environment variables | 
| Dean Troyer | 41d6f85 | 2015-03-25 22:42:46 -0500 | [diff] [blame] | 80 | # Uses globals ``OFFLINE``, ``PIP_VIRTUAL_ENV``, | 
| Robert Collins | 635a5ba | 2015-06-10 08:48:06 +1200 | [diff] [blame] | 81 | # ``PIP_UPGRADE``, ``TRACK_DEPENDS``, ``*_proxy``, | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 82 | # pip_install package [package ...] | 
 | 83 | function pip_install { | 
| Federico Ressi | e208d06 | 2015-11-21 11:15:39 +0000 | [diff] [blame] | 84 |     local xtrace result | 
| Ian Wienand | 433a9b1 | 2015-10-07 13:29:31 +1100 | [diff] [blame] | 85 |     xtrace=$(set +o | grep xtrace) | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 86 |     set +o xtrace | 
| Chris Dent | ebdd9ac | 2015-03-04 12:35:14 +0000 | [diff] [blame] | 87 |     local upgrade="" | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 88 |     local offline=${OFFLINE:-False} | 
 | 89 |     if [[ "$offline" == "True" || -z "$@" ]]; then | 
 | 90 |         $xtrace | 
 | 91 |         return | 
 | 92 |     fi | 
 | 93 |  | 
| Sean Dague | cb658fa | 2015-10-08 17:12:03 -0400 | [diff] [blame] | 94 |     time_start "pip_install" | 
 | 95 |  | 
| Chris Dent | ebdd9ac | 2015-03-04 12:35:14 +0000 | [diff] [blame] | 96 |     PIP_UPGRADE=$(trueorfalse False PIP_UPGRADE) | 
 | 97 |     if [[ "$PIP_UPGRADE" = "True" ]] ; then | 
 | 98 |         upgrade="--upgrade" | 
 | 99 |     fi | 
 | 100 |  | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 101 |     if [[ -z "$os_PACKAGE" ]]; then | 
 | 102 |         GetOSVersion | 
 | 103 |     fi | 
 | 104 |     if [[ $TRACK_DEPENDS = True && ! "$@" =~ virtualenv ]]; then | 
 | 105 |         # TRACK_DEPENDS=True installation creates a circular dependency when | 
| Atsushi SAKAI | 5509ed5 | 2015-11-30 20:20:21 +0900 | [diff] [blame] | 106 |         # we attempt to install virtualenv into a virtualenv, so we must global | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 107 |         # that installation. | 
 | 108 |         source $DEST/.venv/bin/activate | 
 | 109 |         local cmd_pip=$DEST/.venv/bin/pip | 
 | 110 |         local sudo_pip="env" | 
 | 111 |     else | 
| Dean Troyer | 2b56476 | 2015-02-11 17:01:02 -0600 | [diff] [blame] | 112 |         if [[ -n ${PIP_VIRTUAL_ENV:=} && -d ${PIP_VIRTUAL_ENV} ]]; then | 
 | 113 |             local cmd_pip=$PIP_VIRTUAL_ENV/bin/pip | 
 | 114 |             local sudo_pip="env" | 
 | 115 |         else | 
| Ian Wienand | ada886d | 2015-10-07 14:06:26 +1100 | [diff] [blame] | 116 |             local cmd_pip | 
| Doug Hellmann | ddc3839 | 2015-05-07 21:06:24 +0000 | [diff] [blame] | 117 |             cmd_pip=$(get_pip_command $PYTHON2_VERSION) | 
| Dean Troyer | 2b56476 | 2015-02-11 17:01:02 -0600 | [diff] [blame] | 118 |             local sudo_pip="sudo -H" | 
| Doug Hellmann | ddc3839 | 2015-05-07 21:06:24 +0000 | [diff] [blame] | 119 |             if python3_enabled; then | 
 | 120 |                 # Look at the package classifiers to find the python | 
 | 121 |                 # versions supported, and if we find the version of | 
 | 122 |                 # python3 we've been told to use, use that instead of the | 
 | 123 |                 # default pip | 
 | 124 |                 local package_dir=${!#} | 
 | 125 |                 local python_versions | 
 | 126 |                 if [[ -d "$package_dir" ]]; then | 
 | 127 |                     python_versions=$(get_python_versions_for_package $package_dir) | 
 | 128 |                     if [[ $python_versions =~ $PYTHON3_VERSION ]]; then | 
 | 129 |                         cmd_pip=$(get_pip_command $PYTHON3_VERSION) | 
 | 130 |                     fi | 
 | 131 |                 fi | 
 | 132 |             fi | 
| Dean Troyer | 2b56476 | 2015-02-11 17:01:02 -0600 | [diff] [blame] | 133 |         fi | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 134 |     fi | 
 | 135 |  | 
| Robert Collins | 635a5ba | 2015-06-10 08:48:06 +1200 | [diff] [blame] | 136 |     cmd_pip="$cmd_pip install" | 
| Clark Boylan | 05aa384 | 2015-08-03 11:14:13 -0700 | [diff] [blame] | 137 |     # Always apply constraints | 
 | 138 |     cmd_pip="$cmd_pip -c $REQUIREMENTS_DIR/upper-constraints.txt" | 
| Robert Collins | 635a5ba | 2015-06-10 08:48:06 +1200 | [diff] [blame] | 139 |  | 
| Doug Hellmann | ddc3839 | 2015-05-07 21:06:24 +0000 | [diff] [blame] | 140 |     # FIXME(dhellmann): Need to force multiple versions of pip for | 
 | 141 |     # packages like setuptools? | 
| Ian Wienand | ada886d | 2015-10-07 14:06:26 +1100 | [diff] [blame] | 142 |     local pip_version | 
 | 143 |     pip_version=$(python -c "import pip; \ | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 144 |                         print(pip.__version__.strip('.')[0])") | 
 | 145 |     if (( pip_version<6 )); then | 
 | 146 |         die $LINENO "Currently installed pip version ${pip_version} does not" \ | 
 | 147 |             "meet minimum requirements (>=6)." | 
 | 148 |     fi | 
 | 149 |  | 
 | 150 |     $xtrace | 
 | 151 |     $sudo_pip \ | 
| Eli Qiao | 6a83c42 | 2015-03-17 16:54:16 +0800 | [diff] [blame] | 152 |         http_proxy="${http_proxy:-}" \ | 
 | 153 |         https_proxy="${https_proxy:-}" \ | 
 | 154 |         no_proxy="${no_proxy:-}" \ | 
| Joe Gordon | cd8824a | 2015-03-04 16:40:19 -0800 | [diff] [blame] | 155 |         PIP_FIND_LINKS=$PIP_FIND_LINKS \ | 
| Robert Collins | 635a5ba | 2015-06-10 08:48:06 +1200 | [diff] [blame] | 156 |         $cmd_pip $upgrade \ | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 157 |         $@ | 
| Federico Ressi | e208d06 | 2015-11-21 11:15:39 +0000 | [diff] [blame] | 158 |     result=$? | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 159 |  | 
| Sean Dague | eeb7bda | 2015-03-25 11:55:32 -0400 | [diff] [blame] | 160 |     # Also install test requirements | 
| Sirushti Murugesan | 713fd2f | 2015-09-30 15:12:50 +0530 | [diff] [blame] | 161 |     local test_req="${!#}/test-requirements.txt" | 
| Federico Ressi | e208d06 | 2015-11-21 11:15:39 +0000 | [diff] [blame] | 162 |     if [[ $result == 0 ]] && [[ -e "$test_req" ]]; then | 
| Sean Dague | eeb7bda | 2015-03-25 11:55:32 -0400 | [diff] [blame] | 163 |         echo "Installing test-requirements for $test_req" | 
 | 164 |         $sudo_pip \ | 
 | 165 |             http_proxy=${http_proxy:-} \ | 
 | 166 |             https_proxy=${https_proxy:-} \ | 
 | 167 |             no_proxy=${no_proxy:-} \ | 
 | 168 |             PIP_FIND_LINKS=$PIP_FIND_LINKS \ | 
| Robert Collins | 635a5ba | 2015-06-10 08:48:06 +1200 | [diff] [blame] | 169 |             $cmd_pip $upgrade \ | 
| Sean Dague | eeb7bda | 2015-03-25 11:55:32 -0400 | [diff] [blame] | 170 |             -r $test_req | 
| Federico Ressi | e208d06 | 2015-11-21 11:15:39 +0000 | [diff] [blame] | 171 |         result=$? | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 172 |     fi | 
| Sean Dague | cb658fa | 2015-10-08 17:12:03 -0400 | [diff] [blame] | 173 |  | 
 | 174 |     time_stop "pip_install" | 
| Federico Ressi | e208d06 | 2015-11-21 11:15:39 +0000 | [diff] [blame] | 175 |     return $result | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 176 | } | 
 | 177 |  | 
| Joe Gordon | d5ac785 | 2015-02-06 19:29:23 -0800 | [diff] [blame] | 178 | # get version of a package from global requirements file | 
 | 179 | # get_from_global_requirements <package> | 
 | 180 | function get_from_global_requirements { | 
 | 181 |     local package=$1 | 
| Ian Wienand | ada886d | 2015-10-07 14:06:26 +1100 | [diff] [blame] | 182 |     local required_pkg | 
 | 183 |     required_pkg=$(grep -i -h ^${package} $REQUIREMENTS_DIR/global-requirements.txt | cut -d\# -f1) | 
| Joe Gordon | d5ac785 | 2015-02-06 19:29:23 -0800 | [diff] [blame] | 184 |     if [[ $required_pkg == ""  ]]; then | 
 | 185 |         die $LINENO "Can't find package $package in requirements" | 
 | 186 |     fi | 
 | 187 |     echo $required_pkg | 
 | 188 | } | 
 | 189 |  | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 190 | # should we use this library from their git repo, or should we let it | 
 | 191 | # get pulled in via pip dependencies. | 
 | 192 | function use_library_from_git { | 
 | 193 |     local name=$1 | 
 | 194 |     local enabled=1 | 
 | 195 |     [[ ,${LIBS_FROM_GIT}, =~ ,${name}, ]] && enabled=0 | 
 | 196 |     return $enabled | 
 | 197 | } | 
 | 198 |  | 
| Sean Dague | c71973e | 2015-09-08 07:12:48 -0400 | [diff] [blame] | 199 | # determine if a package was installed from git | 
 | 200 | function lib_installed_from_git { | 
 | 201 |     local name=$1 | 
 | 202 |     pip freeze 2>/dev/null | grep -- "$name" | grep -q -- '-e git' | 
 | 203 | } | 
 | 204 |  | 
 | 205 | # check that everything that's in LIBS_FROM_GIT was actually installed | 
 | 206 | # correctly, this helps double check issues with library fat fingering. | 
 | 207 | function check_libs_from_git { | 
 | 208 |     local lib="" | 
 | 209 |     local not_installed="" | 
 | 210 |     for lib in $(echo ${LIBS_FROM_GIT} | tr "," " "); do | 
 | 211 |         if ! lib_installed_from_git "$lib"; then | 
 | 212 |             not_installed+=" $lib" | 
 | 213 |         fi | 
 | 214 |     done | 
 | 215 |     # if anything is not installed, say what it is. | 
 | 216 |     if [[ -n "$not_installed" ]]; then | 
 | 217 |         die $LINENO "The following LIBS_FROM_GIT were not installed correct: $not_installed" | 
 | 218 |     fi | 
 | 219 | } | 
 | 220 |  | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 221 | # setup a library by name. If we are trying to use the library from | 
 | 222 | # git, we'll do a git based install, otherwise we'll punt and the | 
 | 223 | # library should be installed by a requirements pull from another | 
 | 224 | # project. | 
 | 225 | function setup_lib { | 
 | 226 |     local name=$1 | 
 | 227 |     local dir=${GITDIR[$name]} | 
 | 228 |     setup_install $dir | 
 | 229 | } | 
 | 230 |  | 
| Atsushi SAKAI | 5509ed5 | 2015-11-30 20:20:21 +0900 | [diff] [blame] | 231 | # setup a library by name in editable mode. If we are trying to use | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 232 | # the library from git, we'll do a git based install, otherwise we'll | 
 | 233 | # punt and the library should be installed by a requirements pull from | 
 | 234 | # another project. | 
 | 235 | # | 
 | 236 | # use this for non namespaced libraries | 
 | 237 | function setup_dev_lib { | 
 | 238 |     local name=$1 | 
 | 239 |     local dir=${GITDIR[$name]} | 
 | 240 |     setup_develop $dir | 
 | 241 | } | 
 | 242 |  | 
 | 243 | # this should be used if you want to install globally, all libraries should | 
 | 244 | # use this, especially *oslo* ones | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 245 | # | 
 | 246 | # setup_install project_dir [extras] | 
 | 247 | # project_dir: directory of project repo (e.g., /opt/stack/keystone) | 
 | 248 | # extras: comma-separated list of optional dependencies to install | 
 | 249 | #         (e.g., ldap,memcache). | 
 | 250 | #         See http://docs.openstack.org/developer/pbr/#extra-requirements | 
 | 251 | # The command is like "pip install <project_dir>[<extras>]" | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 252 | function setup_install { | 
 | 253 |     local project_dir=$1 | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 254 |     local extras=$2 | 
 | 255 |     _setup_package_with_constraints_edit $project_dir "" $extras | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 256 | } | 
 | 257 |  | 
 | 258 | # this should be used for projects which run services, like all services | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 259 | # | 
 | 260 | # setup_develop project_dir [extras] | 
 | 261 | # project_dir: directory of project repo (e.g., /opt/stack/keystone) | 
 | 262 | # extras: comma-separated list of optional dependencies to install | 
 | 263 | #         (e.g., ldap,memcache). | 
 | 264 | #         See http://docs.openstack.org/developer/pbr/#extra-requirements | 
 | 265 | # The command is like "pip install -e <project_dir>[<extras>]" | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 266 | function setup_develop { | 
 | 267 |     local project_dir=$1 | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 268 |     local extras=$2 | 
 | 269 |     _setup_package_with_constraints_edit $project_dir -e $extras | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 270 | } | 
 | 271 |  | 
 | 272 | # determine if a project as specified by directory is in | 
 | 273 | # projects.txt. This will not be an exact match because we throw away | 
 | 274 | # the namespacing when we clone, but it should be good enough in all | 
 | 275 | # practical ways. | 
 | 276 | function is_in_projects_txt { | 
 | 277 |     local project_dir=$1 | 
| Ian Wienand | ada886d | 2015-10-07 14:06:26 +1100 | [diff] [blame] | 278 |     local project_name | 
 | 279 |     project_name=$(basename $project_dir) | 
| Ihar Hrachyshka | 2ba4a72 | 2015-06-26 10:45:44 +0200 | [diff] [blame] | 280 |     grep -q "/$project_name\$" $REQUIREMENTS_DIR/projects.txt | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 281 | } | 
 | 282 |  | 
 | 283 | # ``pip install -e`` the package, which processes the dependencies | 
 | 284 | # using pip before running `setup.py develop` | 
 | 285 | # | 
| Clark Boylan | 05aa384 | 2015-08-03 11:14:13 -0700 | [diff] [blame] | 286 | # Updates the constraints from REQUIREMENTS_DIR to reflect the | 
 | 287 | # future installed state of this package. This ensures when we | 
 | 288 | # install this package we get the from source version. | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 289 | # | 
| Clark Boylan | 05aa384 | 2015-08-03 11:14:13 -0700 | [diff] [blame] | 290 | # Uses globals ``REQUIREMENTS_DIR`` | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 291 | # _setup_package_with_constraints_edit project_dir flags [extras] | 
 | 292 | # project_dir: directory of project repo (e.g., /opt/stack/keystone) | 
 | 293 | # flags: pip CLI options/flags | 
 | 294 | # extras: comma-separated list of optional dependencies to install | 
 | 295 | #         (e.g., ldap,memcache). | 
 | 296 | #         See http://docs.openstack.org/developer/pbr/#extra-requirements | 
 | 297 | # The command is like "pip install <flags> <project_dir>[<extras>]" | 
 | 298 | function _setup_package_with_constraints_edit { | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 299 |     local project_dir=$1 | 
 | 300 |     local flags=$2 | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 301 |     local extras=$3 | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 302 |  | 
| Robert Collins | 635a5ba | 2015-06-10 08:48:06 +1200 | [diff] [blame] | 303 |     if [ -n "$REQUIREMENTS_DIR" ]; then | 
 | 304 |         # Constrain this package to this project directory from here on out. | 
| Ian Wienand | ada886d | 2015-10-07 14:06:26 +1100 | [diff] [blame] | 305 |         local name | 
 | 306 |         name=$(awk '/^name.*=/ {print $3}' $project_dir/setup.cfg) | 
| Robert Collins | 7c83861 | 2015-07-03 13:28:09 +1200 | [diff] [blame] | 307 |         $REQUIREMENTS_DIR/.venv/bin/edit-constraints \ | 
 | 308 |             $REQUIREMENTS_DIR/upper-constraints.txt -- $name \ | 
 | 309 |             "$flags file://$project_dir#egg=$name" | 
| Robert Collins | 635a5ba | 2015-06-10 08:48:06 +1200 | [diff] [blame] | 310 |     fi | 
 | 311 |  | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 312 |     setup_package $project_dir "$flags" $extras | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 313 |  | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 314 | } | 
 | 315 |  | 
 | 316 | # ``pip install -e`` the package, which processes the dependencies | 
 | 317 | # using pip before running `setup.py develop` | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 318 | # | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 319 | # Uses globals ``STACK_USER`` | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 320 | # setup_package project_dir [flags] [extras] | 
 | 321 | # project_dir: directory of project repo (e.g., /opt/stack/keystone) | 
 | 322 | # flags: pip CLI options/flags | 
 | 323 | # extras: comma-separated list of optional dependencies to install | 
 | 324 | #         (e.g., ldap,memcache). | 
 | 325 | #         See http://docs.openstack.org/developer/pbr/#extra-requirements | 
 | 326 | # The command is like "pip install <flags> <project_dir>[<extras>]" | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 327 | function setup_package { | 
 | 328 |     local project_dir=$1 | 
 | 329 |     local flags=$2 | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 330 |     local extras=$3 | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 331 |  | 
| Brant Knudson | 0842b81 | 2015-08-03 13:31:25 -0500 | [diff] [blame] | 332 |     # if the flags variable exists, and it doesn't look like a flag, | 
 | 333 |     # assume it's actually the extras list. | 
 | 334 |     if [[ -n "$flags" && -z "$extras" && ! "$flags" =~ ^-.* ]]; then | 
 | 335 |         extras=$flags | 
 | 336 |         flags="" | 
 | 337 |     fi | 
 | 338 |  | 
 | 339 |     if [[ ! -z "$extras" ]]; then | 
 | 340 |         extras="[$extras]" | 
 | 341 |     fi | 
 | 342 |  | 
 | 343 |     pip_install $flags "$project_dir$extras" | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 344 |     # ensure that further actions can do things like setup.py sdist | 
 | 345 |     if [[ "$flags" == "-e" ]]; then | 
 | 346 |         safe_chown -R $STACK_USER $1/*.egg-info | 
 | 347 |     fi | 
 | 348 | } | 
 | 349 |  | 
| Doug Hellmann | ddc3839 | 2015-05-07 21:06:24 +0000 | [diff] [blame] | 350 | # Report whether python 3 should be used | 
 | 351 | function python3_enabled { | 
 | 352 |     if [[ $USE_PYTHON3 == "True" ]]; then | 
 | 353 |         return 0 | 
 | 354 |     else | 
 | 355 |         return 1 | 
 | 356 |     fi | 
 | 357 | } | 
 | 358 |  | 
 | 359 | # Install python3 packages | 
 | 360 | function install_python3 { | 
 | 361 |     if is_ubuntu; then | 
 | 362 |         apt_get install python3.4 python3.4-dev | 
 | 363 |     fi | 
 | 364 | } | 
| Dean Troyer | 490430d | 2015-01-30 14:38:35 -0600 | [diff] [blame] | 365 |  | 
 | 366 | # Restore xtrace | 
 | 367 | $INC_PY_TRACE | 
 | 368 |  | 
 | 369 | # Local variables: | 
 | 370 | # mode: shell-script | 
 | 371 | # End: |