a
    &0É_õ ã                   @   sŒ  d dl m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	Z	d dl
ZddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZ ddl m!Z!m"Z"m#Z# da$ej%Z%ej&Z&ej'Z'ej(Z(dd„ Z)d	d
„ Z*G dd„ dej+ƒZ,dd„ Z-dd„ Z.dd„ Z/dd„ Z0ddddœZ1dd„ Z2d'dd„Z3dd„ Z4G dd„ de5ƒZ6G d d!„ d!e6ƒZ7G d"d#„ d#e6ƒZ8G d$d%„ d%e6ƒZ9e7e8e9d&œZ:dS )(é    )Úabsolute_importNé   )Ú_)ÚcmdutilÚencodingÚerrorÚexchangeÚ
logcmdutilÚmatchÚmergeÚnodeÚpathutilÚphasesÚpycompatÚscmutilÚsubrepoutilÚutilÚvfs)ÚdateutilÚhashutilÚprocutilc                 C   s8   t  t  | ¡¡}t  |¡}|js4t  tj |j¡¡} | S )zU
    get a path or url and if it is a path expand it and return an absolute path
    )	r   ZurllocalpathÚ
expandpathZurlZschemeÚnormpathÚosÚpathÚabspath)r   ZexpandedpathÚu© r   ú3/usr/lib/python3/dist-packages/mercurial/subrepo.pyÚ_expandedabspath3   s
    
r   c                 C   s    t  t t| ƒ¡ ¡ ¡dd… S )zEget a unique filename for the store hash cache of a remote repositoryr   é   )r   Úhexr   Úsha1r   Údigest)Ú
remotepathr   r   r   Ú_getstorehashcachename>   s    r%   c                   @   s   e Zd ZdZdd„ ZdS )ÚSubrepoAbortzEException class used to avoid handling a subrepo error more than oncec                 O   s:   |  dd ¡| _|  dd ¡| _tjj| g|¢R i |¤Ž d S )NÚsubrepoÚcause)Úpopr'   r(   r   ÚAbortÚ__init__)ÚselfÚargsÚkwr   r   r   r+   F   s    zSubrepoAbort.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r+   r   r   r   r   r&   C   s   r&   c                    s   ‡ fdd„}|S )Nc              
      s    zˆ | g|¢R i |¤Ž}W n€ t yB } z|‚W Y d }~nbd }~0  tjyš } z@t| ƒ}|jd tdƒ|  }t ||j|t ¡ d‚W Y d }~n
d }~0 0 |S )Nó    s   (in subrepository "%s"))Úhintr'   r(   )	r&   r   r*   Ú
subrelpathÚmessager   r4   ÚsysÚexc_info)r,   r-   ZkargsÚresÚexr'   Zerrormsg©Úfuncr   r   ÚdecoratedmethodM   s    ÿÿz-annotatesubrepoerror.<locals>.decoratedmethodr   )r<   r=   r   r;   r   ÚannotatesubrepoerrorL   s    r>   c                 C   s>   |rt dƒt|ƒ||f }nt dƒt|ƒ||f }|  |d¡S )Ns‰    subrepository sources for %s differ
you can use (l)ocal source (%s) or (r)emote source (%s).
what do you want to do?$$ &Local $$ &Remotes¢    subrepository sources for %s differ (in checked out version)
you can use (l)ocal source (%s) or (r)emote source (%s).
what do you want to do?$$ &Local $$ &Remoter   )r   r5   Zpromptchoice)ÚuiÚsubÚdirtyÚlocalÚremoteÚmsgr   r   r   Ú_updateprompta   s    ÿûÿúrE   c           	      C   s”   |  ¡ D ]†\}}}t|ƒD ]\}}| ¡ |kr||=  q:q| |¡ ¡ dkrNq|D ]:}| ¡ dkrR|  tdƒ| |¡ ¡ | | ||¡¡ qRqd S )Ns   .hgó   hgrcs5   warning: removing potentially hostile 'hgrc' in '%s'
)	ÚwalkÚ	enumerateÚlowerÚbasenameÚwarnr   ÚjoinÚunlinkÚreljoin)	r?   r   ÚignoreÚdirnameÚdirsÚnamesÚiÚdÚfr   r   r   Ú	_sanitizet   s"    ÿüÿrV   c                 C   sd   |  d¡s d|v s t |¡|kr2t tdƒ| ¡‚t | j¡|ƒ | j	 
|¡r`t tdƒ| ¡‚d S )Nó   ~ó   $ó+   subrepo path contains illegal component: %ss$   subrepo '%s' traverses symbolic link)Ú
startswithr   r   r   r*   r   r   ZpathauditorÚrootÚwvfsÚislink)Úrepor   r   r   r   Ú_auditsubrepopathˆ   s     
ÿr_   TF)ó   hgó   gitó   svnc                 C   sz   |   ddd¡s$tjtdƒtdƒd‚t |d¡}|   dd| |¡s\tjtd	ƒ| tdƒd‚|tvrvt td
ƒ| ¡‚d S )Nó   subreposs   allowedTs   subrepos not enableds)   see 'hg help config.subrepos' for details©r4   Fs
   %s:alloweds   %s subrepos not alloweds   unknown subrepo type %s)Z
configboolr   r*   r   ÚSUBREPO_ALLOWED_DEFAULTSÚgetÚtypes)r?   ÚkindÚdefaultr   r   r   Ú
_checktype›   s    þ
þrj   c                 C   sv   ddl m} |a|  ¡ }t||ƒ | j| }t|j|d ƒ |rX|d |  |¡|d f}t|d  | ||dd… |ƒS )z>return instance of the right subrepo class for subrepo in pathr   ©Úhgé   r   N)	Ú rl   r^   r_   Úsubstaterj   r?   Úsubrevrg   )Úctxr   Z	allowwdirÚallowcreateÚhr^   Ústater   r   r   r'   ¯   s    

r'   c                 C   sn   ddl m} |a|  ¡ }t||ƒ | j| }t|j|d ƒ d}|d dkrPd}t|d  |||d |fdƒS )	z=return an empty subrepo in pctx for the extant subrepo in ctxr   rk   rm   ó    r`   s(   0000000000000000000000000000000000000000r   T)rn   rl   r^   r_   ro   rj   r?   rg   )rq   r   Zpctxrs   r^   rt   rp   r   r   r   ÚnullsubrepoÃ   s    

rv   c                   @   sB  e Zd Zdd„ Zdd„ Zdd„ ZdLdd	„ZdMd
d„ZdNdd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdOdd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ ZdPd3d4„Zd5d6„ ZdQd8d9„Zd:d;„ Zd<d=„ Zd>d?„ Z d@dA„ Z!dBdC„ Z"dDdE„ Z#dRdFdG„Z$e%dHdI„ ƒZ&e%dJdK„ ƒZ'dS )SÚabstractsubrepoc                 C   s   |  ¡ j| _|| _|| _dS )zæInitialize abstractsubrepo part

        ``ctx`` is the context referring this subrepository in the
        parent repository.

        ``path`` is the path to this subrepository as seen from
        innermost repository.
        N)r^   r?   Ú_ctxÚ_path)r,   rq   r   r   r   r   r+   Ü   s    	zabstractsubrepo.__init__c                 C   s   dS )zÐAdd the hgwebdir entries for this subrepo, and any of its subrepos.

        ``serverpath`` is the path component of the URL for this repo.

        ``webconf`` is the dictionary of hgwebdir entries.
        Nr   ©r,   Z
serverpathZwebconfr   r   r   Úaddwebdirpathé   s    zabstractsubrepo.addwebdirpathc                 C   s   dS )z‡
        returns true if the repository has not changed since it was last
        cloned from or pushed to a given repository.
        Fr   ©r,   r   r   r   r   Ú
storecleanò   s    zabstractsubrepo.storecleanFc                 C   s   t ‚dS )a  returns true if the dirstate of the subrepo is dirty or does not
        match current stored state. If ignoreupdate is true, only check
        whether the subrepo has uncommitted changes in its dirstate.  If missing
        is true, check for deleted files.
        N©ÚNotImplementedError©r,   ÚignoreupdateÚmissingr   r   r   rA   ù   s    zabstractsubrepo.dirtyc                 C   s"   | j ||drtdƒt| ƒ S dS )z·return reason string if it is ``dirty()``

        Returned string should have enough information for the message
        of exception.

        This returns None, otherwise.
        ©r   r‚   s)   uncommitted changes in subrepository "%s"N)rA   r   r5   r€   r   r   r   Údirtyreason  s    ÿzabstractsubrepo.dirtyreasonNc                 C   s$   | j |dd}|r tj||d‚dS )z4raise Abort if subrepository is ``dirty()``
        Trƒ   rd   N)r„   r   r*   )r,   r   r4   r„   r   r   r   Úbailifchanged  s    zabstractsubrepo.bailifchangedc                 C   s   t ‚dS )zpcurrent working directory base state, disregarding .hgsubstate
        state and working directory modificationsNr~   ©r,   r   r   r   Ú	basestate  s    zabstractsubrepo.basestatec                 C   s   dS )z7check if path is a subrepository within this repositoryFr   r|   r   r   r   Úchecknested  s    zabstractsubrepo.checknestedc                 C   s   t ‚dS )z¨commit the current changes to the subrepo with the given
        log message. Use given user and date if possible. Return the
        new state of the subrepo.
        Nr~   )r,   ÚtextÚuserÚdater   r   r   Úcommit  s    zabstractsubrepo.commitc                 C   s   t jS )z?returns phase of specified state in the subrepository.
        )r   Zpublic©r,   rt   r   r   r   Úphase%  s    zabstractsubrepo.phasec                 C   s   t ‚dS )zTremove the subrepo

        (should verify the dirstate is not dirty first)
        Nr~   r†   r   r   r   Úremove*  s    zabstractsubrepo.removec                 C   s   t ‚dS )zTrun whatever commands are needed to put the subrepo into
        this state
        Nr~   )r,   rt   Ú	overwriter   r   r   rf   1  s    zabstractsubrepo.getc                 C   s   t ‚dS )z/merge currently-saved state with the new state.Nr~   r   r   r   r   r   7  s    zabstractsubrepo.mergec                 C   s   t ‚dS )zhperform whatever action is analogous to 'hg push'

        This may be a no-op on some systems.
        Nr~   ©r,   Úoptsr   r   r   Úpush;  s    zabstractsubrepo.pushc                 K   s   g S ©Nr   ©r,   r?   r
   ÚprefixÚuipathfnÚexplicitonlyr’   r   r   r   ÚaddB  s    zabstractsubrepo.addc                 C   s   | j  d|tdƒf ¡ dS )Ns   %s: %ss   addremove is not supportedr   ©r?   rK   r   )r,   Úmatcherr–   r—   r’   r   r   r   Ú	addremoveE  s    zabstractsubrepo.addremovec                 K   s   dS ©Nr   r   )r,   r
   ÚfmÚ
fntemplater–   r’   r   r   r   ÚcatI  s    zabstractsubrepo.catc              	   K   s   t  g g g g g g g ¡S r”   )r   Ústatus)r,   Úrev2r’   r   r   r   r¡   L  s    zabstractsubrepo.statusc                 K   s   d S r”   r   )r,   r?   ÚdiffoptsÚnode2r
   r–   r’   r   r   r   ÚdiffO  s    zabstractsubrepo.diffc                 C   s   dS r   r   ©r,   r?   Údestr’   r   r   r   ÚoutgoingR  s    zabstractsubrepo.outgoingc                 C   s   dS r   r   ©r,   r?   Úsourcer’   r   r   r   ÚincomingU  s    zabstractsubrepo.incomingc                 C   s   t ‚dS )zreturn filename iteratorNr~   r†   r   r   r   ÚfilesX  s    zabstractsubrepo.filesc                 C   s   t ‚dS )z9return file data, optionally passed through repo decodersNr~   ©r,   ÚnameÚdecoder   r   r   Úfiledata\  s    zabstractsubrepo.filedatac                 C   s   dS )zreturn file flagsru   r   )r,   r®   r   r   r   Ú	fileflags`  s    zabstractsubrepo.fileflagsc                 C   s   t j|dS )z,Resolve the fileset expression for this repo©Úbadfn)ÚmatchmodÚnever)r,   ÚcwdÚexprr³   r   r   r   Úmatchfilesetd  s    zabstractsubrepo.matchfilesetc                 C   s   dS )z)handle the files command for this subrepor   r   )r,   r?   Úmr—   rž   ÚfmtÚsubreposr   r   r   Ú
printfilesh  s    zabstractsubrepo.printfilesTc              
      s¼   ˆ d ur ‡ fdd„|   ¡ D ƒ}n|   ¡ }t|ƒ}t| ƒ}| jjtdƒ| tdƒ|d}| d¡ |D ]J}	|  |	¡}
d|
v r~dp€d	}d
|
v }| ||	 |||  	|	|¡¡ | 
¡  qd| ¡  |S )Nc                    s   g | ]}ˆ |ƒr|‘qS r   r   ©Ú.0rU   ©r
   r   r   Ú
<listcomp>n  ru   z+abstractsubrepo.archive.<locals>.<listcomp>ó   archiving (%s)ó   files)ÚunitÚtotalr   ó   xií  i¤  ó   l)r¬   Úlenr5   r?   Úmakeprogressr   Úupdater±   Úaddfiler°   Ú	incrementÚcomplete)r,   Úarchiverr–   r
   r¯   r¬   rÄ   ÚrelpathÚprogressr®   ÚflagsÚmodeÚsymlinkr   r¿   r   Úarchivel  s&    ÿ

ÿ
zabstractsubrepo.archivec                 C   s   dS )zv
        walk recursively through the directory tree, finding all files
        matched by the match function
        Nr   )r,   r
   r   r   r   rG   ‚  s    zabstractsubrepo.walkc                 C   s   g g fS r”   r   ©r,   r
   r–   r—   ÚdryrunÚinteractiver   r   r   Úforgetˆ  s    zabstractsubrepo.forgetc	           	      C   s   |  tdƒ| j ¡ dS )zÒremove the matched files from the subrepository and the filesystem,
        possibly by force and/or after the file has been removed from the
        filesystem.  Return 0 on success, 1 on any warning.
        s)   warning: removefiles not implemented (%s)r   )Úappendr   ry   ©	r,   r›   r–   r—   ZafterÚforcer»   rÕ   Úwarningsr   r   r   Úremovefiles‹  s    ÿzabstractsubrepo.removefilesc                 O   s$   | j  tdƒ|d |d f ¡ g S )Ns)   %s: reverting %s subrepos is unsupported
r   rm   rš   ©r,   ro   Úpatsr’   r   r   r   ÚrevertŸ  s    ÿÿzabstractsubrepo.revertc                 C   s   |S r”   r   ©r,   Zrevidr   r   r   Úshortid¦  s    zabstractsubrepo.shortidc                 C   s   dS )zH
        convert this repository from shared to normal storage.
        Nr   r†   r   r   r   Úunshare©  s    zabstractsubrepo.unsharec                 C   s   dS )a1  verify the revision of this repository that is held in `_state` is
        present and not hidden.  Return 0 on success or warning, 1 on any
        error.  In the case of ``onpush``, warnings or errors will raise an
        exception if the result of pushing would be a broken remote repository.
        r   r   )r,   Úonpushr   r   r   Úverify®  s    zabstractsubrepo.verifyc                 C   s   t  | j ¡ j | j¡¡S )zIreturn vfs to access the working directory of this subrepository
        )Úvfsmodr   rx   r^   r\   rL   ry   r†   r   r   r   r\   ¶  s    zabstractsubrepo.wvfsc                 C   s   | j  t| j ¡ ƒ| j¡S ©zLreturn path to this subrepository as seen from outermost repository
        )r\   rN   Úreporelpathrx   r^   ry   r†   r   r   r   Ú_relpath¼  s    zabstractsubrepo._relpath)FF)FF)FN)F)N)NT)F)(r/   r0   r1   r+   r{   r}   rA   r„   r…   r‡   rˆ   rŒ   rŽ   r   rf   r   r“   r™   rœ   r    r¡   r¥   r¨   r«   r¬   r°   r±   r¸   r¼   rÓ   rG   r×   rÜ   rß   rá   râ   rä   Úpropertycacher\   rè   r   r   r   r   rw   Û   sL   	







rw   c                       sâ  e Zd Z‡ fdd„Zedd„ ƒZdd„ Zdd„ Zd	d
„ Ze	dd„ ƒZ
dd„ Zdd„ Zdd„ Zedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedd„ ƒZedZd!d"„ƒZed[d$d%„ƒZd&d'„ Zd(d)„ Zed*d+„ ƒZed,d-„ ƒZed.d/„ ƒZd0d1„ Zed\d2d3„ƒZed4d5„ ƒZed6d7„ ƒZed8d9„ ƒZed:d;„ ƒZ ed<d=„ ƒZ!d>d?„ Z"d@dA„ Z#edBdC„ ƒZ$ed]dDdE„ƒZ%dFdG„ Z&edHdI„ ƒZ'edJdK„ ƒZ(edLdM„ ƒZ)dNdO„ Z*dPdQ„ Z+edRdS„ ƒZ,d^dTdU„Z-e	dVdW„ ƒZ.e	dXdY„ ƒZ/‡  Z0S )_Ú	hgsubrepoc                    s   t t| ƒ ||¡ || _| ¡ }| t |¡¡}|oD|j 	d| ¡ }t
j t |¡¡|krnt tdƒ| ¡‚tj|j||d| _| jj|kr¤t d|| jjf ¡‚|| ¡ u r¼| j ¡ | _| jj| _dD ],\}}	|j ||	¡}
|
rÊ| j ||	|
d¡ qÊ| j ddd	d¡ |  ||d
 |¡ d S )Ns   %s/.hgrY   ©Úcreates9   failed to reject unsafe subrepo path: %s (expanded to %s)))ó   uis   commitsubreposó   subreporí   s   _usedassubrepos   Truer   )Úsuperrê   r+   Ú_stater^   Úwjoinr   Z	localpathr\   Úexistsr   r   Úrealpathr   r   r*   r   rl   Z
repositoryÚbaseuiÚ_repor[   ZProgrammingErrorÚ
unfilteredr?   ÚconfigÚ	setconfigÚ	_initrepo)r,   rq   r   rt   rr   Úrr[   rì   ÚsÚkÚv©Ú	__class__r   r   r+   Ä  s2    
ÿ
ÿÿ
zhgsubrepo.__init__c                 C   s   t  | jt| ƒ|¡ d S r”   )r   r{   rõ   r5   rz   r   r   r   r{   ä  s    zhgsubrepo.addwebdirpathc                 C   s8   | j  ¡  |  |¡W  d   ƒ S 1 s*0    Y  d S r”   )rõ   ÚlockÚ_storecleanr|   r   r   r   r}   è  s    zhgsubrepo.storecleanc                 C   sJ   d}|   |¡}|  |¡D ]}|t|d ƒkrd} q4q|rFt|d ƒd u }|S )NTF)Ú_calcstorehashÚ_readstorehashcacheÚnext)r,   r   ÚcleanZ	itercacheÚfilehashr   r   r   r  ì  s    
zhgsubrepo._storecleanc                 c   sP   d}dt |ƒ V  | jj}|D ],}t t | |¡¡ ¡ ¡}d||f V  qdS )z˜calculate a unique "store hash"

        This method is used to to detect when there are changes that may
        require a push to a given remote path.)s	   bookmarkss   store/phaserootss   store/00changelog.is   # %s
ó   %s = %s
N)	r   rõ   r   r   r!   r   r"   Ztryreadr#   )r,   r$   Zfilelistr   Zrelnamer  r   r   r   r  ù  s    zhgsubrepo._calcstorehashc                 C   s   t  | jj d¡¡S )Ns   cache/storehash)rå   r   rõ   rL   r†   r   r   r   Ú_cachestorehashvfs  s    zhgsubrepo._cachestorehashvfsc                 C   s   t |ƒ}| j |d¡S )z7read the store hash cache for a given remote repositoryó   r)r%   r  Ztryreadlines)r,   r$   Ú	cachefiler   r   r   r  
  s    zhgsubrepo._readstorehashcachec                 C   s\   t |ƒ}| j ¡ 6 t|  |¡ƒ}| j}|j||ddd W d  ƒ n1 sN0    Y  dS )zÄcache the current store hash

        Each remote repo requires its own store hash cache, because a subrepo
        store may be "clean" versus a given remote repo, but not versus another
        s   wbT)rÑ   Z
notindexedN)r%   rõ   r   Úlistr  r  Ú
writelines)r,   r$   r
  Z	storehashr   r   r   r   Ú_cachestorehash  s
    zhgsubrepo._cachestorehashc                 C   s0   | j  ¡ du r| jd S | jd }| j| S dS )zKfetch the context for this subrepo revision, possibly a workingctx
        Nr   )rx   Úrevrõ   rð   )r,   r  r   r   r   Ú_getctx  s    

zhgsubrepo._getctxc                    s‚   |ˆj _|ˆj _|r~dg‰ ‡ ‡fdd„}tˆj dd}tˆj ddd}|d|ƒ ||krb|d|ƒ ˆj j d	t d
 ˆ ¡¡¡ d S )Ns   [paths]
c                    s,   |r(ˆ   d| |f ¡ ˆj d| |d¡ d S )Nr  s   pathsrî   )rØ   r?   rø   )ÚkeyÚvalue©Úlinesr,   r   r   Úaddpathconfig,  s    z*hgsubrepo._initrepo.<locals>.addpathconfigF)ÚabortTs   defaults   default-pushrF   ru   )	rõ   Ú
_subparentÚ
_subsourceÚ
_abssourcer   Úwriter   ZtonativeeolrL   )r,   Ú
parentreporª   rì   r  ÚdefpathZdefpushpathr   r  r   rù   $  s    

zhgsubrepo._initrepoc                 K   s   t j|| j||||fi |¤ŽS r”   )r   r™   rõ   r•   r   r   r   r™   9  s
    ÿÿzhgsubrepo.addc                 C   s&   t   |¡}d|d< t | j||||¡S )NTrc   )Úcopyr   rœ   rõ   )r,   r¹   r–   r—   r’   r   r   r   rœ   ?  s    
zhgsubrepo.addremovec                 K   s6   | j d }| j| }tj| j| j|||||fi |¤ŽS r   )rð   rõ   r   r    r?   )r,   r
   rž   rŸ   r–   r’   r  rq   r   r   r   r    H  s    

ÿÿzhgsubrepo.catc                 K   s”   z6| j d }| j| }| j| }| jj||fi |¤ŽW S  tjyŽ } z>| j tdƒ|t| ƒf ¡ t	 g g g g g g g ¡W  Y d }~S d }~0 0 d S )Nr   ó*   warning: error "%s" in subrepository "%s"
)
rð   rõ   r¡   r   ÚRepoLookupErrorr?   rK   r   r5   r   )r,   r¢   r’   Úrev1Zctx1Zctx2Úinstr   r   r   r¡   P  s    



ÿÿzhgsubrepo.statusc           	   
   K   sž   zVt  | jd ¡}|d ur$t  |¡}tj|| j|| j| | j| |f|ddœ|¤Ž W nB tjy˜ } z(| j 	t
dƒ|t| ƒf ¡ W Y d }~n
d }~0 0 d S )Nr   T)r–   Zlistsubreposr  )r   Úbinrð   r	   Zdiffordiffstatrõ   r   r  r?   rK   r   r5   )	r,   r?   r£   r¤   r
   r–   r’   Únode1r   r   r   r   r¥   ^  s.    
úø	÷

ÿÿzhgsubrepo.diffNTc                    s¼   |   | jd ¡ |  ¡ }ˆ r.‡ fdd„|D ƒ}| jd }| j| }t | j| ¡ t | j|¡fg¡ t 	| ||ˆ ¡}|j
D ]<}	t||	dƒ}
t |	ˆ ¡}||	 d }||
 	||||¡7 }qz|S )N)r`   c                    s   g | ]}ˆ |ƒr|‘qS r   r   r½   r¿   r   r   rÀ   |  ru   z%hgsubrepo.archive.<locals>.<listcomp>r   Tó   /)Ú_getrð   r¬   rõ   r   Zprefetchfilesr  Z
matchfilesrw   rÓ   ro   r'   r´   Zsubdirmatcher)r,   rÍ   r–   r
   r¯   r¬   r  rq   rÄ   Úsubpathrû   ZsubmatchZ	subprefixr   r¿   r   rÓ   w  s     

ÿ
zhgsubrepo.archiveFc                 C   sH   | j d }|dkr|sdS | jd  }|| ¡  ¡ kr<|s<dS |j|dS )Nr   ru   T)r‚   )rð   rõ   Zp1r!   rA   )r,   r   r‚   rú   Úwr   r   r   rA   Š  s    

zhgsubrepo.dirtyc                 C   s   | j d  ¡ S ©Nó   .)rõ   r!   r†   r   r   r   r‡   •  s    zhgsubrepo.basestatec                 C   s   | j  | j  |¡¡S r”   )rõ   Z_checknestedrñ   r|   r   r   r   rˆ   ˜  s    zhgsubrepo.checknestedc                 C   sX   |   d¡s| jd  ¡ S | j dt| ƒ ¡ | j |||¡}|sN| jd  ¡ S t |¡S )NTr(  s   committing subrepo %s
)rA   rõ   r!   r?   Údebugr5   rŒ   r   )r,   r‰   rŠ   r‹   Únr   r   r   rŒ   ›  s    
zhgsubrepo.commitc                 C   s   | j |p
d  ¡ S r'  )rõ   rŽ   r   r   r   r   rŽ   §  s    zhgsubrepo.phasec                 C   s.   | j  tdƒt| ƒ ¡ t | jtjd¡ d S )Nó   removing subrepo %s
F)	r?   Únoter   r5   rl   r  rõ   r   Znullidr†   r   r   r   r   «  s    zhgsubrepo.removec                    sÎ  |\}}}ˆ j j}|ˆ j  ¡ v r:tˆ j ƒdks6| ¡ s:dS |ˆ j _tˆ j ƒ‰‡ ‡fdd„}tˆ j ƒdkr~ˆ j j ¡  | ¡ rÐt	 
ˆ¡rÐˆ j tdƒtˆ ƒˆf ¡ t	jˆ j jj|ƒ ˆ j jddd}| ¡ ˆ _ n’| ¡ rˆ j dd	¡}|röt |¡}|ˆ j dd
¡dœ}	ni }	ˆ j tdƒtˆ ƒt ˆ¡f ¡ t	jˆ j jji |ƒ ˆ j jd|	d\}
}| ¡ ˆ _ ˆ j||dd ˆ  ˆ¡ nLˆ j tdƒtˆ ƒt ˆ¡f ¡ ˆ  ˆ¡}t ˆ j |ƒ ¡ |rÊˆ  ˆ¡ dS )Nr   Tc                      s   t  ˆ ji ˆ¡S r”   )rl   Úpeerrõ   r   ©r,   Zsrcurlr   r   Ú<lambda>¿  ru   z hgsubrepo._get.<locals>.<lambda>s   sharing subrepo %s from %s
F)rÉ   Z	bookmarkss   shareó   pools
   poolnaming)r0  s   modeó   cloning subrepo %s from %s
)rÉ   Ú	shareoptsrë   ó   pulling subrepo %s from %s
)rõ   r  rö   rÇ   Úsharedr  r  r   Úrmtreerl   Zislocalr?   r¡   r   r5   Zsharerô   r[   rB   r÷   r   r   ÚhidepasswordZclonerù   r  r}   r   Zpull)r,   rt   rª   Úrevisionrh   r  Zgetpeerr4  Zpoolr2  ÚotherZclonedZcleansubr   r.  r   r$  ²  st    


ÿÿû

þÿÿú

ÿÿ

zhgsubrepo._getc           
      C   s”   |   |¡}|\}}}| j}|j d| j ¡ |rn| ¡ }|| }	|	 ¡ rn|j tdƒ|dd… | jf ¡ |}|r‚t	 
|| ¡ nt	 || ¡ d S )Ns   getting subrepo %s
s,   revision %s in subrepository "%s" is hidden
r   r    )r$  rõ   r?   r)  ry   rö   ÚhiddenrK   r   r   Zclean_updaterÉ   )
r,   rt   r   Zinreporª   r7  rh   r^   Zureporq   r   r   r   rf     s"    

ÿÿzhgsubrepo.getc                    sŠ   ˆ  ˆ¡ ˆjd ‰ˆjˆd  ‰ˆ ˆ¡‰ ‡ ‡‡‡‡fdd„}ˆjd  }ˆ ¡ r€ˆ ˆkrxtˆjˆ| ¡ ˆˆƒr~|ƒ  q†|ƒ  n|ƒ  d S )Nr(  r   c                      s„   ˆ ˆkr@ˆ  ¡ ˆ  ¡ kr@ˆj dtˆƒ ¡ t ˆjˆd ¡ n@ˆ ˆkr^ˆj dtˆƒ ¡ n"ˆj dtˆƒ ¡ tjˆdd d S )Ns   updating subrepository "%s"
r   s   skipping subrepository "%s"
s   merging subrepository "%s"
F)Zremind)Úbranchr?   r)  r5   rl   rÉ   rõ   r   r   ©ZancZcurZdstr,   rt   r   r   Ú	mergefunc  s    
ÿ
ÿ
ÿz"hgsubrepo.merge.<locals>.mergefunc)r$  rõ   ZancestorrA   rE   r?   )r,   rt   r<  Zwctxr   r;  r   r     s    



zhgsubrepo.mergec                 C   sð   |  d¡}|  d¡}|  d¡}| jd }|j}t|ƒD ]}| |¡ |¡dkr6 dS q6t| jdƒ}|s–|  |¡r–| j 	t
dƒt| ƒt |¡f ¡ d S | j 	t
d	ƒt| ƒt |¡f ¡ t | jd|i|¡}	tj| j|	||d
}
|  |¡ |
jS )Nó   forces
   new_branchs   sshr(  r   FTs4   no changes made to subrepo %s since last push to %s
s   pushing subrepo %s to %s
)Ú	newbranch)rf   rõ   ro   Úsortedr@   r“   r  r}   r?   r¡   r   r5   r   r6  rl   r-  r   r  Zcgresult)r,   r’   rÚ   r>  ZsshÚcZsubsrû   Zdsturlr8  r9   r   r   r   r“   6  s4    




ÿÿÿÿ
zhgsubrepo.pushc                 C   sL   d|v sd|v r2t   |¡}| dd ¡ | dd ¡ t || jt| jdƒ|¡S )Nó   revó   branchT)r  r)   rl   r¨   rõ   r  r¦   r   r   r   r¨   V  s
    
zhgsubrepo.outgoingc                 C   sL   d|v sd|v r2t   |¡}| dd ¡ | dd ¡ t || jt| jdƒ|¡S )NrA  rB  F)r  r)   rl   r«   rõ   r  r©   r   r   r   r«   ^  s
    
zhgsubrepo.incomingc                 C   s    | j d }| j| }| ¡  ¡ S r   )rð   rõ   ZmanifestÚkeys)r,   r  rq   r   r   r   r¬   f  s    

zhgsubrepo.filesc                 C   s2   | j d }| j| |  ¡ }|r.| j ||¡}|S r   )rð   rõ   ÚdataZ
wwritedata)r,   r®   r¯   r  rD  r   r   r   r°   l  s
    
zhgsubrepo.filedatac                 C   s   | j d }| j| }| |¡S r   )rð   rõ   rÐ   )r,   r®   r  rq   r   r   r   r±   s  s    

zhgsubrepo.fileflagsc           	   	   C   sD   | j  ¡ d u r| jd  }n| jd }| j| }t |||||||¡S r   )rx   r  rõ   rð   r   r¬   )	r,   r?   r¹   r—   rž   rº   r»   rq   r  r   r   r   r¼   x  s
    

zhgsubrepo.printfilesc                 C   sÚ   | j  ¡ d u r| jd  }n| jd }| j| }|j|||dg}|jD ]t}| |¡}z.|j|||d}	tj||	|d}
| 	|
¡ W qF t
jy¸   | j tdƒ| j t| ƒ|¡ ¡ Y qF0 qFt|ƒdkrÐ|d S t |¡S )Nr   r²   s#   skipping missing subrepository: %s
r   )rx   r  rõ   rð   r¸   ro   r@   r´   ZprefixdirmatcherrØ   r   ÚLookupErrorr?   r¡   r   r\   rN   rç   rÇ   Zunionmatcher)r,   r¶   r·   r³   rq   r  Zmatchersr%  r@   ZsmZpmr   r   r   r¸   ƒ  s(    



ÿÿzhgsubrepo.matchfilesetc                 C   s   | j d  }| |¡S r”   )rõ   rG   )r,   r
   rq   r   r   r   rG     s    
zhgsubrepo.walkc              
   C   s   t j| j| j|||d||dS )NT)rÕ   rÖ   )r   r×   r?   rõ   rÔ   r   r   r   r×   ¡  s    øzhgsubrepo.forgetc	           	      C   s   t  | j| j|||||||¡	S r”   )r   r   r?   rõ   rÙ   r   r   r   rÜ   ®  s    ÷zhgsubrepo.removefilesc                 O   sj   | j  tdƒ|d  ¡ | d¡sN| ¡ }d |d< |d |d< | j|i |¤Ž | d¡sf| j|dd	 d S )
Nó   reverting subrepo %s
r   Ú	no_backupr‹   r   r  Údry_runT©r   )r?   r¡   r   rf   r  Ú
filerevertrÝ   r   r   r   rß   Æ  s    

zhgsubrepo.revertc                 O   sH   | j |d  }| d¡r dg}ng }tj| j| j |g|¢R i |¤Ž d S )Nr  Úalls   set:modified())rõ   rf   r   rß   r?   )r,   rÞ   r’   rq   r   r   r   rJ  Ü  s
    
zhgsubrepo.filerevertc                 C   s   |d d… S )Nr    r   rà   r   r   r   rá   ä  s    zhgsubrepo.shortidc                 C   sD   ddl m} |a| j ¡ r0| j tdƒ| j ¡ t | j| j¡ d S )Nr   rk   s   unsharing subrepo '%s'
)	rn   rl   rõ   r4  r?   r¡   r   rè   râ   )r,   rs   r   r   r   râ   ç  s
    
zhgsubrepo.unsharec              	   C   sÂ   zf| j d }| j ¡ | }| ¡ rbtdƒ| jt | j ¡ ¡f }|rPt	 
|¡‚n| jj d| ¡ W dS  t	jy¼   tdƒ| jt | j ¡ ¡f }|r¤t	 
|¡‚n| jj d| ¡ Y dS 0 d S )Nr   s%   subrepo '%s' is hidden in revision %ss   %s
r   s%   subrepo '%s' not found in revision %s)rð   rõ   rö   r9  r   rè   r   Zshortrx   r   r*   r?   rK   r  )r,   rã   r  rq   rD   r   r   r   rä   ú  s*    
þþzhgsubrepo.verifyc                 C   s   | j jS )z7return own wvfs for efficiency and consistency
        )rõ   r\   r†   r   r   r   r\     s    zhgsubrepo.wvfsc                 C   s
   t | jƒS ræ   )rç   rõ   r†   r   r   r   rè     s    zhgsubrepo._relpath)NT)FF)F)N)F)1r/   r0   r1   r+   r>   r{   r}   r  r  ré   r  r  r  r  rù   r™   rœ   r    r¡   r¥   rÓ   rA   r‡   rˆ   rŒ   rŽ   r   r$  rf   r   r“   r¨   r«   r¬   r°   r±   r¼   r¸   rG   r×   rÜ   rß   rJ  rá   râ   rä   r\   rè   Ú__classcell__r   r   rþ   r   rê   Ã  sŒ    

	









O
 











rê   c                       s¶   e Zd Z‡ fdd„Zd#dd„Zedd„ ƒZd	d
„ Zdd„ Zdd„ Z	dd„ Z
ed$dd„ƒZdd„ Zedd„ ƒZedd„ ƒZed%dd„ƒZedd„ ƒZdd„ Zedd „ ƒZd!d"„ Z‡  ZS )&Ú
svnsubrepoc                    sB   t t| ƒ ||¡ || _t d¡| _| js>t t	dƒ| j
 ¡‚d S )Nrb   s+   'svn' executable not found for subrepo '%s')rï   rM  r+   rð   r   ZfindexeÚ_exer   r*   r   ry   ©r,   rq   r   rt   rr   rþ   r   r   r+   (  s    ÿzsvnsubrepo.__init__ru   Fc              	   C   s,  | j g}i }| j ¡ s6tj|d< |d dv r6| d¡ | |¡ |d url| j | j	 
¡ j| j|¡}| |¡ ttjƒ}| d¡}|r’||d< |d= d|d< tjt tj|¡fd	tjtjtjt |¡d
œ|¤Ž}	ttj|	 ¡ ƒ\}
}| ¡ }|s$|	jrt |p
d|	j ¡‚|r$| j  |d ¡ |
|fS )NÚstdinr   )ó   updateó   checkoutó   commits   --non-interactiveó   LC_ALLs   LANGó   Cs   LC_MESSAGESéÿÿÿÿ)ÚbufsizeÚ	close_fdsÚstdoutÚstderrÚenvs   exited with code %dó   
)!rN  r?   rÖ   Ú
subprocessÚPIPErØ   Úextendr\   rN   rx   r^   Zorigrootry   Údictr   Úenvironrf   ÚPopenr   Úrapplyr   ÚtonativestrÚclosefdsÚtonativeenvÚmapr   ZfromnativeeolZcommunicateÚstripÚ
returncoder   r*   rK   )r,   ÚcommandsÚfilenameÚfailokÚcmdZextrakwr   r[  Zlc_allÚprY  rZ  r   r   r   Ú_svncommand1  sN    



ÿ


ÿúù	ÿzsvnsubrepo._svncommandc                 C   sP   | j ddgd d\}}t d|¡}|s4t tdƒ¡‚t| d¡ƒt| d¡ƒfS )Nó	   --versionó   --quiet)rk  s   ^(\d+)\.(\d+)s    cannot retrieve svn tool versionr   rm   )ro  ÚreÚsearchr   r*   r   ÚintÚgroup)r,   ÚoutputÚerrr¹   r   r   r   Ú_svnversion_  s    ÿ
zsvnsubrepo._svnversionc                 C   s   | j  d¡ S )Nó   .svn©r\   rò   r†   r   r   r   Ú_svnmissingi  s    zsvnsubrepo._svnmissingc                 C   s€   |   ddg¡\}}tjj |¡}| d¡}d\}}|rxt |d  d¡¡pLd}|d  d¡}|rxt |d  d¡¡pvd}||fS )	Ns   infoó   --xmlÚentry)ó   0r~  r   r7  r~  rŒ   )	ro  ÚxmlÚdomÚminidomÚparseStringÚgetElementsByTagNamer   ÚbytestrÚgetAttribute)r,   rv  rw  ÚdocÚentriesÚlastrevr  Zcommitsr   r   r   Ú_wcrevsl  s    
þzsvnsubrepo._wcrevsc                 C   s   |   ¡ d S )Nr   )r‰  r†   r   r   r   Ú_wcrev~  s    zsvnsubrepo._wcrevc                 C   s  |   ddg¡\}}g g g   }}}tjj |¡}| d¡D ]€}| d¡}|sNq:|d  d¡}	|d  d¡}
| d¡ d	¡}|	d
krŽ| |¡ n|	dkr | |¡ |	dvs°|
dvr:| |¡ q:|D ]<}|D ]2}||ksä| 	|t
j ¡rÈddt|ƒf    S qÈqÀt|ƒdt|ƒfS )zýReturn (changes, extchanges, missing) where changes is True
        if the working directory was changed, extchanges is
        True if any of these changes concern an external entry and missing
        is True if any change is a missing entry.
        ó   statusr|  r}  z	wc-statusr   ÚitemÚpropsr   Úutf8Úexternalr‚   )rn   ÚnormalZunversionedr  )rn   Znoner  TF)ro  r  r€  r  r‚  rƒ  r…  ÚencoderØ   rZ   r   ZossepÚbool)r,   rv  rw  Z	externalsZchangesr‚   r†  Úerû   rŒ  r  r   Zextr   r   r   Ú
_wcchanged  s.    

ûzsvnsubrepo._wcchangedc                 C   sT   |   ¡ r| jd dkS |  ¡ }|d p0|o0|d }|sP| jd |  ¡ v sL|rPdS dS )Nr   ru   r   rm   FT)r{  rð   r”  r‰  )r,   r   r‚   Z	wcchangedÚchangedr   r   r   rA   ¢  s    zsvnsubrepo.dirtyc                 C   sP   |   ¡ \}}||krLz"|  dd| jd |f g¡ |W S  tjyJ   Y n0 |S )Nó   listó   %s@%sr   )r‰  ro  rð   r   r*   )r,   rˆ  r  r   r   r   r‡   ­  s    ÿzsvnsubrepo.basestatec           
      C   sÂ   |   ¡ \}}}|s|  ¡ S |r,t tdƒ¡‚|r>t tdƒ¡‚|  dd|g¡\}}| j |¡ t 	d|¡}	|	s–| 
¡ s„t tdƒ¡‚t | ¡ d ¡‚|	 ¡ d }	| j |  d	d
|	g¡d ¡ |	S )Ns   cannot commit svn externalss!   cannot commit missing svn entriesrS  ó   -ms   Committed revision ([0-9]+).s   failed to commit svn changesrV  r   rQ  ó   -r)r”  r‡   r   r*   r   ro  r?   r¡   rr  rs  rh  Ú
splitlinesÚgroups)
r,   r‰   rŠ   r‹   r•  Z
extchangedr‚   Z
commitinforw  Znewrevr   r   r   rŒ   ½  s"    zsvnsubrepo.commitc                 C   s€   |   ¡ r"| j tdƒ| j ¡ d S | j tdƒ| j ¡ | jjdd z"| j 	¡ j}| 
| | j¡¡ W n tyz   Y n0 d S )Nó-   not removing repo %s because it has changes.
r+  T)Zforcibly)rA   r?   rK   r   ry   r,  r\   r5  rx   r^   Ú
removedirsrP   ÚOSError)r,   Zpwvfsr   r   r   r   Ù  s    ÿÿzsvnsubrepo.removec                 C   sÞ   |r|   ddg¡ dg}| jdkr,| d¡ | d|d |d f ¡ t |d ¡ | j |d	d
\}}t| j| jdƒ t 	d|¡sÎd|v r¸|  
¡ d d… dkr¸|  ¡  | j|dd d S t |pÂ| ¡ d ¡‚| j |¡ d S )Ns   revertó   --recursiverR  )r   é   ó   --forcer—  r   r   T)rl  ry  s   Checked out revision [0-9]+.s-   is already a working copy for a different URLrm   )FFFrI  rV  )ro  rx  rØ   r   ÚchecksafesshrV   r?   r\   rr  rs  r”  r   rf   r   r*   rš  r¡   )r,   rt   r   r-   r¡   rw  r   r   r   rf   ê  s$    

ÿzsvnsubrepo.getc                 C   sX   | j d }|d }|  ¡ }||krT||kp4|  ¡ d }t| j| |||ƒrT|  |d¡ d S )Nr   r   F)rð   rŠ  r”  rE   r?   rf   )r,   rt   ÚoldÚnewZwcrevrA   r   r   r   r     s    
zsvnsubrepo.mergec                 C   s   dS )NTr   r‘   r   r   r   r“     s    zsvnsubrepo.pushc                 C   s‚   |   g d¢¡d }tjj |¡}g }| d¡D ]N}t | d¡¡}|dkrLq.d 	dd„ | d	¡d j
D ƒ¡}| | d
¡¡ q.|S )N)r–  rŸ  r|  r   r}  rh   s   filern   c                 s   s    | ]}|j |jkr|jV  qd S r”   )ZnodeTypeZ	TEXT_NODErD  )r¾   r@  r   r   r   Ú	<genexpr>  s   þz#svnsubrepo.files.<locals>.<genexpr>r®   rŽ  )ro  r  r€  r  r‚  rƒ  r   r„  r…  rL   Z
childNodesrØ   r‘  )r,   rv  r†  Úpathsr“  rh   r®   r   r   r   r¬     s    
þzsvnsubrepo.filesc                 C   s   |   dg|¡d S )Ns   catr   )ro  r­   r   r   r   r°   $  s    zsvnsubrepo.filedata)ru   F)FF)F)r/   r0   r1   r+   ro  ré   rx  r{  r‰  rŠ  r”  r>   rA   r‡   rŒ   r   rf   r   r“   r¬   r°   rL  r   r   rþ   r   rM  '  s.   	
.
	!



	
rM  c                       s\  e Zd Z‡ fdd„Zdd„ Zedd„ ƒZedd„ ƒZdFdd„ZdGdd„Z	dHdd„Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ ZedId)d*„ƒZd+d,„ ZedJd-d.„ƒZed/d0„ ƒZed1d2„ ƒZed3d4„ ƒZed5d6„ ƒZed7d8„ ƒZdKd:d;„Z ed<d=„ ƒZ!ed>d?„ ƒZ"ed@dA„ ƒZ#edBdC„ ƒZ$dDdE„ Z%‡  Z&S )LÚ
gitsubrepoc                    s>   t t| ƒ ||¡ || _| ¡  |¡| _| ¡ | _|  ¡  d S r”   )	rï   r§  r+   rð   r^   rñ   Ú_abspathr  Ú
_ensuregitrO  rþ   r   r   r+   )  s
    
zgitsubrepo.__init__c                 C   s~  zd| _ |  dg¡\}}W n ty } zètdƒ}tdƒ}|jtjkrht || jt	 
|j¡f ¡‚n¢tjròzd| _ |  dg¡\}}W nf tyî } zN|jtjkr¾tjtdƒ| j |d‚nt || jt	 
|j¡f ¡‚W Y d }~n
d }~0 0 ntjtdƒ| j |d‚W Y d }~n
d }~0 0 |  |¡}|d	krF| j td
ƒ¡ n4|dkr`t tdƒ¡‚n|dkrz| j tdƒ¡ d S )Nra   rp  s(   error executing git for subrepo '%s': %ss'   check git is installed and in your PATHs   git.cmds1   couldn't find 'git' or 'git.cmd' for subrepo '%s'rd   s"   couldn't find git for subrepo '%s'ó   unknowns   cannot retrieve git version
ó   aborts,   git subrepo requires at least 1.6.0 or lateró   warnings-   git subrepo requires at least 1.6.0 or later
)Ú_gitexecutableÚ	_gitnodirrž  r   ÚerrnoZENOENTr   r*   ry   r   Z
strtolocalÚstrerrorr   Z	iswindowsÚ_checkversionr?   rK   )r,   Úoutrw  r“  ZgenericerrorZnotfoundhintZe2Zversionstatusr   r   r   r©  0  sT    ÿÿüú	ÿÿþ


ÿ
zgitsubrepo._ensuregitc                 C   sj   t  d| ¡}|r8t| d¡ƒt| d¡ƒt| d¡ƒfS t  d| ¡}|rft| d¡ƒt| d¡ƒdfS dS )Ns    ^git version (\d+)\.(\d+)\.(\d+)r   rm   é   s   ^git version (\d+)\.(\d+)r   rV  )rr  rs  rt  ru  )r²  r¹   r   r   r   Ú_gitversion]  s    (zgitsubrepo._gitversionc                 C   s2   t  | ¡}|dkrdS |dk r"dS |dk r.dS dS )aš  ensure git version is new enough

        >>> _checkversion = gitsubrepo._checkversion
        >>> _checkversion(b'git version 1.6.0')
        'ok'
        >>> _checkversion(b'git version 1.8.5')
        'ok'
        >>> _checkversion(b'git version 1.4.0')
        'abort'
        >>> _checkversion(b'git version 1.5.0')
        'warning'
        >>> _checkversion(b'git version 1.9-rc0')
        'ok'
        >>> _checkversion(b'git version 1.9.0.265.g81cdec2')
        'ok'
        >>> _checkversion(b'git version 1.9.0.GIT')
        'ok'
        >>> _checkversion(b'git version 12345')
        'unknown'
        >>> _checkversion(b'no')
        'unknown'
        rV  rª  )r   r   r   r«  )r   é   r   r¬  s   ok)r§  r´  )r²  Úversionr   r   r   r±  i  s    
zgitsubrepo._checkversionNFc                 C   s   | j |||dd S )N)r[  Ústreamr   ©Ú_gitdir©r,   rj  r[  r·  r   r   r   Ú_gitcommand  s    zgitsubrepo._gitcommandc                 C   s   | j |||| jdS )N)r[  r·  r¶   )r®  r¨  rº  r   r   r   r¹    s    
ÿzgitsubrepo._gitdirc           	   	   C   sD  | j  d| jd |¡f ¡ |du r.tj ¡ }d|d< d|vrFd|d< d}| j jr`t 	t
jd¡}| j jrˆt|ƒrˆ|d	 d
krˆ| dd¡ tjt tj| jg| ¡dt tj|¡t |¡tjtj|d}|rÔ|jdfS |j ¡  ¡ }| ¡  |jd	kr:|jdkr:|d	 }|dv r||jfS t tdƒ||j| jf ¡‚||jfS )zœCalls the git command

        The methods tries to call the git command. versions prior to 1.6.0
        are not supported and very probably fail.
        s   %s: git %s
r3   NrU  rT  s   GIT_ALLOW_PROTOCOLs   file:git:http:https:sshó   wr   ó   diffr   s   --colorrV  )rW  r¶   r[  rX  rY  rZ  )ó   cat-fileó   symbolic-refs   git %s error %d in %s) r?   r)  rè   rL   r   ra  r  Úquietr   Úopenr   ÚdevnullZ
_colormoderÇ   Úinsertr]  rb  rc  r   rd  r­  rf  re  r^  rY  Úreadrh  Úwaitri  r   r*   r   )	r,   rj  r[  r·  r¶   Zerrpipern  ZretdataÚcommandr   r   r   r®  •  sH    
ÿ÷


ÿÿzgitsubrepo._gitnodirc                 C   s   | j  d¡ S )Nó   .gitrz  r†   r   r   r   Ú_gitmissingË  s    zgitsubrepo._gitmissingc                 C   s   |   ddg¡S )Ns	   rev-parseó   HEAD©r»  r†   r   r   r   Ú	_gitstateÎ  s    zgitsubrepo._gitstatec                 C   s   |   g d¢¡\}}|rd }|S )N)r¿  rÉ  rq  r¸  )r,   Úcurrentrw  r   r   r   Ú_gitcurrentbranchÑ  s    zgitsubrepo._gitcurrentbranchc                 C   s>   |   ddd|g¡}| d¡d }| d¡tdƒ }||d … S )Ns   remoteó   shows   -nr\  r   s   URL: )r»  ÚsplitÚindexrÇ   )r,   rC   r²  ÚlinerS   r   r   r   Ú
_gitremote×  s    zgitsubrepo._gitremotec                 C   s   |   dd|g¡\}}|dkS )Nr¾  s   -er   r¸  )r,   r7  r²  Úcoder   r   r   Ú_githavelocallyÝ  s    zgitsubrepo._githavelocallyc                 C   s   |   d||g¡}||kS )Nó
   merge-baserÊ  )r,   Zr1Zr2Úbaser   r   r   Ú_gitisancestorá  s    zgitsubrepo._gitisancestorc                 C   s   |   g d¢¡dkS )N)ó   configs   --booló	   core.bareó   truerÊ  r†   r   r   r   Ú
_gitisbareå  s    zgitsubrepo._gitisbarec                 C   s   |   g d¢¡ dS )z This must be run before git diff-index.
        diff-index only looks at changes to file stat;
        this command looks at file contents and updates the stat.)s   update-indexó   -qs	   --refreshNrÊ  r†   r   r   r   Ú_gitupdatestatè  s    zgitsubrepo._gitupdatestatc                 C   s‚   i }i }|   g d¢¡}| d¡D ]X}| d¡\}}| d¡sH| d¡sHq | d¡r^| d¡r^q |||< | |g ¡ |¡ q ||fS )zcreturns 2 things:
        a map from git branch to revision
        a map from revision to branches)s   for-each-refs   --formats   %(objectname) %(refname)r\  r3   s   refs/heads/ó   refs/remotes/s   /HEAD)r»  rÏ  rZ   ÚendswithÚ
setdefaultrØ   )r,   Ú
branch2revÚ
rev2branchr²  rÑ  r7  Úrefr   r   r   Ú_gitbranchmapî  s     ÿÿzgitsubrepo._gitbranchmapc              	   C   sr   i }|D ]d}|  d¡rq| dd¡d }|  dd| g¡}|r|  dd| g¡}||d|| dd¡d f < q|S )z4return map of remote branch to local tracking branchrÞ  r#  rm   rØ  s   branch.%s.remotes   branch.%s.merges   refs/remotes/%s/%s)rZ   rÏ  r»  )r,   ÚbranchesÚtrackingÚbÚbnamerC   rã  r   r   r   Ú_gittracking  s    
þÿzgitsubrepo._gittrackingc                 C   s<   d|vr.|  d¡}|dkr.d|d |… vr.|S || _t| ƒS )Ns   ://ó   :rV  r#  )Úfindr  r  )r,   rª   Zcolonr   r   r   r    s    
zgitsubrepo._abssourcec                 C   s¨   |   ¡ rHt |¡ |  |¡}| j tdƒ| j|f ¡ |  d|| j	g¡ |  
|¡rVd S | j tdƒ| j|  d¡f ¡ |  dg¡ |  
|¡s¤t tdƒ|| jf ¡‚d S )Nr1  s   cloner3  ó   origins   fetchs1   revision %s does not exist in subrepository "%s"
)rÈ  r   r¢  r  r?   r¡   r   rè   r®  r¨  rÔ  rÒ  r»  r   r*   )r,   rª   r7  r   r   r   Ú_fetch  s*    

ÿ
ÿÿ
ÿÿzgitsubrepo._fetchc                 C   s^   |   ¡ r| jd dkS |  ¡ r"dS |s<| jd |  ¡ kr<dS |  ¡  |  g d¢¡\}}|dkS )Nr   ru   T©ó
   diff-indexrq  rÉ  )rÈ  rð   rÛ  rË  rÝ  r¹  )r,   r   r‚   r²  rÓ  r   r   r   rA   5  s    zgitsubrepo.dirtyc                 C   s   |   ¡ S r”   )rË  r†   r   r   r   r‡   C  s    zgitsubrepo.basestatec                    sè  |\}‰}ˆsˆ  ¡  d S ˆ |ˆ¡ ˆ ¡ r\ˆ g d¢¡ ˆ ¡ ˆkrŒˆ g d¢¡ d S n0ˆ ¡ ˆkrŒˆrˆˆ ddg¡ ˆ g d¢¡ d S ˆ ¡ \}}‡‡fdd„‰ ‡ ‡‡fdd„}ˆ|vrÈ|ƒ  d S |ˆ }d }	|D ].}
|
d	krôˆ d	gƒ  d S |	sØ|
 d
¡sØ|
}	qØ|	rˆ |	gƒ d S ˆ | ¡ ¡}|d }||vr\|D ]}
|
|v r@|
} q\q@||vr†| 	dd¡d }ˆ d||gƒ n^ˆ 
|||  |¡rÞ|| ˆ ¡ kr¼ˆ || gƒ ˆ dd|g¡ tˆjˆjdƒ n|ƒ  d S )N)rØ  rÙ  s   false)ó   resets   --hardrÉ  rð  rÉ  c                    sD   dg}ˆ r"ˆ  ddg¡ | d¡ ˆ  ||  ¡ tˆjˆjdƒ d S )NrR  rð  rÉ  ó   -frÇ  )r»  rØ   rV   r?   r\   )r-   rm  )r   r,   r   r   Úcheckout]  s    
z gitsubrepo.get.<locals>.checkoutc                      s6   ˆj  tdƒˆj ¡ ˆj  tdƒ¡ ˆ dˆgƒ d S )Ns1   checking out detached HEAD in subrepository "%s"
s5   check out a git branch if you intend to make changes
rÜ  )r?   rK   r   rè   r   )rò  r7  r,   r   r   Úrawcheckouth  s    ÿÿÿz#gitsubrepo.get.<locals>.rawcheckouts   refs/heads/masterrÞ  r   r#  r³  s   -bó   merges   --ffrÇ  )r   rí  rÛ  r»  rË  rä  rZ   ré  rC  rÏ  r×  rÍ  rV   r?   r\   )r,   rt   r   rª   rh   rá  râ  ró  rå  Zfirstlocalbranchrç  ræ  rC   rB   r   )rò  r   r7  r,   r   rf   F  s`    






zgitsubrepo.getc                 C   sl   |   ¡ rt tdƒ| j ¡‚ddd|g}tj ¡ }|rB|d|g7 }|rVt 	|d¡|d< | j
||d |  ¡ S )	Nó   subrepo %s is missingrS  s   -ar˜  s   --authors   %Y-%m-%dT%H:%M:%S %1%2s   GIT_AUTHOR_DATE)r[  )rÈ  r   r*   r   rè   r   ra  r  r   Zdatestrr»  rË  )r,   r‰   rŠ   r‹   rm  r[  r   r   r   rŒ   Ÿ  s    
ÿzgitsubrepo.commitc                    sÀ   ˆ\}‰}ˆ  |ˆ¡ ˆ dˆˆjd g¡‰ ˆ ¡  ˆ g d¢¡\}}‡ ‡‡‡fdd„}ˆ ¡ r¶ˆ ¡ ˆkr¼ˆ ¡ ˆjd kp„|dk}tˆjˆ|ˆjd d d… ˆd d… ƒr¼|ƒ  n|ƒ  d S )NrÕ  r   rî  c                      sF   ˆ ˆkrˆ  ˆ¡ nˆ ˆjd kr2ˆ ddˆg¡ tˆjˆjdƒ d S )Nr   rô  s   --no-commitrÇ  )rf   rð   r»  rV   r?   r\   r   ©rÖ  r7  r,   rt   r   r   r<  º  s
    z#gitsubrepo.merge.<locals>.mergefuncr   é   )	rí  r»  rð   rÝ  r¹  rA   rË  rE   r?   )r,   rt   rª   rh   r²  rÓ  r<  rA   r   rö  r   r   ²  s    
"ÿzgitsubrepo.mergec           
      C   sb  |  d¡}| jd sdS |  ¡ r4t tdƒ| j ¡‚|  ¡ \}}| jd |v rr|| jd  D ]}| d¡r\ dS q\t	 
|¡D ]*\}}| d¡r||  | jd |¡r| dS q|dg}|r¼| d¡ |  ¡ }|r:|  | jd |¡sö| j tdƒ| j ¡ d	S | j td
ƒ| dd¡d | jf ¡ |  |d|g ¡}	|	d dkS | j tdƒ| j| jd f ¡ d	S d S )Nr=  r   Trõ  s   refs/remotes/origin/s   pushr¡  s7   unrelated git branch checked out in subrepository "%s"
Fs(   pushing branch %s of subrepository "%s"
r#  rm   rì  r   sD   no branch checked out in subrepository "%s"
cannot push revision %s
)rf   rð   rÈ  r   r*   r   rè   rä  rZ   r   Z	iteritemsr×  rØ   rÍ  r?   rK   r¡   rÏ  r¹  )
r,   r’   rÚ   rá  râ  rç  r7  rm  rÌ  Zretr   r   r   r“   Ë  sV    




ÿüÿÿÿÿüÿzgitsubrepo.pushc                    s  |   ¡ rg S | jd ddd}tƒ }|j|j|j|jfD ]}	| |	¡ q6|j}
|
 	ˆ  
¡ ¡ g }‡ fdd„tt|
ƒƒD ƒ}
|
D ]t}ˆ  |¡}dg}|rž| d¡ |js¨|s¾| tdƒ||ƒ ¡ ||v rÖ|r|| |¡ q|| d¡s||  ||g ¡ q||D ]}| td	ƒ||ƒ ¡ qö|S )
NT)Úunknownr  c                    s   g | ]}ˆ |ƒr|‘qS r   r   r½   r¿   r   r   rÀ     ru   z"gitsubrepo.add.<locals>.<listcomp>s   addrñ  s
   adding %s
rH  s   %s already tracked!
)rÈ  r¡   ÚsetÚmodifiedÚaddedÚdeletedr  rÉ   rø  r_  r¬   r?  ÚexactrØ   Úverboser   rf   r»  rK   )r,   r?   r
   r–   r—   r˜   r’   rû   ZtrackedÚlr¬   ZrejectedrU   rý  rÆ  r   r¿   r   r™   þ  s4    




zgitsubrepo.addc                 C   s˜   |   ¡ rd S |  ¡ r.| j tdƒ| j ¡ d S | j tdƒ| j ¡ |  g d¢¡ | j 	¡ D ]6\}}|dkrnq\|t
jkr†| j |¡ q\| j |¡ q\d S )Nrœ  r+  )rØ  rÙ  rÚ  rÇ  )rÈ  rA   r?   rK   r   rè   r,  r»  r\   ZreaddirÚstatÚS_IFDIRr5  rM   )r,   rU   rh   r   r   r   r   %  s"    ÿÿ
zgitsubrepo.removeTc                 C   sò   d}| j \}}|s|S |  ||¡ | jd|gdd}tj|dd}	t| ƒ}
| jjtdƒ|
 tdƒd	}| 	d¡ |	D ]p}| 
¡ r‚qtt |j¡}|rœ||ƒsœqt| ¡ r¬|j}n|	 |¡ ¡ }| || |j| ¡ |¡ |d
7 }| ¡  qt| ¡  |S )Nr   s   archiveT)r·  zr|)ZfileobjrÑ   rÁ   rÂ   )rÃ   r   )rð   rí  r»  ÚtarfilerÁ  r5   r?   rÈ   r   rÉ   Úisdirr   Úfsencoder®   ZissymZlinknameZextractfilerÄ  rÊ   rÑ   rË   rÌ   )r,   rÍ   r–   r
   r¯   rÄ   rª   r7  Z	tarstreamZtarrÎ   rÏ   Úinforè  rD  r   r   r   rÓ   ;  s4    
ÿ

zgitsubrepo.archivec           
      K   sx   | j d }| ¡ rdS | ¡ s"dS | ¡ D ]H}|  dd||f g¡}tj| j|| j ||¡d}	|	 	|¡ |	 
¡  q*dS )Nr   rÎ  s   %s:%s)Úpathnamer   )rð   Zanypatsr¬   r»  r   Zmakefileobjrx   r\   rN   r  Úclose)
r,   r
   rž   rŸ   r–   r’   r  rU   rv  Úfpr   r   r   r    \  s    
ÿ

zgitsubrepo.catc              	   K   sZ  | j d }|  ¡ s|s,t g g g g g g g ¡S g g g   }}}|  ¡  |rXddd||g}n
dd|g}|  |¡}| d¡D ]t}	|	 d¡}
|
dkrŽqv|	|
d |
… |	|
d d …  }}|d	krÄ| |¡ qv|d
krØ| |¡ qv|dkrv| |¡ qvg g g g f\}}}}g d¢}| 	d¡r|dg7 }| 	d¡r4|dg7 }|  |¡}t
ƒ }| |¡ | |¡ | |¡ | d¡D ]˜}	|	szql|	dd… }|	 d¡dkr®|	dd …  d¡\}}n|	dd … }d }| |¡ |rØ| |¡ |dkrî| |¡ n|dkrl| |¡ ql| 	d¡rD|  dg¡}| d¡D ]}||vr(| |¡ q(t |||||||¡S )Nr   s	   diff-treeó   --no-renamesr™  rï  r\  ó   	rV  ó   Mó   Aó   D)r‹  s   --porcelains   -zrø  s   --untracked-files=allÚignoreds	   --ignoredó    r   rm   r³  s   ??s   !!r  s   ls-files)rð   rÈ  r   r¡   rÝ  r»  rÏ  rë  rØ   rf   rù  rÉ   r™   )r,   r¢   r’   r  rú  rû  ÚremovedrÆ  r²  rÑ  Ztabr¡   rU   rü  rø  r  r  ZchangedfilesÚstZ	filename1Ú	filename2r   r   r   r¡   o  sl    



"










ÿzgitsubrepo.statusc                 K   sT  | j d }ddg}|d r&| d¡ n| d|j ¡ |jrT| d| d| g¡ n| d	| d
| g¡ |jrz| d¡ |jrŠ| d¡ |  |  dg¡¡dkr°|j	r°| d¡ | |¡ |rÈ| |¡ d}	| 
¡ rè|	|  |¡d 7 }	nT|  |¡}
dd„ |
j|
j|
jfD ƒ}|D ]*}||ƒr|	|  |d|g ¡d 7 }	q|	 ¡ rP| |	¡ d S )Nr   r½  r	  r   s   --stats   -U%ds   --src-prefix=%s/s   --dst-prefix=%s/s   --src-prefix=a/%s/s   --dst-prefix=b/%s/s   --ignore-all-spaces   --ignore-space-changerp  )r   é   é   s   --ignore-blank-linesru   r\  c                 S   s   g | ]}|D ]}|‘qqS r   r   )r¾   ZsublistrU   r   r   r   rÀ   Ù  s   þz#gitsubrepo.diff.<locals>.<listcomp>s   --)rð   rØ   ÚcontextZnoprefixr_  ZignorewsZignorewsamountr´  r»  ZignoreblanklinesÚalwaysr¡   rú  rû  r  rh  r  )r,   r?   r£   r¤   r
   r–   r’   r"  rm  rv  r  r¬   rU   r   r   r   r¥   ³  sH    
ÿÿ

ÿþ



þ

zgitsubrepo.diffc           	      O   s®   | j  tdƒ|d  ¡ | d¡s’|  d ¡}|j}|D ]Z}tj | j|¡}t	 
| j | j|¡}| j  tdƒ|tj |¡f ¡ t | j |¡|¡ q6| d¡sª| j|dd g S )NrF  r   rG  s#   saving current version of %s as %s
rH  TrI  )r?   r¡   r   rf   rú  r   r   rL   ry   r   Z
backuppathr  r,  rÎ   r   Úrenamer\   )	r,   ro   rÞ   r’   r¡   rR   r®   Z
parentnameZbaknamer   r   r   rß   å  s$    


ÿÿÿ
zgitsubrepo.revertc                 C   s   |d d… S )Nr÷  r   rà   r   r   r   rá   ü  s    zgitsubrepo.shortid)NF)NF)NFN)FF)F)NT)'r/   r0   r1   r+   r©  Ústaticmethodr´  r±  r»  r¹  r®  rÈ  rË  rÍ  rÒ  rÔ  r×  rÛ  rÝ  rä  ré  r  rí  r>   rA   r‡   rf   rŒ   r   r“   r™   r   rÓ   r    r¡   r¥   rß   rá   rL  r   r   rþ   r   r§  (  s\   -

#


6	X


2
&

!

C
1
r§  )r`   rb   ra   )FT);Z
__future__r   r  r¯  r   rr  r   r]  r7   r  Zxml.dom.minidomr  Zi18nr   rn   r   r   r   r   r	   r
   r´   r   r   r   r   r   r   r   r   r   rå   Zutilsr   r   r   rl   rç   r5   r  ré   r   r%   r*   r&   r>   rE   rV   r_   re   rj   r'   rv   Úobjectrw   rê   rM  r§  rg   r   r   r   r   Ú<module>   sf   D	ý
 i    h       ^ý