^cfxddlZddlZddlmZddlmZddlmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZmZddlmZmZejZejZejZejZejZej Z ej!Z!ej"Z"iZ#ej$e#Z$e$ddZ%e$d d d Z&e$d ddhdZ'e$ddddhdZ(e$ddhdZ)e$ddZ*e$ddZ+e$ddhdZ,e$dd dhd!Z-e$d"d# d$Z.e$d%d&Z/e$d'd(Z0e$d)dhd*Z1e$d+dhd,Z2e$d-dhd.Z3d/Z4e$d0d1Z5e$d2d3Z6e$d4d5Z7e$d6d7Z8e$d8dhd9Z9e$d:d;Z:e$d<d=Z;e$d>d?Z<e$d@dAZ=e$dBdCZ>e$dDdEZ?e$dFdGZ@e$dHdIZAe$dJdKZBe$dLd hdMZCe$dNd dhdOZe$dPdQZDe$dRdSZEe$dTdU dVZFe$dWd dhdXZGe$dYdZZHe$d[d\ZIe$d]d^ZJe$d_d`d dhdaZKe$dbdcZLddZMe#NZOdS)eN)_)bin)colordagopdiffutilencodingerrorminirstobsutilpycompat registrarrevset revsetlangscmutiltemplatefilters templatekw templateutilutil)dateutil stringutilsdate(date[, fmt])ctdt|cxkrdks#ntjtdt |||dtd}d}t|dkrt |||d}|t j|St j||S)zFormat a date. See :hg:`help dates` for formatting strings. The default is a Unix date format, including the timezone: "Mon Sep 04 15:13:13 2006 0700".rs!date expects one or two argumentsrsdate expects a date informationN)lenr ParseErrorrevaldate evalstringrdatestr)contextmappingargsdatefmts 9/usr/lib/python3/dist-packages/mercurial/templatefuncs.pyr"r"3s T    a    q!EFFGGG  Q ,--   D C 4yyA~~'4733 {%%%c***sdict([[key=]value...])s*args **kwargs)argspecctj}|dD]}tj|}|s!t jt d||vs ||dvr$t jt d|zt|||<|fd|d Dtj |S)zvConstruct a dict from key-value pairs. A key may be omitted if a value expression can provide an unambiguous name.argssdict key cannot be inferredskwargss!duplicated dict key '%s' inferredc3DK|]\}}|t|fVdSN evalfuncarg).0kvrr s r$ zdict_..ZsL Aq K! , ,-r%) rsortdictrfindsymbolicnamer rrr,updateitems hybriddict)rr r!datar/r.s`` r$dict_r7Ls =??D ']33  )! , , F"1%C#D#DEE E 99T)_,,"1%I#J#JQ#NOO Ogw22QKKO))++  "4 ( ((r%s)diff([includepattern [, excludepattern]])ctxui)requiresc tdkr!tjtdfd}d}d}t j|}||g|d|d|}d |S) zCShow a diff, optionally specifying files to include or exclude.rs(diff expects zero, one, or two argumentsc|tkr.t|}|r|gSgSr*)rrstrip)isr!rr s r$ getpatternszdiff..getpatternsksG s4yy==7GT!W55;;==A s  r%r8r9rr)matchoptsr%) rr rrresourcer diffalloptsdiffrAjoin)rr r!r@ctxuidiffoptschunkss``` r$rErEas  4yy1}}q!LMMNNN   7F + +C   '5 ) )B#B''H XXiiKKNNKKNN;;(F 88F  r%sextdata(source)sourcecache)r&r:cd|vr!tjtdt|||d}|spt j|d}|r3tjtdtd|ztjtd||ddi}||d}||vr ||}n,tj | |x}||<| | d S) zBShow a text read from the specified extdata source. (EXPERIMENTAL)rKsextdata expects one argumentsempty data source specifiedsdid you mean extdata('%s')?hintrLsextdatar8r%) r rrrrr2rC setdefaultr extdatasourcerepogetrev)rr r!sourcesymcacherGr6s r$extdatarX|sD q!@AABBB $y/ : :F F+DO<<  F"011566<  "1%C#D#DEE E   Wh / / : ::r J JE   7F + +C V}&4SXXZZHHHuV} 88CGGIIs # ##r%sfiles(pattern)cbt|dks!tjtdt |||d}||d}||g}t||}tj ||d|S)zUAll files of the current changeset matching the pattern. See :hg:`help patterns`.rsfiles expects one argumentrr8sfile) rr rrrrCrAlistmatchesrcompatfileslist)rr r!rawrGmfiless r$r_r_s t99>>q!>??@@@ WgtAw / /C   7F + +C 3%A Q E  ''5 I IIr%s1fill(text[, width[, initialident[, hangindent]]])cdt|cxkrdks#ntjtdt |||d}d}d}d}dt|cxkrdkrhnnet |||dtd} t |||d}t |||d }n#t $rYnwxYwtj||||S) zJFill many paragraphs with optional indentation. See the "fill" filter.rs"fill expects one to four argumentsrLr%rsfill expects an integer width) rr rrr evalinteger IndexErrorrfill)rr r!textwidth initindent hangindents r$rfrfs! T    a    q!FGGHHH gwQ 0 0D EJJCII   G . / /    #GWd1g>>J#GWd1g>>JJ    D   eZ D DDs.C CCsfilter(iterable[, expr])c dtcxkrdks#ntjtdt d}tdkrfd}nfd}||S)zsRemove empty elements from a list or a dict. If expr specified, it's applied to each element to test emptiness.rrs#filter expects one or two argumentsrc0|Sr*)tobool)wrr s r$selectzfilter_..selects88GW-- -r%ct|tjs!tjt d|}t|dS)Nsnot filterable by expressionr) isinstancermappabler rr overlaymaptomap evalboolean)rnlmr!rr s r$rozfilter_..selectsja!677 K&q)H'I'IJJJ##GQWWW-=-=>>BwDG44 4r%)rr rr evalwrappedfilter)rr r!iterableros``` r$filter_rzs T    a    q!GHHIII7GT!W55H 4yyA~~ . . . . . . .  5 5 5 5 5 5 5 ??7GV 4 44r%sformatnode(node)ct|dkr!tjtd||d}t |||d}|jr|Stj|S)z;Obtain the preferred form of a changeset hash. (DEPRECATED)rsformatnode expects one argumentr9r) rr rrrCr debugflagrshort)rr r!rHnodes r$ formatnodersw 4yyA~~q!CDDEEE   '5 ) )B gwQ 0 0D |   & &&r%smailmap(author)repoct|dkr!tjtdt |||d}||d}||d}d|vr1|jd}tj ||d<tj |d|S)zNReturn the author, updated according to the value set in the .mailmap filersmailmap expects one argumentrrLrsmailmaps.mailmap) rr rrrrCwvfstryreadr parsemailmapmapname)rr r!authorrWrRr6s r$mailmaprs 4yyA~~q!@AABBB $q' 2 2F   Wh / /E   GW - -Dy  --&3D99j  eJ/ 8 88r%s@pad(text, width[, fillchar=' '[, left=False[, truncate=False]]])s!text width fillchar left truncatecd|vsd|vr!tjtdt|||dtd}t |||d}d}d}d}d|vr]t |||d}t t j|dkr!tjtd d |vrt|||d }d |vrt|||d }|tj t j|z }|d kr+|r)tj t j||| S|d kr|S|r||z|zS|||zzS)z#Pad text with a fill character.stextswidths#pad() expects two to four argumentsspad() expects an integer widthF sfillcharrs%pad() expects a single fill charactersleftstruncater)leftside) r rrrdrrr stripeffectsrur colwidthtrim) rr r!rhrgtruncateleftfillchar fillwidths r$padrsdhd22q!GHHIII  X +,,   E gwW 6 6DH DHdgw[0ABB u!(++ , , 1 1"1%M#N#NOO O$7GT'];;dwk1BCC)%*s  4yyA~~q!?@@AAA'7DG44G WgtAw / /C6  '3777  666:;;uSzz55556s$A;;C 2B<<Cs config(section, name[, default])ch||dj}t||||tS)z5Returns the requested hgrc config option as a string.r9)rCconfig_configrrr r!fns r$rrQs2   '5 ) ) 0B 7GT2z : ::r%s$configbool(section, name[, default])ch||dj}t||||tS)z6Returns the requested hgrc config option as a boolean.r9)rC configboolrrurs r$rrXs2   '5 ) ) 4B 7GT2{ ; ;;r%s#configint(section, name[, default])ch||dj}t||||tS)z7Returns the requested hgrc config option as an integer.r9)rC configintrrdrs r$rr_s2   '5 ) ) 3B 7GT2{ ; ;;r%cVdt|cxkrdks#ntjtdt |||d}t |||d}t|dkr ||||d}||||S|||S)Nrrcs%config expects two or three argumentsrr)rr rrevalstringliteral)rr r!configfn defaultfnsectionnamedefaults r$rrfs T    a    q!IJJKKK  $q'::G WgtAw 7 7D 4yyA~~)GWd1g66xw///x&&&r%sif(expr, then[, else])c4dt|cxkrdks#ntjtdt |||d}|rt |||dSt|dkrt |||dSdS)z?Conditionally execute based on the result of an expression.rrcs!if expects two or three argumentsrrN)rr rrrur)rr r!tests r$if_rvs T    a    q!EFFGGG wa 1 1D 5'7DG444 Ta'7DG444 r%s*ifcontains(needle, haystack, then[, else])cdt|cxkrdks#ntjtdt |||d} t |||d}||||}n#tj$rd}YnwxYw|rt |||dSt|dkrt |||dSdS) zNConditionally execute based on whether the item "needle" is in "haystack".rcras*ifcontains expects three or four argumentsrrFrN)rr rrrwrcontains)rr r!haystackneedlefounds r$ ifcontainsrs T    a    q!NOOPPP7GT!W55HGWd1g66!!'7F;;   5'7DG444 Ta'7DG444 s.BBBs ifeq(expr1, expr2, then[, else])cjdt|cxkrdks#ntjtdt |||d}t |||d}||krt |||dSt|dkrt |||dSdS)zBConditionally execute based on whether 2 items are equivalent.rcras$ifeq expects three or four argumentsrrrN)rr rrrr)rr r!rrAs r$ifeqrs T    a    q!HIIJJJ gwQ 0 0D wa 1 1E u}}'7DG444 Ta'7DG444 r%sjoin(list, sep)c0dt|cxkrdks#ntjtdt |||d}d}t|dkrt |||d}||||S)z&Join items in a list with a delimiter.rrs!join expects one or two argumentsrr)rr rrrwrrF)rr r!joinsetjoiners r$rFrFs T    a    q!EFFGGG'7DG44G F 4yy1}}GWd1g66 <<& 1 11r%slabel(label, expr)ct|dkr!tjtd||d}t |||d}t |||d}|||S)zApply a label to generated content. Content with a label applied can result in additional post-processing, such as automatic colorization.rslabel expects two argumentsr9rr)rr rrrCrrlabel)rr r!rHthingrs r$rrs  4yyA~~q!?@@AAA   '5 ) )B wa 1 1E gwQ 8 8E 88E5 ! !!r%slatesttag([pattern])ct|dkr!tjtdd}t|dkrt |||d}t j|||S)aThe global tags matching the given pattern on the most recent globally tagged ancestor of this changeset. If no such tags exist, the "{tag}" template resolves to the string "null". See :hg:`help revisions.patterns` for the pattern syntax. rs&latesttag expects at most one argumentNr)rr rrrrshowlatesttags)rr r!patterns r$ latesttagrsk 4yy1}}q!JKKLLLG 4yyA~~WgtAw77  $Wgw ? ??r%slocaldate(date[, tz])c|dt|cxkrdks#ntjtdt |||dtd}t|dkrd}t |||d}t |trtj |\}}|rd}|G t|}nP#ttf$r"tjtdwxYwntj d}tj|d|fS)zIConverts a date to the specified timezone. The default is local date.rrs&localdate expects one or two argumentsrs$localdate expects a date informationNslocaldate expects a timezone)rr rrrr,rqrr parsetimezoneint TypeError ValueErrormakedaterr")rr r!r"tzoffsettz remainders r$ localdatersU T    a    q!JKKLLL  Q 122   D 4yyA~~ '47 3 3 b%  "*"8"<"< Hi    Kr77z* K K K&q)H'I'IJJJ K $&&q)  d1gx0 1 11s C3Ds max(iterable)c Xt|dkr!tjtdt |||d} |||S#tj$r7}td}tjt ||d}~wwxYw)zReturn the max of an iterablersmax expects one argumentrs(max first argument should be an iterablerNN)rr rrrwgetmaxrrr r!kwargsryrrOs r$max_r 4yyA~~q!<==>>>7GT!W55H6w000  666<==uSzz55556 A##B)22B$$B)s min(iterable)c Xt|dkr!tjtdt |||d} |||S#tj$r7}td}tjt ||d}~wwxYw)zReturn the min of an iterablersmin expects one argumentrs(min first argument should be an iterablerNN)rr rrrwgetminrrs r$min_r rrs mod(a, b)ct|dks!tjtdd}t j||||d|dfS)z0Calculate a mod b such that a / b + a mod b == arsmod expects two argumentsc ||zSr*)abs r$zmod..$s Ar%rr)rr rrr runarithmetic)rr r!funcs r$modrs` t99>>q!=>>???  D  %4a$q'2  r%sobsfateoperations(markers)c^t|dkr!tjtdt |||d} t j|}tj|dS#ttf$r$td}tj|wxYw)CCompute obsfate related information based on markers (EXPERIMENTAL)rs&obsfateoperations expects one argumentrs operationrs6obsfateoperations first argument should be an iterable) rr rrr,r markersoperationsr hybridlistrKeyErrorrr r!markersr6errmsgs r$obsfateoperationsr*s 4yyA~~q!JKKLLL'7DG44G'(11&t,???? x '''LMMv&&&'s )A775B,sobsfatedate(markers)c`t|dkr!tjtdt |||d} t j|}tj|ddS#ttf$r$td}tj|wxYw)rrs obsfatedate expects one argumentrsdates%d %d)rr#s0obsfatedate first argument should be an iterable) rr rrr,r markersdatesrrrrrs r$ obsfatedater<s 4yyA~~q!DEEFFF'7DG44G'#G,,&t'xHHHH x '''FGGv&&&'s *A885B-sobsfateusers(markers)cjt|dkr!tjtdt |||d} t j|}tj|dS#tttf$r$td}tj|wxYw)rrs!obsfateusers expects one argumentrsuserrs>obsfateusers first argument should be an iterable of obsmakers) rr rrr,r markersusersrrrrr)rr r!rr6msgs r$ obsfateusersrOs 4yyA~~q!EFFGGG'7DG44G $#G,,&t':::: x ,$$$   s### $s )A77;B2s obsfateverb(successors, markers)cTt|dkr!tjtdt |||d}t |||d} t j||S#t$r$td}tj|wxYw)zFCompute obsfate related information based on successors (EXPERIMENTAL)rs!obsfateverb expects two argumentsrrs.obsfateverb first argument should be countable)rr rrr,r obsfateverbr)rr r! successorsrrs r$rrds 4yyA~~q!EFFGGGWgtAw77J'7DG44G'":w777 '''DEEv&&&'s $A99.B's relpath(path)ct|dkr!tjtd||d}t |||d}||S)zhConvert a repository-absolute path into a filesystem path relative to the current working directory.rsrelpath expects one argumentrr)rr rrrCrpathto)rr r!rRpaths r$relpathrvsi 4yyA~~q!@AABBB   GW - -D gwQ 0 0D ;;t  r%srevset(query[, formatargs...])c* t|dks!tjtdt |d}d fd}t|dkr5d}fd|ddD}|t j|g|R}nKd}|d i} |}|| vr | |}n||}|| |<tj |d | S) z8Execute a revision set query. See :hg:`help revset`.rs$revset expects one or more argumentsrcvtjj|tj}|S)N)lookup) revsetmodrArHlookupfn)exprr^rRs r$queryzrevset..querys3 ODGT)2DT2J2J K K Kqwwr%rNc2g|]}t|Srr+)r-rrr s r$ zrevset..s%III1k'7A66IIIr%rLs revsetcachesrevision)rcachekey) rr rrrrCr formatspecrPrrevslist) rr r!r]rr formatargsrevsrW revsetcacherRs `` @r$rrsH t99q==q!HIIJJJ WgtAw / /C   GW - -D 4yy1}}IIIIIQRRIII uZ*3<<<<==  (33&&~r::  +  s#DD5::D#K   t+ L L LLr%srstdoc(text, style)ct|dkr!tjtdt |||d}t |||d}t j||dgS)zFormat reStructuredText.rsrstdoc expects two argumentsrrsverbose)stylekeep)rr rrrr format)rr r!rgrs r$rstdocr sp 4yyA~~q!@AABBB gwQ 0 0D wa 1 1E >$e:, ? ? ??r%ssearch(pattern, text)c t|dkr!tjtdt |||d}t |||d} t j|}n7#t j$r%tjtd|zwxYw|ttj |j z}|rQtjtdd dt|D|d z||}|stjSd |di}|d t'|dD|tj |tj|d S)zLook for the first text matching the regular expression pattern. Groups are accessible as ``{1}``, ``{2}``, ... in %-mapped template.rssearch expects two argumentsrrs!search got an invalid pattern: %ss2invalid group %(group)s in search pattern: %(pat)ss, c3 K|] }d|zV dS)s'%s'Nr)r-gs r$r0zsearch..s&$L$LQWq[$L$L$L$L$L$Lr%)sgroupspat0c3*K|]\}}d|z|fVdS)s%dNr)r-r>r/s r$r0zsearch..s. F FAuqy!n F F F F F Fr%s{0})tmpl)rr rrrrecompileknownresourcekeyssetr byteskwargs groupindexrFsortedsearchr mappingnonegroupr3 enumerategroups groupdict mappingdict) rr r!patsrcpatre badgroupsrArvs r$rrs 4yyA~~q!@AABBB WgtAw / /C WgtAw / /CN 3 8NNNq!EFFLMMMN))++cU-..//I  C D D**$L$L&:K:K$L$L$LLL     LL  E *')))  A BII F F5<<>>1)E)E F F FFFFIIh"5??#4#455666  #BV 4 4 44s $A994B-sseparate(sep, args...)s sep *argsc#Kd|vr!tjtdt|||d}d}|dD]#}t|||}|s|rd}n|V|V$dS)z,Add a separator between non-empty arguments.sseps&separate expects at least one argumentTr(FN)r rrr)rr r!sepfirstargargstrs r$separater(sTq!JKKLLL WgtF| 4 4C EG}GWc22    EEIII r%sshortest(node, minlength=4)c.dt|cxkrdks#ntjtdt |||d}d}t|dkr%t |||dtd}||d}d|jjz}t||kr|St||kr( t|}ne#tj $r|cYSwxYw tj ||}n3#tj$r|jj}Yntj$r|cYSwxYw|s|S||d} tj||||S#tj$r|cYSwxYw) z1Obtain the shortest representation of a node.rrs'shortest() expects one or two argumentsrras'shortest() expects an integer minlengthrrL)rr rrrrdrC nodeconstantsnodelenrbinasciiErrorrresolvehexnodeidprefixWdirUnsupportedwdirid LookupErrorshortesthexnodeidprefixRepoLookupError) rr r!hexnode minlengthrR hexnodelenr~rWs r$shortestr7s T    a    q!KLLMMM'4733GI 4yy1}}   G 8 9 9      GW - -DT'//J 7||j   W # # w<r>=su 4yyA~~q!DEEFFF gwQ 0 0D gwQ 0 0D t 3r%ssubsetparents(rev, revset)s rev revsetcd|vsd|vr!tjtd||d}t j|||d}t j|||d}t|tjs!tjtd| ||}|j }|rT||d}| di} || vr | |} n2tj ||} | | |<ntj |||} t j|| |S) z@Look up parents of the rev in the sub graph given by the revset.srevsrevsets#subsetparents expects two argumentsrs&subsetparents expects a queried revsetrLssubsetparentswalker)startrev)r rrrCrrdrwrqrtovaluerrPrsubsetparentswalker parentsset) rr r!rRrTqsubsetrrW walkercachewalkers r$ subsetparentsrILshTYd22q!GHHIII   GW - -D  "7GT&\ B BC  '4 ?CCA a. / /Mq!JKKLLL YYw ( (F *C G  (33&&'=rBB +   %FF.tV<???99@?9$I 0&+&+ &+R788EE98E&  66! 6$1UGDDD;;ED; 5HHH<<IH< 4wGGG<<HG< ' ' ' '(( 5 5)( 5;<<55=<5(122 5 532 5 !! 2 2"! 2#ug666""76""%&&@@'&@"&''22('2@ 6 6  6 6 6  6l   +,,''-,'"%&&'''&'$&''$$('$(122''32'"'333  43 /7H:MNNNMMONM<$%% @ @&% @&''#5#5('#5L'>>>?>&,7JKKK))LK)X%&&  '& 677OO87O,*++  ,+ ! x  ??  ?D011218  r%