
    p:iG                     *   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dl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 d dlmZmZ d dlmZ d d	lmZ d d
lmZmZ g dZ G d de          Z G d de          Zd Z ej         d!                    d                    Z" e#d          Z$ e%dd          D ]
\  Z&Z'e'e$e&<   [&[' e(e$          Z$d Z)d Z*d Z+ G d de,          Z- G d de.          Z/ G d de,          Z0 G d d e,          Z1dS )!    N)deque)partial)DEVNULLPIPE)Lock)TracBaseError)as_int	terminate)	close_fds)time_now)exception_to_unicode
to_unicode)GitErrorGitErrorShaStorageStorageFactoryc                       e Zd ZdS )r   N__name__
__module____qualname__     X/var/www/html/trac/venv/lib/python3.11/site-packages/tracopt/versioncontrol/git/PyGIT.pyr   r   %           Dr   r   c                       e Zd ZdS )r   Nr   r   r   r   r   r   (   r   r   r   c                 Z   | st           |                                 }|st           |                    d          }i }dx}}|r|d         dk    r1|s|}||         d         g}|                    |dd                    nT|                    dd          \  }}|                    |g                               |                                           |                    d          }|r(|r||k    r d                    |          ||         d<   d}|d                    |          |fS )zParse the raw content of a commit (as given by `git cat-file -p <rev>`).

    Return the commit message and a dict of properties.
    r   N    
)r   
splitlinespopappendsplit
setdefaultstripjoin)rawlineslineprops	multilinemultiline_keykeyvalues           r   parse_commitr1   -   sN   
  NNE 99Q<<DE $$I
 7c>> 7 #"=1"56	T!""X&&&&D!,,JCS"%%,,U[[]];;;yy|| 	d 	c]&:&:'+yy';';E- $I   99UU""r   z\\(?:[abtnvfr"\\]|[0-7]{3})utf-8   s	   abtnvfr"\s	   	
"\c                     |                      d          r;|                     d          r&d }t                              || dd                   } | S )N   "c                     |                      d          } t          |           dk    rt          | dd          d          }nt          | d                  }d|z  S )Nr      r       s   %c)grouplenint_unquote_chars)matchcodes     r   replacez_unquote.<locals>.replaceT   sQ    KKNNE5zzQ59a((%eAh/4<r   r    r   )
startswithendswith_unquote_resub)pathr?   s     r   _unquoterE   R   sZ    t 4t!4!4 4	  	  	  wQrT
33Kr   c                 *    | t          | d          } | S Nascii)strrevs    r   _rev_urL   _   s    
#wJr   c                 4    | |                      d          } | S rG   encoderJ   s    r   _rev_brP   e   s    
jj!!Jr   c                       e Zd ZdZ	 	 ddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Z ej        d          Zed             ZdS )GitCorez'Low-level wrapper around git executableNgitc                 >    || _         || _        || _        || _        d S N)_GitCore__git_bin_GitCore__git_dir_GitCore__log_GitCore__fs_encoding)selfgit_dirgit_binlogfs_encodings        r   __init__zGitCore.__init__n   s%      
(r   c                 (    d| j         d| j        dS )Nz<GitCore bin="z" dir="z">)rV   rW   rZ   s    r   __repr__zGitCore.__repr__u   s"     0404@ 	@r   c                 6   | j         g}| j        r|                    d| j        z             |                    |           |                    |           | j        8t
          j        dk    rfd}nfd}t          t          ||                    }|S )z9construct command tuple for git call suitable for Popen()z--git-dir=%sNntc                 ^    t          | t                    r|                     d          } | S Nr?   )
isinstancebytesdecodeargr^   s    r   to_cmd_encodingz0GitCore.__build_git_cmd.<locals>.to_cmd_encoding   s.    !#u-- A!jji@@Jr   c                 ^    t          | t                    r|                     d          } | S rf   )rg   rI   rO   rj   s    r   rl   z0GitCore.__build_git_cmd.<locals>.to_cmd_encoding   s.    !#s++ A!jji@@Jr   )	rV   rW   r$   extendrY   osnamelistmap)rZ   gitcmdargscmdrl   r^   s        @r   __build_git_cmdzGitCore.__build_git_cmdy   s     ~> 	8JJ~6777

6

4("w$     
     s?C0011C
r   c                     |                     dt                     |                     dt                     |                     dt                     t          j         | j        |g|R  fdt
          i|S )Nstdinstdoutstderrr   )r&   r   
subprocessPopen_GitCore__build_git_cmdr   )rZ   git_cmdcmd_argskws       r   __pipezGitCore.__pipe   s    
gt$$$
h%%%
h%%% 4 4W Hx H H H ; ;*3;79; ; 	;r   c                     | j         |dt          i5 }|                                \  }}ddd           n# 1 swxY w Y   | j        r;|j        dk    s|r.| j                            d| j        |j        | j        ||           |S )z9execute git command and return file-like object of stdoutrx   Nr   z/%s exits with %d, dir: %r, args: %r, stderr: %r)_GitCore__piper   communicaterX   
returncodedebugrV   rW   )rZ   rt   pstdout_datastderr_datas        r   	__executezGitCore.__execute   s    
 T[$.g.. 	7!'(}}$K	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7: 	01<1,,,JN!^Q\4>!;0 0 0 s   7;;c                 .    |                      dd          S )Nzcat-filez--batchr   ra   s    r   cat_file_batchzGitCore.cat_file_batch   s    {{:y111r   c                      | j         dg|R  S )Nr]   r   )rZ   r   s     r   log_pipezGitCore.log_pipe   s    t{5,8,,,,r   c                 6    |                      dddddd          S )Nz	diff-treez--stdin--root-z-r-Mr   ra   s    r   diff_tree_pipezGitCore.diff_tree_pipe   s    {{;	8T4NNNr   c                     |                     d          s|dv rt          |          t          | j        |                    dd                    S )N_)r   r   r   -)r@   AttributeErrorr   _GitCore__executer?   )rZ   rp   s     r   __getattr__zGitCore.__getattr__   sP    ??3 	'HHH &&&t~t||C'<'<===r   s   [0-9A-Fa-f]{4,40}$c                     dt          |          cxk    rdk    sn dS t          | j                            |                    S )znreturns whether sha is a potential sha id
        (i.e. proper hexstring between 4 and 40 characters)
        r7   (   F)r:   bool_GitCore__is_sha_patr=   )clsshas     r   is_shazGitCore.is_sha   sM     SXX########5C$**3//000r   )NrS   NN)r   r   r   __doc__r_   rb   r}   r   r   r   r   r   r   recompiler   classmethodr   r   r   r   rR   rR   k   s        118<!) ) ) )@ @ @  2; ; ;  2 2 2- - -O O O> > > 2:344L	1 	1 [	1 	1 	1r   rR   c                   &    e Zd ZdZddZd Zd ZdS )	SizedDictz6Size-bounded dictionary with FIFO replacement strategyr   c                     t                               |            || _        t                      | _        t                      | _        d S rU   )dictr_   _SizedDict__max_sizer   _SizedDict__key_fifor   _SizedDict__lock)rZ   max_sizes     r   r_   zSizedDict.__init__   s5    d"''ffr   c                 F   | j         5  t          |           t          | j                  k    sJ |                     |          s| j                            |           t
                              | ||          }t          | j                  | j        k    rI|                     | j        	                                           t          | j                  | j        k    It          |           t          | j                  k    sJ |cd d d            S # 1 swxY w Y   d S rU   )
r   r:   r   __contains__r$   r   __setitem__r   __delitem__popleft)rZ   rp   r0   rcs       r   r   zSizedDict.__setitem__   sJ   [ 	 	t99DO 4 44444$$T** -&&t,,,!!$e44Bdo&&88  !8!8!:!:;;; do&&88 t99DO 4 44444	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   DDDDc                      t          d          )Nz$SizedDict has no setdefault() method)NotImplementedError)rZ   r   s     r   r&   zSizedDict.setdefault   s    !"HIIIr   N)r   )r   r   r   r   r_   r   r&   r   r   r   r   r      sQ        @@      J J J J Jr   r   c                       e Zd Z ej                    Zi Zi Z e            Z		 	 ddZ
d Zed             Zed             ZdS )	r   TrS   Nc           	         || _         | j        5  |r	 | j        |= n# t          $ r Y nw xY w	 | j        |         }nG# t          $ r: | j                            |          }t          |||||          }|| j        |<   Y nw xY w|s
|| j        |<   d d d            n# 1 swxY w Y   || _        | j         	                    d|rdnd|           d S )Nz,requested %s PyGIT.Storage instance for '%s'weakznon-weak)
logger_StorageFactory__dict_lock_StorageFactory__dict_nonweakKeyError_StorageFactory__dict_StorageFactory__dict_rev_cachegetr   _StorageFactory__instr   )rZ   repor]   r   r\   git_fs_encodingi	rev_caches           r   r_   zStorageFactory.__init__   sg    	. 	. +D11   D&K% & & & 155d;;	D#wKK$%D!!!&  .,-#D)#	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.& H$(8&&j$	@ 	@ 	@ 	@ 	@sM   BB
)B)B;BAA?<B>A??BB!Bc                     | j         S rU   )r   ra   s    r   getInstancezStorageFactory.getInstance  s
    {r   c                 Z    | j         5  || j        |<   d d d            d S # 1 swxY w Y   d S rU   )r   r   )r   r   r   s      r   set_rev_cachezStorageFactory.set_rev_cache  s{    _ 	3 	3)2C &	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3 	3s    $$c                     | j         5  | j                                         | j                                         | j                                         ddd           dS # 1 swxY w Y   dS )zFor testing purpose onlyN)r   r   clearr   r   r   s    r   _cleanzStorageFactory._clean  s     _ 	) 	)J$$&&& &&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   AA!!A%(A%)TrS   N)r   r   r   weakrefWeakValueDictionaryr   r   r   r   r   r_   r   r   r   r   r   r   r   r   r      s        (W(**FN$&&K5:!%@ @ @ @6   3 3 [3 ) ) [) ) )r   r   c                      e Zd ZdZdZ G d de          Zed             Zed9d            Z		 	 d:d	Z
d
 Zd Zd Zed             Zd;dZd Zd Zd Zd Zd Zd Zd Zd;dZd Zd Zd Zd Zd Zd Zd Zd Z d<d!Z!d" Z"d=d#Z#d>d%Z$d& Z%d' Z&d( Z'd) Z(d=d*Z)d+ Z*d, Z+d- Z,e-j.        d.             Z/d=d/Z0d=d0Z1d1 Z2d2 Z3d3 Z4d4 Z5d>d5Z6d6 Z7d7 Z8d8 Z9dS )?r   z8High-level wrapper around GitCore with in-memory cachingr7   c                   @    e Zd ZdZd Zed             Zd Zd Zd Z	dS )Storage.RevCache)youngest_rev
oldest_revrev_dict	refs_dict	srev_dictc                     || _         || _        || _        || _        || _        |
||r|r|rd S |s
|s|s|s|sd S t          d| z            )NzInvalid RevCache fields: %r)r   r   r   r   r   
ValueError)rZ   r   r   r   r   r   s         r   r_   zStorage.RevCache.__init__  s     ,D(DO$DM&DN&DN'J,B -C!* -C/8 -C! G* G G)2G;DG !>!EFFFr   c                       | d d i i i           S rU   r   r   s    r   emptyzStorage.RevCache.empty.  s    3tT2r2...r   c                     d| j         | j        t          | j                  t          | j                  t          | j                  fz  S )NziRevCache(youngest_rev=%r, oldest_rev=%r, rev_dict=%d entries, refs_dict=%d entries, srev_dict=%d entries))r   r   r:   r   r   r   ra   s    r   rb   zStorage.RevCache.__repr__2  sG    + %tDM8J8J''T^)<)<>> >r   c              #      K   | j                             d          }| j                                         D ]-\  }}|                    d          r|dd          |||k    fV  .d S )N   HEAD   refs/heads/   )r   r   itemsr@   )rZ   headrefnamerK   s       r   iter_brancheszStorage.RevCache.iter_branches9  s|      >%%g..D $ 4 4 6 6 = =%%n55 =!"##,W_<<<<= =r   c              #      K   | j                                         D ](\  }}|                    d          r|dd          |fV  )d S )N
   refs/tags/
   )r   r   r@   )rZ   r   rK   s      r   	iter_tagszStorage.RevCache.iter_tags?  sa       $ 4 4 6 6 , ,%%m44 ,!"##,++++, ,r   N)
r   r   r   	__slots__r_   r   r   rb   r   r   r   r   r   RevCacher     su        "		G 	G 	G  
	/ 	/ 
	/	> 	> 	>	= 	= 	=	, 	, 	, 	, 	,r   r   c                     t          |           dk    sJ t          | d d         d          }d|cxk    rdk    sn J |S )Nr7      r   i  )r:   r;   )rK   srev_keys     r   	__rev_keyzStorage.__rev_keyD  sV    3xx1}}}}s2A2w##H&&&&&&&&&&r   rS   c           	      0   d}	 t          |                                           }n5# t          $ r(}t          d| dt	          |          d          d }~ww xY wt          |d          }t          j        d|          }|s"t          d| dt          |                    |	                    d	          }t          d
 |                    d          D                       }||d                    t          t
          |                    |||k    dS )N)r          )r\   z!Could not retrieve GIT version. 'z --version' ()latin1zgit version (.*)
$z --version' returned r    c              3   6   K   | ]}t          ||          V  d S rU   )r	   ).0ss     r   	<genexpr>z&Storage.git_version.<locals>.<genexpr>a  s*      KKqfQllKKKKKKr   .)v_strv_tuple	v_min_strv_min_tuplev_compatible)rR   versionOSErrorr   r   rI   r   r=   reprr9   tupler%   r(   rr   )r\   GIT_VERSION_MIN_REQUIREDr   emversion_strversion_tuples          r   git_versionzStorage.git_versionL  sQ   #, 	Hg...6688GG 	H 	H 	H(%,WW.B1.E.E.E.EG H H H	H gx(( H*G44 	7(%ggtG}}}6 7 7 7 ggajjKKK4E4Ec4J4JKKKKK $#c+C"D"DEE3)-EE
 
 	
s   "' 
A#AANc                    || _         d| _        |p| j                                        | _        d| _        t                      | _        t          d          | _	        t                      | _
        d| _        t                      | _        d| _        t                      | _        )t          j                   fd| _        fd| _        nd x| _        | _        	 t'          j        |           n-# t*          $ r }|                     ||           Y d}~nd}~ww xY w|                     |          sxt&          j                            |d          }	 t'          j        |           |                     |          rd}|}nd}n# t*          $ r d}Y nw xY w|rt5          d	|z            	 t7          t&          j                            |d
          d          5  	 ddd           n# 1 swxY w Y   n-# t*          $ r }|                     ||           Y d}~nd}~ww xY wt9          |||          | _        || _        | j                             d|           dS )a(  Initialize PyGit.Storage instance

        `git_dir`: path to .git folder;
                this setting is not affected by the `git_fs_encoding` setting

        `log`: logger instance

        `git_bin`: path to executable
                this setting is not affected by the `git_fs_encoding` setting

        `git_fs_encoding`: encoding used for paths stored in git repository;
                if `None`, no implicit decoding/encoding to/from
                unicode objects is performed, and bytestrings are
                returned instead
        NT   c                 0    |                      d          S rf   )ri   r   r   s    r   <lambda>z"Storage.__init__.<locals>.<lambda>  s    AHH_5>-@ -@ r   c                 .    |                                S rU   rN   r  s    r   r  z"Storage.__init__.<locals>.<lambda>  s    ahh.G.G r   c                     | S rU   r   )r   s    r   r  z"Storage.__init__.<locals>.<lambda>  s    A r   z.gitFz#Git control files not found in '%s'HEADrbz.PyGIT.Storage instance for '%s' is constructed) r   commit_encodingr   r   _Storage__rev_cache_Storage__rev_cache_refreshr   _Storage__rev_cache_lockr   _Storage__commit_msg_cache_Storage__commit_msg_lock_Storage__cat_file_pipe_Storage__cat_file_pipe_lock_Storage__diff_tree_pipe_Storage__diff_tree_pipe_lockcodecslookup_fs_to_unicode_fs_from_unicodero   listdirEnvironmentError_raise_not_readable_control_files_existrD   r(   r   openrR   r   	repo_pathr   )	rZ   r[   r]   r\   r   r   r  dot_git_dirmissings	       `    r   r_   zStorage.__init__j  s   $ # %=(;(;(=(=#'  $ #,C..!%#$(FF! $%)VV"&M/***#@ #@ #@ #@D$G$G$G$GD!! ;F+ED$"7	1Jw 	1 	1 	1$$Wa00000000	1((11 	P',,w77K	#
;''' ,,[99 ##G)GG"GG $     PDwNOOO	1bgll7F33T::                 	1 	1 	1$$Wa00000000	1 GWc?CC	 J!	# 	# 	# 	# 	#sf    C5 5
D?DDF	 	FF0.G8 G, G8 ,G00G8 3G04G8 8
H"HH"c                     |rR|j         |j        |j        fD ]}|r|                                 t	          |           |                                 d S d S rU   )rx   ry   rz   closer
   wait)rZ   procfs      r   _cleanup_proczStorage._cleanup_proc  sb     	j$+t{;   GGIIIdOOOIIKKKKK	 	r   c                     | j         5  |                     | j                   d d d            n# 1 swxY w Y   | j        5  |                     | j                   d d d            d S # 1 swxY w Y   d S rU   )r  r,  r  r  r  ra   s    r   __del__zStorage.__del__  s    & 	5 	5t3444	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5 	5' 	6 	6t4555	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s   /33A))A-0A-c                 T    | j         5  d| _        d d d            d S # 1 swxY w Y   d S )NT)r  r  ra   s    r   invalidate_rev_cachezStorage.invalidate_rev_cache  sw    " 	, 	,'+D$	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   !!c                 z    | j         5  |                                  | j        cddd           S # 1 swxY w Y   dS )zrRetrieve revision cache

        may rebuild cache on the fly if required

        returns RevCache tuple
        N)r  _refresh_rev_cacher  ra   s    r   r   zStorage.rev_cache  s     " 	$ 	$##%%%#	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$s   044Fc                 p   d}|s| j         rd| _         |                                 }| j        j        |k    r_| j                            d| j                   |                     |          }|| _        t          	                    | j        |           d}n | j                            d| j                   |S )NFz'Detected changes in git repository '%s'Tz*Detected no changes in git repository '%s')
r  	_get_refsr  r   r   r   r$  _build_rev_cacher   r   )rZ   force	refreshedrefsr   s        r   r2  zStorage._refresh_rev_cache  s    	 	:D, 	:',D$>>##D)T11!! #)*..: : : 11$77	#, ,,T^YGGG 		!! #)*..: : :r   c           
         | j                             d| j                   t                      }i }i }i fdfd|                                D             }d |                                D             }fd| j                            ddd                                          D             }d |r|d	         d	         }|d
         d	         }nd x}}i fd}	| j        }
t          |          D ]6\  }}|d	         }|dd          }|
                     |
|          g                               |           ||v r||         \  }}}}|sJ |rJ |d	k    sJ nt                      }t                      }||v r|                    |           t          |          t          |          |dz    |	|          f||<   |D ]c}|
                    |t                      g d	t                      f          \  }}}}|                    |           |                    |           d8d t#          |          dk    rdgt%          |          dz   z  ni }	 	 |                                \  }}t          |          ||<   *# t(          $ r Y nw xY wt#          |          d	k    sJ |}|                     |||||          }| j                             d| j        t#          |          dt                      |z
  z             |S )Nz,triggered rebuild of commit tree db for '%s'c                 0                         | |           S rU   )r&   )rK   	revs_seens    r   
_rev_reusez,Storage._build_rev_cache.<locals>._rev_reuse  s    ''S111r   c                 .    i | ]\  }}| |          S r   r   )r   r   rK   r<  s      r   
<dictcomp>z,Storage._build_rev_cache.<locals>.<dictcomp>  s'    JJJ\WcCJJJr   c                 B    h | ]\  }}|                     d           |S )r   )r@   )r   r   rK   s      r   	<setcomp>z+Storage._build_rev_cache.<locals>.<setcomp>  sE     @ @ @\Wc#..~>>@S @ @ @r   c           	      n    g | ]1}t          t          |                                                    2S r   )rq   rr   r%   )r   r+   r<  s     r   
<listcomp>z,Storage._build_rev_cache.<locals>.<listcomp>  sI     J J J Z6677 J J Jr   z	--parentsz--topo-order--allr   r   c                 N    t          |           }                     | |           S rU   )	frozensetr&   )rheadsrheads_seens    r   _rheads_reusez/Storage._build_rev_cache.<locals>._rheads_reuse  s&    v&&F))&&999r   r    i  r   Tz>rebuilt commit tree db for '%s' with %d entries (took %.1f ms)i  )r   r   r$  r   r   r   rev_listr"   _Storage__rev_key	enumerater&   r$   setaddrE  r  updater:   maxpopitemr   r   )rZ   r8  ts0new_dbnew_sdb	head_revsrI  youngestoldestrH  rJ  ord_revrevsrK   parents	_children_parents_ord_rev_rheadsparent_rheads2tmpkvr   r<  r;  rG  s                            @@@r   r5  zStorage._build_rev_cache  s   H.	* 	* 	*jj 		2 	2 	2 	2 	2 KJJJTZZ\\JJJ@ @TZZ\\ @ @ @	J J J J $	 2 2;3:!< !<<FJLLJ J J 	 	%{1~Hb\!_FF $$Hv	: 	: 	: 	: 	: N	&x00 $	) $	)MGTq'C122hG yy~~r2299#>>> f}}9?6	8Xw    ####1}}}}}EE	%%iC    %Y//w1(=113F3K " 	) 	) %%fsuub!SUU.CDD 8	8Xx c""" ((((	)  ,/w<<$+>+>rdc'llQ&''B	"((1qA"  	 	 	D	7||q    MM(FFD'JJ	 +,0NCKK(**s"23	5 	5 	5 s   +J 
JJc                    i }i }| j                             d                                          D ]H}d|vr|                    dd          \  }}|                    d          r|||d d         <   C|||<   I|                    t          |                                                     |r8| j                             dd          pd	                                }||v r||d	<   |S )
Nz--dereference    r    s   ^{}z-qr   r   )
r   show_refr"   r%   rA   rN  iterr   symbolic_refr'   )rZ   r8  tagsr+   rK   r   s         r   r4  zStorage._get_refsJ  s    I&&77BBDD 	$ 	$D4::dA..LC'' $%(WSbS\"" #WD&&''' 	(y--dF;;ArHHJJG$ 'Wr   c                     d }| j         t          fd| j                                        D             |          }d |D             S )z`returns list of (local) branches, with active (= HEAD) one being
        the first item
        c                     | \  }}}| |fS rU   r   )rt   rp   rK   r   s       r   fnz Storage.get_branches.<locals>.fnc  s    "OD#t8T>!r   c              3   V   K   | ]#\  }}} |          t          |          |fV  $d S rU   rL   )r   rp   rK   r   r  s       r   r   z'Storage.get_branches.<locals>.<genexpr>g  sT       > >.tS$ +N400&++tD > > > > > >r   r/   c                     g | ]
\  }}}||fS r   r   )r   rp   rK   r   s       r   rB  z(Storage.get_branches.<locals>.<listcomp>j  s"    <<<c4s<<<r   )r  sortedr   r   )rZ   rm  branchesr  s      @r   get_brancheszStorage.get_branches_  s    	" 	" 	" , > > > >"n::<<> > >CEG G G =<8<<<<r   c              #      K   | j         }| j        j                                        D ]'\  }}|dk    r ||          t	          |          fV  (d S )Nr   )r  r   r   r   rL   )rZ   r  r   rK   s       r   get_refszStorage.get_refsl  si      , N4::<< 	; 	;LGS'!!$nW--vc{{::::	; 	;r   c                     | j         j        S rU   )r   r   ra   s    r   get_commitszStorage.get_commitsr  s    ~&&r   c                 4    t          | j        j                  S rU   )rL   r   r   ra   s    r   r   zStorage.oldest_revu  s    dn/000r   c                 4    t          | j        j                  S rU   )rL   r   r   ra   s    r   r   zStorage.youngest_revx  s    dn1222r   c                 J   t          |          }| j        }	 |j        |         d         n# t          $ r g cY S w xY w|rA| j        fd|                                D             }|                    d            |S t          t          t                              S )zreturn list of reachable head sha ids or (names, sha) pairs if
        resolve is true

        see also get_branches()
           c                 T    g | ]$\  }}}|v 
 |          t          |          f%S r   ro  )r   rp   rK   r   r  rF  s       r   rB  z/Storage.get_branch_contains.<locals>.<listcomp>  sE     $ $ $%dCF]] ">$''5"]]r   c                     | d         S )Nr   r   )rb  s    r   r  z-Storage.get_branch_contains.<locals>.<lambda>  s
    !A$ r   rp  )
rP   r   r   r   r  r   sortrq   rr   rL   )rZ   r   resolve
_rev_cachervr  rF  s        @@r   get_branch_containszStorage.get_branch_contains{  s     Skk^
	(-a0FF 	 	 	III	  	-!0N$ $ $ $ $)3)A)A)C)C$ $ $B GGG'''IFF++,,,s   . ==c                 ^      fd} |t          |          |          }t          |          S )Nc                 *                                    }| |vrt                      |dk    r| S ||          d         |z   }|dk     s|t          |          k    rd S |                                D ]\  }}|d         |k    r|c S t	          d          )Nr      r    zinternal inconsistency detected)rx  r   r:   r   r   )r   rel_posr   lin_revra  rb  rZ   s         r   get_history_relative_revz>Storage.history_relative_rev.<locals>.get_history_relative_rev  s    ''))H(""!mm#!||
smA&0G{{gH55t ((  1Q47??HHH # <===r   )rP   rL   )rZ   r   r  r  results   `    r   history_relative_revzStorage.history_relative_rev  sB    	> 	> 	> 	> 	>* *)&++w??f~~r   c                 .    |                      |d          S )Nr   r  rZ   r   s     r   hist_next_revisionzStorage.hist_next_revision      ((b111r   c                 .    |                      |d          S Nr    r  r  s     r   hist_prev_revisionzStorage.hist_prev_revision  r  r   c                     | j         4| j                            dd                                          pd| _         | j         S )Nz--getzi18n.commitEncodingr2   )r  r   configr'   ra   s    r   get_commit_encodingzStorage.get_commit_encoding  sH    '	  *?@@FFHH    ##r   c                 ,    |                      d          S )zget current HEAD commit idr  )	verifyrevra   s    r   r   zStorage.head  s    ~~f%%%r   c                 R    |                      ||                                          S rU   )_cat_file_readerread)rZ   kindr   s      r   cat_filezStorage.cat_file  s$    $$T3//44666r   c                    | j         5  | j        | j                                        | _        	 | j        j                            |dz              | j        j                                         | j        j                                        	                                }t          |          dk    rt          dt          |          z            |\  }}}||k    rt          d|d|d          t          |          }| j        j        j        }|dk    rt          j                    }	nt#          j                    }	|dz   }
|
d	k    ru |t'          |
d
                    }|st          d|dz   |dz   |
z
  fz            |
t          |          z  }
|	                    |
d	k    r|n	|d d                    |
d	k    u|	                    d	           |	cd d d            S # t*          $ rS}| j                            dt1          |                     |                     | j                   d | _        Y d }~nd }~ww xY w	 d d d            d S # 1 swxY w Y   d S )N   
r|  z(internal error (could not split line %s)z+internal error (got unexpected object kind z, expected r   i   r    r   i   z;internal error (expected to read %d bytes, but only got %d)r   zclosing cat_file pipe: %s)r  r  r   r   rx   writeflushry   readliner%   r:   r   r   r;   r  tempfileTemporaryFileioBytesIOminseekr   r   warningr   r,  )rZ   r  r   split_stdout_line_sha_type_sizesizestdout_readbuf	remainingchunkr  s                r   r  zStorage._cat_file_reader  s   & 3	, 3	,#+'+y'?'?'A'A$/,$*00u===$*00222$($8$?$H$H$J$J@E "())Q.."#M#'(9#:#:$; < < < &7"eUD=="(>CeeTTT$K L L L 5zz
 #29>***"022CC*,,C 1H	!mm'KIu(=(=>>E  I& (A(,q$(Y2F'G(H I I I U+IIIy1}}ee%*EEE  !mm U3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	,X $ , , , ##$?$8$;$;= = =""4#7888'+$$$$$$, %g3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	, 3	,s6   &IF'G##
I -A	H;6I;I  IIIc                 h      fd} |                      |                    }t          |          S )zaverify/lookup given revision object and return a sha id or None
        if lookup failed
        c                    j         }t                              |           r                    |           }|r|S |j        }| dk    r!|                    |           }||v r||         S |                    d| z             }|r|S |                    d| z             }|r|S j                            d|                                           }|sd S ||j	        v r|S d S )Nr   r   r   z--verify)
r   rR   r   fullrevr   r   r   	rev_parser'   r   )rK   r  r  r8  r   resolvedr   rZ   s          r   get_verifyrevz(Storage.verifyrev.<locals>.get_verifyrev  s    J~~c"" #,,s++ #"N'Dg~~((3--d??=(xx 455H  xx 344H   $$Z55;;==B tZ(((	4r   )r  rL   )rZ   rK   r  r  s   `   r   r  zStorage.verifyrev  sG    
	 	 	 	 	< t44S99::f~~r      c                 Z      fd}t           |t          |          |                    S )Nc                 ^   |j         k     rj         }j        }| |j        vrdS | d|         }t          |j                            |                              }t          |          dk    r|S || hz
  }t          |dz   d          D ] | d         }|fd|D             vr|c S !| S )ztry to shorten sha idNr    r   c                 $    g | ]}|d          S rU   r   )r   rls     r   rB  z:Storage.shortrev.<locals>.get_shortrev.<locals>.<listcomp>:  s!    77712A2777r   )_Storage__SREV_MINr   r   rL  r   rJ  r:   range)rK   min_lenr  srevsrevscrevsr  rZ   s         @r   get_shortrevz&Storage.shortrev.<locals>.get_shortrev!  s    
 ((/J*---txx=D
,T^^C-@-@ABBE5zzQ SEME719b))    2A2w777777777KKK 8 Jr   )rL   rP   )rZ   rK   r  r  s   `   r   shortrevzStorage.shortrev  s>    	 	 	 	 	< ll6#;;88999r   c                 4   | j         }t          |          dk    r||j        v r|S t                              |          sdS 	 |j        |                     |                   }n# t          $ r Y dS w xY wd}|D ]}|                    |          r| dS |}|S )ztry to reverse shortrev()r   N)	r   r:   r   rR   r   r   rJ  r   r@   )rZ   rK   r  r  r  r   s         r   r  zStorage.fullrevB  s     ^
 s88r>>cZ%888J~~c"" 	4	()<)<=EE 	 	 	44	  	 	A||C   '44s    A$ $
A21A2c                      t                    t           fd j                                        D                       S )Nc              3   X   K   | ]$\  }}|k                         |          V  %d S rU   )r  )r   rp   rev_rK   rZ   s      r   r   z#Storage.get_tags.<locals>.<genexpr>^  sK       5 5$$t ))$//(35 5r   )rP   rr  r   r   rZ   rK   s   ``r   get_tagszStorage.get_tags[  s_    ?++C 5 5 5 5 5(,(@(@(B(B5 5 5 5 5 	5r   rf  c                     |r                      |          nd}                      |                              d          pd} j                            |rdnd|d|                              d          } fdfd	|D             S )
Nr      /   .z-zlrz-zl--    c                 ,   |                      dd          \  }}|                                 \  }}}}t          |d          }t          |          }t          |d          }|dk    rdnt          |          }                    |          }|||||fS )z7split according to '<mode> <type> <sha> <size>	<fname>'   	r    r2   r8      -N)r%   rI   rL   r;   r  )r  metafname_moder  r  r  rZ   s          r   split_ls_tree_linez+Storage.ls_tree.<locals>.split_ls_tree_lineh  s     ''%++KD%(,

%E5$w''E$<<DqMME!TMMDDs5zzE''..E%ue33r   c                 *    g | ]}| |          S r   r   )r   r  r  s     r   rB  z#Storage.ls_tree.<locals>.<listcomp>t  s*    999!q9""1%%999r   )r  lstripr   ls_treer%   )rZ   rK   rD   	recursivetreer  s   `    @r   r  zStorage.ls_treeb  s    ,/<d##C(((W$$T**11$77?4y  9!?%!$dD2 227%,, 	
	4 
	4 
	4 
	4 
	4 :999t9999r   c                    |st          d          |}|                     t          |                    }|                                 }||vr#| j                            d||           t          | j        5  || j        v r6| j        |         }|d         t          |d                   fcd d d            S 	 d d d            n# 1 swxY w Y   | 
                    d|          }t          ||                                 d          }t          |          }| j        5  || j        |<   d d d            n# 1 swxY w Y   |d         t          |d                   fS )Nz'read_commit called with empty commit_idzread_commit failed for %r (%r)r   r    s   commitr?   )r   r  rP   rx  r   infor   r  r  r   r  rI   r  r1   )rZ   	commit_idcommit_id_origr   r  r)   s         r   read_commitzStorage.read_commitv  s    	FDEEE"LL	!2!233	##%%H$$K=&8 8 8# 	2 	2D3330;ay$vay//1		2 	2 	2 	2 	2 	2 	2 	23	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 mmIy11#t//119==c""# 	8 	817D#I.	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8ay$vay//))s$   83CC	C	D66D:=D:c                 L    t          |          }|                     d|          S )Ns   blob)rP   r  r  s     r   get_filezStorage.get_file  s#    Skk$$Wc222r   c                     t          |          }	 t          | j                            d|                                                    }n # t
          $ r t          d|z            w xY w|S )Ns   -szobject '%s' not found)rP   r;   r   r  r'   r   r   )rZ   r   obj_sizes      r   get_obj_sizezStorage.get_obj_size  ss    Skk	=49--eS99??AABBHH 	= 	= 	=5;<<<	=s   :A A)c                     t          |          }|                                 }	 ||         }n# t          $ r Y dS w xY wt          t	          t
          |d                             S )Nr   r   )rP   rx  r   rr  rr   rL   rZ   r   r   items       r   childrenzStorage.children  sl    Skk##%%	C=DD 	 	 	22	c&$q'**+++s   . 
<<c              #     K   ||                                  }t                      }t                      }||         d         }|                    |           |                    |           |rU|                                }|V  ||         d         |z
  }|                    |           |                    |           |Ut          |          dk    sJ dS )z4Recursively traverse children in breadth-first orderNr   )rx  r   rL  rN  rn   r   r:   )rZ   r   r   	work_listseenrZ  r   s          r   children_recursivezStorage.children_recursive  s       ''))HGG	uuSM!$	I### 	(!!##AGGG A-IKK	"""Y'''  	( 9~~""""""r   c                     t          |          }|                                 }	 ||         }n# t          $ r g cY S w xY wt          t	          t
          |d                             S r  )rP   rx  r   rq   rr   rL   r  s       r   rY  zStorage.parents  sn    Skk##%%	C=DD 	 	 	III	CQ(()))s   . ==c              #   Z   K   |                                  D ]}t          |          V  d S rU   )rx  rL   r  s     r   all_revszStorage.all_revs  s@      ##%% 	 	C++	 	r   c                 p    | j         5  |                     d          cd d d            S # 1 swxY w Y   d S )NT)r6  )r  r2  ra   s    r   synczStorage.sync  s    " 	7 	7***66	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7s   +//c              #      K   g i g                                 pd fd} |             fd}	 |V  r                     d                    d S d S # r                     d                    w w xY w)Nr   c               3     K   	j                             ddd
d          gd d <   d         j        } | D ]}|dk    r	|                    d          }| D ]}|dk    r n|                    d                              dd          \  }}t          |          }|vr?||<   |gk    r|V  	 |                    d	d          \  }}n# t          $ r Y nw xY w|v?r	                    d                    g d d <   	 d V  )
Nz--pretty=format:%n%Hz--no-renamesz--name-statusr  r   r  r  r    r  )	r   r   ry   rstripr%   rE   rsplitr   r,  )r+  r  old_shar   rD   	base_pathchange	next_pathr   rZ   r   s        r   name_status_genz.Storage.get_historian.<locals>.name_status_gen  su     I&&'=~'6T9N N OAaaaD!A " "::((5// " "AEzzhhuoo33E1==GAt#D>>Df,,'.t$..")MMM"&*kk$&:&:GD!!) " " "!E" f,,  )""1Q4(((AaaaD


s   2C
CCc                                          |           } 	 |          }n'# t          $ r | gd d <   t                    }Y nw xY wt          |          S rU   )r  r   nextrL   )rD   rK   r  genr  rZ   s     r   	historianz(Storage.get_historian.<locals>.historian  sm    ((..D Tl       $v	!!!3ii  #;;s   ! !AAr   )r  r,  )	rZ   r   r  r  r  r  r   r  r   s	   ```  @@@@r   get_historianzStorage.get_historian  s     	)))44;		 	 	 	 	 	 	 	 	 	6 o	 	 	 	 	 	 	 		)OOO )""1Q4((((() )q )""1Q4(((()s   A) ) B	c                 \    | ||          S |                      ||d          D ]}|c S d S )Nr    )limit)history)rZ   r   rD   r  entrys        r   last_changezStorage.last_change  sE     9T??"\\#t1\55 	 	ELLLtr   c              #      K   |d}d|z  t          |          g}|r*|                    d|                     |          f            | j        j        | }|                                D ]}t          |          V  d S )Nr   z--max-count=%dr  )rI   rn   r  r   rI  r"   rL   )rZ   r   rD   r  rt   r`  rK   s          r   r  zStorage.history  s      =E 5(#c((3 	=KKt44T::;<<< di $'>>## 	 	C++	 	r   c                     | j                             ddd|z  d|dz
  z            }d |                                D             S )NrC  z--date-orderz--max-age=%dz--min-age=%dr    c                 ,    g | ]}t          |          S r   ro  )r   rK   s     r   rB  z-Storage.history_timerange.<locals>.<listcomp>  s    ;;;s;;;r   )r   rI  r"   )rZ   startstopoutputs       r   history_timerangezStorage.history_timerange  sW     ##G^$2U$:$2dQh$?A A <;v'8'8':':;;;;r   c                     t          |          }t          |          }|                                 }||v o||                     ||          v S )z(return True if rev2 is successor of rev1)rP   rx  r  )rZ   rev1rev2r   s       r   rev_is_anchestor_ofzStorage.rev_is_anchestor_of  sW     d||d||##%%  @//h???	Ar   c              #     K   d}t          |          }|                     |          }| j                            dd||                                          D ]~}|sJ |r|                    d           }|                                }t          |          dk    r|\  }}}}	n|\  }}}t          |          dk    sJ t          |          |fV  d}|rJ d S )NFz-pr  r  r7   r   T)	rP   r  r   blamer"   r@   r%   r:   rL   )
rZ   
commit_sharD   in_metadatar+   
split_liner   orig_linenolineno
group_sizes
             r   r  zStorage.blame$  s      J''
$$T**IOOD$jAA(jll	# 	#DKKK #"&//%"8"88!ZZ\\
z??a''=G:S+vzz1;.S+v3xx2~~~~Skk6))))"r   c              #     K   | j         5  | j        | j                                        | _        | j        }	 |j                            |r!dt          |          t          |          fz  ndt          |          z             |j                                         |j        j	        }g } |d          }|st                      |dk    rt                      }|dk    r<|                    |d                     |d          }|st                      |dk    <|                    t          |                      |d          }|st                      |dk    n"#  d | _        |                     |            xY wd d d            n# 1 swxY w Y   |sd S |d                             d          rJ |dd          }|                     |          E d {V  d S )Ns   %s %s

s   %s

r    r  r  r      :)r  r  r   r   rx   r  rP   r  ry   r  EOFError	bytearrayr$   rh   r,  r@   _iter_diff_tree)rZ   tree1tree2r*  r  entriescr  s           r   get_changeszStorage.get_changes<  sM     ' 	 	$,(,	(@(@(B(B%(D
  $)";u0N!N!N!*VE]]!:< < < 
  """{'DGG %"**$5jj%KKEu**QqT*** DGG  -"***,	 u**
 NN5<<000QA )&jj( 5jj(,%""4(((9	 	 	 	 	 	 	 	 	 	 	 	 	 	 	:  	F1:((.....!""+''00000000000s)   -FD(E! F!F  FFFc              #     K   |                      |                              d          pd}ddg}|r|                    d           |                    |r|nd|d|g            | j        j        | }|sdS d	 }t           ||                    }|s,|                    d
          }	|	                    d          rJ | 	                    |          E d{V  dS )zgcalls `git diff-tree` and returns tuples of the kind
        (mode1,mode2,obj1,obj2,action,path1,path2)r  r  r   r   r   r   r  Nc              3   l   K   d}	 |                      d|          }|dk    rd S | ||         V  |dz   }0)Nr   Tr  r   r    )find)r  r  idxs      r   
iter_entryz%Storage.diff_tree.<locals>.iter_entrys  sT      E kk%//"99FU3Y''''a r   r   r  )
r  r'   r$   rn   r   	diff_treerq   r#   r@   r  )
rZ   r   r!  rD   find_renamesdiff_tree_argsr  r)  r"  r  s
             r   r*  zStorage.diff_treeb  s'      $$T**0066>$ 	(!!$''';uu8$dD2 	3 	3 	3$$n5 	F	  	  	  zz&))** 	. KKNNE''-----''00000000000r   c              #   T  K   fd}t          |          	 	  |            }n# t          $ r Y d S w xY w|                    d          sJ |dd                              d          }t	          |          dk    sJ |\  }}}}}	t          |d          }t          |d          }t          |          }t          |          }t          |	d d         d          }	|                      |                      }
d }|	d	v r|                      |                      }|||||	|
|fV  )
Nc                  "    t                     S rU   )r  )r)  s   r   
next_entryz+Storage._iter_diff_tree.<locals>.next_entry  s    
###r   Tr  r    rd  r   r8   r2   )RC)	rh  StopIterationr@   r%   r:   r;   rL   rI   r  )rZ   r"  r/  r  valuesold_modenew_moder  new_shar  old_pathnew_pathr)  s               @r   r  zStorage._iter_diff_tree  sv     	$ 	$ 	$ 	$ 	$ ']]
	"
    ##D)))))122Y__T**Fv;;!####;A8Hh&8Q''H8Q''HWooGWooGW--F**::<<88HH##..zz||<<Xw   %	s   
% 
33c                 F    t          d|dt          |                    )NzMake sure the Git repository 'z' is readable: )r   r   )rZ   r[   r  s      r   r!  zStorage._raise_not_readable  s,    h!'':a===2 3 3 	3r   c                     dD ]^}t           j                            t           j                            ||                    s| j                            d||            dS _dS )N)r  objectsr8  z%Missing Git control file '%s' in '%s'FT)ro   rD   existsr(   r   r   )rZ   r[   rp   s      r   r"  zStorage._control_files_exist  sl    / 	 	D7>>"',,w"="=>> !!"I"&1 1 1uu tr   )rS   )rS   NN)F)r  rU   )rf  F):r   r   r   r   r  objectr   staticmethodrJ  r  r_   r,  r.  r0  propertyr   r2  r5  r4  rt  rv  rx  r   r   r  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r  r  rY  r  r  
contextlibcontextmanagerr  r  r  r  r  r  r$  r*  r  r!  r"  r   r   r   r   r     s       BBJ), ), ), ), ),6 ), ), ),V   \ 
 
 
 \
: EIO# O# O# O#b  6 6 6, , , 	$ 	$ X	$   "Z Z Zx  *= = =; ; ;' ' '1 1 13 3 3- - - -2  42 2 22 2 2$ $ $& & &7 7 74, 4, 4,l$ $ $L :  :  :  :F  25 5 5 5: : : :(* * *63 3 3  , , ,# # # #.* * *  7 7 7 0) 0) 0)d   	 	 	 	< < <A A A  0$1 $1 $1L!1 !1 !1 !1F  63 3 3    r   r   )2r  r@  r  ro   r   r{   r  r   collectionsr   	functoolsr   r   r   	threadingr   	trac.corer   	trac.utilr	   r
   trac.util.compatr   trac.util.datefmtr   trac.util.textr   r   __all__r   r   r1   r   rO   rB   r  r<   zip_key_valrh   rE   rL   rP   r=  rR   r   r   r   r   r   r   r   <module>rN     s        				 				 				                   $ $ $ $ $ $ $ $       # # # # # # ' ' ' ' ' ' ' ' & & & & & & & & & & & & ; ; ; ; ; ; ; ;
B
B
B	 	 	 	 	} 	 	 		 	 	 	 	( 	 	 	
# # #: bj7>>wGGHH3#m%9::    JD$N4$~&&
 
 
    W1 W1 W1 W1 W1f W1 W1 W1tJ J J J J J J J:/) /) /) /) /)V /) /) /)dV V V V Vf V V V V Vr   