Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 16 additions & 4 deletions src/azure-cli-core/azure/cli/core/extension/operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,17 @@ def _validate_whl_extension(ext_file):
check_version_compatibility(azext_metadata)


def _get_extension_info_from_source(source):
url_parse_result = urlparse(source)
is_url = (url_parse_result.scheme == 'http' or url_parse_result.scheme == 'https')
whl_filename = os.path.basename(url_parse_result.path) if is_url else os.path.basename(source)
parsed_filename = WHEEL_INFO_RE(whl_filename)
# Extension names can have - but .whl format changes it to _ (PEP 0427). Undo this.
extension_name = parsed_filename.groupdict().get('name').replace('_', '-') if parsed_filename else None
extension_version = parsed_filename.groupdict().get('ver') if parsed_filename else None
return extension_name, extension_version


def _add_whl_ext(cli_ctx, source, ext_sha256=None, pip_extra_index_urls=None, pip_proxy=None, system=None): # pylint: disable=too-many-statements
cli_ctx.get_progress_controller().add(message='Analyzing')
if not source.endswith('.whl'):
Expand Down Expand Up @@ -296,6 +307,7 @@ def add_extension(cmd=None, source=None, extension_name=None, index_url=None, ye
if extension_name:
cmd_cli_ctx.get_progress_controller().add(message='Searching')
ext = None
set_extension_management_detail(extension_name, version)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

version may be None, the information will be overwritten if the extension is resolved from index. If before that, the command exits, then the information set here can be useful.

try:
ext = get_extension(extension_name)
except ExtensionNotInstalledException:
Expand All @@ -322,12 +334,12 @@ def add_extension(cmd=None, source=None, extension_name=None, index_url=None, ye
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)
_augment_telemetry_with_ext_info(extension_name, ext)
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)
Expand Down Expand Up @@ -383,6 +395,8 @@ def update_extension(cmd=None, extension_name=None, index_url=None, pip_extra_in
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)
Expand All @@ -401,8 +415,6 @@ def update_extension(cmd=None, extension_name=None, index_url=None, pip_extra_in
pip_extra_index_urls=pip_extra_index_urls, pip_proxy=pip_proxy)
logger.debug('Deleting backup of old extension at %s', backup_dir)
shutil.rmtree(backup_dir)
# This gets the metadata for the extension *after* the update
_augment_telemetry_with_ext_info(extension_name)
except Exception as err:
logger.error('An error occurred whilst updating.')
logger.error(err)
Expand Down