def update_extension(cmd=None, extension_name=None, index_url=None, pip_extra_index_urls=None, pip_proxy=None, cli_ctx=None, version=None): try: cmd_cli_ctx = cli_ctx or cmd.cli_ctx ext = get_extension(extension_name, ext_type=WheelExtension) cur_version = ext.get_version() try: download_url, ext_sha256 = resolve_from_index( extension_name, cur_version=cur_version, index_url=index_url, target_version=version, cli_ctx=cmd_cli_ctx) _, ext_version = _get_extension_info_from_source(download_url) set_extension_management_detail(extension_name, ext_version) except NoExtensionCandidatesError as err: logger.debug(err) msg = "Extension {} with version {} not found.".format( extension_name, version ) if version else "No updates available for '{}'. Use --debug for more information.".format( extension_name) logger.warning(msg) return # Copy current version of extension to tmp directory in case we need to restore it after a failed install. backup_dir = os.path.join(tempfile.mkdtemp(), extension_name) extension_path = ext.path logger.debug('Backing up the current extension: %s to %s', extension_path, backup_dir) shutil.copytree(extension_path, backup_dir) # Remove current version of the extension rmtree_with_retry(extension_path) # Install newer version try: _add_whl_ext(cli_ctx=cmd_cli_ctx, source=download_url, ext_sha256=ext_sha256, pip_extra_index_urls=pip_extra_index_urls, pip_proxy=pip_proxy) logger.debug('Deleting backup of old extension at %s', backup_dir) rmtree_with_retry(backup_dir) except Exception as err: logger.error('An error occurred whilst updating.') logger.error(err) logger.debug('Copying %s to %s', backup_dir, extension_path) shutil.copytree(backup_dir, extension_path) raise CLIError('Failed to update. Rolled {} back to {}.'.format( extension_name, cur_version)) CommandIndex().invalidate() except ExtensionNotInstalledException as e: raise CLIError(e)
def _augment_telemetry_with_ext_info(extension_name): # The extension must be available before calling this otherwise we can't get the version from metadata if not extension_name: return try: ext = get_extension(extension_name) ext_version = ext.version set_extension_management_detail(extension_name, ext_version) except Exception: # nopa pylint: disable=broad-except # Don't error on telemetry pass
def _augment_telemetry_with_ext_info(extension_name, ext=None): # The extension must be available before calling this otherwise we can't get the version from metadata if not extension_name: return try: ext = ext or get_extension(extension_name) ext_version = ext.version set_extension_management_detail(extension_name, ext_version) except Exception: # nopa pylint: disable=broad-except # Don't error on telemetry pass
def add_extension(cmd=None, source=None, extension_name=None, index_url=None, yes=None, # pylint: disable=unused-argument, too-many-statements pip_extra_index_urls=None, pip_proxy=None, system=None, version=None, cli_ctx=None, upgrade=None): ext_sha256 = None version = None if version == 'latest' else version cmd_cli_ctx = cli_ctx or cmd.cli_ctx if extension_name: cmd_cli_ctx.get_progress_controller().add(message='Searching') ext = None set_extension_management_detail(extension_name, version) try: ext = get_extension(extension_name) except ExtensionNotInstalledException: pass if ext: if isinstance(ext, WheelExtension): if not upgrade: logger.warning("Extension '%s' is already installed.", extension_name) return logger.warning("Extension '%s' %s is already installed.", extension_name, ext.get_version()) if version and version == ext.get_version(): return logger.warning("It will be overridden with version {}.".format(version) if version else "It will be updated if available.") update_extension(cmd=cmd, extension_name=extension_name, index_url=index_url, pip_extra_index_urls=pip_extra_index_urls, pip_proxy=pip_proxy, cli_ctx=cli_ctx, version=version) return logger.warning("Overriding development version of '%s' with production version.", extension_name) try: source, ext_sha256 = resolve_from_index(extension_name, index_url=index_url, target_version=version, cli_ctx=cmd_cli_ctx) except NoExtensionCandidatesError as err: logger.debug(err) if version: err = "No matching extensions for '{} ({})'. Use --debug for more information.".format(extension_name, version) else: err = "No matching extensions for '{}'. Use --debug for more information.".format(extension_name) raise CLIError(err) ext_name, ext_version = _get_extension_info_from_source(source) set_extension_management_detail(extension_name if extension_name else ext_name, ext_version) extension_name = _add_whl_ext(cli_ctx=cmd_cli_ctx, source=source, ext_sha256=ext_sha256, pip_extra_index_urls=pip_extra_index_urls, pip_proxy=pip_proxy, system=system) try: ext = get_extension(extension_name) if extension_name and ext.experimental: logger.warning("The installed extension '%s' is experimental and not covered by customer support. " "Please use with discretion.", extension_name) elif extension_name and ext.preview: logger.warning("The installed extension '%s' is in preview.", extension_name) CommandIndex().invalidate() except ExtensionNotInstalledException: pass