Skip to content

{LTS} Backport #30993#31367

Merged
bebound merged 1 commit intoAzure:dev-lts-2.66from
bebound:backport-30993
May 9, 2025
Merged

{LTS} Backport #30993#31367
bebound merged 1 commit intoAzure:dev-lts-2.66from
bebound:backport-30993

Conversation

@bebound
Copy link
Contributor

@bebound bebound commented Apr 27, 2025

Description

Backport #30993

CI Log
2025-04-27T09:22:37.8305256Z ____________ TestCredentialHelper.test_redact_credential_for_string ____________
2025-04-27T09:22:37.8305565Z self = <azure.cli.core.tests.test_credential_helper.TestCredentialHelper testMethod=test_redact_credential_for_string>
2025-04-27T09:22:37.8305723Z 
2025-04-27T09:22:37.8305884Z     def test_redact_credential_for_string(self):
2025-04-27T09:22:37.8306156Z         with mock.patch('azure.cli.core.credential_helper.get_secret_masker', side_effect=self._get_test_secret_masker):
2025-04-27T09:22:37.8306450Z             creation_time = '2024-03-07T02:50:56.464790+00:00'
2025-04-27T09:22:37.8306688Z >           result = redact_credential_for_string(creation_time)
2025-04-27T09:22:37.8306784Z 
2025-04-27T09:22:37.8306982Z src/azure-cli-core/azure/cli/core/tests/test_credential_helper.py:47: 
2025-04-27T09:22:37.8307209Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
2025-04-27T09:22:37.8307461Z src/azure-cli-core/azure/cli/core/credential_helper.py:121: in redact_credential_for_string
2025-04-27T09:22:37.8307825Z     return get_secret_masker().mask_secrets(content)
2025-04-27T09:22:37.8308092Z env/lib/python3.12/site-packages/microsoft_security_utilities_secret_masker/secret_masker.py:119: in mask_secrets
2025-04-27T09:22:37.8308359Z     detections = self.detect_secrets(input)
2025-04-27T09:22:37.8308648Z env/lib/python3.12/site-packages/microsoft_security_utilities_secret_masker/secret_masker.py:99: in detect_secrets
2025-04-27T09:22:37.8308966Z     detections.extend(regex_pattern.get_detections(input, self._generate_sha256_hashes))
2025-04-27T09:22:37.8309282Z env/lib/python3.12/site-packages/microsoft_security_utilities_secret_masker/regex_pattern.py:126: in get_detections
2025-04-27T09:22:37.8309573Z     for m in re.finditer(self.pattern, input, self.regex_flags):
2025-04-27T09:22:37.8309834Z /opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/__init__.py:224: in finditer
2025-04-27T09:22:37.8310065Z     return _compile(pattern, flags).finditer(string)
2025-04-27T09:22:37.8310320Z /opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/__init__.py:307: in _compile
2025-04-27T09:22:37.8310551Z     p = _compiler.compile(pattern, flags)
2025-04-27T09:22:37.8310785Z /opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/_compiler.py:750: in compile
2025-04-27T09:22:37.8311004Z     p = _parser.parse(p, flags)
2025-04-27T09:22:37.8311225Z /opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/_parser.py:979: in parse
2025-04-27T09:22:37.8311465Z     p = _parse_sub(source, state, flags & SRE_FLAG_VERBOSE, 0)
2025-04-27T09:22:37.8311714Z /opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/_parser.py:460: in _parse_sub
2025-04-27T09:22:37.8311953Z     itemsappend(_parse(source, state, verbose, nested + 1,
2025-04-27T09:22:37.8312178Z _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
2025-04-27T09:22:37.8312267Z 
2025-04-27T09:22:37.8312444Z source = <re._parser.Tokenizer object at 0x7f69f13976b0>
2025-04-27T09:22:37.8312691Z state = <re._parser.State object at 0x7f69f1147980>, verbose = 0, nested = 1
2025-04-27T09:22:37.8312896Z first = True
2025-04-27T09:22:37.8312955Z 
2025-04-27T09:22:37.8313130Z     def _parse(source, state, verbose, nested, first=False):
2025-04-27T09:22:37.8313326Z         # parse a simple pattern
2025-04-27T09:22:37.8313673Z         subpattern = SubPattern(state)
2025-04-27T09:22:37.8313820Z     
2025-04-27T09:22:37.8313988Z         # precompute constants into local variables
2025-04-27T09:22:37.8314181Z         subpatternappend = subpattern.append
2025-04-27T09:22:37.8314361Z         sourceget = source.get
2025-04-27T09:22:37.8314533Z         sourcematch = source.match
2025-04-27T09:22:37.8314686Z         _len = len
2025-04-27T09:22:37.8314834Z         _ord = ord
2025-04-27T09:22:37.8314972Z     
2025-04-27T09:22:37.8315112Z         while True:
2025-04-27T09:22:37.8315249Z     
2025-04-27T09:22:37.8315390Z             this = source.next
2025-04-27T09:22:37.8315547Z             if this is None:
2025-04-27T09:22:37.8315845Z                 break # end of pattern
2025-04-27T09:22:37.8316005Z             if this in "|)":
2025-04-27T09:22:37.8316168Z                 break # end of subpattern
2025-04-27T09:22:37.8316334Z             sourceget()
2025-04-27T09:22:37.8316467Z     
2025-04-27T09:22:37.8316610Z             if verbose:
2025-04-27T09:22:37.8316771Z                 # skip whitespace and comments
2025-04-27T09:22:37.8316940Z                 if this in WHITESPACE:
2025-04-27T09:22:37.8317091Z                     continue
2025-04-27T09:22:37.8317232Z                 if this == "#":
2025-04-27T09:22:37.8317382Z                     while True:
2025-04-27T09:22:37.8317537Z                         this = sourceget()
2025-04-27T09:22:37.8317711Z                         if this is None or this == "\n":
2025-04-27T09:22:37.8317877Z                             break
2025-04-27T09:22:37.8318020Z                     continue
2025-04-27T09:22:37.8318158Z     
2025-04-27T09:22:37.8318305Z             if this[0] == "\\":
2025-04-27T09:22:37.8318608Z                 code = _escape(source, this, state)
2025-04-27T09:22:37.8318787Z                 subpatternappend(code)
2025-04-27T09:22:37.8318936Z     
2025-04-27T09:22:37.8319090Z             elif this not in SPECIAL_CHARS:
2025-04-27T09:22:37.8319283Z                 subpatternappend((LITERAL, _ord(this)))
2025-04-27T09:22:37.8319444Z     
2025-04-27T09:22:37.8319584Z             elif this == "[":
2025-04-27T09:22:37.8319740Z                 here = source.tell() - 1
2025-04-27T09:22:37.8319891Z                 # character set
2025-04-27T09:22:37.8320041Z                 set = []
2025-04-27T09:22:37.8320197Z                 setappend = set.append
2025-04-27T09:22:37.8320362Z     ##          if sourcematch(":"):
2025-04-27T09:22:37.8320537Z     ##              pass # handle character classes
2025-04-27T09:22:37.8320709Z                 if source.next == '[':
2025-04-27T09:22:37.8320862Z                     import warnings
2025-04-27T09:22:37.8321020Z                     warnings.warn(
2025-04-27T09:22:37.8321217Z                         'Possible nested set at position %d' % source.tell(),
2025-04-27T09:22:37.8321427Z                         FutureWarning, stacklevel=nested + 6
2025-04-27T09:22:37.8321594Z                     )
2025-04-27T09:22:37.8321741Z                 negate = sourcematch("^")
2025-04-27T09:22:37.8321912Z                 # check remaining characters
2025-04-27T09:22:37.8322069Z                 while True:
2025-04-27T09:22:37.8322226Z                     this = sourceget()
2025-04-27T09:22:37.8322387Z                     if this is None:
2025-04-27T09:22:37.8322591Z                         raise source.error("unterminated character set",
2025-04-27T09:22:37.8322771Z                                            source.tell() - here)
2025-04-27T09:22:37.8322934Z                     if this == "]" and set:
2025-04-27T09:22:37.8323092Z                         break
2025-04-27T09:22:37.8323241Z                     elif this[0] == "\\":
2025-04-27T09:22:37.8323422Z                         code1 = _class_escape(source, this)
2025-04-27T09:22:37.8323593Z                     else:
2025-04-27T09:22:37.8323769Z                         if set and this in '-&~|' and source.next == this:
2025-04-27T09:22:37.8323953Z                             import warnings
2025-04-27T09:22:37.8324113Z                             warnings.warn(
2025-04-27T09:22:37.8324291Z                                 'Possible set %s at position %d' % (
2025-04-27T09:22:37.8324476Z                                     'difference' if this == '-' else
2025-04-27T09:22:37.8324659Z                                     'intersection' if this == '&' else
2025-04-27T09:22:37.8324846Z                                     'symmetric difference' if this == '~' else
2025-04-27T09:22:37.8325022Z                                     'union',
2025-04-27T09:22:37.8325181Z                                     source.tell() - 1),
2025-04-27T09:22:37.8325361Z                                 FutureWarning, stacklevel=nested + 6
2025-04-27T09:22:37.8325679Z                             )
2025-04-27T09:22:37.8325838Z                         code1 = LITERAL, _ord(this)
2025-04-27T09:22:37.8326000Z                     if sourcematch("-"):
2025-04-27T09:22:37.8326180Z                         # potential range
2025-04-27T09:22:37.8326343Z                         that = sourceget()
2025-04-27T09:22:37.8326502Z                         if that is None:
2025-04-27T09:22:37.8326694Z                             raise source.error("unterminated character set",
2025-04-27T09:22:37.8326886Z                                                source.tell() - here)
2025-04-27T09:22:37.8327039Z                         if that == "]":
2025-04-27T09:22:37.8327194Z                             if code1[0] is IN:
2025-04-27T09:22:37.8327353Z                                 code1 = code1[1][0]
2025-04-27T09:22:37.8327516Z                             setappend(code1)
2025-04-27T09:22:37.8327693Z                             setappend((LITERAL, _ord("-")))
2025-04-27T09:22:37.8327959Z                             break
2025-04-27T09:22:37.8328111Z                         if that[0] == "\\":
2025-04-27T09:22:37.8328284Z                             code2 = _class_escape(source, that)
2025-04-27T09:22:37.8328449Z                         else:
2025-04-27T09:22:37.8328599Z                             if that == '-':
2025-04-27T09:22:37.8328750Z                                 import warnings
2025-04-27T09:22:37.8328901Z                                 warnings.warn(
2025-04-27T09:22:37.8329082Z                                     'Possible set difference at position %d' % (
2025-04-27T09:22:37.8329265Z                                         source.tell() - 2),
2025-04-27T09:22:37.8329445Z                                     FutureWarning, stacklevel=nested + 6
2025-04-27T09:22:37.8329611Z                                 )
2025-04-27T09:22:37.8329769Z                             code2 = LITERAL, _ord(that)
2025-04-27T09:22:37.8329951Z                         if code1[0] != LITERAL or code2[0] != LITERAL:
2025-04-27T09:22:37.8330163Z                             msg = "bad character range %s-%s" % (this, that)
2025-04-27T09:22:37.8330373Z                             raise source.error(msg, len(this) + 1 + len(that))
2025-04-27T09:22:37.8330554Z                         lo = code1[1]
2025-04-27T09:22:37.8330708Z                         hi = code2[1]
2025-04-27T09:22:37.8330858Z                         if hi < lo:
2025-04-27T09:22:37.8331025Z                             msg = "bad character range %s-%s" % (this, that)
2025-04-27T09:22:37.8331237Z                             raise source.error(msg, len(this) + 1 + len(that))
2025-04-27T09:22:37.8331433Z                         setappend((RANGE, (lo, hi)))
2025-04-27T09:22:37.8331599Z                     else:
2025-04-27T09:22:37.8331751Z                         if code1[0] is IN:
2025-04-27T09:22:37.8331904Z                             code1 = code1[1][0]
2025-04-27T09:22:37.8332063Z                         setappend(code1)
2025-04-27T09:22:37.8332214Z     
2025-04-27T09:22:37.8332360Z                 set = _uniq(set)
2025-04-27T09:22:37.8332549Z                 # XXX: <fl> should move set optimization to compiler!
2025-04-27T09:22:37.8332755Z                 if _len(set) == 1 and set[0][0] is LITERAL:
2025-04-27T09:22:37.8332930Z                     # optimization
2025-04-27T09:22:37.8333076Z                     if negate:
2025-04-27T09:22:37.8333256Z                         subpatternappend((NOT_LITERAL, set[0][1]))
2025-04-27T09:22:37.8333430Z                     else:
2025-04-27T09:22:37.8333594Z                         subpatternappend(set[0])
2025-04-27T09:22:37.8333757Z                 else:
2025-04-27T09:22:37.8333901Z                     if negate:
2025-04-27T09:22:37.8334066Z                         set.insert(0, (NEGATE, None))
2025-04-27T09:22:37.8334264Z                     # charmap optimization can't be added here because
2025-04-27T09:22:37.8334455Z                     # global flags still are not known
2025-04-27T09:22:37.8334751Z                     subpatternappend((IN, set))
2025-04-27T09:22:37.8334903Z     
2025-04-27T09:22:37.8335044Z             elif this in REPEAT_CHARS:
2025-04-27T09:22:37.8335214Z                 # repeat previous item
2025-04-27T09:22:37.8335377Z                 here = source.tell()
2025-04-27T09:22:37.8335539Z                 if this == "?":
2025-04-27T09:22:37.8335696Z                     min, max = 0, 1
2025-04-27T09:22:37.8335848Z                 elif this == "*":
2025-04-27T09:22:37.8336020Z                     min, max = 0, MAXREPEAT
2025-04-27T09:22:37.8336169Z     
2025-04-27T09:22:37.8336311Z                 elif this == "+":
2025-04-27T09:22:37.8336479Z                     min, max = 1, MAXREPEAT
2025-04-27T09:22:37.8336640Z                 elif this == "{":
2025-04-27T09:22:37.8336788Z                     if source.next == "}":
2025-04-27T09:22:37.8336967Z                         subpatternappend((LITERAL, _ord(this)))
2025-04-27T09:22:37.8337141Z                         continue
2025-04-27T09:22:37.8337407Z     
2025-04-27T09:22:37.8337555Z                     min, max = 0, MAXREPEAT
2025-04-27T09:22:37.8337703Z                     lo = hi = ""
2025-04-27T09:22:37.8337867Z                     while source.next in DIGITS:
2025-04-27T09:22:37.8338035Z                         lo += sourceget()
2025-04-27T09:22:37.8338200Z                     if sourcematch(","):
2025-04-27T09:22:37.8338371Z                         while source.next in DIGITS:
2025-04-27T09:22:37.8338544Z                             hi += sourceget()
2025-04-27T09:22:37.8338689Z                     else:
2025-04-27T09:22:37.8338829Z                         hi = lo
2025-04-27T09:22:37.8338983Z                     if not sourcematch("}"):
2025-04-27T09:22:37.8339169Z                         subpatternappend((LITERAL, _ord(this)))
2025-04-27T09:22:37.8339345Z                         source.seek(here)
2025-04-27T09:22:37.8339494Z                         continue
2025-04-27T09:22:37.8339623Z     
2025-04-27T09:22:37.8339762Z                     if lo:
2025-04-27T09:22:37.8339917Z                         min = int(lo)
2025-04-27T09:22:37.8340073Z                         if min >= MAXREPEAT:
2025-04-27T09:22:37.8340267Z                             raise OverflowError("the repetition number is too large")
2025-04-27T09:22:37.8340438Z                     if hi:
2025-04-27T09:22:37.8340583Z                         max = int(hi)
2025-04-27T09:22:37.8340739Z                         if max >= MAXREPEAT:
2025-04-27T09:22:37.8340932Z                             raise OverflowError("the repetition number is too large")
2025-04-27T09:22:37.8341116Z                         if max < min:
2025-04-27T09:22:37.8341302Z                             raise source.error("min repeat greater than max repeat",
2025-04-27T09:22:37.8341493Z                                                source.tell() - here)
2025-04-27T09:22:37.8341656Z                 else:
2025-04-27T09:22:37.8341840Z                     raise AssertionError("unsupported quantifier %r" % (char,))
2025-04-27T09:22:37.8342052Z                 # figure out which item to repeat
2025-04-27T09:22:37.8342221Z                 if subpattern:
2025-04-27T09:22:37.8342378Z                     item = subpattern[-1:]
2025-04-27T09:22:37.8342526Z                 else:
2025-04-27T09:22:37.8342671Z                     item = None
2025-04-27T09:22:37.8342832Z                 if not item or item[0][0] is AT:
2025-04-27T09:22:37.8343012Z                     raise source.error("nothing to repeat",
2025-04-27T09:22:37.8343203Z                                        source.tell() - here + len(this))
2025-04-27T09:22:37.8343381Z                 if item[0][0] in _REPEATCODES:
2025-04-27T09:22:37.8343556Z                     raise source.error("multiple repeat",
2025-04-27T09:22:37.8343749Z                                        source.tell() - here + len(this))
2025-04-27T09:22:37.8343936Z                 if item[0][0] is SUBPATTERN:
2025-04-27T09:22:37.8344137Z                     group, add_flags, del_flags, p = item[0][1]
2025-04-27T09:22:37.8344449Z                     if group is None and not add_flags and not del_flags:
2025-04-27T09:22:37.8344628Z                         item = p
2025-04-27T09:22:37.8344777Z                 if sourcematch("?"):
2025-04-27T09:22:37.8344937Z                     # Non-Greedy Match
2025-04-27T09:22:37.8345121Z                     subpattern[-1] = (MIN_REPEAT, (min, max, item))
2025-04-27T09:22:37.8345302Z                 elif sourcematch("+"):
2025-04-27T09:22:37.8345475Z                     # Possessive Match (Always Greedy)
2025-04-27T09:22:37.8345666Z                     subpattern[-1] = (POSSESSIVE_REPEAT, (min, max, item))
2025-04-27T09:22:37.8345843Z                 else:
2025-04-27T09:22:37.8345990Z                     # Greedy Match
2025-04-27T09:22:37.8346167Z                     subpattern[-1] = (MAX_REPEAT, (min, max, item))
2025-04-27T09:22:37.8346330Z     
2025-04-27T09:22:37.8346469Z             elif this == ".":
2025-04-27T09:22:37.8346628Z                 subpatternappend((ANY, None))
2025-04-27T09:22:37.8346893Z     
2025-04-27T09:22:37.8347030Z             elif this == "(":
2025-04-27T09:22:37.8347192Z                 start = source.tell() - 1
2025-04-27T09:22:37.8347352Z                 capture = True
2025-04-27T09:22:37.8347496Z                 atomic = False
2025-04-27T09:22:37.8347645Z                 name = None
2025-04-27T09:22:37.8347797Z                 add_flags = 0
2025-04-27T09:22:37.8347946Z                 del_flags = 0
2025-04-27T09:22:37.8348098Z                 if sourcematch("?"):
2025-04-27T09:22:37.8348255Z                     # options
2025-04-27T09:22:37.8348406Z                     char = sourceget()
2025-04-27T09:22:37.8348568Z                     if char is None:
2025-04-27T09:22:37.8348753Z                         raise source.error("unexpected end of pattern")
2025-04-27T09:22:37.8348935Z                     if char == "P":
2025-04-27T09:22:37.8349099Z                         # python extensions
2025-04-27T09:22:37.8349260Z                         if sourcematch("<"):
2025-04-27T09:22:37.8349447Z                             # named group: skip forward to end of name
2025-04-27T09:22:37.8349647Z                             name = source.getuntil(">", "group name")
2025-04-27T09:22:37.8349833Z                             source.checkgroupname(name, 1)
2025-04-27T09:22:37.8350007Z                         elif sourcematch("="):
2025-04-27T09:22:37.8350180Z                             # named backreference
2025-04-27T09:22:37.8350357Z                             name = source.getuntil(")", "group name")
2025-04-27T09:22:37.8350547Z                             source.checkgroupname(name, 1)
2025-04-27T09:22:37.8350732Z                             gid = state.groupdict.get(name)
2025-04-27T09:22:37.8350899Z                             if gid is None:
2025-04-27T09:22:37.8351074Z                                 msg = "unknown group name %r" % name
2025-04-27T09:22:37.8351262Z                                 raise source.error(msg, len(name) + 1)
2025-04-27T09:22:37.8351450Z                             if not state.checkgroup(gid):
2025-04-27T09:22:37.8351642Z                                 raise source.error("cannot refer to an open group",
2025-04-27T09:22:37.8351826Z                                                    len(name) + 1)
2025-04-27T09:22:37.8352004Z                             state.checklookbehindgroup(gid, source)
2025-04-27T09:22:37.8352192Z                             subpatternappend((GROUPREF, gid))
2025-04-27T09:22:37.8352359Z                             continue
2025-04-27T09:22:37.8352490Z     
2025-04-27T09:22:37.8352622Z                         else:
2025-04-27T09:22:37.8352779Z                             char = sourceget()
2025-04-27T09:22:37.8352931Z                             if char is None:
2025-04-27T09:22:37.8353120Z                                 raise source.error("unexpected end of pattern")
2025-04-27T09:22:37.8353337Z                             raise source.error("unknown extension ?P" + char,
2025-04-27T09:22:37.8353864Z                                                len(char) + 2)
2025-04-27T09:22:37.8354180Z                     elif char == ":":
2025-04-27T09:22:37.8354359Z                         # non-capturing group
2025-04-27T09:22:37.8354523Z                         capture = False
2025-04-27T09:22:37.8354682Z                     elif char == "#":
2025-04-27T09:22:37.8354833Z                         # comment
2025-04-27T09:22:37.8354977Z                         while True:
2025-04-27T09:22:37.8355147Z                             if source.next is None:
2025-04-27T09:22:37.8355353Z                                 raise source.error("missing ), unterminated comment",
2025-04-27T09:22:37.8355555Z                                                    source.tell() - start)
2025-04-27T09:22:37.8355723Z                             if sourceget() == ")":
2025-04-27T09:22:37.8355875Z                                 break
2025-04-27T09:22:37.8356013Z                         continue
2025-04-27T09:22:37.8356152Z     
2025-04-27T09:22:37.8356417Z                     elif char in "=!<":
2025-04-27T09:22:37.8356580Z                         # lookahead assertions
2025-04-27T09:22:37.8356738Z                         dir = 1
2025-04-27T09:22:37.8356877Z                         if char == "<":
2025-04-27T09:22:37.8357031Z                             char = sourceget()
2025-04-27T09:22:37.8357188Z                             if char is None:
2025-04-27T09:22:37.8357373Z                                 raise source.error("unexpected end of pattern")
2025-04-27T09:22:37.8357554Z                             if char not in "=!":
2025-04-27T09:22:37.8357740Z >                               raise source.error("unknown extension ?<" + char,
2025-04-27T09:22:37.8357916Z                                                    len(char) + 2)
2025-04-27T09:22:37.8358098Z E                               re.error: unknown extension ?<r at position 1
2025-04-27T09:22:37.8358190Z 
2025-04-27T09:22:37.8358388Z /opt/hostedtoolcache/Python/3.12.9/x64/lib/python3.12/re/_parser.py:769: error

Ref: https://dev.azure.com/azclitools/public/_build/results?buildId=238863&view=logs&jobId=d7150642-839e-5741-b859-4a3ff06460de&j=d7150642-839e-5741-b859-4a3ff06460de&t=fd2be67c-a965-5ca6-f613-23a02f1e8c5a

@azure-client-tools-bot-prd
Copy link

azure-client-tools-bot-prd bot commented Apr 27, 2025

️✔️AzureCLI-FullTest
️✔️acr
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️acs
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️advisor
️✔️latest
️✔️3.12
️✔️3.9
️✔️ams
️✔️latest
️✔️3.12
️✔️3.9
️✔️apim
️✔️latest
️✔️3.12
️✔️3.9
️✔️appconfig
️✔️latest
️✔️3.12
️✔️3.9
️✔️appservice
️✔️latest
️✔️3.12
️✔️3.9
️✔️aro
️✔️latest
️✔️3.12
️✔️3.9
️✔️backup
️✔️latest
️✔️3.12
️✔️3.9
️✔️batch
️✔️latest
️✔️3.12
️✔️3.9
️✔️batchai
️✔️latest
️✔️3.12
️✔️3.9
️✔️billing
️✔️latest
️✔️3.12
️✔️3.9
️✔️botservice
️✔️latest
️✔️3.12
️✔️3.9
️✔️cdn
️✔️latest
️✔️3.12
️✔️3.9
️✔️cloud
️✔️latest
️✔️3.12
️✔️3.9
️✔️cognitiveservices
️✔️latest
️✔️3.12
️✔️3.9
️✔️compute_recommender
️✔️latest
️✔️3.12
️✔️3.9
️✔️config
️✔️latest
️✔️3.12
️✔️3.9
️✔️configure
️✔️latest
️✔️3.12
️✔️3.9
️✔️consumption
️✔️latest
️✔️3.12
️✔️3.9
️✔️container
️✔️latest
️✔️3.12
️✔️3.9
️✔️containerapp
️✔️latest
️✔️3.12
️✔️3.9
️✔️core
️✔️2018-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️cosmosdb
️✔️latest
️✔️3.12
️✔️3.9
️✔️databoxedge
️✔️2019-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️dla
️✔️latest
️✔️3.12
️✔️3.9
️✔️dls
️✔️latest
️✔️3.12
️✔️3.9
️✔️dms
️✔️latest
️✔️3.12
️✔️3.9
️✔️eventgrid
️✔️latest
️✔️3.12
️✔️3.9
️✔️eventhubs
️✔️latest
️✔️3.12
️✔️3.9
️✔️feedback
️✔️latest
️✔️3.12
️✔️3.9
️✔️find
️✔️latest
️✔️3.12
️✔️3.9
️✔️hdinsight
️✔️latest
️✔️3.12
️✔️3.9
️✔️identity
️✔️latest
️✔️3.12
️✔️3.9
️✔️iot
️✔️2019-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️keyvault
️✔️2018-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️kusto
️✔️latest
️✔️3.12
️✔️3.9
️✔️lab
️✔️latest
️✔️3.12
️✔️3.9
️✔️managedservices
️✔️latest
️✔️3.12
️✔️3.9
️✔️maps
️✔️latest
️✔️3.12
️✔️3.9
️✔️marketplaceordering
️✔️latest
️✔️3.12
️✔️3.9
️✔️monitor
️✔️latest
️✔️3.12
️✔️3.9
️✔️mysql
️✔️latest
️✔️3.12
️✔️3.9
️✔️netappfiles
️✔️latest
️✔️3.12
️✔️3.9
️✔️network
️✔️2018-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️policyinsights
️✔️latest
️✔️3.12
️✔️3.9
️✔️privatedns
️✔️latest
️✔️3.12
️✔️3.9
️✔️profile
️✔️latest
️✔️3.12
️✔️3.9
️✔️rdbms
️✔️latest
️✔️3.12
️✔️3.9
️✔️redis
️✔️latest
️✔️3.12
️✔️3.9
️✔️relay
️✔️latest
️✔️3.12
️✔️3.9
️✔️resource
️✔️2018-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️role
️✔️latest
️✔️3.12
️✔️3.9
️✔️search
️✔️latest
️✔️3.12
️✔️3.9
️✔️security
️✔️latest
️✔️3.12
️✔️3.9
️✔️servicebus
️✔️latest
️✔️3.12
️✔️3.9
️✔️serviceconnector
️✔️latest
️✔️3.12
️✔️3.9
️✔️servicefabric
️✔️latest
️✔️3.12
️✔️3.9
️✔️signalr
️✔️latest
️✔️3.12
️✔️3.9
️✔️sql
️✔️latest
️✔️3.12
️✔️3.9
️✔️sqlvm
️✔️latest
️✔️3.12
️✔️3.9
️✔️storage
️✔️2018-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️synapse
️✔️latest
️✔️3.12
️✔️3.9
️✔️telemetry
️✔️2018-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9
️✔️util
️✔️latest
️✔️3.12
️✔️3.9
️✔️vm
️✔️2018-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2019-03-01-hybrid
️✔️3.12
️✔️3.9
️✔️2020-09-01-hybrid
️✔️3.12
️✔️3.9
️✔️latest
️✔️3.12
️✔️3.9

@azure-client-tools-bot-prd
Copy link

azure-client-tools-bot-prd bot commented Apr 27, 2025

️✔️AzureCLI-BreakingChangeTest
️✔️Non Breaking Changes

@yonzhan
Copy link
Collaborator

yonzhan commented Apr 27, 2025

Thank you for your contribution! We will review the pull request and get back to you soon.

@github-actions
Copy link

The git hooks are available for azure-cli and azure-cli-extensions repos. They could help you run required checks before creating the PR.

Please sync the latest code with latest dev branch (for azure-cli) or main branch (for azure-cli-extensions).
After that please run the following commands to enable git hooks:

pip install azdev --upgrade
azdev setup -c <your azure-cli repo path> -r <your azure-cli-extensions repo path>

@bebound bebound changed the base branch from dev to dev-lts-2.66 April 27, 2025 08:29
@bebound bebound added the LTS label Apr 27, 2025
@bebound bebound marked this pull request as ready for review May 6, 2025 06:50
@bebound bebound changed the title {LTS} Backport 30993 {LTS} Backport #30993 May 6, 2025
@bebound bebound merged commit a3d6a5f into Azure:dev-lts-2.66 May 9, 2025
51 of 54 checks passed
@bebound bebound deleted the backport-30993 branch May 9, 2025 05:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants