^c# bddlZddlZddlZddlmZddlmZmZddlm Z ddl m Z m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZddlmZmZej rddl!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'e"e#e$e%e'fD]Z(e(sJd Z)d Z* d;d Z+GddZ,dZ-GddZ.Gdde.Z/Gdde.Z0dZ1dZ2dd"Z;d#Zd/Z?d0Z@d1ZAd2ZBd3ZCd4ZDd5ZEd@d6ZFd7ZGd8ZHd9ZId:ZJdS)AN)_)nullrevwdirrev)attr)dagoperror formattergraphmodmatchmdiffmergepatchpathutilpycompatrevset revsetlangscmutilsmartset templatekw templaterutil)dateutil stringutil)AnyCallableDictOptionalSequenceTuplec|d}|rh t|}n/#t$r"tjt dwxYw|dkr!tjt dnd}|S)z0get the log limit according to option -l/--limitslimits limit must be a positive integerrslimit must be positiveN)getint ValueErrorr InputErrorr)optslimits 6/usr/lib/python3/dist-packages/mercurial/logcmdutil.pygetlimitr)9s HHX  E  KJJEE K K K"1%H#I#IJJ J K A::"1%>#?#?@@ @  Ls ),Ac|}|jddr|t krddlm}||}| | |j ddid5|j 5tj ||d d d n #1swxYwYd d d n #1swxYwY|S| S) zget the context object to use as parent when diffing If diff.merge is enabled, an overlayworkingctx of the auto-merged parents will be returned. diffsmerger)context)uis forcemerges#internal:merge3-lie-about-conflictss merge-diff)wcN)repoui configboolp2revrr,overlayworkingctxsetbasep1configoverridesilentr)ctxr/r,wctxs r( diff_parentr<Hs 88::D w'8,,71J1J((.. SVVXX W # #:     / /!! / / CFFHH.... / / / / / / / / / / / / / / / / / / / / / / / / / / / / / / vvxxs6?D%)D D%D D%D D%%D),D)Fc  !"#| r.tj|j|| #nd#d}d} fd}#dkr t j|d}||#}#dz #|D]P}|#s9td||||fzQt j |#gd }tj ||}|}|j d d p|j d d !!#fd}|||}|rd|dd}d}s| z }#s|t j||}|||||||| "|rn|p}|r)t)jt-j"|g"t-jt-j"D]}||n|r)t)jt-j"|"nt)jd"|"rM"fd}t-jt-j|D]}|n"D]\}}|||}t j||D]\}}|} ||j |d}n#tB$rd}YnwxYwtj"||}|j#$ |} | s6|%|s!tM|r|||||||| dS)zshow diff or diffstat.r=NcfdS)Nc,|SN)xfgs r(z1diffordiffstat..compose..}s11Q44r=rB)rDrEs``r(composezdiffordiffstat..compose|s      r=c.tj|SrA) posixpathjoin)rDprefixs r(pathfnzdiffordiffstat..pathfns~fa(((r=T)legacyrelativevalue/s(warning: %s not inside relative root %s spath)patsdefaultsdevels all-warningss check-relrootcr)|std|fz|tdS)Ns%file %s doesn't start with relroot %s) startswithAssertionErrorlen)rD checkrootrelroots r( relrootpathfnz%diffordiffstat..relrootpathfnsS g!6!6 $<7|KS\\^^$ $r=rF)r,noprefixP)r&rLcopysourcematch hunksfilterfn)widthc|SrArB)chunkskwargss r(rFz diffordiffstat..sr=)r&c3NKD]\}}||VdS)Nlabelra)chunkrbr^r0s r(genzdiffordiffstat..gensC$*77LE5((5(66666677r=rar)changesstatfprK)'r canonpathrootgetcwdr getuipathfnfilesrRwarnrr matchmodintersectmatchersr0r1copyplain termwidthdiffcanwritewithoutlabelsrdiffstatr iterlines filechunkiter chunkbufferwrite diffstatui difflabelcanbatchlabeledwritesnode itersubrepossubstateKeyError subdirmatcherwvfsreljoinexactany)$r0r/diffoptsctx1ctx2r rerfrg graphwidthrKri listsubreposr[rZrGrLuipathfn uirelroot matchroot relrootmatchrWr\outrcrdrbnode2subpathsub tempnode2submatch subprefixrUr^rVs$` ` @@@r(diffordiffstatres" $TY tDDO!!!)))))#~~&tFFFHVVG__-- 4  I''00 BCCxy 1 122I>? }T 7KKK *5,??&G&& o  < W  *: ; ;  % % % % % %// @==U=;;xxzz 0LLNNZ/E @WW066??F YY   '#F ~1133~hB  KnT^F%;%;5IIIJF'(8(@(@AA  E IIe       %dnV&<&g)>)>$?h)?)?   "022 r=c2|}||jvrA|j|}||jkr!||_|j||j|=||jvr/|j|j||j|=dSdSrA)r3rrr0ryr)rr:r3hs r(flushzchangesetprinter.flushsggii $+   C ADO##"# a    C $)   GMM$)C. ) ) ) #  r=cV|jr!|j|jdSdSrA)rr0ryrs r(closezchangesetprinter.close%s2 ; ' GMM$+ & & & & & ' 'r=c 8tj|}|jrg|jd|||||j|j|<dS||||dS)NT)labeled) r byteskwargsrr0 pushbuffer_show popbufferrr3)rr:copiespropss r(showzchangesetprinter.show)s$U++ = + G  t  , , , JJsFE * * *#'7#4#4#6#6DIcggii JJsFE * * * * *r=cB |}|dd}|jjr3|jdt j|zddS|j}|j|dt j|zt|| }|dkr%|j|d |zd |j j D]V\}} |d kr | |j |D].} |j| j | zd | jz/W|jjr7|j|d |zdt j|j |D]P} d| z} |j|dt j| z| Q|jjr|} | |j jj} t*}n|j j| }|j|dt j|j|| zd|j|d|zd|j|dt5j|zd|rM|}|j|dd|zdn)| r|!||"||jjrtGgd|$|%|&gD]?\}}|r8|j||d|zd@nj|'rV|jj(rJ|j|dd|'zd|rP|jj(rDd|D}|j|d d|zd!|)}|rl|jjr`tU| D]>\}}|j|d"|tWj,|fzd#?|-.}|r|jj(r`|jt_d$d%|j|d%|jd&n7|j|d'tWj0|zd(|jd)|1||dS)*(show a single changeset or file revision graphwidthrs%s slog.noderaN changesetsdefaultbranchs log.branchsbranchesslog.%ssphases log.phaseslog.parent changeset.%sparentmanifestsui.debug log.manifestuserslog.userdateslog.dates instabilitys, slog.instability)filessfiles+sfiles-rsui.debug log.filesrsui.note log.filescg|]}d|zS)s%s (%s)rB.0cs r( z*changesetprinter._show..s555j1n555r=copiessui.note log.copiesextrasui.debug log.extras description: sui.note log.descriptions ssummarys log.summary )2r}r"r0quietryrformatchangeidrrbranchr/namesitemslogfmt colorname debugflagrmeaningfulparents manifestnode nodeconstantswdiridr manifestlogr3 formatrevnodeuserrdatestrdaterrrJr _showobsfate_exthookzip filesmodified filesadded filesremovedrlverboseextrasortedr escapestr descriptionstripr firstline _showpatch)rr:rr changenodercolumnsrnsnamensnamepctxrbmnodemrevrkeyvaluerrs r(rzchangesetprinter._show2sXXZZ YY}a00 7=  GMM'0555[     F-  L !G$:3$?$? ?!#&&     Z   GMM'),v5]M K K K)///11 P PJFB$$J77 P P bi$.i",6N OOOO P 7   GMM!CLLNN2,    -di==  D.@E GMM "W%;D%A%AA      7  $$&&E} /6y,0077 GMM $'u==>.      gg&3; GGG  G x/ ;; ;;     >>   #--//M GMM'%**]*C*CC(      \\^^ #   c " " " c 7  !000""$$cnn&6&68H8H8J8JK   UGMM tyy'7'773"  YY[[ TW_  GMM!DIIciikk$:$::*      dgo 55f555F GMM "TYYv%6%66+        TW& $U[[]]33   U H%j.B5.I.I(JJ/ oo''--//  w  '((0J k1K LLL g&&&& J'**>{*K*KK(  e Z(((((r=c^tj|jj|j}tj|jjdt j|}|d|i}|r/|D].}|j |j d|zd-dSdS)Ns{join(obsfate, " ")}defaults resourcesctxsobsoletes log.obsfatera) r templateresourcesr/r0 maketemplaterrkeywords renderdefault splitlinesryr)rr:trestobsfate obsfatelines r(rzchangesetprinter._showobsfates*49<CC  # IL $(     //63-00;;==  &    M+.<(    r=cdS)z.empty method used by extension as a hook pointNrBrs r(rzchangesetprinter._exthooksr=rcj|jr)|j|j||j|d|jr!|jr|jd|jr)|j|j||j|d|js|jr|jddSdS)NTrfrF)rrrr0rrry)rr:rs r(rzchangesetprinter._showpatchs    L ! !dnjt "      !!2 ! GMM%    L ! !dnju "      ! 1 ! GMM%  ! !r=NNFrA)r) rrrrrrrrrrrrrBr=r(rrsCC 3 3 3 3   '''++++u)u)u)n$=== ! ! ! ! ! !r=rc(eZdZdZ ddZdZdZdS)changesetformatterz1Format changeset information by generic formatterNFct||||||tj||d|_||_dS)NT)git)rrrdifffeatureoptsr_fm)rr0r/fmrrrs r(rzchangesetformatter.__init__sF !!$D&(HMMM.r8FFFr=c8|jdSrA)r"endrs r(rzchangesetformatter.closes  r=c |j|t j|t j|}|j j r|sdS| | | |||d|dfd|Dd |j jsd |vrL|p|jjj |j jsd |vr;| |j js d|vsd|vsd|vr|d|d|d|j j o |j j}|sd|vr=| d|r|sd|vr.|pidd|j!sd|vrn|j "|j#$|j ||j%d|j &|j'sd|vrp|j "|j#$|j ||j%d|j & dSdS)!r)r:)r3r}Nbookmark)rstagc^g|])}|*SrB)hexfuncr})rrr#s r(rz,changesetformatter._show..s-===!AFFHH%%===r=snode)rphaserrdesc bookmarkstagsparentsr)manifestr)rsmodifiedsaddedremovedsfile)modifiedaddedremovedr)rlrsnamessource)r r rsdiffstatTr)rur+F)rs)(r" startitemr,datarintrevr)binnodedatahintr0rrrr formatdaterr formatlistr,r-r.rrr/rr formatdictrrrrrrlrrrrrrr)rr:rrr9rr#s @r(rzchangesetformatter._shows+ X  s  GN3''bjj9M9M.N.NOOO;;== 7=   F ::<<,,..sxxzz**""mmCMMOO+mFFsxxzz77MM====s{{}}===G"   7   x 7 7 GG$$&&H$)*A*H     7  6H 4 4 GG"-- 44G 5 5 5 G  h&&8##X%% GGs'8'8':':IImmCNN$4$47mCC c&6&6&8&8w GG     g'';DGO  Dh(** GG"-- '-BBG C C C  v h!6!6 GG}}V\rwi}PP       2 x 7 7 G   L ! !$'3T ! J J J GGTW..00G 1 1 1   .8 3 3 G   L ! !$'3U ! K K K GG**,,G - - - - -!4 3r=r)rrrrrrrrBr=r(rrsS;;BG<.<.<.<.<.r=rc2eZdZdZ ddZfdZdZxZS)changesettemplateraformat changeset information. Note: there are a variety of convenience functions to build a changesettemplater for common cases. See functions such as: maketemplater, changesetdisplayer, buildcommittemplate, or other functions that use changesest_templater. NFc nt||||||tj||x|_}tj|t j|t j|_ tj |_ j |_ddddj j ddddddi|_jrWd|jjd f|jjd f|jjd fg}|D])\} } |jD]} | | z} | r| |j vr | |j| <*nZfd |jD} tj|j | }|j||jdr@|j|j |jdidSdS) N)r rcacheheaderr=footers docheader docfooter separator)Tr=s_verboses_quiets_debugc*g|]}|jk |SrB)ref)rptmplspecs r(rz/changesettemplater.__init__..Ks%LLLq!x|:K:K:K:K:Kr=)rrr r _tresources loadtemplaterrr defaulttemplr itertoolscount_counterrF_tref_partsmapfiler0rrrkeystemplatepartsmapupdateryrender)rr0r/rHrrrr tmplmodesmodepostfixrcur partnamesms ` r(rzchangesettemplater.__init__$s !!$D&(HMMM"+"=b$"G"GG4(  ()    ")) \ s s L(, # # #      "+. *"I. I "+ - - g--Ag+C-tv ), A- - MLLLDK$4$4$6$6LLLI*8TVYGGA K  q ! ! ! ;| $ H GMM$&-- L(A2FF G G G G G H Hr=c|jdrB|jsd|_|xj|j|jdiz c_t t |S)NrCr=)rPrrrUsuperr>r)r __class__s r(rzchangesettemplater.closeRsh ;| $ H; "! KK46==\)BBGG GKK'..44666r=c|}||d<t|jx|d<}d|i|d<|dd}|jdrD|dkr>|j|j|jdi|jdrv|j|jd|}|j r||j | <n,|j |kr!||_ |j||j|j }|j|j||||||||jd r4|js/|j|jd ||_d Sd Sd S) rrsindexrsrevcacherrrDrArBN)rpnextrNr"rPr0ryrrUrrr3rrOrrr)rr:rrindexrrr s r(rzchangesettemplater._showYs f "&t}"5"55h%'0kYY}a00 ;| $ H GMM$&-- L(A2FF G G G ;y ! % dk)4e<r>sxHM,H,H,H,H\77777 K K K K K K Kr=r>cd|r|rJ|rtjd|Stj|S)Nr)r mapfile_templatespecliteral_templatespec)tmplrQs r( templatespecrg|s?!!!!4-lGDDD-d333r=c|sh|sf|dd}|r&tjtj|St j|dd}|ss|rq|}d}tj |ds2tj d|zptj |\}}|r|}tj d||Stj |d|S) zqFind the template matching the given template spec or style See formatter.lookuptemplate() for details. command-templateslogr-styleNrs map-cmdline.r) configr rer unquotestringr expandpathospathsplittry_open_templaterdlookuptemplate)r0rfstylerQrgmapnames r(_lookuptemplatervs @@yy-v66  @1)2I$2O2OPP POBIIeX$>$>??E  IE I w}}W%%a( "%7')6,W55 Wb "!-lGRHHH  #B d ; ;;r=cPtj|}t||||S)zKCreate a changesettemplater from a literal template 'tmpl' byte-string.)r)r rer>)r0r/rfrspecs r(rrs+  )$ / /D b$x @ @ @@r=c:|||f}t||d|d}|jdvr%|d|}t |||g|RS|js|js|jst||g|RSt|||g|RS)a_show one changeset using template or regular display. Display format will be the first non-empty hit of: 1. option 'template' 2. option 'style' 3. [command-templates] setting 'log' 4. [ui] setting 'style' If all of these values are either the unset or the empty string, regular display via changesetprinter() is done. stemplaterk>cborjsonrj) rvr"rFr rrfrQrr>)r0r/r&rrpostargsrxr#s r(changesetdisplayerr}sh'H 2txx 44dhhx6H6H I ID  x%%% \\&$ ' '!"dB::::: 85DI5dl5D484444 b$ 8x 8 8 88r=c.eZdZdZejZejZejZejej e Z ejej e Z ejdZ ejej e ZejdZejdZejej e Zejej e Zejej e Zejej e ZejdZejdZejdZejdZejdZdS)walkoptszgOptions to configure a set of revisions and file matcher factory to scan revision/file history )rPNFrT)rrrrribrOr&revspecFactorylistr,branchesrr no_merges only_mergesprune_ancestorsusers include_pats exclude_patsfollowforce_changelog_traversalfilter_revisions_by_patssort_revisionsr'rBr=r(rrs 4799D 4799DdgiiG  T 2 2333Itw|t|D11222H 474 Dtw|t|D11222H&&&I$'%(((Kdgldl4&8&8999O DGLDL.. / / /E47<4<#5#5666L47<4<#5#5666LTWQ   F!( 6 6 6 'twt444TWT***N DGD ! ! !EEEr=rc |drd}n|drd}nd}|dr|ddrd }nd }nd }td*id |d |d|dgd|dgd|dg|dgzd|dd|dgdt|ddt|dd|dgd|d gd!|d"gd#|d$gd%|d&t|d'd(|d)t |S)+zwParse log command options into walkopts The returned walkopts will be passed in to getrevs() or makewalker(). s follow_firstrsfollowrgraph experimentalslog.topotopodescNrOr&rsrevr,r'rrs only_branchrrrkeywordr no_mergesr only_mergesrprunerrrsincludersexcluderrr0rr'rB)r"r1rboolr))r0rOr&rrs r( parseoptsrs8  xx   )   xx ==+ 6 6 %$NN$NN     T  T $$$ ((;+++  )R((488NB+G+GGG XXg    *b))) txx --... .11222 2... hhw### XXj"--- XXj"---  v! "#'txx ';';"<"<"<# $&~% &tnnn' r=c~|d}tj||j|j\}}|p| o|j}|s|jr|jrt| }t|}|} |D][} | snV|| } | D]J} | | vr| | | | r| | d}|} K\|D]*} | |vr$tjt!d| z+n|jr| D]} | |vrYt"j|| rd};tjt!d| z|| } | s$tjt!d| zn0| D]} || } | sd}|r&| D]}|r ||jvrnd}|||fS)a^Build matcher and expanded patterns from log options If --follow, revs are the revisions to follow from. Returns (match, pats, slowpath) where - match: a matcher built from the given pats and -I/-X opts - pats: patterns used (globs are expanded on Windows) - slowpath: True if patterns aren't as simple as scanning filelogs NTs>cannot follow file not in any of the specified revisions: "%s"/cannot follow file not in parent revision: "%s"s$cannot follow nonexistent file: "%s"F)r matchandpatsrOr&anypatsalwaysrrrrrlsetdiscardhasdirr StateErrorrrorpexistswjoinfilestore)r/revswoptsr;r rOslowpath all_files missing_filesrlrr:rDfilelogrps r( _makematcherrs :D&tUZDDKE4}} LLNN>u>  H! << $EM< $U[[]]++I NNME . .E1g . .ACxx%--a0000A.&--a000#' - .   %%*/ & \ $[[]]  D==w~~djjmm44 #' #.!2  ))A,, *ABBQF! .[[]] $ $))A,,$ $H  !  ! !ttz11E 2! $  r=c g |D]>}| fd|D?ifd} fd}tj|d|fS)Nc3LK|]}|VdSrA) introfilectx)rrDr:s r( z!_fileancestors..s3DDqSV((**DDDDDDr=cztjtj|gSrA)r matchfilesr"r7)r:fcacher/s r( filematcherz#_fileancestors..filematchers.!$ 7>#3F3F(K(KLLLr=c3jKtjD]\}}d|D|<|VdS)N followfirstc6g|]}|SrB)rprs r(rz2_fileancestors..revgen..s 00016688000r=)rfilectxancestors)r3csrfctxsrs r(revgenz_fileancestors..revgensV-eMMM  GC00R000F3KIIII  r=F)iterasc)extendwalkr generatorset) r/rr rrrrr:rrs ` ` @@@r(_fileancestorsr|s E EE1g DDDDCHHUOODDDDDDDFMMMMMM  5 9 9 9; FFr=cdS)zDhook for extensions to override the filematcher for non-follow casesNrB)r/rOr&s r(_makenofollowfilematcherrs 4r=.c tj||||S#tj$r+}tj|jd|jd}~wwxYw)zResolves user-provided revset(s) into a single revision. This just wraps the lower-level scmutil.revsingle() in order to raise an exception indicating user error. rhintN)r revsingler RepoLookupErrorr%argsr)r/rrP localaliases r(rrs^ 7 wDDD  777qvayqv66667sA&AAc tj||S#tj$r+}tj|jd|jd}~wwxYw)zResolves user-provided revset(s) into two revisions. This just wraps the lower-level scmutil.revpair() in order to raise an exception indicating user error. rrN)rrevpairr rr%rr)r/rrs r(rrsY 7tT***  777qvayqv66667sA&A  Ac tj|||S#tj$r+}tj|jd|jd}~wwxYw)zResolves user-provided revset(s). This just wraps the lower-level scmutil.revrange() in order to raise an exception indicating user error. rrN)rrevranger rr%rr)r/specsrrs r(rrs\ 7eZ888  777qvayqv66667sA&A  A)s not merge()N)smerge()N)Ns_matchfiles(%ps))sdate(%s)N)s branch(%s)%lr)s filelog(%s)r)s keyword(%s)r)s ancestors(%s)snot %lr)suser(%s)r) rr _matchfilesrr_patslogrrrc fd|jD|j|j|j|j|jd|jDd}|jrr|rpddg}|jD]}| d|z|j D]}| d|z|j D]}| d|z||d <n%|jr|j st|j|d <g}t|D]\}}|st |\ } rd vr| 4| s)| t#j |_ r fd |D}| t#j| ||jr7| t#jd d|jD|rdd|zdz}nd}|S)z?Return a revset string built from log options and file patternsc@g|]}d|zSsliteral:) lookupbranch)rbr/s r(rz_makerevset..s,OOO1K$"3"3A"6"66OOOr=cg|]}d|zSrrBrvs r(rz_makerevset..s777a+/777r=)rrrrrrrsr:s d:relpathsp:si:sx:rr%c:g|]}tj|SrB)r formatspec)rrrevops r(rz_makerevset..s&DDD1z,UA66DDDr=rc6g|]}tj|SrB)rformat_bookmark_revspecrs r(rz_makerevset..s#MMM033MMMr=(s and )N)rrrrrrrrrOrrrrrrr_opt2logrevsetrrr,rJ) r/rrr& matchargsrGexpropvallistoprs ` @r( _makerevsetrsPOOOOOONo)'775;777  D %-(-L)  ( (A   UQY ' ' ' '# ( (A   UQY ' ' ' '# ( (A   UQY ' ' ' '(^  '- - ,,[ D$**,,'' < <C  &r* v  Return the initial set of revisions to be filtered or followedr) rrrdirstater7nullidrbasesetrspansetreverse)r/rrs r( _initialrevsrs }em,, $-**,, ;;!! yy%%  Kr=ct||}|stjdfSt|||\}}t j||}d}|jrs|sr!tj |||jdk}n(|j rJt|||jdk\}}| |t||j|j}|fd}t!|||}|jr|jdvsJ|jdkrW|sBtj||jj}t-jt/|d }n>|s*|s|d |r!t-jd|}|||}|j|d |j}||fS) zBuild (revs, makefilematcher) to scan revision/file history - revs is the smartset to be traversed. - makefilematcher is a function to map ctx to a matcher for that revision N)rOrrcSrArB)r:r s r(rzmakewalker..filematcher/sLr=>rrrT)istoporr)rrrrrevolverrr revancestorsrrrrrOr&rrrtoposort changelog parentrevsrr isdescendingsortr r'slice) r/rrrOrrrmatcherr s @r( makewalkerrs. e $ $D (!!4''(tU;;E4 KD ) ) )EK |  u||~~ %dDela>OPPPDD6 6 6 6 .dEu|q/@!!! D+ .tUZLL       tUH - -D  $#'99999  7 * *;;== ?~dDN,EFF~d4jj>>>##%% $ $ IIdI # # # #,tT**wtT"" {zz!U[))  r=cft||\}}|s|dfSt}||_||fS)zvReturn (revs, differ) where revs is a smartset differ is a changesetdiffer with pre-configured file matcher. N)rrr)r/rrrrs r(getrevsrFsG #4//D+ Tz   F)F <r=c>g}|dgD]} |dd\}}n2#t$r%tjt d|zwxYw t t|d\}}n2#t$r%tjt d|zwxYwt d|z}tj |d||}| |tj ||f|S) zbParse --line-range log option and return a list of tuples (filename, (fromline, toline)). s line_range,rs"malformatted line-range pattern %s:sinvalid line range for %ss3line range pattern '%s' must match exactly one fileN)r"rsplitr$r r%rmapr#rqrparsefollowlinespatternrrprocesslinerange) r/r&linerangebyfnamepat linerangefromlinetolinemsgfnames r(_parselinerangeoptrTsOxx r**    ZZa00NC   "7883>   J"3 (=(=>> Hff J J J"1%A#B#BS#HII I JFGG#M/dCEE D)(F;; <     s7/A&*+B/Ccd}it|D]\}\}}||vr$tjtd|z||}t j|||D]v\}}|} | t} | |vr' | i | g |wdfd} fd} td} t} | | _| | _t!j| | fS)aReturn (revs, differ). "revs" are revisions obtained by processing "line-range" log options and walking block ancestors of each specified file/line-range. "differ" is a changesetdiffer with pre-configured file matcher and hunks filter. Nrc|SrArB)fctxhunkss r(nofilterhunksfnz)getlinerangerevs..nofilterhunksfns r=cjtj|Sfd}|S)Nc3K|}|4|D]/\}|fVtfd|Dr|fV0dS|D]}|VdS)Nc3RK|]!}tjdd|V"dS)rN)r hunkinrange)rlrhrs r(rzJgetlinerangerevs..hunksfilter..filterfn..s8NNR5,RVR88NNNNNNr=)r"rpr)rr linerangeslinesrrfctxlinerangess @r(filterfnz7getlinerangerevs..hunksfilter..filterfns'++DIIKK88J%!&((IBz %i NNNN:NNNNN( %i (("DJJJJr=)r"rr7)r:r#r"linerangesbyrevrs @r( hunksfilterz%getlinerangerevs..hunksfiltersM(,,W^C-@-@AA  !" "     r=cttj|g}tj|SrA)rr"rr7r)r:rlr$r/s r(rz%getlinerangerevs..filematchers=_(()<).formatnodes$t,,""5)))r=) rlr getgraphnoderrm isinstancer>rIr rrr)r0 displayerrxrr0r/s @r(_graphnodeformatterr4s 99)< 8 8D '&&  "4 ( (D)/00/$*2..  # D:.$   E***** r=c |pi}t||}tj}|j} |dr/| t | dntjtj tj d} | D]5\} } | dd| z| | | | <| | sd| | <6| dd|_i} |D]\}}}}|||| }|r ||nd}||||||}t|}|d}|j|f||dt#j||j|d }|d s|d =||t/j|g|D]"\}}}}tj||||||g}#|dS) Nr|)rs grandparentsmissingrs graphstyle.%ss graphshortenr)rrr)r4r asciistatestylesrqrTdictfromkeysPARENT GRANDPARENT MISSINGPARENTrrlr1 graphshortenr`rr strkwargsrpoprqrrLchainasciir)r0r/dagr3edgefn getcopiesrr0stater9 edgetypesrr formatnode_cacher3typer:r.charredges firstedger\r!coldatas r( displaygraphrOs[ KRE$R33J   ! !E \F xxM dmmFD112222 $0 .  #** # #ID#))!1D!8&+F3K#; #"s  ]]?OLL#&T3z$%566#,63$tT5#w77KK !    5  4<4Fu4M4M   ""3''--e44Ry b *3/9+u*M*M   &D$w N2udD% A A AEE OOr=cltj||}t||||tj|dSrA)r dagwalkerrO asciiedges)r0r/rr3 getrenamedrevdags r(displaygraphrevsrUs5  d + +FT69h.A:NNNNNr=c|D]E}||}|r ||nd}|||||F|dS)Nr4)rrr)r0r/rr3rFr3r:rs r( displayrevsrWsq3i#,63$s6*** OOr=cdD]F}||vr@||r8tjtd|ddzGdS)N)s newest_firsts+-G/--graph option is incompatible with --%s_-)r r%rreplace)rOr&rs r(checkunsupportedgraphflagsr\sd ::$r(:"@AA**T4(() r=ct|}|| |d|}tj||SrA)r)rr nodes)r/r^r&r's r( graphrevsr_s? TNNE MMOOO fuf  >$ & &&r=)NFNrr=r=FN)F)NF)rNrA)NN)KrLrorIi18nrr}rr thirdpartyrr4rr r r r rnr rrrrrrrrrrrutilsrr TYPE_CHECKINGtypingrrrrrr rr)r<rrrrrr>rgrvrr}srrrrrrrrrrrrrrr,r4rOrUrWr\r_rBr=r(rfs """"""""&   8T8U 3   H     ~~~~B        .B!B!B!B!B!B!B!B!JI.I.I.I.I.)I.I.I.X`K`K`K`K`K)`K`K`KF444<<<8AAAA99996*"*"*"*"*"*"*"*"Z)))X]!]!]!@GGG0 7 7 7 7 7 7 7 7 7 7 7)&/ &)(, "  888v   000f   0=*=*=*@,,,,,^OOO '''''r=