55from packaging .version import parse
66from typing import Callable , List , NamedTuple , Union
77
8- from azure .cli .core .extension import ext_compat_with_cli , WHEEL_INFO_RE , is_stable_from_metadata
8+ from azure .cli .core .extension import (ext_compat_with_cli , WHEEL_INFO_RE ,
9+ is_stable_from_metadata , is_preview_from_metadata )
910from azure .cli .core .extension ._index import get_index_extensions
1011
1112from knack .log import get_logger
@@ -104,6 +105,28 @@ def resolve_from_index(extension_name, cur_version=None, index_url=None, target_
104105 if not candidates :
105106 raise NoExtensionCandidatesError (f"No extension found with name '{ extension_name } '" )
106107
108+ if allow_preview is None :
109+ # default value of allow-preview changed from true to false
110+ # and the following part deals with two influenced scenariors if user does not specify allow-preview
111+ # 1. if extension module does not have any stable version, set allow-preview=True and display warning message to
112+ # unblock those extension module user
113+ # 2. if extension module has a later preview version than stable one, dispaly a warning message to user
114+ # indicating how to try the newer preview one, but allow-preview is still set to be False by default
115+ allow_preview = False
116+ stable_candidates = list (filter (is_stable_from_metadata , candidates ))
117+ preview_candidates = list (filter (is_preview_from_metadata , candidates ))
118+ if len (stable_candidates ) == 0 :
119+ logger .warning ("No stable version of '%s' to install. Preview versions allowed." , extension_name )
120+ allow_preview = True
121+ elif len (preview_candidates ) != 0 :
122+ max_preview_item = max (preview_candidates , key = lambda x : parse (x ['metadata' ]['version' ]))
123+ max_stable_item = max (stable_candidates , key = lambda x : parse (x ['metadata' ]['version' ]))
124+ if parse (max_preview_item ['metadata' ]['version' ]) > parse (max_stable_item ['metadata' ]['version' ]):
125+ logger .warning ("Extension '%s' has a later preview version to install, add `--allow-preview True` "
126+ "to try preview version." , extension_name )
127+ else :
128+ logger .info ("No preview versions need to be tried." )
129+
107130 # Helper to curry predicate functions
108131 def list_filter (f ):
109132 return lambda cs : list (filter (f , cs ))
@@ -120,7 +143,7 @@ def list_filter(f):
120143 _ExtensionFilter (
121144 filter = list_filter (is_stable_from_metadata ),
122145 on_empty_results_message = f"No suitable stable version of '{ extension_name } ' to install. "
123- f"Add `--allow-preview` to try preview versions"
146+ f"Add `--allow-preview True ` to try preview versions"
124147 )]
125148
126149 if target_version :
0 commit comments