o k`R@sddlZddlmZmZddlTddlmZddlmZddl m Z ddl m Z m Z ddlmZmZdd lmZdd lmZmZmZdd lmZddlTdd lmZdd lmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ddl%m&Z&m'Z'Gddde(Z)Gddde*Z+dS)N) IntOption ListOption)*)IPermissionRequestor)ResourceNotFound)Ranges)Markuptag) to_unicodewrap)_) ChangesetNoSuchChangesetRepositoryManager)ChangesetModule)IRequestHandler)INavigationContributor add_ctxtnavadd_link add_scriptadd_script_dataadd_stylesheet auth_link web_context)IWikiSyntaxProvider WikiParserc@seZdZeeeeeej Z e ddddZ e ddgdddZd d Zd d Zd dZddZddZdejejdZddZddZedeZdddZdS) LogModule revisionlogdefault_log_limitdzEDefault value for the limit argument in the TracRevisionLog. graph_colors)z#cc0z#0c0z#0ccz#00cz#c0cz#c00zdComma-separated list of colors to use for the TracRevisionLog graph display. (''since 1.0''))doccCsdS)Nbrowserselfreqr#r#@/usr/lib/python3/dist-packages/trac/versioncontrol/web_ui/log.pyget_active_navigation_item:z$LogModule.get_active_navigation_itemcCsgSNr#r$r#r#r'get_navigation_items=r)zLogModule.get_navigation_itemscCsdgS)NLOG_VIEWr#r%r#r#r'get_permission_actionsBsz LogModule.get_permission_actionscCs.td|j}|r|dpd|jd<dSdS)Nz /log(/.*)?$/pathT)rematch path_infogroupargs)r%r&r3r#r#r' match_requestGs zLogModule.match_requestc3 sjdjddjddjdjd}jd}jd }jd  jd |jt|j}|\}s`dkrSt t d t t d |p\ dd|j kr}j}jj pqd|ryd|nd}|rt|ddjndj|jd} gdkrfdd} n4rψdkoˆ oˆj otdk} fdd} ndkoو oوj } fdd} g} d} |} d}d}| D]\}}}|r||rnu|}||||| d}|tjkr|||d<dkr(|tjks-| ||r[|| kr[dkr?||ks[| d7} | |d<||d<dkrRn%dkr[| d8} |durc}n|d7}d}||krrn|} qd}| st!}||j"rt t d#d t d!i}| rt$d"d#| D\}}}|j%||||j&d$d%d&t'd't(|d( fd)d*}|d+vrd,d-| D} | r|kr| d.=nZ| r>|r>|kr>| d.d}| d.d}d}r| d.d/r d|fnd})|}t*|pd}|s"s8||||d0}t+d1|t d2|#|d d| d.d/<d3d-| D} t,| |j}!i}"|d4kr| D]C|!}#i}$t-|#j.d5d6d6d7|$d8<g}%g}&|#,D]\}'}(})}*}+|% |)tjkr|*n|'|& |)qp|%|$d9<|&|$d:<|$|"<qUid;t/d<jd=d>j pdd?ddd|d@j#dAdd d dB| dC|!dD|"dE|dF|j0dG1dF},|d4krdH|,dIdJifS|dKkrt/d<jddL|,d;<dM|,dIdNifSg}-g}.| D] }|d/dur!|.r|. ||- |.g}.q|. |q|.r0|- |.|-|,dO<t2dPt2dQt3jj }/|/rN|/|,dR<dkr`t+dS|/dTdUt dV|dK||dW}0t+dXt4|0t dYdNdK|d4||dW}1t+dX|1t dZdJt5t d[j6j pdd\d1j7d]vrj7d]d1d}2t5t89t8j:t d^|2dUd\t;d_d`|,fS)aNr,mode stop_on_copyr1r0revstop_revrevsformatverboselimitz=No repository specified and no default repository configured.Repository '%(repo)s' not foundrepo?TresolveF path_historyc3s6D]}d|ddvr|VqdSNCHANGESET_VIEWr/id)get_path_historyperm)h cset_resourcer1reposr&r:r#r'historys z*LogModule.process_request..historyr/c3sd}tjD]A\}}||fdd<t|}|D]\}}}||r,nd|dvr>d}|||fVqd}|rI||dfVqdS)NFrIrJT)reversedpairsget_existing_node get_historyrev_older_thanrM) separatorabnodepr:chg)rP curr_revranger1rQr& revrangesr#r'rRs"   c3s@t}|D]}d|ddvr|Vq dSrH)rUrVrM)r[rNrOr#r'rRs r)r1r: existing_revchangedepthr`rb copyfrom_pathz_The file or directory '%(path)s' doesn't exist at revision %(rev)s or at any previous revision.)r1r:zNonexistent pathcss|]}|dVqdS)r:Nr#).0itemr#r#r' sz,LogModule.process_request..g{Gz?g?)threadsverticescolumnscolors line_width dot_radiuszcommon/js/log_graph.js)graphcsT}tjkr d}|d}||r|d<jjjp#d|fi|S)N)r:r8r?r>)str youngest_revupdatehreflogreponame)r1r6link_revparams)r?r8rQr&r:r>r#r' make_log_hrefs  z0LogModule.process_request..make_log_href)rss changelogcSsg|]}|dr|qS)rar#rdir#r#r' z-LogModule.process_request..ra)r:r<nextz3Revision Log (restarting at %(path)s, rev. %(rev)s)cSsg|]}|dqSr:r#ryr#r#r'r{srxF )initial_indentsubsequent_indentmessagefilesactionscontextsource)parentrsrQ display_revr_itemschanges extra_changesrmwiki_format_messages changesetzrevisionlog.txt content_typez text/plainrw)rabsurlszrevisionlog.rsszapplication/rss+xml item_rangeszcommon/css/diff.csszcommon/css/browser.css path_linksuprqzParent directory)r=r<r; alternatezRSS Feed ChangeLogzView Latest Revision)rqlinkszOlder Revisionsz →zrevisionlog.html)r'process_requestMs                                            zLogModule.process_requestz%(?:%(int)s|%(cset)s(?:[:-]%(cset)s)?))intcsetc#s@dtjdjfddfVdtjfddfVdS)Nz!?\[(?P%s\s*)z+(?P%s)(?P[/?][^\]]*)?\]cs|d|dd||S)Nlog1r/r} _format_linkxyzr-r#r'`sz+LogModule.get_wiki_syntax..z#(?:\b|!)r%s\b(?:/[a-zA-Z0-9_/+-]+)?cs|dd|dd|S)Nlog2@r/rrr-r#r'rds)rINTERTRAC_SCHEME REV_RANGErRE_STRr-r#r-r'get_wiki_syntaxZs   zLogModule.get_wiki_syntaxccsd|jfVdS)Nrrrr-r#r#r'get_link_resolversfszLogModule.get_link_resolversz([^@:]*)[@:]%s?Nc sX|dkr5|}|d}|d}|dpd} d|| |f} |d| ||} | r,| S|| \} } } nM|dvs;J|dkrH|\} } nd } } d tdd } d }|jrfd d d D}t dd |D}d||d d} }t |j }z| | \}}} |s| |j}|dur||}|r| pd} d||jd| vr|jpd}t||}|r|jj|| t|d}n|||jj|| |pdd}| rd|vrd| d d} tj|d|| | dWStd}n|rtd|d}ntd}Wnty#}z t|}WYd}~nd}~wwtj|d|dS)Nrit_loglog_revslog_pathr0z%s%s@%srr)rrrrDr/csg|] }|vo |qSr#)index)rdsepr3r#r'r{sz*LogModule._format_link..z:@cSsg|]}|dur|qS)Fr#ryr#r#r'r{r|r,r)r<rrC&)class_rqz No permission to view change logr@rAzNo default repository definedzmissing source)rtitle) groupdictrshorthand_intertrac_helper split_linkjoinrSsplit LOG_LINK_REr3minrrrget_default_repositoryrget_repositoryrMrrrsr has_rangesrqrrrnrr rYr rr )r% formatternsr3label fullmatchgroupsrr<r1target intertracqueryfragmentindexesidxrrsrQr_rqerrmsger#rr'rksx                zLogModule._format_linkr*)__name__ __module__ __qualname__ implementsrrrrrchangeset_realmrrrrr r(r+r.r7rrrr CHANGESET_IDrrrr2compilerrr#r#r#r'r(s4  rc@sheZdZdddZddZdddZd d Zed d e j iej Z d dZ ddZddZddZdS)rNFcCs4||_||_g|_d|_|_|r||dSdSr*)rQrFrTrYrZ_append)r%rQr<rFr#r#r'__init__s zRevRanges.__init__cCs&t|j}|dkp|dko|j|jkS)Nr/)rrTrYrZ)r%nr#r#r'rs zRevRanges.has_rangescCst|}|r t|}t|j|jd}|j}|jD]}||kr'|r%||n||q|r=|dd|_|dd|_||S)NrErr}r/) tuplerrQrFrTrrYrZ_reduce)r% curr_pairnew_pairr_rTpairr#r#r'rs    zRevRanges.truncatec CsP|st||jr|j|S|jjr&zt|WSttfy%|YSw|Sr*)rrFrQrrr ValueError TypeError)r%r:r#r#r'_normrevs  zRevRanges._normrevz(?: %(cset)s[:-]%(cset)s | # int or hexa revs [0-9]+[:-][A-Za-z_0-9]+ | # e.g. 42-head [A-Za-z_0-9]+[:-][0-9]+ | # e.g. head-42 [^:]+:[^:]+ # e.g. master:dev-42 )\Z rcCs|sdSg}td|D]G}d}}|j|r*dD]}||vr)||\}}nq|dur6||}}n||krB||}}n ||}||}|||fq |j||dS)Nu,​?z:-) r2r_cset_range_rer3rrrTextendr)r%r<rTr:rYrZrr#r#r'r s(     zRevRanges._appendcCstdd|jDr#z tt|dd}WnYn<|j|jdd<n3t}|jdd}t|D]\}}||vr>d||<q1||q1t|t|krVtd||jdd<|jrk|jdd|_ |jdd|_ dSd|_ |_ dS)Ncss,|]}t|dtot|dtVqdSrr/N) isinstancerrdrr#r#r'rfs$z$RevRanges._reduce..T)reorderrr}r/) allrTrrnset enumerateaddrfilterrYrZ)r%rangesseenrTrrr#r#r'rs(  zRevRanges._reducecCs t|jSr*)rrTr-r#r#r'__len__s zRevRanges.__len__cs*|jjrdnddfdd|jDS)N-:,c3s<|]}|d|dkrtt|nt|dVqdSr)rmaprnrrr#r'rfs   z$RevRanges.__str__..)rQrrrTr-r#r(r'__str__szRevRanges.__str__)NFr*)rrrr rrrr2r rr VERBOSErr rr#r)r#r#r#r'rs    r),r2 trac.configrr trac.core trac.permr trac.resourcer trac.utilrtrac.util.htmlrr trac.util.textr r trac.util.translationr trac.versioncontrol.apir rr$trac.versioncontrol.web_ui.changesetrtrac.versioncontrol.web_ui.util trac.web.apirtrac.web.chromerrrrrrrr trac.wikirr Componentrobjectrr#r#r#r's(      (