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mZ ddlm	Z	 ddl
mZmZmZmZmZmZmZ ddlmZ dZd	d
„ Zdd„ Zddd„Zddd„Zdd„ Zdd„ Zddd„Zdd„ ZdS )é    )Úabsolute_importNé   )Ú_)Úgetattr)ÚconfigÚerrorÚ	filemergeÚpathutilÚphasesÚpycompatÚutil)Ú
stringutil)ó    r   s   emptyc              
      s@  t   ¡ ‰ˆ  ¡ ‰d‡ ‡‡‡‡fdd„	‰dˆ v r6ˆdƒ ˆ d¡D ] \}}ˆ d||ˆ d|¡¡ q@i }dˆ v r(z€tˆ d  ¡  ¡ ƒD ]f\}}| ¡ }|sœq†z| 	dd¡\}}W n2 t
yâ   t td	ƒˆ d¡|d f ¡‚Y n0 |||< q†W n6 ty& } z|jtjkr‚ W Y d}~n
d}~0 0 ‡fd
d„}	i }
ˆd  ¡ D ]ö\}}d}| d¡r˜d|vrtt tdƒ¡‚| 	dd¡\}}|dd… }| ¡ }t |¡ ¡ stˆdd}|rt |¡}t |jpÒd|¡|_t |j¡|_t|ƒ}|	|ƒ}||kr|	|ƒ}n|}|	|ƒ}| ¡ | |d¡|f|
t |¡< qD|
S )z return a state dict, mapping subrepo paths configured in .hgsub
    to tuple: (source from .hgsub, revision from .hgsubstate, kind
    (key in types dict))
    Nc              
      s–   | ˆ v rzzˆ |    ¡ }W nL tyd } z4|jtjkr6‚ ˆ tdƒˆ | ¡ ¡ W Y d }~d S d }~0 0 ˆ | |||ˆ¡ nt 	tdƒˆ | ¡ ¡‚d S )Ns*   warning: subrepo spec file '%s' not found
s    subrepo spec file '%s' not found)
ÚdataÚIOErrorÚerrnoÚENOENTÚwarnr   ÚpathtoÚparser   ÚAbort)ÚfZsectionsÚremapr   Úerr©ÚctxÚpÚreadÚrepoÚui© ú7/usr/lib/python3/dist-packages/mercurial/subrepoutil.pyr   '   s     ÿÿÿzstate.<locals>.readó   .hgsubó   subpathsó   .hgsubstateó    r   s8   invalid subrepository revision specifier in '%s' line %dc                    s   ˆ   d¡D ]€\}}t |¡}t dd|¡}zt ||| d¡} W q
 tjyˆ } z0t tdƒˆ  d|¡t 	|¡f ¡‚W Y d }~q
d }~0 0 q
| S )Nr#   s   \\\\([0-9]+)s   \\\1r   s#   bad subrepository pattern in %s: %s)
Úitemsr   Z	escapestrÚreÚsubr   r   r   ÚsourceZforcebytestr)ÚsrcÚpatternÚreplÚe)r   r    r!   r   V   s    

þÿÿzstate.<locals>.remapr   s   hgó   [ó   ]s!   missing ] in subrepository sourceF©Úabort)NN) r   r   ZconfigitemsÚsetZconfigsourceÚ	enumerater   Ú
splitlinesÚlstripÚsplitÚ
ValueErrorr   r   r   r   r   r   r   r&   Ú
startswithr   ÚurlÚisabsÚ
_abssourceÚ	posixpathÚjoinÚpathÚnormpathÚbytesÚstripÚgetÚpconvert)r   r   r>   r*   ZrevÚiÚlZrevisionr   r   ÚstateÚkindÚparentZjoinedZremappedr    r   r!   rF      sh    
ÿüÿ




$rF   c                    s.   ‡ fdd„t ˆ ƒD ƒ}|  dd |¡d¡ dS )z=rewrite .hgsubstate in (outer) repo with these subrepo statesc                    s4   g | ],}ˆ | d  t d  krdˆ | d  |f ‘qS )r   s   %s %s
)Ú	nullstate©Ú.0Ús©rF   r    r!   Ú
<listcomp>Œ   s   þzwritestate.<locals>.<listcomp>r$   r   N)ÚsortedZwwriter=   )r   rF   Úlinesr    rM   r!   Ú
writestateŠ   s    
þrQ   c                    sÀ  ||kr|  ¡ }|j}|j}|j}i }	ˆ j d|||f ¡ d‡ fdd„	}
t |¡}tt |¡ƒD ]–\}}| 	|t
¡}|}| |¡ ¡ rž|d |d d f}||krª|}| ¡ }||d< ||v rˆ|| }||ksÜ||krê||	|< qbqú||kr|
|d	|ƒ | |¡ 	||¡ ||	|< qú|d |d krˆ|d |d
< |d |d< ˆ j tdƒ| d¡r†|
|d|ƒ | |¡ 	||¡ ||	|< nþ|d |d krÂ|
|d|ƒ | |¡ 	||¡ ||	|< nÄ|
|dƒ | |¡}| |d ¡|d< | |d ¡|d< ˆ j tdƒ| d¡}|dkr@| |¡ |¡ ||	|< |
|d|ƒ nF|dkr`||	|< |
|d|ƒ n&| |¡ 	||¡ ||	|< |
|d|ƒ qb||kr¬|
|dƒ | |¡ ¡  qb|t
krÌ|
|dƒ ||	|< qbqbˆ j tdƒ| d¡rb|
|dƒ | |¡ ¡  qbt| ¡ ƒD ]¨\}}||v r qnŽ||vrP|
|d|ƒ | |¡ 	|¡ ||	|< n^||| kr| ¡ }||d< ˆ j tdƒ| d¡dkr|
|d|ƒ | |¡ 	|¡ ||	|< qtˆ |	ƒ |	S )z{delegated from merge.applyupdates: merging of .hgsubstate file
    in working context, merging context and ancestor contexts   subrepo merge %s %s %s
r   c                    s&   |rd| }ˆ j  d| ||f ¡ d S )Ns   %s:%s:%ss     subrepo %s: %s %s
)r   Údebug)rL   ÚmsgÚr©r   r    r!   rR       s    zsubmerge.<locals>.debugr   r   ó   +ó   ss   other changed, gets   los   rosž    subrepository sources for %(s)s differ
you can use (l)ocal%(l)s source (%(lo)s) or (r)emote%(o)s source (%(ro)s).
what do you want to do?$$ &Local $$ &Remotes   prompt changed, gets   other side changed, gets   both sides changeds   sls   srs¿    subrepository %(s)s diverged (local revision: %(sl)s, remote revision: %(sr)s)
you can (m)erge, keep (l)ocal%(l)s or keep (r)emote%(o)s.
what do you want to do?$$ &Merge $$ &Local $$ &Remotes
   merge withs   keep local subrepo revisions   get remote subrepo revisions   remote removed, removes   local added, keepsz    local%(l)s changed subrepository %(s)s which remote%(o)s removed
use (c)hanged version or (d)elete?$$ &Changed $$ &Deletes   prompt removes   remote added, getsz    remote%(o)s changed subrepository %(s)s which local%(l)s removed
use (c)hanged version or (d)elete?$$ &Changed $$ &Deletes   prompt recreate)r   )Úp1Úsubstater   rR   r   Z
partextrasrO   r   Z	iteritemsrB   rI   r(   ZdirtyÚcopyZpromptchoicer   ZshortidÚmergeÚremover&   rQ   )r   ÚwctxZmctxZactxZ	overwriteÚlabelsÚs1Ús2ZsaZsmrR   Z
promptssrcrL   rE   ÚaZldZpromptsrT   ZsrepoZoptionr    rU   r!   Úsubmerge”   sÜ    


ÿù÷



ÿø	ö





ÿúø




ÿúø
öÿ
rb   Fc                    sì  g }t ƒ }|j ¡ ‰d|v r¦|j|j|jfD ]}d|v r.| d¡ q.| ¡ j}tˆ 	¡ ƒD ]Ê}	ˆ |	ƒs”|	|v r~||	 ˆ|	< q\|s”t
 tdƒ|	 ¡‚| |	¡ d¡}
|
rÜ|  dd¡sÆt
j|
tdƒd‚| |	¡ | |	¡ q\| |	¡ ¡ }ˆ|	 d	 |ˆ|	 d
 fˆ|	< | |	d¡d |kr\| |	¡ q\| ¡ D ]0}‡fdd„|jD ƒ}|‡ fdd„|D ƒ7 }q0|râˆ dƒs–d| ¡ | ¡  v r–t
 tdƒ¡‚|j d	d¡ n<d|jv râd|v râd|j|j |j vrâ|j d	d¡ ||ˆfS )ay  Calculate .hgsubstate changes that should be applied before committing

    Returns (subs, commitsubs, newstate) where
    - subs: changed subrepos (including dirty ones)
    - commitsubs: dirty subrepos which the caller needs to commit recursively
    - newstate: new state dict which the caller must write to .hgsubstate

    This also updates the given status argument.
    r"   r$   s#   commit with new subrepo %s excludedTs   uis   commitsubreposs#   use --subrepos for recursive commit)Úhintr   é   )NNNr   c                    s   g | ]}|ˆ vr|‘qS r    r    rJ   )Únewstater    r!   rN   R  r   zprecommit.<locals>.<listcomp>c                    s   g | ]}ˆ |ƒr|‘qS r    r    rJ   )Úmatchr    r!   rN   S  r   s$   can't commit subrepos without .hgsub)r2   rY   rZ   ZmodifiedZaddedZremovedr\   rX   rO   Úkeysr   r   r   r(   ÚdirtyreasonZ
configboolÚappendÚaddZ	basestaterB   ÚparentsÚinsert)r   r]   Zstatusrf   ZforceZsubsZ
commitsubsÚcZoldstaterL   rh   Zbsr   rT   r    )rf   re   r!   Ú	precommit  sZ    




ÿþ
ÿÿrn   c                 C   s2   | }t  |d¡r|j}q| jtt |j¡ƒd… S )z9return path to this (sub)repo as seen from outermost repoó
   _subparentN)r   ÚsafehasattrÚ
_subparentÚrootÚlenr	   Znormasprefix)r   rH   r    r    r!   Úreporelpathe  s    rt   c                 C   s   | j S )z7return path to this subrepo as seen from outermost repo)Z_relpath)r(   r    r    r!   Ú
subrelpathm  s    ru   Tc                 C   sP  t  | d¡rˆt  | j¡}| ¡ r(t|ƒS t |j¡|_t	| j
|dd}|r†t  t  |¡¡}t |jpfd|j¡|_t |j¡|_t|ƒS n°d}t  | d¡r | j}nV|rÂ| j dd¡rÂ| j dd¡}n4| j dd	¡rà| j dd	¡}n|  ¡ rötj | j¡S |r8t  |¡r4t|ƒd
ks(|d
d… dvr4tj |¡}|S |rLt tdƒ¡‚dS )zreturn pull/push path of repo - either based on parent repo .hgsub info
    or on the top repo config. Abort or return None if no source found.ro   Fr0   r   Ns   _subtoppaths   pathss   default-pushs   defaultrd   é   s   \/s(   default path for subrepository not found)r   rp   r9   Z
_subsourcer:   r@   r<   r?   r>   r;   rq   rC   r=   Z_subtoppathr   r   ZsharedÚosÚdirnameZ
sharedpathZhasdriveletterrs   Úabspathr   r   r   )r   Úpushr1   r)   rH   r>   r    r    r!   r;   r  s6    
 r;   c           
      C   sì   t  | ¡}t|dd ƒ}|s|S |  dd¡}|dvrDt tdƒ| ¡‚|dkrP|S t j}d }t|ƒD ]0}| 	|¡}| 
|| d ¡}	||	k rb|	}|}qb||k rè|dkrÈt td	ƒt j| t j| |f ¡‚|  td
ƒt j| |f ¡ |S |S )NrY   s   phasess   checksubrepos)ó   ignores   followó   aborts.   invalid phases.checksubrepos configuration: %sr{   r   r|   s=   can't commit in %s phase conflicting %s from subrepository %ssA   warning: changes are committed in %s phase from subrepository %s
)r
   Únewcommitphaser   r   r   r   r   ZpublicrO   r(   ZphaseZ
phasenamesr   )
r   r   ZcommitphaserY   ZcheckZmaxphaseZmaxsubrL   r(   Zsubphaser    r    r!   r}   ¢  sP    

ÿ
ÿýüÿÿüÿr}   )N)F)FT)Z
__future__r   r   rw   r<   r'   Zi18nr   r   r   Ú r   r   r   r	   r
   r   Zutilsr   rI   rF   rQ   rb   rn   rt   ru   r;   r}   r    r    r    r!   Ú<module>   s$   $	k

 
F
0