bgddlmZddlZddlZddlmZddlmZddlmZddlmZddlm Z ddlm Z dd lm Z dd lm Z dd lm Z dd lmZdd lmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZddlmZerddlmZeeeefZeeeedfdfZedefZ edZ!e edfZ"e edeedfedfZ#edeedfZ$ej%dZ&gd Z'Gd!d"e(Z)Gd#d$e)Z*Gd%d&e)Z+Gd'd(e)Z,Gd)d*e)Z-Gd+d,e-Z.Gd-d.e-Z/Gd/d0e.e/Z0Gd1d2Z1Gd3dZ2ed?d8Z3ed@d;Z3d<Z3dAd>Z4dS)B) annotationsN)Any)Callable)cast) Collection)Deque)Dict) FrozenSet)Iterable)Iterator)List)Optional)overload)Sequence)Set)Tuple) TYPE_CHECKING)TypeVar)Union)util)not_none)Literal.Revision)rzLiteral['base']_T)boundz(?:(.+?)@)?(\w+)?((?:\+|-)\d+))@-+ceZdZdS) RevisionErrorN)__name__ __module__ __qualname__rN/opt/cloudlinux/venv/lib64/python3.11/site-packages/alembic/script/revision.pyr"r",sDr&r"c eZdZdfd ZxZS)RangeNotAncestorErrorlower_RevisionIdentifierTypeupperreturnNonecz||_||_td|pdd|pddS)N Revision basez is not an ancestor of revision )r*r,super__init__)selfr*r, __class__s r'r3zRangeNotAncestorError.__init__1sT    1     r&)r*r+r,r+r-r.r#r$r%r3 __classcell__r5s@r'r)r)0s=          r&r)c eZdZdfd ZxZS) MultipleHeadsheads Sequence[str]argument Optional[str]r-r.c||_||_td|dd|dS)Nz/Multiple heads are present for given argument 'z'; , )r;r=r2r3join)r4r;r=r5s r'r3zMultipleHeads.__init__=sW    HHdii... 0     r&)r;r<r=r>r-r.r6r8s@r'r:r:<s=          r&r:c eZdZdfd ZxZS)ResolutionErrormessagestrr=r-r.cXt|||_dSN)r2r3r=)r4rDr=r5s r'r3zResolutionError.__init__Gs& !!!  r&)rDrEr=rEr-r.r6r8s@r'rCrCFs=!!!!!!!!!!r&rCc$eZdZdZdfd ZxZS) CycleDetectedCycle revisionsr<r-r.c||_t|jdd|ddS)Nz is detected in revisions (r@))rKr2r3kindrAr4rKr5s r'r3zCycleDetected.__init__OsR" yyy$))I.... 0     r&rKr<r-r.r#r$r%rNr3r7r8s@r'rIrILsB D          r&rIc$eZdZdZdfd ZxZS)DependencyCycleDetectedzDependency cyclerKr<r-r.cJt|dSrGr2r3rOs r'r3z DependencyCycleDetected.__init__Zs! #####r&rPrQr8s@r'rSrSWsB D$$$$$$$$$$r&rSc$eZdZdZdfd ZxZS) LoopDetectedz Self-looprevisionrEr-r.cLt|gdSrGrUr4rXr5s r'r3zLoopDetected.__init__as# ($$$$$r&rXrEr-r.rQr8s@r'rWrW^sB D%%%%%%%%%%r&rWc$eZdZdZdfd ZxZS)DependencyLoopDetectedzDependency self-looprXr<r-r.cJt|dSrGrUrZs r'r3zDependencyLoopDetected.__init__hs! """""r&)rXr<r-r.rQr8s@r'r]r]esB !D##########r&r]ceZdZdZdldZejdmdZejdmd Zejdmd Z ejdmd Z ejdnd Z dodZ dpdZ dpdZdpdZdpdZdqdrd#Z dsdtd'Zdud*Zdvd.Zdwd0Zdxd1Z dsdyd5Zdzd9Z dqd{d>Z dqd|dCZd}dEZ d~ddOZ dddUZ dddVZ dqddYZdd\Z dddcZ!ddfZ"ddgZ#ddhZ$ddjZ%ddkZ&d$S) RevisionMapzMaintains a map of :class:`.Revision` objects. :class:`.RevisionMap` is used by :class:`.ScriptDirectory` to maintain and traverse the collection of :class:`.Script` objects, which are themselves instances of :class:`.Revision`. generator Callable[[], Iterable[Revision]]r-r.c||_dS)a Construct a new :class:`.RevisionMap`. :param generator: a zero-arg callable that will generate an iterable of :class:`.Revision` instances to be used. These are typically :class:`.Script` subclasses within regular Alembic use. N) _generator)r4ras r'r3zRevisionMap.__init__us$r&Tuple[str, ...]c|j|jS)zAll "head" revisions as strings. This is normally a tuple of length one, unless unmerged branches are present. :return: a tuple of string revision numbers. ) _revision_mapr;r4s r'r;zRevisionMap.heads zr&c|j|jS)zAll "base" revisions as strings. These are revisions that have a ``down_revision`` of None, or empty tuple. :return: a tuple of string revision numbers. )rgbasesrhs r'rkzRevisionMap.basesrir&c|j|jS)zeAll "real" head revisions as strings. :return: a tuple of string revision numbers. )rg _real_headsrhs r'rmzRevisionMap._real_heads r&c|j|jS)zeAll "real" base revisions as strings. :return: a tuple of string revision numbers. )rg _real_basesrhs r'rpzRevisionMap._real_basesrnr&_RevisionMapTypec tj}tj}tj}d}d}t}t}|D]}|||j|vrtjd|jz|||j<|j r|||||||j r||fz }|j r||fz }| } | |tt|||tt||D]{} | jD]q} | |vrtjd| d| d|| } | | | | jvr|| || r|||tt||| ||||t1|} dx| d<| d<t5d|D|_t5d|D|_t5d |D|_t5d |D|_||| | S) z_memoized attribute, initializes the revision map from the initial collection. r%Revision %s is present more than oncer0 referenced from  is not presentNc3$K|] }|jV dSrGrX.0revs r' z,RevisionMap._revision_map..$99C3<999999r&c3$K|] }|jV dSrGrwrxs r'r{z,RevisionMap._revision_map..$ E E# E E E E E Er&c3$K|] }|jV dSrGrwrxs r'r{z,RevisionMap._revision_map..r|r&c3$K|] }|jV dSrGrwrxs r'r{z,RevisionMap._revision_map..r~r&) sqlautil OrderedDict OrderedSetsetrdaddrXrwarn branch_labelsis_base _is_real_basecopy_map_branch_labelsrrq_add_depends_onvalues_all_down_revisions add_nextrev_versioned_down_revisionsdiscard_normalize_depends_on_detect_cyclesdictitemstupler;rmrkrp _add_branches)r4map_r;rmrkrphas_branch_labels all_revisionsrXrev_maprzdownrev down_revision revision_maps r'rgzRevisionMap._revision_maps6)1(<(>(>'244%-%8%:%: &(,. EE )) + +H   h ' ' ' D(( ;h>OO'/D" #% 0!%%h/// IIh    OOH % % % %($% +{* ))++  t$4d;;   ]D1A4,H,HIII;;== 3 3C2 3 3$&&II"77CCC)!%W ))#...c;;;MM-000##M2222 3 ""=$7G2N2NOOO GUE; LLL)-djjll);); 044 T\"-99599999  E E E E EEE99599999  E E E E EEE ,l;;;r&r_InterimRevisionMapTyper; Set[Revision]rkTuple[Revision, ...]rmrpc |sdS|r|stt|d|d|tt|Dd|d|tt|D}t ||z }|rtt||r|stt|d|d|tt|Dd|d |tt|D}t ||z }|rtt|dS) Nch|] }|j Srrwrxs r' z-RevisionMap._detect_cycles..*    L   r&c|jSrGrrs r'z,RevisionMap._detect_cycles..s !5r&)rc3$K|] }|jV dSrGrwrxs r'r{z-RevisionMap._detect_cycles.. 8   L      r&c|jSrGnextrevrs r'rz,RevisionMap._detect_cycles..s!)r&ch|] }|j Srrwrxs r'rz-RevisionMap._detect_cycles..rr&c|jSrG)rrs r'rz,RevisionMap._detect_cycles..s !/r&c3$K|] }|jV dSrGrwrxs r'r{z-RevisionMap._detect_cycles..!rr&c|jSrG _all_nextrevrs r'rz,RevisionMap._detect_cycles..$s!.r&) rIlist_iterate_related_revisionsrrq intersectionrkeyssortedrS)r4rr;rkrmrp total_space deleted_revss r'rzRevisionMap._detect_cycless$  F /E /W .. .  6655*G447    ,  66##*G447      7<<>>**[8  6| 4 455 5 9+ 9)$w--88 8  66//*G447    ,  66((*G447      7<<>>**[8  @)&*>*>?? ? @ @r&rKCollection[Revision]rc |D]S}|jrJ|jJ|jD]9}||vr.||}|Jtd|d|jd|j|||<:TdS)Nz Branch name 'z' in revision z already used by revision )r_orig_branch_labelsr"rX)r4rKrrX branch_labelmap_revs r'rzRevisionMap._map_branch_labels-s" 2 2H% 23???$,$@ 2 2L#t++"&|"4&222+m!- ( 1 1 1 ' 0 0 *2D&&! 2 2r&c|D]}|jr|j|j||g|dD]!}|j|j"|}|rS|jsL|jsE|j|j|jr||j}nn|r|js|jEdSNFinclude_dependencies)rupdate_get_descendant_nodes_is_real_branch_pointis_merge_pointr)r4rKrrXnodeparents r'rzRevisionMap._add_branchesBs"  H% &--h.DEEE 66J57FFD&--h.DEEEE "8 #1  (//0FGGG+!%f&:!; "8 #1   r&c|D]T}|jrDfdtj|jD}td|D|_Md|_UdS)aResolve the 'dependencies' for each revision in a collection in terms of actual revision ids, as opposed to branch labels or other symbolic names. The collection is then assigned to the _resolved_dependencies attribute on each revision object. c g|] }| Srr)rydeprs r' z/RevisionMap._add_depends_on..hs*"%DIr&c g|] }||j SrGrwryds r'rz/RevisionMap._add_depends_on..ls???AQZr&rN) dependenciesrto_tupler_resolved_dependencies)r4rKrrXdepss ` r'rzRevisionMap._add_depends_onZs" 5 5H$ 5)-x7L)M)M38?????33//35// 5 5r&c (|D]}|jr~t|j}||gdtt|D](}||ur|jr||j)t ||_d|_dS)aCreate a collection of "dependencies" that omits dependencies that are already ancestor nodes for each revision in a given collection. This builds upon the _resolved_dependencies collection created in the _add_depends_on() method, looking in the fully populated revision map for ancestors, and omitting them as the _resolved_dependencies collection as it is copied to a new collection. The new collection is then assigned to the _normalized_resolved_dependencies attribute on each revision object. The collection is then used to determine the immediate "down revision" identifiers for this revision. F)rrrN)rr_get_ancestor_nodesrrqdifference_updater!_normalized_resolved_dependencies)r4rKrrXnormalized_resolvedrzs r'rz!RevisionMap._normalize_depends_onqs&" @ @H. @&)(*I&J&J#33J)..554  C h 3+==6>C'>>::>@::' @ @r&FrXr_replaceboolcb|j}|s&j|vrtjdjzn"|r j|vrt djz|j<g}|||||||||jr|xj jfz c_ j r|xj jfz c_ j D]I}||vrtjd|ddt||J|||jr.t#fd|jDjfz|_jr0t#fd|jDjfz|_dSdS) zadd a single revision to an existing map. This method is for single-revision use cases, it's not appropriate for fully populating an entire revision map. rszrevision %s not in mapr0rtruc3zK|]5}|tjjgv1|V6dSrG)rrunionrXryheadrXs r'r{z+RevisionMap.add_revision..sk%%8788>>&'%%r&c3zK|]5}|tjjgv1|V6dSrG)rrrrXrs r'r{z+RevisionMap.add_revision..sk8=>>DD&'r&N)rgrXrr Exceptionrrrrrkrrprrrr _is_real_headrrmis_headr;)r4rXrrrKrs ` r' add_revisionzRevisionMap.add_revisionsL! JH-55 I7(:KK     J(+4774x7HHII I"*X J  9d+++  4000 Y---   / JJ8,. .JJ  ! 5   !2 4 4  3 : :Gd"" ww* T'] # # / / 9 9 9 9 ""9d333  ! %$%%%% ,%%%  "$ %D    % J"$%DJJJ % %r&Nrr>c|j}|r|||}t|dkrt||rd|znd|r|dSdS)aReturn the current head revision. If the script directory has multiple heads due to branching, an error is raised; :meth:`.ScriptDirectory.get_heads` should be preferred. :param branch_label: optional branch name which will limit the heads considered to those which include that branch_label. :return: a string revision number. .. seealso:: :meth:`.ScriptDirectory.get_heads` z%s@headrrN)r;filter_for_lineagelenr:)r4r current_headss r'get_current_headzRevisionMap.get_current_heads((,z   33|M }   ! !,8D L((f    # #4r& identifierrEc8||j|SrG)rrk)r4rs r'_get_base_revisionszRevisionMap._get_base_revisionss&&tz:>>>r&id_+Union[str, Collection[Optional[str]], None]%Tuple[Optional[_RevisionOrBase], ...]ct|ttttfrt fd|DdS|\}t|dkr{ t|ddkrN d}tfd|D}tfd|DSn#t$rYnwxYwtfd |DS) aReturn the :class:`.Revision` instances with the given rev id or identifiers. May be given a single identifier, a sequence of identifiers, or the special symbols "head" or "base". The result is a tuple of one or more identifiers, or an empty tuple in the case of "base". In the cases where 'head', 'heads' is requested and the revision map is empty, returns an empty tuple. Supports partial identifiers, where the given identifier is matched against all identifiers that start with the given characters; if there is exactly one match, that determines the full revision. c:g|]}|Sr) get_revisions)ryid_elemr4s r'rz-RevisionMap.get_revisions.. s'GGG**733GGGr&rrrr;Nc3HK|]}t|jv|VdSrG) is_revisionr)ryrrs r'r{z,RevisionMap.get_revisions..sX11$(#/#.t#4#4#B$C$C!%$C$C$C$C11r&c3FK|]}|VdS))stepsN)_walk)ryrrintr4s r'r{z,RevisionMap.get_revisions..sG%% $!JJt4J88%%%%%%r&c3DK|]}|VdSrG)_revision_for_ident)ryrev_idrr4s r'r{z,RevisionMap.get_revisions..&sG((>>r&) isinstancerrr frozensetsum_resolve_revision_numberrintr ValueError)r4r resolved_id select_headsrrs` @@r'rzRevisionMap.get_revisionss( cD%i8 9 9 GGGG3GGGLL L(,(E(E)) %K;1$${1~..Daxx'+'9'9''B'B '3+01111,8111,,L %%%%%%(4%%%   "D) s4A(C C+*C+Optional[Revision]c||\}}t|dkrt|||r|dnd}|||S)a Return the :class:`.Revision` instance with the given rev id. If a symbolic name such as "head" or "base" is given, resolves the identifier into the current head or base revision. If the symbolic name refers to multiples, :class:`.MultipleHeads` is raised. Supports partial identifiers, where the given identifier is matched against all identifiers that start with the given characters; if there is exactly one match, that determines the full revision. rrr)rrr:r)r4rrrresolveds r' get_revisionzRevisionMap.get_revision+sg%)$A$A#$F$F! \ {  a   S11 1.esJQ! [(A(A#r&zNo such revision or branch ''z\; please ensure at least four characters are present for partial revision identifier matchesrzMultiple revisions start with 'z': r@c3 K|] }d|zV dS)z'%s'Nrryrs r'r{z2RevisionMap._revision_for_ident..s&-L-LQfqj-L-L-L-L-L-Lr&rrz...r0z is not a member of branch ') rrgrrrCrrA_shares_lineagerX)r4rrrrXrevss ` r'rzRevisionMap._revision_for_identPs  --l;;JJJ )+6HH   HHH  u    ;+D  C..t\BB 7%o$  #;//!33NN"$$     TQ%o#{{DII-L-L$qs)-L-L-L$L$L$L$LN  -d1g6  H0)))  ;''!:#6 &o(((,,,8 s + ::targets#Iterable[Optional[_RevisionOrBase]]Set[Optional[_RevisionOrBase]]ct|}t|D]Z}|sJ|||gd|gr||[|Sr)rrrr differencer)r4r!rzs r'_filter_into_branch_headsz%RevisionMap._filter_into_branch_headssg,,== % %CJJ3##**C5u*MMj# %$$$r& Iterable[_T] check_againstrTuple[_T, ...]c|\}}g|r||r|tfd|DS)Nc3LK|]}||VdS)rN)r)rytgrr4sharess r'r{z1RevisionMap.filter_for_lineage..sZ  ##F1E$       r&)rappendextendr)r4r!r(rrrr-s` ` @r'rzRevisionMap.filter_for_lineages !99-HH\  ( MM, ' ' '   MM#               r&target_RevisionOrStrtest_against_revsSequence[_RevisionOrStr]c|sdSt|ts#t|}n|}fdt j|dD}t t|g| |g| |S)NTchg|].}t|ts|n|/Sr)rrr)rytest_against_revr4s r'rz/RevisionMap._shares_lineage..sR& & & !.99 "D $ $%5 6 6 6!& & & r&rdefaultr) rrrrrrrrrrrr)r4r0r2rresolved_targetresolved_test_against_revss` r'rzRevisionMap._shares_lineages  ! 4&(++ %&t'?'?'G'GHHOO$O& & & & %)M!2%%% & & & " **$%)=+   U(($%)=) \4 5 5   r&%Tuple[Tuple[str, ...], Optional[str]]c0t|trd|vr|dd\}}ne|at|tr|rt|dtrt|ttfst d|dd}|j|dkr(|r||j||fS|j|fS|dkr | |}|r|f|fSd|fS|d ks|d|fStj |d |fS) Nrrrzrevision identifier z= is not a string; ensure database driver settings are correctr;rrr1r7) rrEsplitrr"rgrr;rmrrr)r4rr current_heads r'rz$RevisionMap._resolve_revision_numbersh c3   C3JJ # #q 1 1 L## _ U # #(+4>s1vs4K4KcC<00 -147   L  '>> 6++DJ EE  '55 F]]00>>L ($ 44<'' F]]ck|# #=d333\A Ar&Tr,r+r* implicit_base inclusiveassert_relative_lengthselect_for_downgradeIterator[Revision]c#K|r|j}n|j}||||||\}} ||| D]&} t|| V'dS)auIterate through script revisions, starting at the given upper revision identifier and ending at the lower. The traversal uses strictly the `down_revision` marker inside each migration script, so it is a requirement that upper >= lower, else you'll get nothing back. The iterator yields :class:`.Revision` objects. )r@r?rAN)_collect_downgrade_revisions_collect_upgrade_revisions_topological_sortrr ) r4r,r*r?r@rArBfnrKr;rs r'iterate_revisionszRevisionMap.iterate_revisionss*  12BB0B2  '#9     5**9e<< 4 4D4,,T2233 3 3 3 3 4 4r&%Collection[Optional[_RevisionOrBase]]Optional[_RevisionMapType]checkomit_immediate_dependencies Iterator[Any]cX|rfd}n |rd}nd}||||S)Nc(|vr|jS|jSrG)rr)rzr!s r'rHz-RevisionMap._get_descendant_nodes..fn3sg%%++;&r&c|jSrGrrzs r'rHz-RevisionMap._get_descendant_nodes..fn;s ''r&c|jSrGrrRs r'rHz-RevisionMap._get_descendant_nodes..fn@s {"r&rrLr)r4r!rrLrMrrHs ` r'rz!RevisionMap._get_descendant_nodes(s ' # ' ' ' ' ' ' " # ( ( ( (  # # #.. d%/   r&cF|rd}nd}|||||S)Nc|jSrG_normalized_down_revisionsrRs r'rHz+RevisionMap._get_ancestor_nodes..fnQs 55r&c|jSrGrrRs r'rHz+RevisionMap._get_ancestor_nodes..fnVs 44r&rTrU)r4r!rrLrrHs r'rzRevisionMap._get_ancestor_nodesGsW  5 6 6 6 6  5 5 5.. d%/   r&rHrc #K||j}t}tj}|D]1}t |}|||rt} |r|} |r| | | |vr2|| || D]=} || } | J| j| krtd|| >| V||rb| | |g} | r7td|jdd d| D3dS)Nz(Dependency resolution failed; broken mapzRequested revision z) overlaps with other requested revisions r@c3$K|] }|jV dSrGrwrs r'r{z9RevisionMap._iterate_related_revisions..s$%C%CQaj%C%C%C%C%C%Cr&) rgr collectionsdequerr.poprrXr"rr%rA)r4rHr!rrLseentodo target_forr0 per_targetrzrnext_revoverlapss r'rz&RevisionMap._iterate_related_revisions]s <%Duu + 1 3 3!$ $ J ,,F KK    # UU  hhjj(NN3'''$;;  bgg**F#F|H#///(F22+FKK)))) # $ %227;;FFH'-#OOO II%C%C(%C%C%CCCC ;$ $ r&r List[str]c jfd d|Dtj}ttfd|D|j fd D}g}d} rD |}t |D]\}} ||kr || vr|}n|vr*||||} | J fd| jD} | s |=||=t|d z d}n| j s?t| j d kr'| d |<|| |ne| d |< | d d | d||<| fd | d dD DrJ|S) zYield revision ids of a collection of Revision objects in topological sorted order (i.e. revisions always come after their down_revisions and dependencies). Uses the order of keys in _revision_map to sort. cPd|gDS)Nch|] }|j Srrwrs r'rzGRevisionMap._topological_sort..get_ancestors..s* r&)r)r id_to_revr4s r' get_ancestorsz4RevisionMap._topological_sort..get_ancestorss:119V3D2EFF r&ch|] }|j Srrwrs r'rz0RevisionMap._topological_sort..s...q ...r&c0h|]}|jv |jSrrw)ryrras r'rz0RevisionMap._topological_sort..s'AAAajD.@.@.@.@.@r&)keyc&g|] }|Srr)ryrrks r'rz1RevisionMap._topological_sort..s#NNNfMM&11NNNr&rNc$g|] }|v|v | Srr)ryrrras r'rz1RevisionMap._topological_sort..s6   DyyQm%;%;%;%;%;r&rc3.K|]}|VdSrGr)ryrrks r'r{z0RevisionMap._topological_sort..s>0048MM$//000000r&)rgrrindex enumerater.removerYmaxrrrrr/)r4rKr;inserted_orderancestors_by_idxoutputcurrent_candidate_idx candidatecheck_head_index ancestors candidate_rev heads_to_addrrkrjras` @@@@r'rGzRevisionMap._topological_sorts&        /.I...d011 AAAAUAAA"(     ONNN NNN !@ %&;?,/0E0I1,M,M))*K GHHAMM?KA &;< ))>?GG%@LA &;<%,,\!""-=>>>*M,q/::)1)//0000 0) or down (steps < 0) the revision tree. :branch_label is used to select branches only when walking up. If the walk goes past the boundaries of the tree and :no_overwalk is True, None is returned, otherwise the walk terminates early. A RevisionError is raised if there is no unambiguous revision to walk to. rr1c,g|]}t|Srrrxs r'rz%RevisionMap._walk..s0 $$r&Nr)r1rzAmbiguous walk) rrEr rangeabsrrkrrr;rrr") r4rrrrinitial_walk_upchildrenrets r'rzRevisionMap._walksk( eS ! ! ''..GGGs5zz""! "! "Aqyy&((((#11&-o 7?    '#66w MMHH&HHf$$!HH#11"? $2  H $-#, 6*6ddw X""#$4555qkGGr&current_revisions/Tuple[Optional[str], Optional[_RevisionOrBase]]c|dSt|ts Jdt|}|r|\}}}t |}|dkrQ|!t d|t|fz|||||} | t d|| fS|du} | r|rtj |} | | |} | sUttt|| } | | |}d|D} t!| d ksJ| d}nutj |}|s!t d|t|fzt!t#|d krtjd |d}|}||||n||d ||| } | 2| r!t d|t|fzt d|| fS|d \}}}|sd}|||fS) aV Parse downgrade command syntax :target to retrieve the target revision and branch label (if any) given the :current_revisons stamp of the database. Returns a tuple (branch_label, target_revision) where branch_label is a string from the command specifying the branch to consider (or None if no branch given), and target_revision is a Revision object which the command refers to. target_revsions is None if the command refers to 'base'. The target may be specified in absolute form, or relative to :current_revisions. NNNz(Expected downgrade target in string formr1Relative revision %s didn't produce %d migrations)rzWalked too farc$g|] }|r|jn|Srrwrs r'rz7RevisionMap._parse_downgrade_target..xs3+++$%/0 6 Q+++r&rzadowngrade -1 from multiple heads is ambiguous; this usage will be disallowed in a future release.rrrr)rrE_relative_destinationmatchgroupsrr"rrrrrrrr_get_all_currentrrrr  rpartition)r4rr0rArrsymbolrelativerel_intrzrelative_revisioncr_tuple symbol_list all_currentsl_all_currentrs r'_parse_downgrade_targetz#RevisionMap._parse_downgrade_target7sJ$ >: C   6 6 5 6 6 &++F33 T )-2\\^^ *L&((mmG!||>'03;S\\2JK jj 6 ! ;'(8999#S(($*dN!$-.#+.#'=1B#C#C&*&=&=$l''  + +/ #H t/D/DX/N/N++K.2-D-D +\..N++)7+++K #;//14444!,Q,0M:K,L,L)0"/!8#+S\\":!;## s#45566:: I!+ "31!5(. jj#+++F333**lllFF+KLL! 6 !;(>+47?W6NO ,,<===#S((#)"3"3C"8"8 a LT..v6666r&cNt|trt|}nd}|s||St j|}|\}}}t|} | dkr0||sd}|} |r| |||} | sf| | |||} td| Dd| Dz } | sd} t| dkrtd|| d| ||} | !td |t| fz| fS|||| ||fS|!td | t| fz||||n||d || | fS) aI Parse upgrade command syntax :target to retrieve the target revision and given the :current_revisons stamp of the database. Returns a tuple of Revision objects which should be iterated/upgraded to. The target may be specified in absolute form, or relative to :current_revisions. NrrGch|] }|j Srrwrxs r'rz4RevisionMap._parse_upgrade_target..sFFFcS\FFFr&c&h|]}|jD]}|SrrX)ryrzdowns r'rz4RevisionMap._parse_upgrade_target..sB$',/,J%)!%r&rz1Ambiguous upgrade from multiple current revisions)rrrrrrr)rrErrrrrrrrrrrr"rrr ) r4rr0rArcurrent_revisions_tuprr relative_strr start_revsactive_on_branchrzs r'_parse_upgrade_targetz!RevisionMap._parse_upgrade_targets fc " " )//77EEE .%%f-- -!% .? @ @-2\\^^* fl|$$ a<<~,4,3)2 1!%!8!8**+@AA<""J&1,0+B+B 44 $ 2 23H I I) ,,(&+FF5EFFF+;&&  *1*1Jz??Q&&'Kjj$Q-"!- 6 ! ;'03?X2OPv JJ"//77&%1$: ~#,/7X.GH  #+++F333**lllFF+KLL" 6  r&c||||\}}|dkrd}|t|tsJ|$d|jD}n*|r|g}n$d||jD}|rt|dkrd|| |gd D} d |d |D | D}t|d krtd ||} t| |dd} t|| d } | | |r;| | |||| s|| vrt#d|| | fS)a Compute the set of current revisions specified by :upper, and the downgrade target specified by :target. Return all dependents of target which are currently active. :inclusive=True includes the target revision in the set rr0rAr1Nc$g|] }||j |SrGrrxs r'rz.1s/?s'8'@'@'@'@r&c,g|]}t|Srrrxs r'rz.;s0C  r&rch|] }|j Srrwrxs r'rz;RevisionMap._collect_downgrade_revisions..Bs* r&Frc,g|]}t|Srrrxs r'rz.Ks0C  r&ch|] }|j Srrwrxs r'rz;RevisionMap._collect_downgrade_revisions..Ns333cS\333r&rz/Not a valid downgrade target from current headsT)rrMzNothing to drop)rrrrgrrrrrrrr"rrintersection_updaterr%r)) r4r,r0r@r?rArtarget_revisionrootsr|r;downgrade_revisionsactive_revisionss r'rEz(RevisionMap._collect_downgrade_revisionss )-(D(D##9)E) ) % o f $ $"O&*_h*O*O&&O  "-4466EE  $%EE--o.EFFE  CJJNN33)),778).4I--33U333@@KKE5zzQ#E""5))"  & &%),1 '      $ $U $ F F   //0@AAA    & & ++D,D,DU,K,KLL     '' (u,,((95AA A"E))r&6Tuple[Set[Revision], Tuple[Optional[_RevisionOrBase]]]cd||||D}t|trd|vr|d\}}|}|F|jkr;t |jdksJtt|jfd|D}t| |dd || |} |s+tfd | Drt||t!| t"us Jd | rH| d @||||\}} | sJ| d krt#} d}n | f} | j}t| | dd | } | } |r2| d | |D| r9|s7|d| Ddd} | | | t#|fS)a Compute the set of required revisions specified by :upper, and the current set of active revisions specified by :lower. Find the difference between the two to compute the required upgrades. :inclusive=True includes the current/lower revisions in the set :implicit_base=False only returns revisions which are downstream of the current/lower revisions. Dependencies from branches with different bases will not be included. c,g|]}t|Srrrxs r'rz:RevisionMap._collect_upgrade_revisions..s0) ) )    ) ) ) r&rrNrc&h|] }|jv |Sr)r)ryneedbranchs r'rz9RevisionMap._collect_upgrade_revisions..s-Fd6H,H,H,H,H,Hr&T)rLrc3$K|] }||vV dSrGr)ryrzrequired_node_sets r'r{z9RevisionMap._collect_upgrade_revisions..s7% %  ( (% % r&z#current_revisions should be a tuplerr1c34K|]}t|VdSrGrrxs r'r{z9RevisionMap._collect_upgrade_revisions..s*OOcS))OOOOOOr&c,g|]}t|Srrrxs r'rz:RevisionMap._collect_upgrade_revisions..s ???cS!!???r&F)rrrE partitionr rXrrnextiterrrrranyr)typerrr%rrr)r4r,r*r@r?rAr!rrrrzcurrent_node_setneedslower_descendentsrrs @@r'rFz&RevisionMap._collect_upgrade_revisions{s.&) ) 11"''=2) ) )  eS ! ! cUll ??3//LFAq**622J%**=*G*G:3449999d:#;<<==!(G  $ $t$ %     %..  !..u55 6% % % % (% % % " "  6 (u55 5 " # #u , , , 0 - , ,  %!21!5!=11"''=2FAs JJ3f}}$)GG!%(F!   $ $!D %     %! " "  ",,-=>>  P LLOOT5G5G5N5NOOO O O O  9] 9 $ : :??->???%*!;!!   % %&7 8 8 8eGnn$$r&ct||}||t |d||S)NTr)rrrrrr&)r4rtop_revss r'rzRevisionMap._get_all_currentsgt))#..//  $ $T(^^$ $ O O   --h777r&)rarbr-r.r-re)r-rq) rrr;rrkrrmrrprr-r.)rKrrrqr-r.)F)rXrrrr-r.rG)rr>r-r>)rrEr-re)rrr-r)rr>r-r )rrEr-r )rrrr>r-r )r!r"r-r#)r!r'r(r>rrr-r))r0r1r2r3rrr-r)rr>r-r;)FFTF)r,r+r*r+r?rr@rrArrBrr-rC)NFFT) r!rJrrKrLrrMrrrr-rN)NFT) r!rJrrKrLrrrr-rC) rHrr!rJrrKrLrr-rC)rKrr;rr-rf)NT) rrrrrr>rrr-r)rr+r0r+rArr-r)rr+r0r+rArr-r) r,r+r0r+r@rr?rrArr-r) r,r+r*r+r@rr?rrArr-r)rrer-r#)'r#r$r%__doc__r3rmemoized_propertyr;rkrmrprgrrrrrrrrrr rrr&rrrrIrrrrGrrrrErFrrr&r'r`r`ls$$$$                     IIIIV2@2@2@2@h2222*05555.&@&@&@&@P6%6%6%6%6%r-1"""""H????1111f@@@@*&'+@@@@@D    "&+      4&+ $ $ $ $ $ L&B&B&B&BX$'+%*#4#4#4#4#4P,0,1%)      D,0%)      6 00000dggggZ'+ =====~r7r7r7r7hggggRe*e*e*e*Nc%c%c%c%J888888r&r`ceZdZUdZeZded< eZded<dZded< dZ ded < dZ ded < dZ d ed < d ed<d ed<e d"dZ d#d$dZd%dZd&dZed'dZed'dZed'dZed(dZed(dZed(dZed(dZed(dZed(d Zed(d!ZdS))raoBase class for revisioned objects. The :class:`.Revision` class is the base of the more public-facing :class:`.Script` object, which represents a migration script. The mechanics of revision management and traversal are encapsulated within :class:`.Revision`, while :class:`.Script` applies this logic to Python files in a version directory. zFrozenSet[str]rrNrErXzOptional[_RevIdType]rrzSet[str]rrerrr-r.ct|t}|r6tddt |d|ddS)NzCharacter(s) 'r@z&' not allowed in revision identifier 'r)rr_revision_illegal_charsr"rAr)clsrX illegal_charss r' verify_rev_idzRevision.verify_rev_idsjH 223JKK  -99VM223333XXX?   r&%Optional[Union[str, Tuple[str, ...]]]c|r%|tj|vrt||%|tj|vrt|||||_t ||_t ||_tj|d|_ t|j |_ dSNrr7) rrrWr]rrXtuple_rev_as_scalarrrrrr)r4rXrrrs r'r3zRevision.__init__ s  3X})E)EEEx(( (  %(dm 7 7 + + )22 2 8$$$  0??/ ==#'=#K#K#K  !9::r&c,t|jt|jg}|jr|d|j|jr|d|j|jjdd|dS)Nz dependencies=zbranch_labels=(r@rM) reprrXrrr.rr5r#rA)r4argss r'__repr__zRevision.__repr__5sT]##T$*<%=%=>   B KKKT->->@ A A A   D KKKd.@.@B C C C>222DIIdOOOODDr&c|j|jg|_|j|jvr'|j|jg|_dSdSrG)rrrXrr)r4rXs r'rzRevision.add_nextrev=sZ -33X5F4GHH =H> > ><--x/@.ABBDLLL ? >r&cltjtj|jd|jzSr)r dedupe_tuplerrrrhs r'rzRevision._all_down_revisionsBs7 M$,b 9 9 9) *   r&cltjtj|jd|jzS)z|return immediate down revisions for a rev, omitting dependencies that are still dependencies of ancestors. rr7)rrrrrrhs r'rYz#Revision._normalized_down_revisionsIs9  M$,b 9 9 94 5   r&c8tj|jdSr)rrrrhs r'rz"Revision._versioned_down_revisionsTs}T/<<<rs""""""  '''''' 3 % & U38_d :;z3'56sJ/dCr23Xj5IIJ WTsJ/000" #DEE)//     I         M         M   !!!!!m!!!      M   $$$$$m$$$%%%%%=%%%#####4l###|8|8|8|8|8|8|8|8~+d7d7d7d7d7d7d7d7N      r&