Mercurial > repos > bcclaywell > argo_navis
comparison venv/lib/python2.7/site-packages/pip/commands/install.py @ 0:d67268158946 draft
planemo upload commit a3f181f5f126803c654b3a66dd4e83a48f7e203b
| author | bcclaywell |
|---|---|
| date | Mon, 12 Oct 2015 17:43:33 -0400 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:d67268158946 |
|---|---|
| 1 from __future__ import absolute_import | |
| 2 | |
| 3 import logging | |
| 4 import operator | |
| 5 import os | |
| 6 import tempfile | |
| 7 import shutil | |
| 8 import warnings | |
| 9 | |
| 10 from pip.req import InstallRequirement, RequirementSet, parse_requirements | |
| 11 from pip.locations import build_prefix, virtualenv_no_global, distutils_scheme | |
| 12 from pip.basecommand import Command | |
| 13 from pip.index import PackageFinder | |
| 14 from pip.exceptions import ( | |
| 15 InstallationError, CommandError, PreviousBuildDirError, | |
| 16 ) | |
| 17 from pip import cmdoptions | |
| 18 from pip.utils.build import BuildDirectory | |
| 19 from pip.utils.deprecation import RemovedInPip7Warning, RemovedInPip8Warning | |
| 20 | |
| 21 | |
| 22 logger = logging.getLogger(__name__) | |
| 23 | |
| 24 | |
| 25 class InstallCommand(Command): | |
| 26 """ | |
| 27 Install packages from: | |
| 28 | |
| 29 - PyPI (and other indexes) using requirement specifiers. | |
| 30 - VCS project urls. | |
| 31 - Local project directories. | |
| 32 - Local or remote source archives. | |
| 33 | |
| 34 pip also supports installing from "requirements files", which provide | |
| 35 an easy way to specify a whole environment to be installed. | |
| 36 """ | |
| 37 name = 'install' | |
| 38 | |
| 39 usage = """ | |
| 40 %prog [options] <requirement specifier> [package-index-options] ... | |
| 41 %prog [options] -r <requirements file> [package-index-options] ... | |
| 42 %prog [options] [-e] <vcs project url> ... | |
| 43 %prog [options] [-e] <local project path> ... | |
| 44 %prog [options] <archive url/path> ...""" | |
| 45 | |
| 46 summary = 'Install packages.' | |
| 47 | |
| 48 def __init__(self, *args, **kw): | |
| 49 super(InstallCommand, self).__init__(*args, **kw) | |
| 50 | |
| 51 cmd_opts = self.cmd_opts | |
| 52 | |
| 53 cmd_opts.add_option(cmdoptions.editable.make()) | |
| 54 cmd_opts.add_option(cmdoptions.requirements.make()) | |
| 55 cmd_opts.add_option(cmdoptions.build_dir.make()) | |
| 56 | |
| 57 cmd_opts.add_option( | |
| 58 '-t', '--target', | |
| 59 dest='target_dir', | |
| 60 metavar='dir', | |
| 61 default=None, | |
| 62 help='Install packages into <dir>. ' | |
| 63 'By default this will not replace existing files/folders in ' | |
| 64 '<dir>. Use --upgrade to replace existing packages in <dir> ' | |
| 65 'with new versions.' | |
| 66 ) | |
| 67 | |
| 68 cmd_opts.add_option( | |
| 69 '-d', '--download', '--download-dir', '--download-directory', | |
| 70 dest='download_dir', | |
| 71 metavar='dir', | |
| 72 default=None, | |
| 73 help=("Download packages into <dir> instead of installing them, " | |
| 74 "regardless of what's already installed."), | |
| 75 ) | |
| 76 | |
| 77 cmd_opts.add_option(cmdoptions.download_cache.make()) | |
| 78 cmd_opts.add_option(cmdoptions.src.make()) | |
| 79 | |
| 80 cmd_opts.add_option( | |
| 81 '-U', '--upgrade', | |
| 82 dest='upgrade', | |
| 83 action='store_true', | |
| 84 help='Upgrade all specified packages to the newest available ' | |
| 85 'version. This process is recursive regardless of whether ' | |
| 86 'a dependency is already satisfied.' | |
| 87 ) | |
| 88 | |
| 89 cmd_opts.add_option( | |
| 90 '--force-reinstall', | |
| 91 dest='force_reinstall', | |
| 92 action='store_true', | |
| 93 help='When upgrading, reinstall all packages even if they are ' | |
| 94 'already up-to-date.') | |
| 95 | |
| 96 cmd_opts.add_option( | |
| 97 '-I', '--ignore-installed', | |
| 98 dest='ignore_installed', | |
| 99 action='store_true', | |
| 100 help='Ignore the installed packages (reinstalling instead).') | |
| 101 | |
| 102 cmd_opts.add_option(cmdoptions.no_deps.make()) | |
| 103 | |
| 104 cmd_opts.add_option( | |
| 105 '--no-install', | |
| 106 dest='no_install', | |
| 107 action='store_true', | |
| 108 help="DEPRECATED. Download and unpack all packages, but don't " | |
| 109 "actually install them." | |
| 110 ) | |
| 111 | |
| 112 cmd_opts.add_option( | |
| 113 '--no-download', | |
| 114 dest='no_download', | |
| 115 action="store_true", | |
| 116 help="DEPRECATED. Don't download any packages, just install the " | |
| 117 "ones already downloaded (completes an install run with " | |
| 118 "--no-install).") | |
| 119 | |
| 120 cmd_opts.add_option(cmdoptions.install_options.make()) | |
| 121 cmd_opts.add_option(cmdoptions.global_options.make()) | |
| 122 | |
| 123 cmd_opts.add_option( | |
| 124 '--user', | |
| 125 dest='use_user_site', | |
| 126 action='store_true', | |
| 127 help="Install to the Python user install directory for your " | |
| 128 "platform. Typically ~/.local/, or %APPDATA%\Python on " | |
| 129 "Windows. (See the Python documentation for site.USER_BASE " | |
| 130 "for full details.)") | |
| 131 | |
| 132 cmd_opts.add_option( | |
| 133 '--egg', | |
| 134 dest='as_egg', | |
| 135 action='store_true', | |
| 136 help="Install packages as eggs, not 'flat', like pip normally " | |
| 137 "does. This option is not about installing *from* eggs. " | |
| 138 "(WARNING: Because this option overrides pip's normal install" | |
| 139 " logic, requirements files may not behave as expected.)") | |
| 140 | |
| 141 cmd_opts.add_option( | |
| 142 '--root', | |
| 143 dest='root_path', | |
| 144 metavar='dir', | |
| 145 default=None, | |
| 146 help="Install everything relative to this alternate root " | |
| 147 "directory.") | |
| 148 | |
| 149 cmd_opts.add_option( | |
| 150 "--compile", | |
| 151 action="store_true", | |
| 152 dest="compile", | |
| 153 default=True, | |
| 154 help="Compile py files to pyc", | |
| 155 ) | |
| 156 | |
| 157 cmd_opts.add_option( | |
| 158 "--no-compile", | |
| 159 action="store_false", | |
| 160 dest="compile", | |
| 161 help="Do not compile py files to pyc", | |
| 162 ) | |
| 163 | |
| 164 cmd_opts.add_option(cmdoptions.use_wheel.make()) | |
| 165 cmd_opts.add_option(cmdoptions.no_use_wheel.make()) | |
| 166 | |
| 167 cmd_opts.add_option( | |
| 168 '--pre', | |
| 169 action='store_true', | |
| 170 default=False, | |
| 171 help="Include pre-release and development versions. By default, " | |
| 172 "pip only finds stable versions.") | |
| 173 | |
| 174 cmd_opts.add_option(cmdoptions.no_clean.make()) | |
| 175 | |
| 176 index_opts = cmdoptions.make_option_group( | |
| 177 cmdoptions.index_group, | |
| 178 self.parser, | |
| 179 ) | |
| 180 | |
| 181 self.parser.insert_option_group(0, index_opts) | |
| 182 self.parser.insert_option_group(0, cmd_opts) | |
| 183 | |
| 184 def _build_package_finder(self, options, index_urls, session): | |
| 185 """ | |
| 186 Create a package finder appropriate to this install command. | |
| 187 This method is meant to be overridden by subclasses, not | |
| 188 called directly. | |
| 189 """ | |
| 190 return PackageFinder( | |
| 191 find_links=options.find_links, | |
| 192 index_urls=index_urls, | |
| 193 use_wheel=options.use_wheel, | |
| 194 allow_external=options.allow_external, | |
| 195 allow_unverified=options.allow_unverified, | |
| 196 allow_all_external=options.allow_all_external, | |
| 197 trusted_hosts=options.trusted_hosts, | |
| 198 allow_all_prereleases=options.pre, | |
| 199 process_dependency_links=options.process_dependency_links, | |
| 200 session=session, | |
| 201 ) | |
| 202 | |
| 203 def run(self, options, args): | |
| 204 | |
| 205 if ( | |
| 206 options.no_install or | |
| 207 options.no_download | |
| 208 ): | |
| 209 warnings.warn( | |
| 210 "--no-install and --no-download are deprecated. " | |
| 211 "See https://github.com/pypa/pip/issues/906.", | |
| 212 RemovedInPip7Warning, | |
| 213 ) | |
| 214 | |
| 215 # If we have --no-install or --no-download and no --build we use the | |
| 216 # legacy static build dir | |
| 217 if (options.build_dir is None and | |
| 218 (options.no_install or options.no_download)): | |
| 219 options.build_dir = build_prefix | |
| 220 | |
| 221 if options.download_dir: | |
| 222 options.no_install = True | |
| 223 options.ignore_installed = True | |
| 224 | |
| 225 if options.build_dir: | |
| 226 options.build_dir = os.path.abspath(options.build_dir) | |
| 227 | |
| 228 options.src_dir = os.path.abspath(options.src_dir) | |
| 229 install_options = options.install_options or [] | |
| 230 if options.use_user_site: | |
| 231 if virtualenv_no_global(): | |
| 232 raise InstallationError( | |
| 233 "Can not perform a '--user' install. User site-packages " | |
| 234 "are not visible in this virtualenv." | |
| 235 ) | |
| 236 install_options.append('--user') | |
| 237 | |
| 238 temp_target_dir = None | |
| 239 if options.target_dir: | |
| 240 options.ignore_installed = True | |
| 241 temp_target_dir = tempfile.mkdtemp() | |
| 242 options.target_dir = os.path.abspath(options.target_dir) | |
| 243 if (os.path.exists(options.target_dir) and not | |
| 244 os.path.isdir(options.target_dir)): | |
| 245 raise CommandError( | |
| 246 "Target path exists but is not a directory, will not " | |
| 247 "continue." | |
| 248 ) | |
| 249 install_options.append('--home=' + temp_target_dir) | |
| 250 | |
| 251 global_options = options.global_options or [] | |
| 252 index_urls = [options.index_url] + options.extra_index_urls | |
| 253 if options.no_index: | |
| 254 logger.info('Ignoring indexes: %s', ','.join(index_urls)) | |
| 255 index_urls = [] | |
| 256 | |
| 257 if options.use_mirrors: | |
| 258 warnings.warn( | |
| 259 "--use-mirrors has been deprecated and will be removed in the " | |
| 260 "future. Explicit uses of --index-url and/or --extra-index-url" | |
| 261 " is suggested.", | |
| 262 RemovedInPip7Warning, | |
| 263 ) | |
| 264 | |
| 265 if options.mirrors: | |
| 266 warnings.warn( | |
| 267 "--mirrors has been deprecated and will be removed in the " | |
| 268 "future. Explicit uses of --index-url and/or --extra-index-url" | |
| 269 " is suggested.", | |
| 270 RemovedInPip7Warning, | |
| 271 ) | |
| 272 index_urls += options.mirrors | |
| 273 | |
| 274 if options.download_cache: | |
| 275 warnings.warn( | |
| 276 "--download-cache has been deprecated and will be removed in " | |
| 277 "the future. Pip now automatically uses and configures its " | |
| 278 "cache.", | |
| 279 RemovedInPip8Warning, | |
| 280 ) | |
| 281 | |
| 282 with self._build_session(options) as session: | |
| 283 | |
| 284 finder = self._build_package_finder(options, index_urls, session) | |
| 285 | |
| 286 build_delete = (not (options.no_clean or options.build_dir)) | |
| 287 with BuildDirectory(options.build_dir, | |
| 288 delete=build_delete) as build_dir: | |
| 289 requirement_set = RequirementSet( | |
| 290 build_dir=build_dir, | |
| 291 src_dir=options.src_dir, | |
| 292 download_dir=options.download_dir, | |
| 293 upgrade=options.upgrade, | |
| 294 as_egg=options.as_egg, | |
| 295 ignore_installed=options.ignore_installed, | |
| 296 ignore_dependencies=options.ignore_dependencies, | |
| 297 force_reinstall=options.force_reinstall, | |
| 298 use_user_site=options.use_user_site, | |
| 299 target_dir=temp_target_dir, | |
| 300 session=session, | |
| 301 pycompile=options.compile, | |
| 302 isolated=options.isolated_mode, | |
| 303 ) | |
| 304 | |
| 305 for name in args: | |
| 306 requirement_set.add_requirement( | |
| 307 InstallRequirement.from_line( | |
| 308 name, None, isolated=options.isolated_mode, | |
| 309 ) | |
| 310 ) | |
| 311 | |
| 312 for name in options.editables: | |
| 313 requirement_set.add_requirement( | |
| 314 InstallRequirement.from_editable( | |
| 315 name, | |
| 316 default_vcs=options.default_vcs, | |
| 317 isolated=options.isolated_mode, | |
| 318 ) | |
| 319 ) | |
| 320 | |
| 321 for filename in options.requirements: | |
| 322 for req in parse_requirements( | |
| 323 filename, | |
| 324 finder=finder, options=options, session=session): | |
| 325 requirement_set.add_requirement(req) | |
| 326 | |
| 327 if not requirement_set.has_requirements: | |
| 328 opts = {'name': self.name} | |
| 329 if options.find_links: | |
| 330 msg = ('You must give at least one requirement to ' | |
| 331 '%(name)s (maybe you meant "pip %(name)s ' | |
| 332 '%(links)s"?)' % | |
| 333 dict(opts, links=' '.join(options.find_links))) | |
| 334 else: | |
| 335 msg = ('You must give at least one requirement ' | |
| 336 'to %(name)s (see "pip help %(name)s")' % opts) | |
| 337 logger.warning(msg) | |
| 338 return | |
| 339 | |
| 340 try: | |
| 341 if not options.no_download: | |
| 342 requirement_set.prepare_files(finder) | |
| 343 else: | |
| 344 # This is the only call site of locate_files. Nuke with | |
| 345 # fire. | |
| 346 requirement_set.locate_files() | |
| 347 | |
| 348 if not options.no_install: | |
| 349 requirement_set.install( | |
| 350 install_options, | |
| 351 global_options, | |
| 352 root=options.root_path, | |
| 353 ) | |
| 354 reqs = sorted( | |
| 355 requirement_set.successfully_installed, | |
| 356 key=operator.attrgetter('name')) | |
| 357 items = [] | |
| 358 for req in reqs: | |
| 359 item = req.name | |
| 360 try: | |
| 361 if hasattr(req, 'installed_version'): | |
| 362 if req.installed_version: | |
| 363 item += '-' + req.installed_version | |
| 364 except Exception: | |
| 365 pass | |
| 366 items.append(item) | |
| 367 installed = ' '.join(items) | |
| 368 if installed: | |
| 369 logger.info('Successfully installed %s', installed) | |
| 370 else: | |
| 371 downloaded = ' '.join([ | |
| 372 req.name | |
| 373 for req in requirement_set.successfully_downloaded | |
| 374 ]) | |
| 375 if downloaded: | |
| 376 logger.info( | |
| 377 'Successfully downloaded %s', downloaded | |
| 378 ) | |
| 379 except PreviousBuildDirError: | |
| 380 options.no_clean = True | |
| 381 raise | |
| 382 finally: | |
| 383 # Clean up | |
| 384 if ((not options.no_clean) and | |
| 385 ((not options.no_install) or | |
| 386 options.download_dir)): | |
| 387 requirement_set.cleanup_files() | |
| 388 | |
| 389 if options.target_dir: | |
| 390 if not os.path.exists(options.target_dir): | |
| 391 os.makedirs(options.target_dir) | |
| 392 | |
| 393 lib_dir = distutils_scheme('', home=temp_target_dir)['purelib'] | |
| 394 | |
| 395 for item in os.listdir(lib_dir): | |
| 396 target_item_dir = os.path.join(options.target_dir, item) | |
| 397 if os.path.exists(target_item_dir): | |
| 398 if not options.upgrade: | |
| 399 logger.warning( | |
| 400 'Target directory %s already exists. Specify ' | |
| 401 '--upgrade to force replacement.', | |
| 402 target_item_dir | |
| 403 ) | |
| 404 continue | |
| 405 if os.path.islink(target_item_dir): | |
| 406 logger.warning( | |
| 407 'Target directory %s already exists and is ' | |
| 408 'a link. Pip will not automatically replace ' | |
| 409 'links, please remove if replacement is ' | |
| 410 'desired.', | |
| 411 target_item_dir | |
| 412 ) | |
| 413 continue | |
| 414 if os.path.isdir(target_item_dir): | |
| 415 shutil.rmtree(target_item_dir) | |
| 416 else: | |
| 417 os.remove(target_item_dir) | |
| 418 | |
| 419 shutil.move( | |
| 420 os.path.join(lib_dir, item), | |
| 421 target_item_dir | |
| 422 ) | |
| 423 shutil.rmtree(temp_target_dir) | |
| 424 return requirement_set |
