o ]Lb @sPddlmZddlZddlZddlZddlmZddlmZm Z ddl m Z ddl m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlm Z m!Z!ej"rudd l#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)e$e%e&e'e)fD]Z*e*stJqnd d Z+d d Z,       dWddZ-Gddde.Z/ddZ0Gddde.Z1Gddde1Z2Gddde1Z3ddZ4ddZ5dXd d!Z6dYd"d#Z7e j8Gd$d%d%e.Z9d&d'Z:d(d)Z;d*d+Zd1d2Z?d[d3d4Z@d5d6d7d8d9d:d;d ZAd?d@ZBdAdBZCdCdDZDdEdFZEdGdHZFdIdJZGdKdLZHd\dMdNZIdOdPZJdQdRZKdSdTZLdUdVZMdS)])absolute_importN)_)nullrevwdirrev)attr)dagoperror formattergraphmodmatchmdiffmergepatchpathutilpycompatrevset revsetlangscmutilsmartset templatekw templaterutil)dateutil stringutil)AnyCallableDictOptionalSequenceTuplecCsZ|d}|r)zt|}Wntyttdw|dkr'ttd|Sd}|S)z0get the log limit according to option -l/--limitslimits limit must be a positive integerrslimit must be positiveN)getint ValueErrorr InputErrorr)optslimitr'6/usr/lib/python3/dist-packages/mercurial/logcmdutil.pygetlimit:s   r)c Cs|}|jddrg|tkrgddlm}||}| | |j ddid/|j t j ||dWd n1sHwYWd |SWd |S1s`wY|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+wctxr'r'r( diff_parentIs,        r;Fc! s| r t|j|| ndd}dd}fdd}dkrvtj|dd}||}d 7|D]}|sJt d ||||fq4tj |gd d }t ||}|}|j d dpi|j d dfdd}|||}|r|jddd}d}s| }s|t||}|j||||||| d|dusr|p}|rtjt|dgttD]}||qnC|rtjt|dn tjdd|drfdd}tt|D]}|qnD] \}}j||dq|}t||D]L\}}|}z|dur+|j |d}Wn t!y8d}Ynwt "||}|j#$|} | sV|%|sVt&|rc|j||||||| dqdS) zshow diff or diffstat.r<NcsfddS)Ncs |SNr')xfgr'r(~s z1diffordiffstat..compose..r'r?r'r?r(compose}zdiffordiffstat..composecs t|Sr=) posixpathjoinr@)prefixr'r(pathfns zdiffordiffstat..pathfnT)legacyrelativevalue/s(warning: %s not inside relative root %s spath)patsdefaultsdevels all-warningss check-relrootcs.r|std|f|tdS)Ns%file %s doesn't start with relroot %s) startswithAssertionErrorlenrG) checkrootrelrootr'r( relrootpathfns  z%diffordiffstat..relrootpathfnrF)r+noprefixP)r%rIcopysourcematch hunksfilterfn)widthc[s|Sr=r')chunkskwargsr'r'r(rBz diffordiffstat..)r%c3s$D] \}}j||dVqdS)Nlabelr\)chunkr])rYr/r'r(gens zdiffordiffstat..genr\r)changesstatfprH)'r canonpathrootgetcwdr getuipathfnfilesrNwarnrr matchmodintersectmatchersr/r0copyplain termwidthdiffcanwritewithoutlabelsrdiffstatr iterlines filechunkiter chunkbufferwrite diffstatui difflabelcanbatchlabeledwritesnode itersubrepossubstateKeyError subdirmatcherwvfsreljoinexactany)!r/r.diffoptsctx1ctx2r r`rarb graphwidthrHrd listsubreposrWrVrCrIuipathfn uirelroot matchroot relrootmatchrSrXoutr^r_r]node2subpathsub tempnode2submatch subprefixr')rQrYrHrRr/r(diffordiffstatfs                rc@s*eZdZdZddZddZd dd Zd S) changesetdifferzBGenerate diff of changeset with pre-configured filtering functionscCst|Sr=)rmatchallr.selfr9r'r'r(_makefilematcherrDz changesetdiffer._makefilematchercCsdSr=r'rr'r'r(_makehunksfilterz changesetdiffer._makehunksfilterrFc Cs2t|||t||||||||d dS)N)r rarrW)rr.r;rr)rr/r9rrrar'r'r(showdiffs zchangesetdiffer.showdiffN)rF)__name__ __module__ __qualname____doc__rrrr'r'r'r(rs rcCsZdd|g}|r|d|r(|d|D] }|d|qd|S)Ns log.changesets changeset.%sschangeset.obsoleteschangeset.unstablesinstability.%s )phasestrobsoleteappend isunstable instabilitiesrF)r9labels instabilityr'r'r(changesetlabelss    rc@sVeZdZdZdddZddZdd Zdd d Zd d ZddZ ddZ dddZ dS)changesetprinterz9show changeset information when templating not requested.NFcCsr||_||_||_|p t|_t|||_|o|d|_ |o$|d|_ i|_ i|_ d|_ d|_t|_dS)Nsstatspatch)r/r.bufferedr_differr diffallopts _diffoptsr! _includestat _includediffheaderhunk lastheaderfooterr getlogcolumns_columns)rr/r.differrrr'r'r(__init__ s zchangesetprinter.__init__cCsl|}||jvr |j|}||jkr||_|j||j|=||jvr4|j|j||j|=dSdSr=)r2rrr/rtr)rr9r2hr'r'r(flushs      zchangesetprinter.flushcCs|jr |j|jdSdSr=)rr/rtrr'r'r(close&szchangesetprinter.closecKsVt|}|jr"|jjdd|||||j|j|<dS||||dS)NT)labeled) r byteskwargsrr/ pushbuffer_show popbufferrr2)rr9copiespropsr'r'r(show*s zchangesetprinter.showcCs|}|dd}|jjr|jjdt|dddS|j}|jj|dt|t|d| }|dkrE|jj|d |d dt |j j D]!\}} |d krUqL| |j |D]} |jj| j| d | jdq\qL|jjr|jj|d |ddt|j |D]} d| } |jj|dt| | dq|jjr|} | dur|j jj} t}n|j j| }|jj|dt|j|| dd|jj|d|dd|jj|dt|dd|r|}|jj|dd |ddn |!r|"||#||jjrE|$%|}t&gd|j'|j(|j)gD]\}}|rB|jj||d |ddq,n|*r`|jj+r`|jj|dd |*dd|r~|jj+r~dd |D}|jj|d!d |d"d|,}|r|jjrt-|.D]\}}|jj|d#|t/0|fd$dq|12}|r|jj+r|jjt3d%d&d|jj|d&d|jd'n|jj|d(|4dd)d|jd*|5||dS)+(show a single changeset or file revision graphwidthrs%s slog.noder\N 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.filescSsg|]}d|qS)s%s (%s)r'.0cr'r'r( z*changesetprinter._show..copiessui.note log.copiesextrasui.debug log.extras description: sui.note log.descriptions ssummarys log.summary )6rxr!r/quietrtrformatchangeidrrbranchr iteritemsr.nameslogfmt colorname debugflagrmeaningfulparents manifestnode nodeconstantswdiridr manifestlogr2 formatrevnodeuserrdatestrdaterrrFr _showobsfate_exthookr6statuszipmodifiedaddedremovedrgverboseextrasorteditemsr escapestr descriptionstripr splitlines _showpatch)rr9rr changenodercolumnsrnsnamensnamepctxr]mnodemrevrrgkeyvaluerrr'r'r(r3s             zchangesetprinter._showcCslt|jj|j}tj|jjdtj|d}|d|i}|r2|D]}|jj |j d|ddq"dSdS)Ns{join(obsfate, " ")}defaults resourcesctxsobsoletes log.obsfater\) r templateresourcesr.r/ maketemplaterrkeywords renderdefaultrrtr)rr9trestobsfate obsfateliner'r'r(rs  zchangesetprinter._showobsfatecCdS)z.empty method used by extension as a hook pointNr'rr'r'r(rr[zchangesetprinter._exthookrcCsx|jr|jj|j||j|dd|jr|jr|jd|jr,|jj|j||j|dd|js2|jr:|jddSdS)NTrarF)rrrr/rrrt)rr9rr'r'r(rs   zchangesetprinter._showpatchNNFr=)r) rrrrrrrrrrrrr'r'r'r(r s   xrc@s,eZdZdZ d ddZddZdd ZdS) changesetformatterz1Format changeset information by generic formatterNFcCs0t||||||tj||dd|_||_dS)NT)git)rrrdifffeatureoptsr_fm)rr/r.fmrrrr'r'r(rs zchangesetformatter.__init__cCs|jdSr=)rendrr'r'r(rrDzchangesetformatter.closec sl|jj|djt|t|d}|j j r)|s)dSj| | | ||j|ddj|ddjfdd|Dd dd |j jsgd |vrwj|ps|jjjd |j jsd |vrj|d|j jsd|vsd|vsd|vr||}jj|jddj|jddj|j ddd|j j o|j j!}|sd|vr׈jj|"ddd|r|sd|vrjj|pidddd|j#sd|vr|j $|j%j&|j ||j'ddj|j (d|j)sd|vr4|j $|j%j&|j ||j'd dj|j (d!dSdS)"rr9)r2rxNbookmark)rstagcsg|] }|qSr')hexfuncrxrrr'r(rz,changesetformatter._show..snode)rphaserrdesc bookmarkstagsparentsr)manifestr)rsmodifiedsaddedremovedsfile)rrrr)rgrsnamessource)rrrsdiffstatTr )rpr*F)rn)*r startitemr+datarintrevrbinnodedatahintr/rrrr formatdaterr formatlistrrrrrr.rr formatdictrr6rrrrrrgrrrrrrr)rr9rrr$rgrr'rr(rsl        zchangesetformatter._showr )rrrrrrrr'r'r'r(r s   r cs4eZdZdZ d ddZfddZdd ZZS) 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 s<t||||||t|||_}tj|tj|tjd|_ t |_ j |_ddddj j ddddddi|_jrmd|jjd f|jjd f|jjd fg}|D]\} } |jD]} | | } | rj| |j vrj| |j| <qXqQnfd d |jD} t|j | }|j||jdr|j|j |jdidSdS)N)rrcacheheaderr<footers docheader docfooter separator)Tr<s_verboses_quiets_debugcsg|] }|jkr|qSr')ref)rptmplspecr'r(rNrz/changesettemplater.__init__..)rrr r _tresources loadtemplaterrr defaulttemplr itertoolscount_counterr._tref_partsmapfiler/rrrkeystemplatepartsmapupdatertrender)rr/r.r1rrrr tmplmodesmodepostfixrcur partnamesmr'r0r(r'sL          zchangesettemplater.__init__csB|jdr|js d|_|j|j|jdi7_tt|S)Nr,r<)r9rrr>superr(rr __class__r'r(rUs zchangesettemplater.closecCs"|}||d<t|j|d<}d|i|d<|dd}|jdr4|dkr4|j|j|jdi|jdr\|j|jd|}|j rN||j | <n|j |kr\||_ |j||j|j }|j|j||||||||jd r|js|j|jd ||_d Sd Sd S) rrsindexrsrevcacherrr-r*r+N)rknextr7r!r9r/rtrr>rrr2rr8rrr)rr9rrindexrrrr'r'r(r\s.         zchangesettemplater._showr )rrrrrrr __classcell__r'r'rFr(r(s  .r(cCs&|r|rJ|rtd|St|S)Nr)r mapfile_templatespecliteral_templatespec)tmplr:r'r'r( templatespecs   rNcCs|s|s|dd}|rtt|St|dd}|sF|rF|}d}tj |ds?t d|p8t |\}}|r?|}t d||St |d|S) zqFind the template matching the given template spec or style See formatter.lookuptemplate() for details. command-templateslogr,styleNrs map-cmdline.r) configr rLr unquotestringr expandpathospathsplittry_open_templaterKlookuptemplate)r/rMstyler:rbmapnamer'r'r(_lookuptemplates$ r\cCst|}t||||dS)zKCreate a changesettemplater from a literal template 'tmpl' byte-string.)r)r rLr()r/r.rMrspecr'r'r(rs rcCs|||f}t||d|d}|jdvr&|d|}t|||g|RS|js8|js8|js8t||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. stemplaterQ>cborjsonrP) r\r!r.r r rMr:rr()r/r.r%rrpostargsr]rr'r'r(changesetdisplayers   rac@seZdZdZeZeZeZeje e dZ eje e dZ ejddZ eje e dZejddZejddZeje e dZeje e dZeje e dZeje e dZejddZejddZejddZejddZejddZdS)walkoptszgOptions to configure a set of revisions and file matcher factory to scan revision/file history )rMNFrT)rrrrribrLr%revspecFactorylistrbranchesrr no_merges only_mergesprune_ancestorsusers include_pats exclude_patsfollowforce_changelog_traversalfilter_revisions_by_patssort_revisionsr&r'r'r'r(rbs(       rbc Cs.|drd}n |drd}nd}|dr#|ddr d }nd }nd }td*id |d |d|dgd|dgd|dg|dgd|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.topotopodescNrLr%rdsrevrrrgrs only_branchrrrkeywordrh no_mergesri only_mergesrjprunerkrrlsincludermsexcludernrorrqr&r')r!r0rbboolr))r/rLr%rnrqr'r'r( parseoptssZ              r|c sfd}t||j|j\}}|p| o|j}|s|jrV|jrVfdd|D}| D]$}d} |D]} || vr?d} q6| |rHd} }q6| sTt t d|q0nD|jr| D]+}||vrxtj|rod}q]t t d||} | st t d|q]n| D] }|} | sd}q|r| D] } | r| jvrnqd}|||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 Ncsg|]}|qSr'r')rrr.r'r(r7rz _makematcher..FTs>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")r matchandpatsrLr%anypatsalwaysrornrdrghasdirr StateErrorrrUrVexistswjoinfilestore) r.revswoptsr:r rLslowpath startctxsr@foundrfilelogrVr'r~r( _makematcherst          rcsjg|D]}|fdd|Dqifdd}fdd}tj|dd|fS) Nc3s|] }|VqdSr=) introfilectx)rr@rr'r( zsz!_fileancestors..cstt|gSr=)r matchfilesr!r"r)fcacher.r'r( filematchersz#_fileancestors..filematcherc3s6tjdD]\}}dd|D|<|VqdS)N followfirstcSsg|]}|qSr')rVrr'r'r(rrz2_fileancestors..revgen..)rfilectxancestors)r2cs)rfctxsrr'r(revgens z_fileancestors..revgenF)iterasc)extendwalkr generatorset)r.rr rr}rrr')r9rrrr.r(_fileancestorsvs rcCr )zDhook for extensions to override the filematcher for non-follow casesNr')r.rLr%r'r'r(_makenofollowfilematchersr.c CsDz t||||WStjy!}z tj|jd|jdd}~ww)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.rdrM localaliaser'r'r(rs rc Cs@zt||WStjy}z tj|jd|jdd}~ww)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.rrr'r'r(rs rc CsBzt|||WStjy }z tj|jd|jdd}~ww)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.specsrrr'r'r(rs r)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) rxry _matchfilesrr_patslogrwrzrc sfdd|jD|j|j|j|j|jdd|jDd}|jrR|rRddg}|jD] }| d|q)|j D] }| d|q6|j D] }| d |qC||d <n |jr_|j s_t |j|d <g}tt|D]9\}}|soqht|\} rd vr| qh| s| t|qhrfd d|D}| t| |qh|jr| tddd|jD|rdd|d}|Sd}|S)z?Return a revset string built from log options and file patternscsg|] }d|qSsliteral:) lookupbranch)rbr~r'r(rrz_makerevset..cSsg|]}d|qSrr'rvr'r'r(rr)rrrwrxryrzrsr:s d:relpathsp:si:sx:rr%csg|]}t|qSr')r formatspecr)revopr'r(rsrcSsg|]}t|qSr')rformat_bookmark_revspecrr'r'r(rs(s and )N)rgrrrhrirjrkrprLrrlrmrnrfrrr_opt2logrevsetrrrrF) r.rrr% matchargsr/expropvallistopr')r.rr( _makerevsetsV         rcCsb|jr t||j}|S|jr|j|jkrt}|S|jr&|d}|St |}| |S)z>Return the initial set of revisions to be filtered or followedr) rdrrndirstater6nullidrbasesetrspansetreverse)r.rrr'r'r( _initialrevss   rcslt||}|s tdfSt|||\}}tj||d}d}|jrJ|s(r4tj |||jdkd}n|j r9Jt |||jdkd\}}| |durVt ||j|j}|dur`fdd}t|||}|jr|jdvspJ|jdkr|st||jj}tjt|d d }n|s|s|jd d |rtd|}|||}|jdur|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)rLrrcsSr=r'rr r'r(r)rzmakewalker..filematcher>rvruruT)istoporr)rrrrrevolvernrr revancestorsrorrrrLr%rrqrtoposort changelog parentrevsrrf isdescendingsortr r&slice)r.rrrLrrrmatcherr'rr( makewalker sD            rcCs.t||\}}|s |dfSt}||_||fS)zvReturn (revs, differ) where revs is a smartset differ is a changesetdiffer with pre-configured file matcher. N)rrr)r.rrrrr'r'r(getrevs@s rc Csg}|dgD]S}z |dd\}}Wnty$ttd|wz tt|d\}}WntyAttd|wtd|}t |d||}| |t ||fq|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"rWrparsefollowlinespatternrrprocesslinerange) r.r%linerangebyfnamepat linerangefromlinetolinemsgfnamer'r'r(_parselinerangeoptNs(    rcsd}it|D]B\}\}}||vrttd|||}t|||D]"\}}|} | dur8t} | |vr=q* | i | g |q*q ddfdd} fdd} t d d } t } | | _| | _t| | 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. NrcSs|Sr=r')fctxhunksr'r'r(nofilterhunksfnrz)getlinerangerevs..nofilterhunksfncs,t|durSfdd}|S)Nc3sr|}|dur/|D]\}dur|fVqtfdd|Dr,|fVqdS|D]}|Vq1dS)Nc3s$|] }tdd|VqdS)rrN)r hunkinrange)rlrhrr'r(rs"zJgetlinerangerevs..hunksfilter..filterfn..)r!rVr)rr linerangeslinesrfctxlinerangesrr(filterfns   z7getlinerangerevs..hunksfilter..filterfn)r!rr")r9r)linerangesbyrevrrr( hunksfilters   z%getlinerangerevs..hunksfiltercs"tt|g}t|Sr=)rfr!rr"r)r9rg)rr.r'r(rs z%getlinerangerevs..filematcherTr)rr rrfilectxrblockancestorsintrorevr setdefaultrVrrrrrrr)r.userrevsr%r:rrrrrr2rrrrr')rrr.r(getlinerangerevsfs6       rcs`|dd}|s tjSt|}t|tr|j}nt |}tj ||tj |dfdd}|S)NrOs graphnodercs||d}|S)N)rsrepo)r)r.r9r)rtemplr'r( formatnodes  z'_graphnodeformatter..formatnode) rRr getgraphnoderrS isinstancer(r2r rrr)r/ displayerr]rrr'rr(_graphnodeformatters      rc Cst|pi}t||}t}|j} |dr| t| dn.tjtj tj d} | D]\} } | dd| | | | | <| | sEd| | <q,| dd|_i} |D]b\}}}}|||| }|rc||nd}||||||}t|}|d}|j|f||dt||j|d }|d s|d =||t|g|D]\}}}}t||||||g}qqQ|dS) Nrs|)rs grandparentsmissingrts graphstyle.%ss graphshortenrr)rrr)rr asciistatestylesrlr=dictfromkeysPARENT GRANDPARENT MISSINGPARENTrrRr0 graphshortenrHrr strkwargsrpoprWrr5chainasciir)r/r.dagredgefn getcopiesrrstater edgetypesrrformatnode_cacher2typer9rcharredges firstedgerXrcoldatar'r'r( displaygraphsR     rcCs$t||}t||||tj|dSr=)r dagwalkerr asciiedges)r/r.rr getrenamedrevdagr'r'r(displaygraphrevss rcCsF|D]}||}|r||nd}|j||d||q|dS)Nr)rrr)r/r.rrrr2r9rr'r'r( displayrevss   rcCs8dD]}||vr||rttd|ddqdS)N)s newest_firsts+-G/--graph option is incompatible with --%s_-)r r$rreplace)rLr%rr'r'r(checkunsupportedgraphflagss r!cCs0t|}||dur|d|}t||Sr=)r)rr nodes)r.r"r%r&r'r'r( graphrevss   r#)NFNrr<r<FN)F)NF)rNr=)NN)N __future__rr5rUrEi18nrrxrr thirdpartyrr3rr r r r rir rrrrrrrrrrrutilsrr TYPE_CHECKINGtypingrrrrrr rr)r;robjectrrrr r(rNr\rrasrbr|rrrrrrrrrrrrrrrrrr!r#r'r'r'r(s   L  $  GMc  -,W    ;3@ /