
    p:iM                         d dl Z d dlmZ d dlT d dlmZmZ d dlmZ d dl	m
Z
 d dlmZmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ  G d de          Z G d de          Zd Zd Zd ZddZ G d de          ZdS )    N)ConfigSection)*)
NoSuchNodeRepositoryManager)IPropertyRenderer)IPropertyDiffRenderer)Ranges	to_ranges)tag)_tag_)chrome_resource_path)_path_within_scopec                   n    e Zd Z ee            eddddi          Zd Zd Zd Z	d	 Z
d
 Zd Zd ZdS )SubversionPropertyRenderersvn:externalsa  The TracBrowser for Subversion can interpret the `svn:externals`
        property of folders. By default, it only turns the URLs into links as
        Trac can't browse remote repositories.

        However, if you have another Trac instance (or an other repository
        browser like [http://www.viewvc.org/ ViewVC]) configured to browse the
        target repository, then you can instruct Trac which other repository
        browser to use for which external URL. This mapping is done in the
        `[svn:externals]` section of the TracIni.

        Example:
        {{{
        [svn:externals]
        1 = svn://server/repos1                       http://trac/proj1/browser/$path?rev=$rev
        2 = svn://server/repos2                       http://trac/proj2/browser/$path?rev=$rev
        3 = http://theirserver.org/svn/eng-soft       http://ourserver/viewvc/svn/$path/?pathrev=25914
        4 = svn://anotherserver.com/tools_repository  http://ourserver/tracs/tools/browser/$path?rev=$rev
        }}}
        With the above, the
        `svn://anotherserver.com/tools_repository/tags/1.1/tools` external will
        be mapped to `http://ourserver/tracs/tools/browser/tags/1.1/tools?rev=`
        (and `rev` will be set to the appropriate revision number if the
        external additionally specifies a revision, see the
        [%(svnbook)s SVN Book on externals] for more details).

        Note that the number used as a key in the above section is purely used
        as a place holder, as the URLs themselves can't be used as a key due to
        various limitations in the configuration file parser.

        Finally, the relative URLs introduced in
        [http://subversion.apache.org/docs/release-notes/1.5.html#externals Subversion 1.5]
        are not yet supported.
        svnbookz>http://svnbook.red-bean.com/en/1.7/svn.advanced.externals.html)doc_argsc                     i | _         d S N)_externals_map)selfs    [/var/www/html/trac/venv/lib/python3.11/site-packages/tracopt/versioncontrol/svn/svn_prop.py__init__z#SubversionPropertyRenderer.__init__I   s         c                     |dv rdS |dv rdndS )N)r   svn:needs-lock   svn:mergeinfosvnmerge-blockedsvnmerge-integrated   r    r   namemodes      r   match_propertyz)SubversionPropertyRenderer.match_propertyN   s1    6661 4 4 4qq9:	;r   c                     |dk    r|                      ||                   S |dk    r|                     |          S |dk    s|                    d          r|                     ||||          S d S )Nr   r   r    	svnmerge-)_render_externals_render_needslock
startswith_render_mergeinfo)r   r&   r'   contextpropss        r   render_propertyz*SubversionPropertyRenderer.render_propertyT   s    ?""))%+666%%%))'222_$$(D(D$))$guEEE %$r   c                     |od|v S )Nz://r$   )r   urls     r   _is_abs_urlz&SubversionPropertyRenderer._is_abs_url\   s    #u|#r   c                 &   | j         s| j                                        D ]\  }}|                                }t	          |          dk    r| j                            d|           H|\  }}|                    dd                              dd                              dd          | j         |<   g }|                                D ]}|                                }|s|d	         d
|d         }
}	}|	                    d          r|
                    |d d d d f           \t	          |          dk    r|d         }	|	                    dd
          }	|                     |
          s|
                    |d d d d f           g }|
}|r>|| j         v s|dk    rn.t          j        |          \  }}|
                    |           |>| j                             |          }|	rd|	z   nd
}|s@|
	                    d          s|
	                    d          r|
                    dd          }|rAd
}|rt          j        t          |           }|
                    |||||||	dz  f           |
                    |||
d d f           g }|D ]`\  }}	}
}}|}|
d
}n9|r(|
rd|
z   }
||	|
z   z  }d
                    ||	|
f          }nt!          d          }|
                    |||f           at#          j        d |D                       S )Nr#   zRsvn:externals entry %s doesn't contain a space-separated key value pair, skipping.%z%%z$pathz%(path)sz$revz%(rev)sr    #      z-r/z at revision zhttp://zhttps://)pathrevz in z'No svn:externals configured in trac.inic           	      h    g | ]/\  }}}t          j        t          j        |||                     0S ))hreftitle)r   lia).0labelr@   rA   s       r   
<listcomp>z@SubversionPropertyRenderer._render_externals.<locals>.<listcomp>   sO     A A A-5$ vceEEBBBCC A A Ar   )r   svn_externals_sectionoptionssplitlenlogwarningreplace
splitlinesr-   appendr4   	posixpathgetjoinreversedr   r   ul)r   propdummykeyvaluekey	externalsexternalelements	localpathr>   r3   prefixbase_urlprefr@   revstr
remotepathexternals_datarE   rA   s                       r   r+   z,SubversionPropertyRenderer._render_externals_   s   " 	G#'#=#E#E#G#G 
G 
G%u::??H$$ &12:< < < "
U+0==d+C+C,3GGZ,H,H,3GFI,F,F #C(( 	)) "	G "	GH~~''H "*1+r8B<CsI##C((   (D$d!CDDD8}}!!qkkk$++##C((   (D$d!CDDDFH $t222h#oo!*!:!:$d###	  $
 &**844D.19_s**rF .S^^I66 . ^^J77.{{3-- G
 C!*&1A1A!BJ  )VXz"&*S)I)I"I"K L L L L   )VS$!EFFFF5> 	8 	81IsCTE{ E ' 3,Cs"S# 677CDD!!5$"67777v A A1?A A A B B 	Br   c                     t          |j        d          }t          j        |t	          d          t	          d                    S )Nzcommon/lock-locked.pngz
needs lock)srcaltrA   )r   reqr   imgr   )r   r/   r3   s      r   r,   z,SubversionPropertyRenderer._render_needslock   s7    "7;0HIIw3AlOO1\??KKKKr   c           
         g }||                                          D ]}	 |                    dd          \  }}|                    t          j        |          t          j        |                    dd                    g           l# t          $ r, |                    t          j        |d                     Y w xY wt          j        t          j        d |D                       d	          S )
N:r;   ,   ,​r#   colspanc                 6    g | ]}t          j        |          S r$   r   tr)rD   rows     r   rF   z@SubversionPropertyRenderer._render_mergeinfo.<locals>.<listcomp>   s     #@#@#@CCF3KK#@#@#@r   r0   class_)	rN   rsplitrO   r   tdrM   
ValueErrortabletbody)	r   r&   r'   r/   r0   rowsrq   r=   revss	            r   r.   z,SubversionPropertyRenderer._render_mergeinfo   s   ;))++ 	4 	4C4"zz#q11tSVD\\ VDLLi$@$@AAC D D D D 4 4 4CF3222333334y#@#@4#@#@#@AA ') ) ) 	)s   A(B		3B?>B?N)__name__
__module____qualname__
implementsr   r   rG   r   r(   r1   r4   r+   r,   r.   r$   r   r   r   r   !   s        J !!!)M/ 	B ]^E"` "` "`H! ! !
; ; ;F F F$ $ $?B ?B ?BBL L L
) 
) 
) 
) 
)r   r   c                   0    e Zd Z ee           d Zd ZdS )SubversionMergePropertyRendererc                     |dv rdndS Nr   r   r   r$   r%   s      r   r(   z.SubversionMergePropertyRenderer.match_property         4 4 4qq9:	;r   c                 
   |dv }|                     d          rt          d          nt          d          }|rdnd}|j        j        j        }|j        j        }	t          | j                                      |          }
|j        j        }|r>|
	                    |	|          }i }|
                                D ]\  }}||vr|dz   ||<   g }g }|                    d          r||                                         }n||                                         }|D ]}|                    dd          \  }}t          |
j        |          }|4|                                }t#          |          \  }}d	                    |          }d
}	 |
	                    ||          }|j        j                            d|          }d|                    |          v rt+          ||          t-          ||||          g}|rUd	                    |          }|                    t-          t          d          |||t          d                               |r|                    |          }|s|                                }t5          t7          |pd|dz                       }|t5          t9          |                    z  }t;          |||          }|r|t5          t9          |                    z  }|r>|
	                    |t=          |                    }|                    ||||f           t?          |          }|                    t-          t          d          |||                     |                    d
|d |D             f           n# t@          $ r d}Y nw xY w|!                    d	d          }|                    ||tE          j#        d|z             tE          j#        ||          gf           i }d |D             }|r|
$                    |          }|D ]\  }}}}||v r|t5          ||                   z  }n|%                                 |                    t-          t          d          ||t?          |                               |                    d
|d |D             f           |sdS |&                                 |r3|d         d         r%tE          j'        t          d          dd          } nd} tE          | tE          j(        tE          j)        d |D                       d                    S ) zParse svn:mergeinfo and svnmerge-* properties, converting branch
        names to links and providing links to the revision log for merged
        and eligible revisions.
        )r"   r    blockedmergedr#   Nr;   r*   ri   rj   FsourceLOG_VIEWznon-inheritablez,merged on the directory itself but not beloweligiblec                 6    g | ]}t          j        |          S r$   r   ru   rD   eachs     r   rF   zCSubversionMergePropertyRenderer.render_property.<locals>.<listcomp>   s     /M/M/Mt/M/M/Mr   Trk   r<   rl   c                 :    g | ]\  }}}}|t          |          fS r$   )min)rD   spathnoder   rq   s        r   rF   zCSubversionMergePropertyRenderer.render_property.<locals>.<listcomp>  sA     K K K7UD(C H. K K Kr   c                 6    g | ]}t          j        |          S r$   r   r   s     r   rF   zCSubversionMergePropertyRenderer.render_property.<locals>.<listcomp>  s     'E'E'Et'E'E'Er   r8   r   z(toggle deleted branches)ztrac-toggledeletedr9   )rs   r@   c                 J    g | ] \  }}}t          j        ||rd nd          !S )ztrac-deletedNrr   ro   )rD   deletedr   rq   s       r   rF   zCSubversionMergePropertyRenderer.render_property.<locals>.<listcomp>  sF     9 9 9/GUC sW+N>>$OOO 9 9 9r   r0   rr   )*endswithr   resourceparentidr   envget_repositoryversionget_nodeget_copy_ancestryr-   rI   rN   r   scopestrip_partition_inheritablerR   childperm_get_source_link_get_revs_linkrO   rQ   get_branch_originsetranger	   _get_blocked_revsmaxr
   r   rM   r   ru   _get_changed_revsclearsortrC   rw   rx   )!r   r&   r'   r/   r0   has_eligible
revs_label	revs_colsreponametarget_pathrepos
target_revr   branch_startsr=   r>   ry   eligible_infossourceslinerz   r   inheritablenon_inheritabler   r   rq   	first_revr   r   changed_revschanged_nodestoggledeleteds!                                    r   r1   z/SubversionMergePropertyRenderer.render_property   s   
 GG%)]]9%=%=NQy\\\1X;;
%/AA4	#*-&)!$(++::8DD%-
 	2>>+z::DM!3355 2 2	c},,*-'M$'??;'' 	/Dk''))GGDk,,..G ,	= ,	=DC++JD$&u{D99E}::<<D+A$+G+G(K88K((DG~~eZ88"+2885IIh!7!777+E7;;)*gudKKMC& N*-((?*C*C

>!4E2F2F2723 5K 3L 3L$M $M N N N $ D$1$5$5e$<$<	( A(,(>(>(@(@I#&uY^!Z!^'L'L#M#M Ct$5$55"3E4"G"G" =$F7OO(<(<<H# %#(>>%X#G#GD*115$#2NOOO$#,X#6#6

>!J--27$C $C D D DKK/M/M/M/M/M NOOO5 86    <<Y//DKK%&u--&y999;< = = = =
 K K;IK K K 	B 22=AAL*8 	H 	H&E43$$CU 3444   JJ~a
mmWe&/&9&9; ; < < <KK'E'E'E'E'EFGGGG 	4		 	!DHQK 	!E!$?"@"@)=CI I IMM !M=9SY9 9379 9 9: :BIK K KL L 	Ls   F&N8A#NN-,N-N)r{   r|   r}   r~   r   r(   r1   r$   r   r   r   r      sM        J !!!; ; ;`L `L `L `L `Lr   r   c                     g g }}|                      d          D ]C}|r*|d         dk    r|                    |dd                    .|                    |           D||fS )z?Non-inheritable revision ranges are marked with a trailing '*'.rj   r8   r   N)rI   rO   )rz   r   r   rs       r   r   r     sy    #%rKZZ__ " " 	"2#""1SbS6****q!!!!''r   c                     |dk    r|                      dd          }ndS |                                D ]I}	 |                    dd          \  }}|                    d          |k    r|c S :# t          $ r Y Fw xY wdS )zXReturn the revisions blocked from merging for the given property
    name and path.
    r"   r!   r7   ri   r;   r<   )rQ   rN   rI   r   	Exception)r0   r&   r=   rU   r   prz   s          r   r   r   '  s     $$$yy+R00r!!  	jja((GAtwws||t## $ 	 	 	D	2s   3A..
A;:A;c           	          |j         j        j        }t          j        d| z   t          d          |j                            |pd| |j         j                            S )z Return a link to a merge source.r<   zView merge sourceN)r>   rA   r@   )	r   r   r   r   rC   r   r@   browserr   )r   r/   r   s      r   r   r   8  sl    &)H5uA&9$:$:l**8+;tU/6/?/G + I IJ J J Jr   c                    |j         j        j        }|s#t          j        | t          d                    S d|v sd|v r |j                            |pd||          }n|j                            ||pd|          }|	                    dd          }|rt          d||	          }n|}t          j
        | ||
          S )zReturn a link to the revision log when more than one revision is
    given, to the revision itself for a single revision, or a `<span>`
    with "no revision" for none.
    zNo revisions)rA   rj   -N)rz   z, z%(title)s: %(revs)s)rA   rz   r   )r   r   r   r   spanr   r@   rK   	changesetrM   rC   )rE   r/   r   rz   rA   r   	revs_hrefs          r   r   r   ?  s    
 &)H JxQ~%6%67777	tL$$X%5u4$HH		L**41AT5II	<<T""D 'u4@@@5e)4444r   c                   0    e Zd Z ee           d Zd ZdS )#SubversionMergePropertyDiffRendererc                     |dv rdndS r   r$   )r   r&   s     r   match_property_diffz7SubversionMergePropertyDiffRenderer.match_property_diffX  r   r   c                   #$ t          | j                  }|                    |j        j        j                  ##fd} ||          }	 ||          }
                    d          }t          d          t          d          g|         }t          d          t          d          g|         }t          d          }t          d          }g }i }g }|
                                D ]\  $\  }}$|	v}|rt                      x}}n|	
                    $          \  }}||z
  }||z
  }|s|sF||z
  }||z
  }t          ||z  |z  |z            }	 #                    $|d	                   }|                    ||d
         f           n# t          $ r Y nw xY w|                    $|||||f           |r#                    |          }$fd}g }|D ]\  $}}}}}$|v r)t          |$                   }||z  }||z  }||z  }||z  }|s|r|rt          d          } nd } |                    $t!          $|          | g|ot#          | |||                    |ot#          | |||                    |ot#          | |||                    |ot#          | |||                    f           g }!|	                                D ]*\  $}|!                    $t!          $|          f           +|s|!rf|                                 |!                                 t#          j        t#          j        d |D             d |!D                       d          }"n!t#          j        t          d                    }"t#          j        t/          dt#          j                            |"          S )Nc                 |   i }| 
         }
dk    r|                                 n|                                }|D ]}|                    dd          \  }}t          j        |          }|Mt	          |          \  }}	t          t          |                    t          t          |	                    f||<   |S )Nr    ri   r;   )rN   rI   r   r   r   r   r	   )r0   r   rW   linesr   r=   rz   r   r   r   r&   r   s             r   parse_sourceszOSubversionMergePropertyDiffRenderer.render_property_diff.<locals>.parse_sourcesc  s    G$KE*./*A*AE$$&&&,1KKMM  D D!ZZQ//
d*5;==$3I$3O3O0K&)&*=*=&>&>&)&*A*A&B&B&DGENNr   r   zmerged: z	blocked: zreverse-merged: zun-blocked: zmarked as non-inheritable: zunmarked as non-inheritable: r8   r   c                 v    | r5t          |           } t          |                     dd          ||           S d S )Nrj   rk   )r
   r   rM   )rz   r/   r   s     r   	revs_linkzKSubversionMergePropertyDiffRenderer.render_property_diff.<locals>.revs_link  sI     < %dll3	&B&B&-ud< < << <r   z (added)c                 Z    g | ](}t          j        d  |dd         D                       )S )c              3   >   K   | ]}t          j        |          V  d S r   r   )rD   cs     r   	<genexpr>zVSubversionMergePropertyDiffRenderer.render_property_diff.<locals>.<listcomp>.<genexpr>  s*      44aq		444444r   r;   Nro   )rD   colss     r   rF   zLSubversionMergePropertyDiffRenderer.render_property_diff.<locals>.<listcomp>  sI     / / / 444844444 / / /r   c           
          g | ]M\  }}t          j        t          j        |          t          j        t          d           d                    NS )removedr   rl   )r   rp   ru   r   )rD   r   rd   s      r   rF   zLSubversionMergePropertyDiffRenderer.render_property_diff.<locals>.<listcomp>  sU     4 4 4UC sSVAiLL!%D%D%DEE 4 4 4r   r0   rr   z# (with no actual effect on merging)zProperty %(prop)s changed)rU   )r   r   r   r   r   r   r   r   itemsr   popsortedr   rO   r   r   r   r   r   rw   rx   emrB   r   strong)%r   r&   old_context	old_propsnew_context	new_propsrH   rmr   old_sourcesnew_sourcesr   added_labelremoved_labeladded_ni_labelremoved_ni_labelr   r   r   new_revsnew_revs_ni	new_spathold_revsold_revs_niaddedr   added_ni
removed_nirz   r   r   modified_sourcesstatusremoved_sourceschangesr   r   s%    `                                 @@r   render_property_diffz8SubversionMergePropertyDiffRenderer.render_property_diff\  s   
 tx((!!+"6"="@AA	 	 	 	 	 	 $mI..#mI..--	**}}ann5g>-...0A0AB7K899<==.9.?.?.A.A 	) 	)*E*Hk[0I ?),.;;(3(>(>%+x'E)G  "[0H${2J%'/H4zABBD~~eT"X66$$dDG_5555   NNE9eWh&( ) ) ) ) 	B 22=AAL	< 	< 	< 	< 	<
 FM 	 	BE9eWh
$$<.//4D d"
   "z]]FF!F '',UK@@&IMc+yy/L/LMM EM$-Ig{$C$C!E !E G^%.Yx%E%E"G "G K3'7'0y['I'I$K $K	) 	 	 	 *0022 	K 	KOE8""E$4UK$H$H$J K K K K 		G 		G!!###  """i	/ /-/ / /4 4#24 4 4!5 !5 >E	F F FGG fQDEEFFGvd6SZ=M=MNNN  	s   9F
FFN)r{   r|   r}   r~   r   r   r   r$   r   r   r   r   S  sH        J$%%%; ; ;d d d d dr   r   r   )rP   trac.configr   	trac.coretrac.versioncontrol.apir   r   "trac.versioncontrol.web_ui.browserr   $trac.versioncontrol.web_ui.changesetr   	trac.utilr	   r
   trac.util.htmlr   trac.util.translationr   r   trac.web.chromer   !tracopt.versioncontrol.svn.svn_fsr   	Componentr   r   r   r   r   r   r   r$   r   r   <module>r     s  &     % % % % % %     A A A A A A A A @ @ @ @ @ @ F F F F F F ' ' ' ' ' ' ' '       ) ) ) ) ) ) ) ) 0 0 0 0 0 0 @ @ @ @ @ @M) M) M) M) M) M) M) M)`iL iL iL iL iLi iL iL iLX( ( (  "J J J5 5 5 5(m m m m m) m m m m mr   