o ]Lbl@sddlmZddlZddlZddlZddlZddlmZddlm Z m Z ddl m Z ddl mZmZmZmZdd lmZmZmZmZmZmZmZmZm Z mZmZmZmZmZ m!Z!dd l"m#Z#e!$d Z%d}d d Z&ddZ'd}ddZ(Gddde)Z*Gddde*Z+ddZ,d~ddZ-ddZ.ddZ/d}ddZ0d}d d!Z1d"d#Z2d$d%Z3d&d'Z4d(d)Z5d*d+Z6d,d-Z7d.d/Z8d}d0d1Z9d}d2d3Z:dd4d5Z;d6d7Zdd?Z@d@dAZAdBdCZBdDdEZCdFdGheC_DdHdIZEdJdKZFdFdGheF_DdLdMZGdNdOZHdPdQZIdRdSZJdTdUZKdVdWZLdXdYZMdZd[ZNd\d]ZOd^d_ZPddadbZQdcddZRdedfZSdgdhZTdidjZUdkdlZVdmdnZWdodpZXdqdrZYdsdtZZGdudvdvej[Z\Gdwdxdxe jZ]dydzZ^d{d|Z_dS))absolute_importN)_)hexshort)setattr) ErrorResponseHTTP_BAD_REQUESTHTTP_NOT_FOUND paritygen)contextdiffutilerrormatchmdiffobsutilpatchpathutilpycompatscmutiltemplatefilters templatekw templateutiluiutil) stringutil))zip)sapplication/ziprs.zipN)sgz)sapplication/x-gzipstgzs.tar.gzN)sbz2)sapplication/x-bzip2stbz2s.tar.bz2NcCsf|jdddd}g}ttD]\}}||vs!|jdd|ddr-|||d||dqt|S)Nwebs allow-archiveT untrustedsallowr)types extensionnodesurl) configlistr iteritems archivespecs configboolappendr mappinglist)rnodeidurlallowedarchivestypspecr/9/usr/lib/python3/dist-packages/mercurial/hgweb/webutil.py archivelist8s   r1cCsT|dddkr d|}|dddkr|dd}tj|}|dkr&dS|dS)Nrr/)ospathdirname)pupr/r/r0r8Ls  r8ccsv|r+|V|dkr|dkrd}|V|dksJ|dksJ||kr+|d9}||ks# d|Vd|V|d9}q,) N(2r Trr/)step firststepr/r/r0_navseqWs     r@c@s8eZdZddZddZeZddZddZd d Zd S) revnavcCs |j|_dS)zUNavigation generation object :repo: repo object we generate nav for N) changelog_revlog)selfrepor/r/r0__init__hs zrevnav.__init__cCs |duS)z,return True if any revision to navigate overN)_firstrDr/r/r0 __nonzero__ps zrevnav.__nonzero__cCs&ztt|jWStyYdSw)z1return the minimum non-filtered changeset or NoneN)nextiterrC StopIterationrHr/r/r0rGvs  z revnav._firstcCst|j|SN)rrCnoderDrevr/r/r0r}z revnav.hexc Cs@|sttgtgdgSg}td|D]}||kr n||||||q||}d|||dg}g}|D]B} | |jvrNqF|| krX|krknn|dt| ||| dd| kru|krnqF|dt| ||| dqF|dddtt|t|dgS) acomputes label and revision id for navigation link :pos: is the revision relative to which we generate navigation. :pagelen: the size of each navigation page :limit: how far shall we link The return is: - a single element mappinglist - containing a dictionary with a `before` and `after` key - values are dictionaries with `label` and `node` keys )sbeforesafterrs(%i))slabelr"s+%drs-%dtip) rr(r@r'sortrGrrCabs) rDpospagelenlimittargetsffirst navbeforenavafterrPr/r/r0gensH   z revnav.genN) __name__ __module__ __qualname__rFrI__bool__rGrr]r/r/r/r0rAgs rAc@seZdZddZddZdS) filerevnavcCs|j|_|||_dS)zNavigation generation object :repo: repo object we generate nav for :path: path of the file we generate nav for N) unfilteredrB _changelogfilerC)rDrEr5r/r/r0rFs zfilerevnav.__init__cCst|j|j|SrM)rrdrNrClinkrevrOr/r/r0rszfilerevnav.hexN)r^r_r`rFrr/r/r/r0rbs rbccsX|D]&}||||||d}t|dr&||d<|VqdS)N)r"revsuserdates descriptionbranchspathfile) rrPuserdate descriptionbranchr safehasattrr5)r ctxssdr/r/r0_ctxsgens  rscCsJ|durg}dd|D}t|dkr|d|krg}tjt|fdS)NcSs"g|] }||jkr|qSr/)rNrEnullid).0rqr/r/r0 s"z_siblings..rrargs)lenrPrmappinggeneratorrs)siblingshiderevr/r/r0 _siblingss r}cCsVtj|d|dd}dD]}|j|}|dur(t|}t|||dur%|ndq |S)NT)r section whitespace)signorewssignorewsamounts ignorewseolsignoreblanklines)rdifffeatureoptsqsparamsgetr parseboolr)reqrr~diffoptskvr/r/r0rs  rcCst||d}|jd|dS)NsannotateT)followr)rannotate)rfctxrrr/r/r0rs rcCsFt|tjr|}||krt||g|St||SrM) isinstancer basefilectxintrorev changectxrPr}rEparents)ctxhiderr/r/r0rs rcCst||SrM)r}children)rrr/r/r0rrcCs4|}|rt|dt|ddgStgS)Nrr)rjr")renamedrr(r)rrr/r/r0 renamelink s rcCtj||ddSNnamename)r hybridlistnodetagsrErNr/r/r0 nodetagsdictrcCrr)rr nodebookmarksrr/r/r0nodebookmarksdictrrcCsXg}|}z||}Wn tjyd}Ynw||kr%||tj|ddSrrn branchtiprRepoLookupErrorrNr'rrrErbranchesrn branchnoder/r/r0nodebranchdicts  rcCs`g}|}z||}Wn tjyd}Ynw|dkr)||kr)||tj|ddSNsdefaultrrrrr/r/r0 nodeinbranch&s rcCs,g}|}|dkr||tj|ddSr)rnr'rr)rrrnr/r/r0nodebranchnodefault2s  rccs||D]}||iVqdSrMr/)r rYrNrtr/r/r0 _nodenamesgen:s  rcC*|dur|j}|j|df}tjt||dS)Nstagrxr)rtrrrzrrEt1rNrxr/r/r0showtag? rcCr)Nsbookmarkr)rtrrrzrrr/r/r0 showbookmarkFrrcs<gt|ddfdd}t|S)NcSs|d |dfS)Nrr)rP)itemr/r/r0Qszbranchentries..c3sd}sD]\}}}}||fq tddD]4\}}dkr1|kr1dS|d7}|r:d}n |vrCd}nd}t||||dVq"dS) NrT)keyreversersclosedsinactivesopen)parityristatusr"rh) branchmap iterbranchesr'sortedrNrJrnrrl)r counttaghstipclosedrstatusheadsrWparityrEsortkeytipsr/r0entriesSs*  zbranchentries..entries)rr rrz)rE stripecountrWrr/rr0 branchentriesMs  rcCs.|d}tj|jdd}tj|jd||dS)Nr2F)realfs)auditor)lstripr pathauditorroot canonpath)rEr5rr/r/r0 cleanpathms rcCsFd}d|jvr|jd}|d}|dkr||dd}t||S)NrRr":r3rrfindr revsymbolrErchangeidiposr/r/r0rss    rcCsBd|jvr|jd}|d}|dkr|d|}t||SdS)Nr"rr3rrr/r/r0 basechangectx~s     rcCsd|jvr ttdt||jd}d|jvr|jd}nd|jvr(|jd}nttdz t|||}W|StjyJ|j||d}Y|Sw)Nrjsfile not givenr"sfilenodesnode or filenode not given)fileid) rr r rrrr RepoErrorfilectx)rErr5rrr/r/r0rs       rc Cs|jd}|s dSt|dkrttdztt|ddd\}}Wn ty0ttdwzt ||WSt j yM}zttt |d}~ww)Ns linerangersredundant linerange parameterrrsinvalid linerange parameter)rgetallryr r mapintsplit ValueErrorrprocesslineranger ParseErrorrbytestr)r linerangefromlinetolineexcr/r/r0rs     rcCsd|d|fS)Ns%d:%drr/)rrr/r/r0formatlinerangerQrc#sT||dt||}|||D]}tfdd|dD|d<|VqdS)Nrepoc3s|]}|VqdSrMr/)ru successorrEr/r0 s z&_succsandmarkersgen..s successors)resourcershowsuccsandmarkerstovaluer})r mapping itemmappingsrr/rr0_succsandmarkersgens    rcCtjt|fdSNrw)rrzrr rr/r/r0succsandmarkersrQrrctxccsT||d}||d}t||}|D]}|dr$t|d|d<|VqdS)Nrrsdivergentnodes)rr whyunstablerr})r rrErrentryr/r/r0_whyunstablegens    rcCrr)rrzrrr/r/r0rrQrcst}idddt|dddddd d t d t j d d dtdtdt|dt|dt||dt||fddfdddS)Nrrgr"sauthorsdescrhsextrasphasesobsoletessuccsandmarkerss instabilitiess instabilityrs whyunstablerisinbranchsbranchesstagss bookmarksctSrMrrrr/r0rzcommonentry..crrMrrrr/r0rr)parentchild)rbinnoderPrrkrmrlextraphasestrobsoleterrr instabilitiesrrrrrr)rErrNr/rr0 commonentrysR            r csv|j}t}t|d|}t||j}t|}| fddfddfdd||d|S)zObtain a dictionary to be used for entries in a changelist. This function is called when producing items for the "entries" list passed to the "shortlog" and "changelog" templates. changelogtagcrrMrrrr/r0rrz!changelistentry..cstdSNrrrrrPr/r0rcstdSr rrrr/r0rr)s allparentsrrr sfiles) rErPrrr listfilediffsfilesmaxfilesr update)webrrEnshowtagsrrr/rr0changelistentrys       rccsP|j}d}|D]}||krdS|d7}t|||}t||d<|VqdS)z2Emit up to N records for an iterable of revisions.rrrN)rErrJ)rrevsmaxcountparityfnrErrPrr/r/r0changelistentries s rcCs(d|jvr t|jdStt|S)Nr")rr revescaperrr)rrr/r/r0symrevorshortnodes rc cst|}|}t|D]/\}}||vrd}n ||vr!d}nd}|dkr)dnd}|||||dt||dVqdS)Nsremovedsaddedsmodifieds filenolinks filenodelinkr)r"rjblocknorr)r filesadded enumeraterprocessrrJ) r rrrrblocknorYrtemplater/r/r0 _listfilesgen"s(r$c st|jdt|}t|jdt|}t|}t|j|j}|dur'|}| dd}d|jj vr9|jj d}t |||d|}t |j }t|jj||t||} td |t|j|||||tjt||j fdfdd| ||d tt|j|S) zBObtain a dictionary to be used to render the "changeset" template.s changesettagschangesetbookmarkNrsstylerwcrrM) diffsummaryr diffstatsgenr/r0rZrz changesetentry..) diffsymrevbasenode changesettagchangesetbookmarkchangesetbranchrr%diffstatr,r/)rrErrrrrrp1configrdiffsr r diffstatgenrr.dictrrrmappedgeneratorr$r1r strkwargsr ) rrr showbookmarks showbranchbasectxstyler(r diffstatsr/r&r0changesetentry9s>          r;ccsN|d|D]}|dt||dVqt||kr%|diVdSdS)Ns filedifflink)r"rjs fileellipses)r!rry)r rrNmaxrYr/r/r0_listfilediffsgenas  r=cCstjt|||fdSr)rr4r=)rrNr<r/r/r0rhs rc cs~t|dD]6\}}d||f}|drd}n|dr d}n |dr(d}nd }|||||d |d |d VqdS) Nrs%d.%d+s difflineplus-s difflineminus@s difflineatsdifflinesl%ss% 8s)slineslinenolineids linenumber)r  startswithr!)r linesr" lineidprefixlinenol difflinenoltyper/r/r0_prettyprintdifflinesns&     rIc cs|r t|} nt} tj|jdd} t|} tj|||| | d} t| dD]Q\} \}}}}|dkr:|dd}dd|D}|D] \}}|dur^|dur^|\}}}}t ||f|s^qC| |qC|ryt j t|| |fd}t| | |d Vq(dS) NTroptsrsrawcSsg|]}|dqS) r/)ruhr/r/r0rvsz_diffsgen..rw)rrlines)rexactalwaysrrrr diffhunksr r hunkinrangeextendrr4rIrJ)r rErr8rr9rrrDmrrrQr"fctx1fctx2headerhunksrC hunkrange hunkliness1l1s2l2rFr/r/r0 _diffsgens6      r_rcCs(|j|||||j||f}tjt|ddS)Ns diffblockr)rErrrzr_)rrr8rr9rrDrxr/r/r0r1s r1c Csj|rd|pd}||rd|pd7}|rd|nd}|r d|nd}|||d||p+d|d||p2ddS)Nsl%drsr%ds%ds% 6s)r!rAs leftlinenosleftlinenumbersleftlines rightlinenosrightlinenumbers rightliner/)type leftlinenoleftline rightlineno rightlinelineidllnorlnor/r/r0 _complinesrhc cs|D]v\}}}}}t|}||} ||} t| | } t| D]} t||| d||| || d||| dVq!| | kr\t|| |D]} t|| d|| dddVqJq| | kryt|| |D]} t|dd| d|| dVqhqdS)Nr)r`rarbrcrd)rsysbytesminxrangerh) r leftlines rightlinesopcodesr`llolhirlorhilen1len2rir/r/r0_getcompblockgensF         rvcC|||f}tjt|ddS)Nscomparisonliner)rrzrv)rlrmrnrxr/r/r0 _getcompblock rxccsbtd||}|dkrt|||}d|iVdS|j|dD] }t|||}d|iVq!dS)z>Generator function that provides side-by-side comparison data.NrrN)r)difflibSequenceMatcherrx get_opcodesget_grouped_opcodes)r contextnumrlrmrqrFocr/r/r0 _comparegens  rcCrw)Nscomparisonblockr)rrzr)r~rlrmrxr/r/r0compareryrc csVt|ddi}tt|j||d}t|\}}}}} |||||| fVq!)z3Generator function that provides the diffstat data.snoprefixFrJ)rr diffstatdatar iterlinesr( diffstatsum) rrr8rstatsmaxnamemaxtotaladdtotal removetotalbinaryr/r/r0r2 sr2cCs*t|\}}}}}}tdt|||fS)z#Return a short summary of the diff.s5 %d files changed, %d insertions(+), %d deletions(-) )rJrry)statgenrrrrrrr/r/r0r%s r%c #st|\}}}}}|} fdd} d} |D]-\} } }}| | vr%dnd}| |}| d7} |||| | || | | |t|dVqdS)NcsdkrdSt|dS)Nrd)float)rurr/r0pct#sz_diffstattmplgen..pctrs diffstatlinksdiffstatnolinkr)r"rjsfilenostotalsaddpcts removepctr)rJrr!r)r rrrrrrrrrrfilenofilenameaddsremovesisbinaryr#totalr/rr0_diffstattmplgens* rcCs|||f}tjt|dS)z5Return a diffstat template for each file in the diff.rw)rr4r)rrrrxr/r/r0r.;s r.c@s~eZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ ddZ ddZddZddZdS) sessionvars?cCs||_||_dSrM)_start_vars)rDvarsstartr/r/r0rFBs zsessionvars.__init__cCs |j|SrMr)rDrr/r/r0 __getitem__F zsessionvars.__getitem__cCs||j|<dSrMr)rDrvaluer/r/r0 __setitem__Irzsessionvars.__setitem__cCstt|j|jSrM)rcopyrrrHr/r/r0__copy__Lrzsessionvars.__copy__cCst|||}||jvSrM)r unwrapvaluer)rDr rrr/r/r0containsOs zsessionvars.containscCst|||}|j|SrM)rrrr)rDr rrr/r/r0 getmemberSs zsessionvars.getmembercCttdNsnot comparablerrrrDr rr/r/r0getminWrzsessionvars.getmincCrrrrr/r/r0getmaxZrzsessionvars.getmaxcCr)Nsnot filterabler)rDr rselectr/r/r0filter]zsessionvars.filterccs>|j}tt|jD]\}}|t||dVd}q dS)N)rsvalues separator&)rrrr$rr)rDr separatorrrr/r/r0itermapsaszsessionvars.itermapscCr)Ns not displayable without templater)rDr rsepr/r/r0joinkrzsessionvars.joincCs|||dSNr)rrr/r/r0showorzsessionvars.showcCs t|jSrM)boolrrr/r/r0toboolrrzsessionvars.toboolcCs|jSrMrrr/r/r0ruszsessionvars.tovalueN)r)r^r_r`rFrrrrrrrrrrrrrr/r/r/r0rAs   rc@seZdZddZdS)wsgiuicCsdS)NPr/rHr/r/r0 termwidth{szwsgiui.termwidthN)r^r_r`rr/r/r/r0rys rc Cs,g}|jd}||jd7}|D]\}}|dd}t|}td|||f|}|s;|jtd||fqtd|}| || d} | || d} | d} d } | rnt | D] } | tj| O} qdzt| | } || | fWqtjy|jtd || fYqw|S) Nswebsubsinterhgrrs1^s%s(.+)(?:(?<=\\\\)|(?s   D   T             ( )"   8 .