Ë 8ɯšm¼×ãó—ddlZddlmZddlmZmZddlmZmZm Z m Z m Z ddl m Z dZdZGd„d «Zd5d „Zd „Zd „Zd6d „Zd6d„Zd„Zd„Zd„ZdZdZdZdZdZdZdZdZ ejBd«ejBd«ejBd«ejBd«gZ"d„Z#d„Z$d„Z%d„Z&d „Z'd7d!„Z(Gd"„d#e)«Z*d8d$„Z+d%„Z,d&„Z-d'„Z.d(„Z/d)„Z0d*„Z1d+„Z2ed,«ed-«ed.«ed/«ed0«d1œZ3d2„Z4d3„Z5d4„Z6y)9éNé)Ú_)ÚhexÚshort)ÚdiffutilÚencodingÚerrorÚphasesÚutil)ÚdateutilécóF—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z y ) ÚmarkerzWrap obsolete marker raw datacó.—||_||_d|_y©N)Ú_repoÚ_dataÚ _decodedmeta)ÚselfÚrepoÚdatas ú5usr/lib/python3.12/site-packages/mercurial/obsutil.pyÚ__init__zmarker.__init__>s€àˆŒ ؈Œ Ø ˆÕócó,—t|j«Sr)Úhashr©rs rÚ__hash__zmarker.__hash__Ds€Ü�D—J‘JÓÐrcód—t|«t|«k7ry|j|jk(S©NF)Útyper©rÚothers rÚ__eq__z marker.__eq__Gs(€Ü �‹;œ$˜t›*Ò $ØØ�z‰z˜UŸ[™[Ñ(Ð(rcó —|jdS)z%Predecessor changeset node identifierr©rrs rÚprednodezmarker.prednodeLó€à�z‰z˜!‰}Ðrcó —|jdS)z-List of successor changesets node identifiersrr&rs rÚ succnodeszmarker.succnodesPr(rcó —|jdS)z2Parents of the predecessors (None if not recorded)ér&rs rÚ parentnodeszmarker.parentnodesTr(rcó2—t|jd«S)zDecoded metadata dictionaryé)Údictrrs rÚmetadatazmarker.metadataXs€ä�D—J‘J˜q‘MÓ"Ð"rcó —|jdS)z#Creation date as (unixtime, offset)ér&rs rÚdatez marker.date\r(rcó —|jdS)zThe flags field of the markerr r&rs rÚflagsz marker.flags`r(rN) Ú__name__Ú __module__Ú __qualname__Ú__doc__rrr$r'r*r-r1r4r6©rrrr;s2„Ù'ò!ò  ò)ò òòò#òórrc#ó¨K—|€ |j}n*|r t||«}n|jj|«}|D]}t||«–—Œy­w)zreturns markers known in a repository If is specified, only markers "relevant" to those nodes are are returnedN)ÚobsstoreÚexclusivemarkersÚrelevantmarkersr)rÚnodesÚ exclusiveÚ rawmarkersÚ markerdatas rÚ getmarkersrDesPèø€ð  €}Ø—]‘]‰ Ù Ü% d¨EÓ2‰ à—]‘]×2Ñ2°5Ó9ˆ ã ˆ Ü�T˜:Ó&Ó&ñ!ùs‚AAcó—t|d„¬«S)Ncó"—|dd|dxsdfzS)Néÿÿÿÿr;r;)Úms rÚzsortedmarkers..ws€¨¨3¨B¨°1°R±5²;¸B°.Ò)@r)Úkey)Úsorted)Úmarkerss rÚ sortedmarkersrMus€ä �'Ñ@Ô AÐArc#óK—|jj}|g}t|«}|rb|j«}|j |d«}|D]7}|d}||vrŒ |j |«||vr|–—Œ'|j |«Œ9|rŒayy­w)z±yield the list of next predecessors pointing on visible changectx nodes This function respect the repoview filtering, filtered revision will be considered missing. r;rN)r=Ú predecessorsÚsetÚpopÚgetÚaddÚappend) rÚnodeidÚ precursorsÚstackÚseenÚcurrentÚ currentpreccsÚprecÚ precnodeids rÚclosestpredecessorsr]zs�èø€ð—‘×+Ñ+€JØ ˆH€EÜ ˆu‹:€Dá Ø—)‘)“+ˆØ"Ÿ™ w°Ó3ˆ ã!ˆDؘa™ˆJð˜TÑ!ØØ �H‰H�ZÔ à˜TÑ!Ø Ó à— ‘ ˜ZÕ(ð"ô ùs ‚BB  B c#óK—t|«}t|«}|jj}|r[|j«}|–—||d«D]7}|d|zrŒ |d}||vsŒ|j |«|j |«Œ9|rŒZyy­w)zÀYield node for every precursors of . Some precursors may be unknown locally. This is a linear yield unsuited to detecting folded changesets. It includes initial nodes too.r;r rN)rPrOrRrQrS) r=r@Ú ignoreflagsÚ remainingrXr[rYÚmarkÚsucs rÚallpredecessorsrc—sŠèø€ô�E“ €IÜ ˆy‹>€DØ × Ñ × $Ñ $€DÙ Ø—-‘-“/ˆØŠ Ù˜ "Ö%ˆDà�A‰w˜Ò$ØØ�q‘'ˆCؘ$ŠØ—‘˜” Ø— ‘ ˜cÕ"ð&ô ùs‚A!B Á$&B  B c#ó"K—t|«}t|«}|rs|j«}|–—|jj|d«D]<}|d|zrŒ |dD])}||vsŒ|j |«|j |«Œ+Œ>|rŒryy­w)z¾Yield node for every successor of . Some successors may be unknown locally. This is a linear yield unsuited to detecting split changesets. It includes initial nodes too.r;r rN)rPrQÚ successorsrRrS)r=r@r_r`rXrYrarbs rÚ allsuccessorsrf¯sŠèø€ô�E“ €IÜ ˆy‹>€DÙ Ø—-‘-“/ˆØŠ Ø×'Ñ'×+Ñ+¨G°RÖ8ˆDà�A‰w˜Ò$ØØ˜A”w�ؘd’?Ø—H‘H˜S”MØ—M‘M #Õ&ñð 9ô ùs‚A!BÁ$(B Bcó8—|D�chc] }|dsŒ |’Œ c}Scc}w)z"return a set with no prune markersrr;©rLrHs rÚ _filterprunesriÅs €áÓ '‘w�! ! A£$ŠA�wÑ 'Ð'ùÒ 's… �c óè—|j«}|jjj}|jj }|jj }|jj}t«}t|«}|D�cgc] }t|j|d««rŒ|‘Œ"} }| j«t| «} | �r| j«} t|j| d««} |j| d«D]} | drŒ | j| «Œ|j| d«D]} | drŒ | j| «Œ| D]Œ} | |vrŒ| ds| d| k(r|j| «| d}|| vrŒ0||«}|r||vrŒ?t|j|««}|j!|«sŒk| j|«| j|«ŒŽ| r�Œ|Scc}w)aset of markers relevant to "nodes" but no other locally-known nodes This function compute the set of markers "exclusive" to a locally-known node. This means we walk the markers starting from until we reach a locally-known precursors outside of . Element of with locally-known successors outside of are ignored (since their precursors markers are also relevant to these successors). For example: # (A0 rewritten as A1) # # A0 <-1- A1 # Marker "1" is exclusive to A1 or # (A0 rewritten as AX; AX rewritten as A1; AX is unknown locally) # # <-1- A0 <-2- AX <-3- A1 # Marker "2,3" are exclusive to A1 or # (A0 has unknown precursors, A0 rewritten as A1 and A2 (divergence)) # # <-2- A1 # Marker "2" is exclusive to A0,A1 # / # <-1- A0 # # <-3- A2 # Marker "3" is exclusive to A0,A2 # # in addition: # # Markers "2,3" are exclusive to A1,A2 # Markers "1,2,3" are exclusive to A0,A1,A2 See test/test-obsolete-bundle-strip.t for more examples. An example usage is strip. When stripping a changeset, we also want to strip the markers exclusive to this changeset. Otherwise we would have "dangling"" obsolescence markers from its precursors: Obsolescence markers marking a node as obsolete without any successors available locally. As for relevant markers, the prune markers for children will be followed. Of course, they will only be followed if the pruned children is locally-known. Since the prune markers are relevant to the pruned node. However, while prune markers are considered relevant to the parent of the pruned changesets, prune markers for locally-known changeset (with no successors) are considered exclusive to the pruned nodes. This allows to strip the prune markers (with the rest of the exclusive chain) alongside the pruned changesets. r;rr)Ú unfilteredÚ changelogÚindexÚhas_noder=rOreÚchildrenrPrirRÚsortrQÚlistrTrSÚissubset)rr@ÚunfirnÚprecursorsmarkersÚsuccessormarkersÚchildrenmarkersÚ exclmarkersÚnrWÚ seennodesrYrLrar[ÚknownÚ precmarkerss rr>r>ÊsÞ€ðl �?‰?Ó €Dð�~‰~×#Ñ#×,Ñ,€HØŸ ™ ×2Ñ2ÐØ—}‘}×/Ñ/ÐØ—m‘m×,Ñ,€Oô“%€Kä �‹J€EñÓ P™�1¤]Ð3C×3GÑ3GÈÈ2Ó3NÕ%OŠQ˜€EÐ PØ ‡J�J„Lä�E“ €IÚ Ø—)‘)“+ˆäÐ(×,Ñ,¨W°bÓ9Ó:ˆà$×(Ñ(¨°"Ö5ˆDؘ“7Ø—‘˜tÕ$ð6ð$×'Ñ'¨°Ö4ˆDؘ“7Ø—‘˜tÕ$ð5óˆDØ�{Ñ"àð �AŠw˜$˜q™' WÒ,Ø—‘ Ô%ð˜‘7ˆDð�yÑ Øñ˜T“NˆEñ˜ UÑ*Øô (Ð(8×(<Ñ(<¸TÓ(BÓCˆKØ×#Ñ# KÕ0Ø— ‘ ˜dÔ#Ø— ‘ ˜TÕ"ð?ó ð\ Ðùòe Qs  G/Â-G/c󌇗|j«}t|jd|««}|jrà|jjj Šd}t |«|k7r°t |«}|D�chc]}|j«’Œ}}|D�cgc]#}|j«sŒ|j«‘Œ%}}|jt|j|««ˆfd„|D«}t|jd|««}t |«|k7rŒ°|D�chc]}|j«’Œc}Scc}wcc}wcc}w)aRreturn all nodes in the "foreground" of other node The foreground of a revision is anything reachable using parent -> children or precursor -> successor relation. It is very similar to "descendant" but augmented with obsolescence information. Beware that possible obsolescence cycle may result if complex situation. s%ln::rGc3ó4•K—|]}‰|«sŒ |–—Œy­wrr;)Ú.0rxrns €rÚ zforeground..Zsøèø€Ð5¡˜1©°!­”Q¡ùsƒ ‘) rkrPr=rlrmrnÚlenÚnodeÚmutableÚupdaterf) rr@Ú foregroundÚplenÚcÚsuccsr‚rzrns @rr„r„Dsø€ð �?‰?Ó €DÜ�T—X‘X˜h¨Ó.Ó/€JØ ‡}‚}ð—>‘>×'Ñ'×0Ñ0ˆØˆä�*‹o Ò%Ü�z“?ˆDÙ'1Ó2¡z !�Q—V‘V•X zˆEÐ2Ù)3ÓC© A°q·y±yµ{�q—v‘v•x¨ˆGÐCØ �L‰Lœ t§}¡}°gÓ>Ô ?Û5¡Ó5ˆEܘTŸX™X h°Ó6Ó7ˆJô �*‹o Ó%ñ)Ó )™j˜ˆA�F‰F�H˜jÑ )Ð)ùò 3ùÚCùò *sÁ8D7ÂD<Â+D<ÄEsef1ér3éé é@s^branch$s ^.*-source$s ^.*_source$s^source$có@‡—|dŠtˆfd„tD«« S)zvCheck that the key of a meta item (extrakey, extravalue) does not match at least one of the blacklist pattern rc3ó@•K—|]}|j‰«–—Œy­wr)Úmatch)r~ÚpatternÚmetakeys €rrz%metanotblacklisted..†søèø€ÐG¹¨g�7—=‘= ×)¹ùsƒ)ÚanyÚ METABLACKLIST)Úmetaitemr�s @rÚmetanotblacklistedr”€s"ø€ð�q‰k€GäÓG½ÓGÓGÐ GÐGrcó—g}|j«D]I}|jd«s|jd«rŒ&|jd«rd}|j|«ŒK|S)z/Drop all information but the username and patchs# Useró#s@@s@@ )Ú splitlinesÚ startswithrT)ÚhunkÚ cleanhunkÚlines rÚ _prepare_hunkrœ‰sV€à€IØ—‘Ö!ˆØ �?‰?˜9Ô %¨T¯_©_¸TÕ-BØ�‰˜uÔ%Ø�Ø × Ñ ˜TÕ "ð "ð Ðrcó8—t|d«}|€|St|«S)zreturn a cleaned up linesN)Únextrœ)ÚiterdiffÚliness rÚ _getdifflinesr¡”s#€ä �˜4Ó €Eà €}؈ ä ˜Ó Ðrcó´—tj|j«jddi«}|jj «|j «}|j|¬«}|jj «|j «}|j|¬«}d\}}d||fvr#t|«}t|«}||k7ryd||fvrŒ#y)z|return True if both ctx introduce the "same diff" This is a first and basic implementation, with many shortcoming. sgitT)Úopts)rrNF) rÚ diffalloptsrÚuirrkÚrevÚdiffr¡) ÚleftctxÚrightctxÚdiffoptsÚleftunfiÚleftdiffÚ rightunfiÚ rightdiffÚleftÚrights rÚ_cmpdiffr±žsÈ€ô ×#Ñ# G§L¡L£N×$5Ñ$5¸À°~ÓF€Hð�}‰}×'Ñ'Ó)¨'¯+©+«-Ñ8€HØ�}‰} (ˆ}Ó+€HØ—‘×)Ñ)Ó+¨H¯L©L«NÑ;€IØ—‘ H�Ó-€Ià�K€Dˆ%Ø �t˜U�mÑ #ܘXÓ&ˆÜ˜iÓ(ˆà �5Š=Øð �t˜U�mÒ #ð rcóæ—d}|D�]h}|j«|j«k7r |tz}|j«|j«k7r |tz}|j «|j «k7r |t z}|j «|j «k7r |tz}|j«|j«k7r |tz}|j«j«}ttt|««}|j«j«}ttt|««}||k7r |tz}t!||«r�Œ`|t"z}�Œk|S)zeFrom an obs-marker relation, compute what changed between the predecessor and the successor. r)Ú descriptionÚ DESCCHANGEDÚuserÚ USERCHANGEDr4Ú DATECHANGEDÚbranchÚ BRANCHCHANGEDÚparentsÚ PARENTCHANGEDÚextraÚitemsrqÚfilterr”Ú METACHANGEDr±Ú DIFFCHANGED)ÚsourcereÚeffectsÚ changectxÚ changeextraÚctxmetaÚ sourceextraÚsrcmetas rÚ geteffectflagrȺs@€ð€Gäˆ à × Ñ Ó " f×&8Ñ&8Ó&:Ò :Ø ”{Ñ "ˆGð �>‰>Ó ˜vŸ{™{›}Ò ,Ø ”{Ñ "ˆGð �>‰>Ó ˜vŸ{™{›}Ò ,Ø ”{Ñ "ˆGð × Ñ Ó  §¡£Ò 0Ø ”}Ñ $ˆGð × Ñ Ó  &§.¡.Ó"2Ò 2Ø ”}Ñ $ˆGð —o‘oÓ'×-Ñ-Ó/ˆ Ü”vÔ0°+Ó>Ó?ˆà—l‘l“n×*Ñ*Ó,ˆ Ü”vÔ0°+Ó>Ó?ˆà �gÒ Ø ”{Ñ "ˆGô˜  Ö*Ø ”{Ñ "ŠGðC ðF €Nrcón—|du|duk(rd}tj|«‚|j«jjj }|j j}|jjj}tj}|€ |j}|d}|d} t«} t«} |D]o} | d} || «}|� || vs|| k\rŒ| j|«|||«|k(rŒ:t|| «xsg«j!|«sŒ_| j|«Œq| S)z·return the set of pre-existing revisions obsoleted by a transaction Either the transaction or changes item of the transaction (for hooks) must be provided, but not both. Ns.exactly one of tr and changes must be provideds obsmarkerss origrepolenr)r ÚProgrammingErrorrkrlrmÚget_revÚ _phasecacheÚphaser=rerRr ÚpublicÚchangesrPrSrr)rÚtrrÏÚeÚtorevrÍÚ succsmarkersrÎÚ addedmarkersÚ origrepolenÚseenrevsÚ obsoletedrar�r¦s rÚ getobsoletedrØæs'€ð ˆdˆ ˜ 4˜Ò(Ø =ˆÜ×$Ñ$ QÓ'Ð'Ø �O‰OÓ × 'Ñ '× -Ñ -× 5Ñ 5€EØ × Ñ × "Ñ "€EØ—=‘=×+Ñ+×/Ñ/€LÜ �]‰]€F؀ؗ*‘*ˆØ˜=Ñ)€Lؘ.Ñ)€KÜ‹u€HÜ“€IÛˆØ�A‰wˆÙ�D‹kˆØ ˆ;˜# ™/¨S°KÒ-?Ø Ø� ‰ �SÔÙ ��sÓ ˜vÒ %Ø Ü ‰|˜DÓ!Ò' RÓ (× 1Ñ 1°,Õ ?Ø �M‰M˜#Õ ðð ÐrcóR‡—eZdZdZˆfd„Zd„Zejd„«Zd„Z ˆxZ S)Ú_succszAsmall class to represent a successors with some metadata about itcóJ•—tt|� |i|¤Žt«|_yr)ÚsuperrÚrrPrL)rÚargsÚkwargsÚ __class__s €rrz_succs.__init__ s ø€Ü Œf�dÑ$ dÐ5¨fÒ5Ü“uˆ� rcóZ—t|«}|jj«|_|Sr)rÚrLÚcopy)rÚnews rráz _succs.copy s$€Ü�T‹lˆØ—l‘l×'Ñ'Ó)ˆŒ ؈ rcó—t|«Sr)rPrs rÚ_setz _succs._sets€ô�4‹yÐrcóL—|jj|j«Sr)rärrr"s rÚcanmergez_succs.canmerges€Ø�y‰y×!Ñ! %§*¡*Ó-Ð-r) r7r8r9r:rrár Ú propertycacheräræÚ __classcell__)rßs@rrÚrÚs/ø„ÙKôòð  ×Ññóðö.rrÚcó¤—|jj}|g}t|«}|€i}|�r!|d}||vxs|xr ||k7xr||v}||vr!|j|j ««�nÞ|r||vrt |f«g||<�nÆg||<�n¿t ||«D]A} | dD]4} | |vsŒ| |vrg|| <Œ|j| «|j| «nŒ@�nng} t ||«D]À} t «} | jj| «| g} | dD]}} g}| D]o}|| D]e}|j«}|jj|j«|D]}||vsŒ|j|«Œ|j|«ŒgŒq|sŒ||} Œ| j| «ŒÂg}g}td„| D«td¬«}|D]c}|D]:}|j|«sŒ|jj|j«ŒA|j|«|j|«Œe|j!«|||<|r�Œ!||S)a� Return set of all latest successors of initial nodes The successors set of a changeset A are the group of revisions that succeed A. It succeeds A as a consistent whole, each revision being only a partial replacement. By default, the successors set contains non-obsolete changesets only, walking the obsolescence graph until reaching a leaf. If 'closest' is set to True, closest successors-sets are return (the obsolescence walk stops on known changesets). This function returns the full list of successor sets which is why it returns a list of tuples and not just a single tuple. Each tuple is a valid successors set. Note that (A,) may be a valid successors set for changeset A (see below). In most cases, a changeset A will have a single element (e.g. the changeset A is replaced by A') in its successors set. Though, it is also common for a changeset A to have no elements in its successor set (e.g. the changeset has been pruned). Therefore, the returned list of successors sets will be [(A',)] or [], respectively. When a changeset A is split into A' and B', however, it will result in a successors set containing more than a single element, i.e. [(A',B')]. Divergent changesets will result in multiple successors sets, i.e. [(A',), (A'')]. If a changeset A is not obsolete, then it will conceptually have no successors set. To distinguish this from a pruned changeset, the successor set will contain itself only, i.e. [(A,)]. Finally, final successors unknown locally are considered to be pruned (pruned: obsoleted without any successors). (Final: successors not affected by markers). The 'closest' mode respect the repoview filtering. For example, without filter it will stop at the first locally known changeset, with 'visible' filter it will stop on visible changesets). The optional `cache` parameter is a dictionary that may contains precomputed successors sets. It is meant to reuse the computation of a previous call to `successorssets` when multiple calls are made at the same time. The cache dictionary is updated in place. The caller is responsible for its life span. Code that makes multiple calls to `successorssets` *should* use this cache mechanism or risk a performance hit. Since results are different depending of the 'closest' most, the same cache cannot be reused for both mode. rGrc3ó&K—|] }|sŒ|–—Œ y­wrr;)r~Úss rrz!successorssets..ôsèø€Ð/¡ ˜1ªQ”Q¡ ùs‚ŠT)rJÚreverse)r=rerPÚremoverQrÚrMrTrSrLrárƒÚextendrKr€rærì)rÚ initialnodeÚclosestÚcacheÚ succmarkersÚ toproceedÚ stackedsetrYÚcase2conditionrarbÚ succssetsÚbaseÚmarkssÚ productresultÚprefixÚsuffixÚnewssÚpartrXÚfinalÚ candidatesÚcandÚ seensuccss rÚsuccessorssetsrs‹€ðb—-‘-×*Ñ*€Kð� €Iô�Y“€JØ €}؈ò8 ð$˜B‘-ˆð"¨Ð4ò Ø Ò B˜ ;Ñ.Ò B°7¸d°?ð ð �eÑ à × Ñ ˜iŸm™m›oÖ .Ù à˜$‰ä"(¨'¨Ó"4Ð!5��g“ð"$��g“ôB& k°'Ñ&:Ö;�Ø œ7�CØ %Ò'Ø *Ñ,à)+˜E #šJð &×,Ñ,¨SÔ1Ø&ŸN™N¨3Ô/Ù!ð#ðÚð!<ðH� Ü)¨+°gÑ*>Ö?�Dä!›8�DØ—L‘L×$Ñ$ TÔ*Ø"˜V�FØ# Aœw˜à(*˜ Û&,˜FØ*/°¬* Ø(.¯ © «  Ø %§ ¡ × 4Ñ 4°V·^±^Ô DÛ,2 Dð(,°5Ò'8Ø(-¯ © °TÕ(:ð -3ð !.× 4Ñ 4°UÕ ;ñ+5ð'-ò)Ø%2™Fð 'ð×$Ñ$ VÕ,ð)@ð,�Ø�Ü#Ù/¡ Ó/´SÀ$ô� ó'�DÛ%)˜ ØŸ=™=¨Õ3Ø%×-Ñ-×4Ñ4°T·\±\ÔBÙ!ð&*ð Ÿ ™  TÔ*ØŸ ™  DÕ)ð'ð— ‘ ”Ø!&��g‘ó_ ð` �Ñ Ðrcó6—|j«syt||j«d¬«}|gk(r t«g}|jj }g}|D]—}|r|j |«Œd}|j|j«d«D]@}|drŒ d}t«}|jj|«|j |«ŒB|rŒ|j t««Œ™g}|D] }|j ||jdœ«Œ"|S)zncompute the raw data needed for computing obsfate Returns a list of dict, one dict per successors set NT)rðFr;r)s successorssmarkers) Úobsoleterr�rÚr=rerTrRrLrS) rÚctxÚssetsÚsuccsmapÚfullsuccessorsetsÚssetÚfoundanyraÚvaluess rÚsuccessorsandmarkersr sÿ€ð �<‰<Œ>Øä ˜4 §¡£°TÔ :€Eð �‚{Ü“� ˆð�}‰}×'Ñ'€HØÐÛˆÙ Ø × $Ñ $ TÕ *ðˆHØ Ÿ ™  S§X¡X£Z°Ö4�ؘA“wØ#�HÜ!›8�DØ—L‘L×$Ñ$ TÔ*Ø%×,Ñ,¨TÕ2ð 5ò Ø!×(Ñ(¬«Õ2ð-ð0€FÛ!ˆØ� ‰  d¸¿ ¹ ÑEÕFð"ð €Mrcóh—t|«dk(ryt|«dkDry|d}t|«dk(ryy)a}Compute a changeset obsolescence fate based on its successorssets. Successors can be the tipmost ones or the immediate ones. This function return values are not meant to be shown directly to users, it is meant to be used by internal functions only. Returns one fate from the following values: - pruned - diverged - superseded - superseded_split róprunedródivergedó supersededósuperseded_split©r€)rres rÚ _getobsfater3sB€ô ˆ>Ó˜aÒàÜ ˆ^Ó ˜qÒ Øð$ AÑ&ˆ ä ˆz‹?˜aÒ Ø à&rcó:—|sd}|St|«dk(rd}|Sd}|S)zhReturn the verb summarizing the successorset and potentially using information from the markers rrs rewrittenssplitr)Ú successorsetrLÚverbs rÚ obsfateverbrNs:€ñ ؈ð €Kô ˆ\Ó ˜aÒ Øˆð €KðˆØ €Krcó2—|D�cgc]}|d‘Œ c}Scc}w)z/returns the list of dates for a list of markersr3r;rhs rÚ markersdatesr[s€á!Ó "™'�QˆAˆa‹D˜'Ñ "Ð"ùÒ "s… cóΗ|D�cgc]}t|d«‘Œ}}|D�chc]+}|jd«rtj|d«’Œ-}}t |«Scc}wcc}w)z9Returns a sorted list of markers users without duplicatesr/suser)r0rRrÚtolocalrK)rLrHÚ markersmetaÚmetaÚuserss rÚ markersusersr`sq€á'.Ó/¡w !”4˜˜!™•: w€KÐ/ñ ó áˆDØ �8‰8�GÔ ô ×ј˜g™Õ'Øð ð ô �%‹=Ðùò0ùò s …A 0A"có—|D�cgc]}t|d«‘Œ}}|D�chc]%}|jd«sŒ|jd«’Œ'}}t|«Scc}wcc}w)z>Returns a sorted list of markers operations without duplicatesr/s operation)r0rRrK)rLrHrrÚ operationss rÚmarkersoperationsr"lse€á'.Ó/¡w !”4˜˜!™•: w€KÐ/á+6óÙ+6 4¸$¿(¹(À<Õ:Pˆ�‰�Õ¨;ððô �*Ó Ðùò 0ùòs…A A·Acóh—|j}|j}| xr| }g}|jt||««t |«} | r#|jddj | «z«|r;|D� cgc] } ||| «‘Œ} } |jddj | «z«t |«} |s&|jd¬«} t| «dk(r| | vrd} |s|r%| r#|jddj | «z«t|«}|rŠ|rˆt|«}t|«}||k(r+tj|d «}|jd |z«nBtj|d «}tj|d «}|jd ||fz«d j |«Scc} w) zoBuild a obsfate string for a single successorset using all obsfate related function defined in obsutil s using %só, s as %sT)Ú acceptemptyrNs by %ss%Y-%m-%d %H:%M %1%2s (at %s)s (between %s and %s)r)ÚquietÚverboserTrr"ÚjoinrÚusernamer€rÚminÚmaxr Údatestr)r¥rrerLÚ formatctxr&r'Únormalr›r!ÚsuccÚ fmtsuccessorsrÚ currentuserÚdatesÚmin_dateÚmax_dateÚ fmtmin_dateÚ fmtmax_dates rÚobsfateprinterr7vsœ€ð �H‰H€EØ�j‰j€G؈[Ò & ˜Y€Fà €Dð ‡K�K” ˜J¨Ó0Ô1ô# 7Ó+€JÙØ � ‰ �L 5§:¡:¨jÓ#9Ñ9Ô:ñÙ;EÓF¹:°4™ 4¨¡:Õ.¸:ˆ ÐFØ � ‰ �I § ¡ ¨=Ó 9Ñ9Ô:ô ˜Ó !€Eñ Ø—k‘k¨d�kÓ3ˆ Ü ˆu‹:˜Š?˜{¨eÑ3؈Eá‘6™uØ � ‰ �I § ¡ ¨5Ó 1Ñ1Ô2ô ˜Ó !€Eá ‘Ü�u“:ˆÜ�u“:ˆà �xÒ Ü"×*Ñ*¨8Ð5KÓLˆKØ �K‰K˜  kÑ1Õ 2ä"×*Ñ*¨8Ð5KÓLˆKÜ"×*Ñ*¨8Ð5KÓLˆKØ �K‰KÐ/°;À Ð2LÑLÔ Mà �8‰8�D‹>Ðùò=GsÁ4F/shidden revision '%s' is pruneds!hidden revision '%s' has divergeds)hidden revision '%s' was rewritten as: %ss%hidden revision '%s' was split as: %ss1hidden revision '%s' was split as: %s and %d more)rrrrósuperseded_split_severalcóð—t||j««}t|«}|dk(r td|zS|dk(r td|zS|dk(rt |dd«}td||fzS|dk(r†g}|dD]}|j t |««Œt |«dkrdj|«}td||fzSdj|dd«} t |«dz } || | f} td | zSy) zDreturn a human-friendly string on why a obsolete changeset is hiddenrrrrrr r$Nr8)rr�rÚfilteredmsgtablerrTr€r() rÚchangeidrreÚfateÚsingle_successorr‡Únode_idÚfmtsuccsÚfirstsuccessorsÚremainingnumberrÝs rÚ_getfilteredreasonrB¶s"€ä  c§h¡h£jÓ1€JÜ �zÓ "€Dð ˆyÒÜ  Ñ*¨XÑ5Ð5Ø �Ò Ü  Ñ,¨xÑ7Ð7Ø �Ò Ü  ¨A¡¨qÑ!1Ó2ÐÜ  Ñ.°(Ðr„ÚEFFECTFLAGFIELDr´r¿rÀr»r¶r·r¹Úcompiler’r”rœr¡r±rÈrØrqrÚrr rrrrr"r7r:rBrKr]r;rrÚresrðó å÷÷õõð@ € Ø€ ÷'ñ'óT 'ò Bò )ó:#ó0'ò,(ò wòt*ðT€à€ Ø€ Ø€ Ø€ Ø€ Ø€ Ø€ ð€B‡J�Jˆ{ÓØ€B‡J�Jˆ~ÓØ€B‡J�Jˆ~ÓØ€B‡J�Jˆ{Óð € òHòò òò8)óXô@.ˆTô.ó*eòP-ò`'ò6 ò#ò òò2ñlÐ2Ó3ÙÐ7Ó8ÙÐAÓBÙÐCÓDÙ!"Ø<ó"ñ ÐòHò<ó.,r