
    Dg1                        d 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	  G d d          Z
 G d d          Z G d d	          Z e            Zd
Zej        dk    redz  Zedz   Zg fdZd ZefdZd Z G d de	j                  Zd Z G d de          Zd Zd                    d          Zej        ev re                    ej                   ej        dk    Z ej         dej!                  Z"d Z#d0dZ$d Z% G d d e&          Z' ej         d!          Z( G d" d#e	j                  Z) G d$ d%          Z* G d& d'e*          Z+ G d( d)          Z,d* Z- ej         d+          fd,Z.g fd-Z/ G d. d/          Z0dS )1zm
svn-Command based Implementation of a Subversion WorkingCopy Path.

  SvnWCCommandPath  is the main class.

    N)commonc                       e Zd Zi Zi Zi Zi ZdS )cacheN)__name__
__module____qualname__proplistinfoentriesprop     C/var/www/sysmax/venv/lib/python3.11/site-packages/py/_path/svnwc.pyr   r      s"        HDGDDDr   r   c                       e Zd Zd Zd ZdS )	RepoEntryc                 0    || _         || _        || _        d S Nurlrev	timestamp)selfr   r   r   s       r   __init__zRepoEntry.__init__   s    "r   c                 6    d| j         d| j        d| j        S )Nzrepo: ;  r   r   s    r   __str__zRepoEntry.__str__    s!     #'888TXXXt~~FFr   N)r   r   r   r   r   r   r   r   r   r      s7        # # #
G G G G Gr   r   c                   0    e Zd ZdZdZd Zd ZddZd ZdS )		RepoCachez The Repocache manages discovered repository paths
    and their revisions.  If inside a timeout the cache
    will even return the revision of the root.
       c                     g | _         d S r   reposr   s    r   r   zRepoCache.__init__*       


r   c                     g | _         d S r   r#   r   s    r   clearzRepoCache.clear-   r%   r   Nc                     |d S |t          j                     }| j        D ]}||j        k    r||_        ||_         d S t          |||          }| j                            |           d S r   )timer$   r   r   r   r   append)r   r   r   r   entrys        r   putzRepoCache.put0   s    ;F	IZ 	% 	%Eei"+		   c3	22EJe$$$$$r   c                     t          j                     }| j        D ]J}|                    |j                  r.||j        | j        z   k     r|j        |j        fc S |j        dfc S K|dfS )N)r)   r$   
startswithr   r   timeoutr   )r   r   nowr+   s       r   getzRepoCache.getA   s    ikkZ 	% 	%E~~ei(( %4<777 9ei////y"}$$$	%
 Bwr   r   )	r   r   r   __doc__r0   r   r'   r,   r2   r   r   r   r    r    #   sf          G    % % % %"    r   r    z_ -/\=$.~+%win32:z@:c                 (   	 | d         S # t           $ r} t          j                            d          }|                                 d                    |                    d          d d                   }|                     |           |cY S w xY w)Nr   zsvn -q --version.   )
IndexErrorpyprocesscmdexecstripjoinsplitr*   )vervs     r   _getsvnversionrB   U   s    1v   J122				HHQWWS\\"1"%&&

1s   
 BBBc                     t          |           } t          j        dk    r#t          |                               dd          } | S )Nr4   $z\$)strsysplatformreplace)texts    r   _escape_helperrJ   _   s:    t99D
|w4yy  e,,Kr   c                 b    t          |           D ]}|                                r||v r dS dS NTF)rE   isalnum)rI   allowed_charscs      r   _check_for_bad_charsrP   e   sD    YY  99;; 	tt5r   c                     |                      dd          \  }}|dk    rU|                     dd          \  }}t          |t                    st          |t                    rt	          d|           d S d S )Nz://   file/zbad char in )r?   rP   ALLOWED_CHARS_HOSTALLOWED_CHARS
ValueError)r   protourihosturipaths        r   checkbadcharsr\   n   s    5!$$JE3		#q))g '9:: 	9#G];;	9*7888 	9 	9r   c                       e Zd ZdZdZd Z eeddd          Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Z G d dej                  ZdS )SvnPathBasez2 Base implementation for SvnPath implementations. rT   c                     | j         S r   strpathr   s    r   _geturlzSvnPathBase._geturl   s
    |r   Nzurl of this svn-path.c                     | j         S )z7 return a string representation (including rev-number) r`   r   s    r   r   zSvnPathBase.__str__   s
    |r   c                 *    t          | j                  S r   )hashra   r   s    r   __hash__zSvnPathBase.__hash__   s    DL!!!r   c                 r   t                               | j                  }|                    d| j                  |_        |                    d| j                  |_        |                     d          \  }}}}d|v rd|v sd|v rt          d|z            nP|                    d|          }|                    d|          }|r|	                    d          sd|z   }||z   |d<   |                    d	|           |                    d
| j
                   |d         rd|z  |_        n
d|z  |_        |S )a   create a modified version of this path. A 'rev' argument
            indicates a new revision.
            the following keyword arguments modify various path parts::

              http://host.com/repo/path/file.ext
              |-----------------------|          dirname
                                        |------| basename
                                        |--|     purebasename
                                            |--| ext
        r   authz!dirname,basename,purebasename,extbasenamepurebasenameextzinvalid specification %rr7   dirnamesepz%(dirname)s%(sep)s%(basename)sz%(dirname)s)object__new__	__class__r2   r   rh   
_getbyspecrW   
setdefaultr/   rm   ra   )r   kwobjrl   ri   rj   rk   pbs           r   newzSvnPathBase.new   sI    nnT^,,&&))66&$),,/3002 02,<##u{{ !;b!@AAA (3 ~|<<B--s++C  3>>#..  Ci#XBzN
i)))
eTX&&&j> 	-:R?CKK'",CK
r   c                 f   g }| j                             | j                  }|                    d          D ]}|                                }|dk    r6|                    | j                            |dd                              R|dk    r|                    |d                    t|d         }|                    d          }|dk    r|d}}n|d|         ||d         }}|dk    r|                    |           |d	k    r|                    |           t          d
|z            |S )a   get specified parts of the path.  'arg' is a string
            with comma separated path parts. The parts are returned
            in exactly the order of the specification.

            you may specify the following parts:

            http://host.com/repo/path/file.ext
            |-----------------------|          dirname
                                      |------| basename
                                      |--|     purebasename
                                          |--| ext
        ,rl   Nr.   ri   r7    rj   rk   zDon't know part %r)ra   r?   rm   r=   r*   r>   rfind	NameError)	r   specrespartsnameri   irj   rk   s	            r   rq   zSvnPathBase._getbyspec   s<    ""48,,JJsOO 	A 	AD::<<Dy  

48==ss445555##

59%%%% 9NN3''77(0"#LL(0!hqrrl#L>))JJ|,,,,U]]JJsOOOO#$84$?@@@
r   c                     t          |           t          |          k    o| j        |j        k    p| j        |j        k    S )z3 return true if path and rev attributes each match )rE   r   r   others     r   __eq__zSvnPathBase.__eq__   s<    D		SZZ' @EI%>UY)>	Ar   c                     | |k     S r   r   r   s     r   __ne__zSvnPathBase.__ne__   s    5=  r   c                      |s S t           fd|D                       } j        f|z   }                      j                            |           j         j                  }|S ) return a new Path (with the same revision) which is composed
            of the self Path followed by 'args' path components.
        c                 D    g | ]}|                     j                  S r   )r=   rm   ).0argr   s     r   
<listcomp>z$SvnPathBase.join.<locals>.<listcomp>   s'    :::ccii)):::r   )tuplera   rp   rm   r>   r   rh   )r   argsr~   newpaths   `   r   r>   zSvnPathBase.join   so      	K::::T:::;; 4'..u!5!5txKKr   c                 0    |                      |          }|S )z+ return the content of the given property. )_propget)r   r   values      r   propgetzSvnPathBase.propget   s    d##r   c                 .    |                                  }|S )z list all property names. )	_proplist)r   contents     r   r	   zSvnPathBase.proplist   s    ..""r   c                 4    |                                  j        S z2 Return the size of the file content of the Path. r
   sizer   s    r   r   zSvnPathBase.size       yy{{r   c                 4    |                                  j        S z0 Return the last modification time of the file. r
   mtimer   s    r   r   zSvnPathBase.mtime       yy{{  r   c                      t          |          S r   rJ   r   cmds     r   _escapezSvnPathBase._escape       c"""r   c                   &    e Zd Zd Zd Zd Zd ZdS )SvnPathBase.Checkersc                     	 | j                                         j        dk    S # t          j        j        $ r |                                 cY S w xY w)Ndir)pathr
   kindr:   errorError_listdirworksr   s    r   r   zSvnPathBase.Checkers.dir  sX    ,y~~'',558> , , ,))+++++,s   !$ (AAc                 p    	 | j                                          dS # t          j        j        $ r Y dS w xY wrL   )r   listdirr:   r   ENOENTr   s    r   r   z"SvnPathBase.Checkers._listdirworks  sJ    	!!### t 8?   uus    55c                 ~    	 | j                                         j        dk    S # t          j        j        $ r Y dS w xY w)NrS   F)r   r
   r   r:   r   r   r   s    r   rS   zSvnPathBase.Checkers.file#  sG    y~~'',668?   uus   !$ <<c                     	 | j                                         S # t          j        j        $ r |                                 cY S w xY wr   )r   r
   r:   r   r   r   r   s    r   existszSvnPathBase.Checkers.exists)  sP    ,y~~'''8? , , ,))+++++,s    (AAN)r   r   r   r   r   rS   r   r   r   r   Checkersr     sP        	, 	, 	,	 	 		 	 		, 	, 	, 	, 	,r   r   )r   r   r   r3   rm   rb   propertyr   r   rf   rv   rq   r   r   r>   r   r	   r   r   r   r   r   r   r   r   r^   r^   {   s)       <<
C  
(7D$(?
@
@C  " " "     D" " "HA A A
! ! !
 
 
  
  
     ! ! !# # #8, , , , ,6? , , , , ,r   r^   c                     |                      d          }|dk    rt          d| z            | d |         } t          j        | d          }t          j        |          S )Nr7   r.   zcould not parse %sz%Y-%m-%dT%H:%M:%S)rz   rW   r)   strptimemktime)timestrr   
parsedtimes      r   parse_apr_timer   /  s_    cABww-7888bqbkGw(;<<J;z"""r   c                       e Zd ZdZd Zd ZdS )PropListDictzD a Dictionary which fetches values (InfoSvnCommand instances) lazilyc                 ^    t                               | d |D                        || _        d S )Nc                     g | ]}|d fS r   r   r   xs     r   r   z)PropListDict.__init__.<locals>.<listcomp>:  s    9991aY999r   )dictr   r   )r   r   keynamess      r   r   zPropListDict.__init__9  s0    d99999:::			r   c                     t                               | |          }|6| j                            |          }t                               | ||           |S r   )r   __getitem__r   r   __setitem__)r   keyr   s      r   r   zPropListDict.__getitem__=  sN      s++=I%%c**ET3...r   N)r   r   r   r3   r   r   r   r   r   r   r   7  s8        NN      r   r   c                  *    t           j        dk    rdS dS )Nr4   z	LC_ALL=C ry   )rF   rG   r   r   r   	fixlocaler   D  s    
|w{2r   z* | \ / : < > ? 	 
    z^([a-z]\:\\)?[^:]+$c                    t           d d          }| j        }t          r>|                    d           t                              |          st          d          |D ]'}|t          j        vs||v rt          d|d          (d S )Nr5   z path may not contain a colon (:)zillegal character z in path)	ILLEGAL_CHARSra   	ISWINDOWSremove_reg_allow_diskmatchrW   string	printable)r   illegalspchars       r   _check_pathr   O  s    AAAG	B As$$R(( 	A?@@@ G Gv'''47??*tttEFFF ,;G Gr   Tc                 t    t          |            | j        }|r| j        dk    r|d| j        }n|r|d}|S )Nr.   @@HEAD)r   ra   r   )r   addatr   s      r   path_to_fspathr   Z  sV    	B RDHH%	 ""Ir   c           
         t          | d          }ddlm} t          rt                              |          }|                    dd          }|                    d          r`d|                    d                              dd           ||t          |                    d                    d                    }n ||          }n ||          }| j	        dk    r|d| j	        }n|d	}d
|S )NFr   )quote\rT   rR   r.   r   r   zfile://)
r   urllibr   r   r   r   rH   grouplenr   )r   fspathr   r   s       r   url_from_pathr   c  s   D%((F 	%%f--c**;;q>> 	# 	# %A 6 6tS A A A %fSQ-@-@-A-A&B C C CEFF U6]]FFvx2~~"FFDHH-$ff& &""r   c                   &    e Zd ZdZddZd Zd ZdS )SvnAuthz/ container for auth information for Subversion Tc                 >    || _         || _        || _        || _        d S r   )usernamepassword
cache_authinteractive)r   r   r   r   r   s        r   r   zSvnAuth.__init__x  s%      $&r   c                 x   | j                             dd          }| j                            dd          }g }|r|                    d|d           |r|                    d|d           | j        s|                    d           | j        s|                    d           d                    |          S )N"\"z--username="z--password="z--no-auth-cache--non-interactiver   )r   rH   r   r*   r   r   r>   )r   unamepasswdrets       r   makecmdoptionszSvnAuth.makecmdoptions~  s    %%c511&&sE22 	5JJJEEE3444 	6JJJFFF4555 	*JJ())) 	,JJ*+++xx}}r   c                     d| j         dS )Nz<SvnAuth username=z ...>)r   r   s    r   r   zSvnAuth.__str__  s     -1]]]<<r   N)TT)r   r   r   r3   r   r   r   r   r   r   r   r   v  sL        99' ' ' '  = = = = =r   r   z\s*(\d+)\s+(\S+) (.*)c                   
   e Zd ZdZej        Zd@dZ ed ddd          Z ed ddd          Z	d Z
d	 Z eeddd
          Zd Zd Zd Zd Zd Zd ZdAdZd Zd Zd@dZdBdZdCdZd Zd Zd Zd Zd ZdDd Zd! Zd" Z d# Z!d$ Z"d% Z#dEd'Z$dAd(Z%d) Z& e'j(        d*e'j)                  Z*dFd,Z+d- Z,d. Z-d/ Z.dGd0Z/dGd1Z0d2 Z1d3 Z2dHd4Z3d@d5Z4dId7Z5d8 Z6 G d9 d:e7j8        j9        j:                  Z:dJd<Z;d= Z<d> Z=d? Z>dS )KSvnWCCommandPathz path implementation offering access/modification to svn working copies.
        It has methods similar to the functions in os.path and similar to the
        commands of the svn client.
    Nc                 @   t                               |           }t          ||           r|j        | k    r|S |j        }t          t          |          t                    rt          d|          t          j
                            |          |_        ||_        |S )Nzbad char in wcpath )rn   ro   
isinstancerp   	localpathrP   rE   rV   rW   r:   r   localrh   )clswcpathrh   r   s       r   ro   zSvnWCCommandPath.__new__  s    ~~c""fc"" 	&3&&%FF*79 9 	C*ABBBv..	r   c                 *    t          | j                  S r   rE   r   r   s    r   <lambda>zSvnWCCommandPath.<lambda>  s    Q[!1!1 r   zstring pathc                 8    |                      d          j        S )Nr   )usecache)r
   r   r   s    r   r  zSvnWCCommandPath.<lambda>  s    QVVQV//3 r   revisionc                 6    | j         t          |dd           k    S )Nr   )r   getattrr   s     r   r   zSvnWCCommandPath.__eq__  s    ~T!B!BBBr   c                     t          | dd            |                                 }|j        | _        t	          | j        t
          j        j                  sJ | j        S )N_url)r  r
   r   r  r   r:   builtin_basestringr   r
   s     r   rb   zSvnWCCommandPath._geturl  sO    4&&.99;;DDI$)RZ%;<<<<<yr   zurl of this WC itemc                      t          |          S r   r   r   s     r   r   zSvnWCCommandPath._escape  r   r   c                 6    | j                             |          S )z! pickle object into path location)r   dump)r   rt   s     r   r  zSvnWCCommandPath.dump  s    ~""3'''r   c                 r    |                                  }t          j                            |j                  S )z* return current SvnPath for this WC-item. )r
   r:   r   svnurlr   r  s     r   r  zSvnWCCommandPath.svnurl  s%    yy{{w~~dh'''r   c                     d| j         z  S )Nz	svnwc(%r)r`   r   s    r   __repr__zSvnWCCommandPath.__repr__  s    dl++r   c                 *    t          | j                  S r   r   r   s    r   r   zSvnWCCommandPath.__str__  s    4>"""r   c                 F    | j         dS | j                                         S )Nry   )rh   r   r   s    r   _makeauthoptionsz!SvnWCCommandPath._makeauthoptions  s#    92y'')))r   c                     |rt          |          pg }|                    |                                             | j        |g|R  S r   )listr*   r  _svn)r   r   r   s      r   _authsvnzSvnWCCommandPath._authsvn  sO    "T

(bD))++,,,ty$t$$$$r   c                     d|z  g} fd|D             }|                     |           |                    d                      j                  z             t	                      d                    |          z   }	 	 d}t          j                            |          }dt          j        |<   t          j
                            |          }|r|t          j        |<   n2t          j        |= n$# |r|t          j        |<   nt          j        |= w xY wnD# t          j
        j        j        $ r' t          j                    d         }|j                                        }	|	                    d          d	k    rt          j                                       |	                    d
          d	k    rt          j                                       |	                    d          d	k    sK|	                    d          d	k    s2|	                    d          d	k    s|	                    d          d	k    rt          j                            |	           w xY w|S )Nzsvn %sc                 :    g | ]}                     |          S r   )r   )r   itemr   s     r   r   z)SvnWCCommandPath._svn.<locals>.<listcomp>  s%    444tT""444r   z"%s"r   LC_MESSAGESCrR   z	not foundr.   zE200009:zfile existszfile already existszw150002:zcan't create directory)extendr*   r   ra   r   r>   osenvironr2   r:   r;   r<   r   rF   exc_infoerrlowerfindr   r   EEXIST)
r   r   r   lr   r   holdoutestrerrs
   `         r   r  zSvnWCCommandPath._svn  s   ^4444t444		$,,t|444555sxx{{*		(#z~~c**"%
3j((00 (&*BJsOO
3  (&*BJsOO
3''''z!' 	 	 	q!AU[[]]F{{;''2--hood+++Z((B..hood+++M**b00122b88J''2--455;;hoof---	 
s    AC0  D 0!DD EIc                 4    |                      d|g           dS )z switch to given URL. switchN)r  )r   r   s     r   r-  zSvnWCCommandPath.switch  s    h&&&&&r   c                 R   g }|| j         }||dk    r(t          j        dk    rt                      dk    r|dz  }n@t                      dk    r	|d|z  z  }n%|                    dt          |          z              |                    |           |                     d|           dS )	z$ checkout from url to local wcpath. Nr.   r4   z1.3r   z@%d-rco)r   rF   rG   rB   r*   rE   r  )r   r   r   r   s       r   checkoutzSvnWCCommandPath.checkout  s    ;(C;#))''"$$--w5((us{"D3s88O,,,CdD!!!!!r   HEADTc                 h    d|g}|s|                     d           |                     d|           dS )z= update working copy item to given revision. (None -> HEAD). r/  r   upNr*   r  )r   r   r   optss       r   updatezSvnWCCommandPath.update  s@    c{ 	-KK+,,,dD!!!!!r   wc                 <    | j                             ||           dS )z) write content into local filesystem wc. N)r   write)r   r   modes      r   r:  zSvnWCCommandPath.write  s     Wd+++++r   c                 T    |                       | j        j        | | j                  S )z0 return the directory Path of the current Path. rh   )rp   r   dirpathrh   r   r   s     r   r>  zSvnWCCommandPath.dirpath  s'    ~~4dn4d;$)~LLLr   c                     |                                  }|                    d          r|                                 |                     d          r|                                  | S )Nr   )r   )r>  check_ensuredirsmkdir)r   parents     r   rB  zSvnWCCommandPath._ensuredirs  s_    <<A< 	!   ::!: 	JJLLLr   c                     | j         | }|                                r,|                    d          r|                                 |S |                    dd          r|                                S |                                }|                                 |                    d           |                                 |S )z ensure that an args-joined path exists (by default as
            a file). if you specify a keyword argument 'directory=True'
            then the path is forced  to be a directory path.
        F	versionedr   r   ry   )r>   rA  addr2   rB  r>  r:  )r   r   kwargsprD  s        r   ensurezSvnWCCommandPath.ensure  s    
 DIt7799 	www'' H::eQ 	#==??"		r   c                 l    |r | j         |                                 S |                     d           | S )z1 create & return the directory joined with args. rC  )r>   rC  r  r?  s     r   rC  zSvnWCCommandPath.mkdir/  s<     	49d#))+++IIgKr   c                 0    |                      d           dS )z add ourself to svn rH  Nr  r   s    r   rH  zSvnWCCommandPath.add7  s    		%r   rR   c                     |s
J d            |                      d          s3t          j                            |                                            dS g }|r|                    d            | j        dg|R   dS )z remove a file or a directory tree. 'rec'ursive is
            ignored and considered always true (because of
            underlying svn semantics.
        z!svn cannot remove non-recursivelyTrF  Nz--forcer   )rA  r:   r   r   r   r*   r  )r   recforceflagss       r   r   zSvnWCCommandPath.remove;  s    
 777777zzDz)) 	GMM$&&(((F 	$LL###	(#U######r   c                     t           j                            dt          |           dt          |                     dS )z copy path to target.z	svn copy r   Nr:   r;   r<   rE   r   targets     r   copyzSvnWCCommandPath.copyJ  s8    

c$iiiiVEFFFFFr   c                     t           j                            dt          |           dt          |                     dS )z rename this path to target. zsvn move --force r   NrT  rU  s     r   renamezSvnWCCommandPath.renameN  s8    

c$iiiiVMNNNNNr   c                 v    |                      d                                          }|st          d          dS )z( set a lock (exclusive) on the resource lockz!unknown error in svn lock commandN)r  r=   rW   r   r)  s     r   r[  zSvnWCCommandPath.lockR  sC    mmF##))++ 	B@AAA	B 	Br   c                     |                      d                                          }|                    d          rt          |dd                   dS )z unset a previously set lock unlockzsvn:   N)r  r=   r/   	Exceptionr\  s     r   r^  zSvnWCCommandPath.unlockY  sS    mmH%%++-->>&!! 	%CG$$$	% 	%r   c                 @    	 |                                   dS #  Y dS xY w)z$ remove any locks from the resource N)r^  r   s    r   cleanupzSvnWCCommandPath.cleanup`  s(    	KKMMMMM	DDs    r   c                    |rt          d          d}|rd}nd}|rd}nd}d|d|d|}|                     |          }t          |                               ||           }nb# t          j        j        j        $ rF d|d|d|}|                     |          }t          |                               ||           }Y nw xY w|S )z2 return (collective) Status object for this file. z1XXX cannot perform status() on external items yetry   z--non-recursivez-uzstatus -v --xml --no-ignore r   zstatus -v --no-ignore )	rW   r  XMLWCStatus
fromstringr:   r;   r<   r   WCStatus)r   updatesrP  	externalsr   r)  
rootstatuss          r   statuszSvnWCCommandPath.statush  s   
  	 5 6 6 6 I 	$CC#C  	GGG
	AGGSSS))-C--$$C %T**55c4@@JJ z!' 	> 	> 	> 	>GGSSS))-C--$$C!$223==JJJ		> s    A& &ACCc                 j    g }||                     d|z             |                     d|          }|S )zj return a diff of the current path against revision rev (defaulting
            to the last one).
        Nz-r %ddiffr5  )r   r   r   r)  s       r   rl  zSvnWCCommandPath.diff  s<     ?KK#&&&mmFD))
r   c                    |                      d          }g }|                                }t          j                            | j                                                  }t          t          ||                    D ]t\  }\  }}t          
                    |          }|st          d|d          |                                \  }	}
}|                    t          |	          |
|f           u|S )z[ return a list of tuples of three elements:
            (revision, commiter, line)
        blamezoutput line z, of svn blame does not match expected format)r  
splitlinesr:   r   r  r   	readlines	enumeratezip	rex_blamer   rW   groupsr*   int)r   r)  result
blamelines	reallinesr   	blamelinelinemr   r   _s               r   rn  zSvnWCCommandPath.blame  s     ii  ^^%%
GNN48,,6688	$-J	**%, %, 	2 	2 A 	4	**A ? j6:dd"> ? ? ?88::LCqMM3s88T401111r   z.*Committed revision (\d+)\.$ry   c                 ,   d|                     dd          d}|s|dz  }|                     |          }	 t          j        | = n# t          $ r Y nw xY w|r<| j                            |          }t          |                    d                    S dS )z/ commit with support for non-recursive commits zcommit -m "r   r   z" --force-logz -NrR   N)	rH   r  r   r
   KeyError_rex_commitr   ru  r   )r   msgrP  r   r)  r{  s         r   commitzSvnWCCommandPath.commit  s      /2kk#u.E.E.E.EG 	5LCmmC  	
4   	 	 	D	 	# &&s++Aqwwqzz??"	# 	#s   A 
AAc                 8   t           j        j                                        }	 |                    d          }|                    |            | j        d|dt          |          g|R   |                                 dS # |                                 w xY w)z* set property name to value on this path. r   propsetz--fileN)	r:   r   r   mkdtempr>   r:  r  rE   r   )r   r   r   r   drJ  s         r   r  zSvnWCCommandPath.propset  s    GM!!##	wAGGENNNDIixQ?$????HHJJJJJAHHJJJJs   AB Bc                 B    |                      d|          }|dd         S )z! get property name on this path. r   Nr.   rN  r   r   r}   s      r   r   zSvnWCCommandPath.propget  "    ii	4((3B3xr   c                 B    |                      d|          }|dd         S )z$ delete property name on this path. propdelNr.   rN  r  s      r   r  zSvnWCCommandPath.propdel  r  r   c                     |r%|                      d          }t          | |          S |                      d          }|                    d          }d |dd         D             }t          | |          S )z return a mapping of property names to property values.
If rec is True, then return a dictionary mapping sub-paths to such mappings.
zproplist -Rr	   
c                 6    g | ]}|                                 S r   )r=   r   s     r   r   z-SvnWCCommandPath.proplist.<locals>.<listcomp>  s     2221QWWYY222r   rR   N)r  make_recursive_propdictr?   r   )r   rP  r}   liness       r   r	   zSvnWCCommandPath.proplist  sx      	-))M**C*4555))J''CIIdOOE22abb	222Ee,,,r   c                 `    |r|                      d          }n|                      d          }|S )zK revert the local changes of this path. if rec is True, do so
recursively. z	revert -RrevertrN  )r   rP  rv  s      r   r  zSvnWCCommandPath.revert  s5      	)YY{++FFYYx((Fr   c                 r    |r | j         j        di |}n| j         }|                     || j                  S )a   create a modified version of this path. A 'rev' argument
            indicates a new revision.
            the following keyword arguments modify various path parts:

              http://host.com/repo/path/file.ext
              |-----------------------|          dirname
                                        |------| basename
                                        |--|     purebasename
                                            |--| ext
        r=  r   )r   rv   rp   rh   )r   rs   r   s      r   rv   zSvnWCCommandPath.new  sG      	'**00R00III~~idi~888r   c                 f    |s| S  | j         j        |i |}|                     || j                  S )r   r=  )r   r>   rp   rh   )r   r   rI  r   s       r   r>   zSvnWCCommandPath.join  sB      	K'DN'888	~~idi~888r   c                    |ot           j                            |           }|s	 |                     d          }n# t          j        j        j        $ r t          j	                    d         }|j
                            d          dk    r%t          j                            | |j
                  |j
                            d          dk    r%t          j                            | |j
                   w xY w|                                dk    s+|                                                    d          dk    r t          j                            | |          t!          |          }t          j        dk    rC|j        | j        k    r3t          j                            | d	d
|j        d| j        z             |t           j        | <   |S )z9 return an Info structure with svn-provided information. r
   rR   z$Path is not a working copy directoryr.   zis not under version controlry   not a versioned resourcer4   znot a versioned resource:r   z != )r   r
   r2   r  r:   r;   r<   r   rF   r"  r#  r%  r   r   r=   r$  InfoSvnWCCommandrG   r   r   )r   r  r
   outputr*  s        r   r
   zSvnWCCommandPath.info  s   0EJNN400 	$6**:%+   LNN1%5::DEEKK(//$666UZZ >??2EE(//$666 "$$LLNN''(BCCrIIhoodF333#F++D |w&&9..(//$0K0K+/999dnnE1F G G G#EJts
   < B:C6c                 Z   t          |t                    rt          j        |          }d }g }| j                            |          D ]K}|                     || j                  } ||          r"|r ||          r|                    |           L| 	                    ||           |S )z return a sequence of Paths.

        listdir will return either a tuple or a list of paths
        depending on implementation choices.
        c                     | j         dk    S )Nz.svn)ri   )r   s    r   notsvnz(SvnWCCommandPath.listdir.<locals>.notsvn$  s    =F**r   r=  )
r   rE   r   	FNMatcherr   r   rp   rh   r*   	_sortlist)r   filsortr  pathsr   rJ  s          r   r   zSvnWCCommandPath.listdir  s     c3 	("3''C	+ 	+ 	+ //77 	  	 Iyty99Avayy  #  Q  Qud###r   rc                 ,    t          | j        |          S )z, return an opened file with the given mode. )openra   )r   r;  s     r   r  zSvnWCCommandPath.open/  s    DL$'''r   c                 6    | j                             |          S r   )r   rq   )r   r|   s     r   rq   zSvnWCCommandPath._getbyspec3  s    ~((...r   c                       e Zd Zd Zd ZdS )SvnWCCommandPath.Checkersc                 ,    || _         |j        | _        d S r   )	svnwcpathr   r   )r   r   s     r   r   z"SvnWCCommandPath.Checkers.__init__7  s    !DNDIIIr   c                    	 | j                                         }dS # t          j        j        t          j        j        f$ r Y dS t          j        j        j        $ ro t          j
                    d         }|j                            d          dk    rY dS |j                                                            d          dk    rY dS  w xY w)NTFrR   zis not a working copyr.   r  )r  r
   r:   r   r   r&  r;   r<   r   rF   r"  r#  r%  r$  )r   sr*  s      r   rG  z#SvnWCCommandPath.Checkers.versioned:  s    N'')) t HORX_5   uu:%+   LNN1%5::566:: 555;;==%%&@AARGG 55s    %CAC0C
CN)r   r   r   r   rG  r   r   r   r   r  6  s2        	' 	' 	'	 	 	 	 	r   r   Fc           
         |                                  sJ |du rdp|}|du rdp|}|dk    r	|dk    rd}nd|d|}|rdpd}t                      }|                                 }|d|d	|d	|d
| j        d	z   }t	          j        |t          j        t          j        d          }	|	                                \  }
}t          j	        
                    |
t          j                              }
t                      \  }}	 |                    |
          }n# |$ r t          d          w xY wg }t!          d|j        j                  D ]4}|j        |j        k    r"|                    t-          |                     5|S )z return a list of LogEntry instances for this path.
rev_start is the starting revision (defaulting to the first one).
rev_end is the last revision (defaulting to HEAD).
if verbose is True, then the LogEntry instances also know which files changed.
Nr2  rR   ry   z-r r5   z-vzsvn log --xml r   z "r   T)stdoutstderrshellzno such revision)rA  r   r  ra   
subprocessPopenPIPEcommunicater:   r	  _totextrF   getdefaultencoding	importxmlparseStringrW   filter
firstChild
childNodesnodeTypeELEMENT_NODEr*   LogEntry)r   	rev_startrev_endverboserev_optverbose_opt
locale_envauth_optr   popenr  r  minidom
ExpatErrortreerv  logentrys                    r   logzSvnWCCommandPath.logI  s    zz||%0&=I	T/,f77a<<$-IIww7G&$,"[[
((**
 jGG[[[(((DLLL: :  %?%?
 
 

 **,,##FC,B,D,DEE&[[
	1&&v..DD 	1 	1 	1/000	1tT_%?@@ 	2 	2H H$999hx00111s   D D.c                 4    |                                  j        S r   r   r   s    r   r   zSvnWCCommandPath.sizes  r   r   c                 4    |                                  j        S r   r   r   s    r   r   zSvnWCCommandPath.mtimew  r   r   c                 D    t          | j        | j        | j        f          S r   )re   ra   rp   rh   r   s    r   rf   zSvnWCCommandPath.__hash__{  s    T\4>49=>>>r   )NNr   )r2  T)r8  )rR   rR   )r   r   r   )ry   rR   )r   )rR   )r  )NrR   F)?r   r   r   r3   r   rm   ro   r   ra   r   r   rb   r   r   r  r  r  r   r  r  r  r-  r1  r7  r:  r>  rB  rK  rC  rH  r   rW  rY  r[  r^  rb  rj  rl  rn  recompileDOTALLr  r  r  r   r  r	   r  rv   r>   r
   r   r  rq   r:   r   r   r   r  r   r   rf   r   r   r   r   r     s         &C    h114}MMG
(33T4
L
LCC C C   (7D$(=
>
>C# # #( ( (( ( (
, , ,# # #* * *
% % % %
  B' ' '" " " """ " " ", , , ,M M M    $    $ $ $ $G G GO O OB B B% % %  $ $ $ $L     $ "*=ryIIK# # # #    
  
- - - -   9 9 9"9 9 9   :   (( ( ( (/ / /    27=)   &( ( ( (T     ! ! !? ? ? ? ?r   r   c                   `    e Zd ZdZddZd	dZ ej        d          ZddZ	 e
e	          Z	dS )
rf  )modifiedaddedconflict	unchangedexternaldeletedprop_modifiedunknownupdate_available
incompletekindmismatchignoredlockedreplacedNc                 t    || _         || _        || _        || _        | j        D ]}t          | |g            d S r   )r   r   modrevauthor	attrnamessetattr)r   r   r   r  r  r   s         r   r   zWCStatus.__init__  sN    N 	$ 	$DD$####	$ 	$r   Tc                     i }| j         D ]&}||vs||         rt          | |          D ]}d||<   '|                                }|r|                                 |S )NrR   )r  r  keysr  )r   r  rs   r  r   r   r'  s          r   allpathzWCStatus.allpath  su    N 	  	 D2~~D~#D$//    DAdGGFFHH 	FFHHHr   z$\s+(\d+|-)\s+(\S+)\s+(.+?)\s{2,}(.*)c           	         t          ||||          }d}|                     d          D ]>}|                                s|dd         |dd         }	}|\  }
}}}}}}}|
dv r|                    dd          d         }|
dk    r2|                    |d          }|j                            |           n|
dk    rQ|                    |j                            |d          |j        	          }|j	                            |           n7|
d
k    r1|                    |d          }|j
                            |           t           j                            |	          }|s|dk    rG|	                                }|                    |d          }|j                            |           |                                                    d          dk    r<t!          |	                    d          d                                                   }|                                                    d          dk    r!t#          d|z            |                                \  }}}}|                    |d          }|
dk    r<|                    d          s
J d            |j                            |           n|
dk    s|dk    r|j                            |           n|
dk    r|j                            |           n|
dk    r|j                            |           n|
dk    r|j                            |           n|
dk    r|j                            |           nb|
dk    r|j                            |           nA|
                                s|j                            |           nt9          d|
z            |dk    r|j                            |           |dk    s|dk    r|j                            |           |dk    r|j                            |           ||k    r ||_        ||_         ||_!        |r||_"        >@|S )z4 return a new WCStatus object from data 's'
        Nr     z?XIrR   ?absXr=  I*zagainst revision:r.   r5   zstatus on externalzcould not parse line %rMrS   z3didn't expect a directory with changed content hereA+Dr  ~!Rzreceived flag %rLK)#rf  r?   r=   r>   r  r*   rp   r   rh   r  r  _rex_statusr   r  r$  r%  ru  rW   rt  rA  r  r  r  r  r  r  r  r  NotImplementedErrorr  r  r   r  r  
update_rev)data
rootwcpathr   r  r  ri  r  rz  rR  restc0c1c2c3c4c5x6c7fnr   r{  s                        r   re  zWCStatus.fromstring  s    j#vv>>

JJt$$ V	 V	D::<< rr(DH4E&+#Br"R2b U{{ZZa((+99'__RQ_77F&--f55553YY'11",11"!1<<'_ 2 . .F '..v66663YY'__RQ_77F&--f555
 $**400A 599B'__RQ_77F/66v>>>::<<$$%8992==!$TZZ__Q%7%=%=%?%?!@!@J::<<$$%9::R??  !:T!ABBB*+((**'VVR__RQ_//FSyy|||++bb-bbbb#**62222sbCii ''////s"))&1111s#**62222s'..v6666s%,,V4444s#**62222XXZZ C$++F3333)*<r*ABBBSyy(//777SyyB#II!((000Syy+226:::##!$
$*
!$*
! 7,6J) $ r   NNNT)r   r   r   r  r   r  r  r  r  re  staticmethodr   r   r   rf  rf    s{        I
$ $ $ $	 	 	 	 "*DEEK\ \ \ \z j))JJJr   rf  c                   ,    e Zd ZddZ ee          ZdS )rd  Nc                 v   t          ||||          }d}t                      \  }}	 |                    |           }	n># |$ r6 t          j                    d         }
t          t          |
                    w xY w|	                    d          }|r |d                             d          |_	        |	                    d          D ]p}|                    d          }|                    d          d	         }|                    d
          }|dk    r2|
                    |d          }|j                            |           |dk    rQ|                    |j        
                    |d          |j                  }|j                            |           |dk    r3|
                    |d          }|j                            |           |dk    r3|
                    |d          }|j                            |           I|                    d          }|dk    s|dk    r	d}d}d}d}n|dk    rn|                    d          d	         }|rw|                    d          }d}|                    d          }|r|d	         j        D ]}||j        z  }d}|                    d          d	         j        D ]}||j        z  }|
                    |d          }|dk    s |                    d          s
J d            ddddd                     ||          }t/          ||          }|                    |           |                    d!          }|d"vr|j                            |           ||k    r||_        ||_        ||_        ||_        |                    d#          }|r;|d	         }|                    d
          }|d$v r|j                            |           |                    d%          }t=          |          r|j                            |           r|S )&zL parse 'data' (XML string as outputted by svn st) into a status obj
        NrR   againstr.   r  r+   r   z	wc-statusr   r  unversionedr  r  r=  r  r  r  none0r  ry   r  r  r  dater  r  z2did't expect a directory with changed content herer  r  r  )normalr  
conflictedr  props)r  r  zrepos-status)r  r  r[  ) rf  r  r  rF   r"  rW   rE   getElementsByTagNamegetAttributer  r>   r  r*   rp   r   rh   r  r  r  r  	nodeValuerA  r2   r  r  r   r  r  r  r  r   r  )r  r  r   r  r  ri  r  r  r  docr*  urevelsentryelr   statusel
itemstatusr   r  commitel
author_elsrO   itemattrnameattrpropsstatus
rstatusels	rstatuselritemstatuslockelss                               r   re  zXMLWCStatus.fromstring  s    j#vv>>

'kk	%%%d++CC 	% 	% 	%q!ASVV$$$	% **955 	I$+BK$<$<Z$H$HJ!//88 R	1 R	1G''//D33K@@CH!..v66J]**#155"))&111z))#--(--d-::# . * * #**6222y((#155"))&111|++#155%,,V444''
33CW$$
f(<(<z)) #77AA!D 
,%22:>>FF!)!>!>x!H!HJ! 2!+A!9 2 2A"ak1FFD%::6BB1E', ,+__Tq_11F++v|||/C/C++E ,++ &((	 
 c*j))  :|44DKK"//88K"444(//777##!$
$*
!$*
!"&
 !55nEEJ ?&qM	'44V<<"777/66v>>>226::G7|| 1!((000s	   = ;A8r  )r   r   r   re  r	  r   r   r   rd  rd    s8        h h h hR j))JJJr   rd  c                       e Zd Zd Zd ZdS )r  c                 X   i }|                     d          D ]q}|                                s|                     dd          \  }}|                                                    dd          }|                                }|||<   r	 |d         | _        n# t
          $ r t          d          w xY w|d         d	k    rd
p|d         | _        	 t          |d                   | _	        n# t
          $ r
 d | _	        Y nw xY wt          j                            |d                   | _        | j                                        | _        d|v rt          |d                   | _        d|v r|d         | _        d|v r+t!          |d                   | _        | j        dz  | _        d S d S )Nr  r5   rR   r   ry   r   zNot a versioned resourcenodekind	directoryr   r  r   lastchangedrevlastchangedauthorlastchangeddatei@B )r?   r=   r$  rH   r   r~  rW   r   ru  r   r:   r   r   r   created_revlast_authorparse_wcinfotimer   r)   )r   r  r  rz  r   r   s         r   r   zInfoSvnWCCommand.__init__j  s    LL&& 	 	D::<< C++JC))++%%c2..CKKMMEAcFF	:xDHH 	: 	: 	:8999	: jM[0:UKa
m		1Z=))DHH 	 	 	DHHH	 GMM!F),,	INN$$	q  "1%5#677D!## !45D!!)!,=*>??DJ
W,DIII "!s   B B3C- -D Dc                 "    | j         |j         k    S r   )__dict__r   s     r   r   zInfoSvnWCCommand.__eq__  s    }..r   N)r   r   r   r   r   r   r   r   r  r  i  s3        '- '- '-R/ / / / /r   r  c                     t          j        d|           }|st          d| z            |                                \  } }t	          j        | d          }t          j        |          S )z# Returns seconds since epoch, UTC. z&(\d+-\d+-\d+ \d+:\d+:\d+) ([+-]\d+) .*ztimestring %r does not matchz%Y-%m-%d %H:%M:%S)r  r   rW   rt  r)   r   calendartimegm)r   r{  timezoner   s       r   r.  r.    sg     	:GDDA C7'ABBB

GXw(;<<J?:&&&r   zProperties on '(.*)':c                 `   d |                     d          D             }i }|r	|                    d          }|                    |          }|st          d|z            |                                d         }|                     |d          }g }	|rt|d                             d          rY|                    d                                          }
|	                    |
           |r|d                             d          Y|	s
J d            t          ||	          ||<   |	|S )	z5 Return a dictionary of path->PropListDict mappings. c                     g | ]}||S r   r   r   s     r   r   z+make_recursive_propdict.<locals>.<listcomp>  s    0001a0Q000r   r  r   z could not parse propget-line: %rrR   r  r   zmust have found properties!)
r?   popr   rW   rt  r>   r/   r=   r*   r   )wcrootr  rexr  pdictrz  r{  r   r   	propnamespropnames              r   r  r    sD    10T**000EE
 8yy||IIdOO 	H?$FGGGxxzz!}Tq))	 	'a++D11 	'yy||))++HX&&&  	'a++D11 	' 777777$VY77f  8 Lr   c                 T    | r| S ddl m} ddlm} |                     ||g           | S )Nr   )r  )r  )xml.domr  xml.parsers.expatr  r  )r   r  r  s      r   r  r    sO     ,,,,,,	LL':&'''Lr   c                       e Zd Zd Zd ZdS )r  c                 P   t          |                    d                    | _        t          d |j                  D ]}|j        |j        k    r|j        dk    r|j        j	        | _
        /|j        dk    r!|j        r|j        j	        | _        Sd| _        [|j        dk    r!|j        j	        }t          |          | _        |j        dk    rVg | _        t          d |j                  D ]9}|j        |j        k    r'| j                            t!          |                     :d S )Nr  r  r  ry   r  r  )ru  r  r   r  r  r  r  nodeNamer  r  r  r  r   r  strpathsr*   	PathEntry)r   r  lpartr   pparts        r   r   zLogEntry.__init__  s0   x,,Z8899D("566 	C 	CE~!333>X--"'"2"<DKK^u,,' &#(#3#=#%^v--#.8G .w 7 7DII^w..$&DM!'e.>!?!? C C >U-??? M0051A1ABBB#	C 	Cr   c                 0    d| j         | j        | j        fz  S )Nz#<Logentry rev=%d author=%s date=%s>)r   r  r  r   s    r   r  zLogEntry.__repr__  s!    4Hdk498. . 	.r   N)r   r   r   r   r  r   r   r   r  r    s5        C C C(. . . . .r   r  r  )1r3   r   rF   r)   r  r2  r:   r  py._pathr   r   r   r    repositoriesrV   rG   rU   rB   rJ   rP   r\   PathBaser^   r   r   r   r   r?   r   rm   r   r   r  r  r   r   r   r   rn   r   rs  r   rf  rd  r  r.  r  r  r  r   r   r   <module>rK     s    # " " " " " " " " " " " " " " " " " " " 				                 G G G G G G G G& & & & & & & &P y{{
 <7SM"T)        .;    9 9 9r, r, r, r, r,&/ r, r, r,h# # #    4      6;;C@@6]   LG#	"*3RT::	G 	G 	G   # # #&= = = = =f = = =2 BJ/00	k? k? k? k? k?v k? k? k?\|* |* |* |* |* |* |* |*|j* j* j* j* j*( j* j* j*X+/ +/ +/ +/ +/ +/ +/ +/Z	' 	' 	' #-"*-D"E"E   ,     . . . . . . . . . .r   