a
    &0_`                     @   s   d dl mZ d dlZd dlZddlmZ ddlmZ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d	 Zd
d Zdd ZdddZdd Zdd Zdd Zdd Zdd ZdddZdS )     )absolute_importN   )_)nullidshort)	bookmarkserrormdiff
narrowspecphasespycompatsetdiscovery)
repositoryc              
      s  | j }| j}t| }|rX|d& t|| |jdd W d   n1 sN0    Y  | j }t|j	| j
ptdh| j}| j
s| jri }| j
rt| j
|d< | jrt| j|d< nd}t||| j| jd\}}}	| jp|	}
t||||||
}|d	 rt||tj|d	  tj D ]>\}}|d
ks|d | s>qt||||d |  qtj|j||d | | j| jd t||||d }| jrt |j j!}|"d|
| jd D ]}#|| qfdd ndd  |rHg }g }i }|D ]H}|| }|! } |sq|$ }|%| |%| |||< qn& fdd|d	 D }|d	 }|d }t&|||}t'|||||||t(| jd dS )z#Pull using wire protocol version 2.   cloneT)ZclearfilecacheNs   path:.s   includes   excludeabortwhenunrelated   addeds   secret   nodesbyphase	   bookmarks)Zexplicit   manifestnodess   ancestors(%ln, %s)r   c                    s   |  v S N n)relevantcsetnodesr   6/usr/lib/python3/dist-packages/mercurial/exchangev2.py<lambda>t       zpull.<locals>.<lambda>c                 S   s   dS )NTr   r   r   r   r   r   w   r   c                    s   g | ]} |r|qS r   r   ).0r   )csetrelevantfilterr   r   
<listcomp>   r   zpull.<locals>.<listcomp>   linkrevs)shallow))reporemote_checkuserawstorefiledataZtransaction_fetchrawstorefilesZ
invalidateZ	trmanagerr
   matchrootZincludepatsZexcludepatssorted_pullchangesetdiscoveryheadsZforce_fetchchangesetsr   ZregisternewZdraft
phasenamesitemsZadvanceboundaryr   ZupdatefromremoteuiZurlZgettransactionZexplicitbookmarks_fetchmanifestsZdepthset	changelognodeZrevsaddmanifestnodeappend_derivefilesfrommanifests_fetchfilesfromcsetsbool)pullopr#   r$   ZusingrawchangelogandmanifesttrZnarrowmatcher
pathfiltercommonfetchremoteheadsZ	pullheadsZcsetresZphasenumberphaseZmanresZclnoderevZcsetsforfilesZmnodesforfilesZmanifestlinkrevsctxr3   mnodefnodesr   )r   r   r   pull   s    
*



	


rE   c                 C   sF   | j }| j}d|jd vrdS | js(dS t|r4dS d|jvrBdS dS )zFCheck whether we should use rawstorefiledata command to retrieve data.   rawstorefiledata   commandsFs   revlogv1T)r#   r$   apidescriptorZstreamclonerequestedlenZrequirements)r:   r#   r$   r   r   r   r%      s    
r%   c                 C   s  |  }|ddddgi }t|}| jjtd|d tdd}| |d	 zt|}W n ty   Y qY n0 d
D ]}||vrt	
td| q|d dkr| j}nt	
td|d  |d }	||d d}
zt|}W n ty   Y qY n0 |	t|8 }	|	d	k r>t	
td|d  |jt|d |
| z|jrhW qW q ty   t	
tdY q0 qW d    n1 s0    Y  |	r\t	
td|d |d |	 f q\W d    n1 s0    Y  W d    n1 s0    Y  d S )NrF      filess	   changelogs   manifestlogr   s	   totalsizes   bytes)totalunitr   )   location   path   sizes    remote file data missing key: %srM   s   stores&   invalid location for raw file data: %srO   rN   s   wbsF   received invalid number of bytes for file data; expected %d, got extra)steps:   did not receive indefinite length bytestring for file datasA   received invalid number of bytes forfile data; expected %d got %d)commandexecutorcallcommandresultnextr/   makeprogressr   updateStopIterationr   ZAbortZsvfsopenrI   	incrementwriteZislastAttributeError)r#   r$   eobjsoverallprogressZfilemetakZvfsZbytesremainingZfhchunkr   r   r   r&      s|    




,
r&   Tc                    s   |r,| j jtfdd|D r,|d|fS tj| j| ||d\}}}t|}t|}|r|r|  j jj	 | fdd|D O }t|
|rg }|t |||fS )z-Determine which changesets need to be pulled.c                 3   s   | ]} |V  qd S r   r   r   head)	knownnoder   r   	<genexpr>  r   z*_pullchangesetdiscovery.<locals>.<genexpr>Fr   c                    s   h | ]} |r|qS r   r   rb   )has_noder   r   	<setcomp>%  r   z*_pullchangesetdiscovery.<locals>.<setcomp>)r2   Zhasnodeallr   Zfindcommonheadsr/   r1   
unfilteredindexrf   issubsetdiscardr   )r#   r$   r+   r   r=   r>   r?   r   )rf   rd   r   r*     s     


r*   c                 C   sd   |  H}|ddt|t|dgh dd }t| ||W  d    S 1 sV0    Y  d S )Ns   changesetdatas   changesetdagrange)   types   rootss   heads>      revision   parents   phaser   )	   revisions   fields)rQ   rR   r)   rS   _processchangesetdata)r#   r;   r$   r=   r>   r?   r\   r]   r   r   r   r,   /  s    
r,   c           	         s   j dddit|j  }|j  | t}jj	t
dt
d|ddi  fdd	}fd
d}dd tj D i fdd} j| |t||d}  |dS )N   prechangegroupthrowTs
   changesets   chunks
   totalitemsrL   rK   c                    s   j dt|   t S )Ns   add changeset %s
)r/   debugr   rI   r3   )clr#   r   r   linkrev[  s    z&_processchangesetdata.<locals>.linkrevc                    s&      | |}|j | |< d S r   )rY   ZchangelogrevisionmanifestrA   )r{   r3   revision)manifestnodesr_   r   r   onchangeset`  s    
z*_processchangesetdata.<locals>.onchangesetc                 S   s   i | ]}|t  qS r   )r1   )r   r@   r   r   r   
<dictcomp>i  r   z)_processchangesetdata.<locals>.<dictcomp>c               
   3   s   D ]} | d }d| v r* | d   | | dg D ]}||< q6i }| dg D ]\}}t||< qTd|vrtq|d }|| d d | d d | d ttt|| dfV  qd S )	N   noderp   r      fieldsfollowingrn   ro   r   r   )r4   getrT   r   r	   trivialdiffheaderrI   )Zcsetr3   Zmarkextrafieldsfieldsizedata)nodesbyphaser]   remotebookmarksr   r   iterrevisionsq  s(    


z,_processchangesetdata.<locals>.iterrevisions)Zaddrevisioncb)r   r   r   r   )rt   )hookr   Z	strkwargsZhookargsri   r2   ZdelayupdaterT   r/   rU   r   r   r   r-   valuesaddgroupweakrefproxycomplete)	r#   r;   r]   Zurepometar|   r   r   addedr   )r{   r   r   r]   r_   r   r#   r   rs   I  s.    
	%rs   c                 C   s|  | j d}g }i }t }tt|D ]R\}}	|	|v r:q(z||	 W n& tjyn   |	|	 |||	< Y n0 |
|	 q(dd }
| jjtdtdt|d}|jd d }|d	d
}g }tdt||D ]}dd ||||  D }|sq| X}|dd|ddhdd }t| |||
|||jt| W d    q1 s^0    Y  q|  ||dS )Nr   c           
      s   s   | D ]}|d }i }| dg D ]\}}t| ||< q d|v rP|d }|d }n*d|v rt}|d }	tt|	|	 }nq||d d |d d |||dfV  |  qd S 	Nr   r      delta   deltabasenodern   ro   r   r   r   rT   r   r	   r   rI   rY   )
r]   r_   r}   r3   r   r   r   basenodedeltar~   r   r   r   r     s,    


z&_fetchmanifests.<locals>.iterrevisionss	   manifestsrv   rx   rG   s   manifestdata   recommendedbatchsize'  r   c                 S   s   g | ]}|qS r   r   )r   r3   r   r   r   r      r   z#_fetchmanifests.<locals>.<listcomp>ro   rn   T)s   tree   nodesrr      haveparents)r   r!   )manifestlogZ
getstorager1   r)   r   	iteritemsrA   r   LookupErrorr6   r4   r/   rU   r   rI   rH   r   xrangerQ   rR   rS   rT   extendr   __getitem__r   r   r   )r#   r;   r$   r   ZrootmanifestZ
fetchnodeslinkrevsseenclrevr3   r   r_   commandmeta	batchsizer   ibatchr\   r]   r   r   r   r0     sZ    
%
&r0   c                 C   s   | j }tt}| jjtdt|d}|` |D ]J}|d|}|	 }|
 D ] \}	}
||	rR||	 |
| qR|  q2W d   n1 s0    Y  |S )zDetermine what file nodes are relevant given a set of manifest nodes.

    Returns a dict mapping file paths to dicts of file node to first manifest
    node.
    s   scanning manifests)rK   r   N)r   collectionsdefaultdictdictr/   rU   r   rI   r   Zreadfastr.   
setdefaultrY   )r#   Zmatcherr   ZmlrD   r_   r5   mZmdpathfnoder   r   r   r7     s    
(r7   c                    sX  dd }| j jtdtdtdd t|D d}d}d	d
 t| D }tdt	||D ]}	dd
 ||	|	|  D }
|
sqb|
 }g }i }|
D ]L\}}|||d|t|ddhddf  fddt|D ||< q|D ]B\}}| }t| | |}|||||| jt| qW d   qb1 sH0    Y  qbdS )z-Fetch file data from explicit file revisions.c           
      s   s   | D ]}|d }i }| dg D ]\}}t| ||< q d|v rP|d }|d }n*d|v rt}|d }	tt|	|	 }nq||d d |d d |||dfV  |  qd S r   r   )
r]   r_   filerevisionr3   r   r   r   r   r   r~   r   r   r   r   <  s,    


z"_fetchfiles.<locals>.iterrevisionsrJ   rv   c                 s   s   | ]}t |V  qd S r   rI   r   vr   r   r   re   _  r   z_fetchfiles.<locals>.<genexpr>rx   r   c                 S   s   g | ]}|qS r   r   r   xr   r   r   r    d  r   z_fetchfiles.<locals>.<listcomp>r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r    g  r   s   filedataro   rn   T)rN   r   rr   r   c                    s   i | ]\}}| | qS r   r   )r   r3   r5   r   r   r   r     s   z_fetchfiles.<locals>.<dictcomp>N)r/   rU   r   sumr   
itervaluesr)   r.   r   rI   rQ   r6   rR   r   rS   rT   filer   r   r   r   )r#   r;   r$   rD   r   r   r_   r   Z
fnodeslistr   r   r\   ZfsZlocallinkrevsr   Znodesfr]   storer   r   r   _fetchfiles9  sP     


r   Fc              	      s  dd }| j jtdtdtdd t|D d}	|jd d	 }
|
d
d}tj	| j
v }ddh}| jj |pr| }|s|d tdt||D ]}dd ||||  D }|sq| }d|dg||d}|r||d< |d	| }t|}t|d D ]n}t|}|d }| |}fddt|| D  fdd}|j|||d |	|t||d qW d   q1 s0    Y  qdS )z2Fetch file data from explicit changeset revisions.c                 s   s   |rt | }|d }i }|dg D ]\}}t | ||< q$d|v rT|d }|d }	n*d|v r t}|d }
tt|
|
 }	nq d|v r|d }n|}||d d |d d	 |||	dfV  |  |d	8 }q d S )
Nr   r   r   r   rn      linknodero   r   r   )rT   r   r   r	   r   rI   rY   )r]   Z	remainingr_   r   r3   r   r   r   r   r   r~   Zlinknoder   r   r   r     s6    



z+_fetchfilesfromcsets.<locals>.iterrevisionsrJ   rv   c                 s   s   | ]}t |V  qd S r   r   r   r   r   r   re     r   z'_fetchfilesfromcsets.<locals>.<genexpr>rx   rG   s	   filesdatar   iP  ro   rn   r   r   c                 S   s   g | ]}|qS r   r   r   r   r   r   r      r   z(_fetchfilesfromcsets.<locals>.<listcomp>s   changesetexplicit)rm   r   )rq   rr   r   s
   pathfilters
   totalpathsrN   c                    s   i | ]\}}| | qS r   r   )r   r   rC   )manlinkrevsr   r   r     s   z(_fetchfilesfromcsets.<locals>.<dictcomp>c                    s   | v r|  S  | S d S r   r   rz   )r   r   r   r   
getlinkrev  s    z(_fetchfilesfromcsets.<locals>.getlinkrevrw   )ZmaybemissingparentsN)r/   rU   r   r   r   r   rH   r   r   Z!REPO_FEATURE_SHALLOW_FILE_STORAGEZfeaturesr2   rA   r4   r   rI   rQ   rR   rS   rT   r   r   r   r   r   )r#   r;   r$   r<   rD   Zcsetsr   r"   r   r_   r   r   ZshallowfilesfieldsZhaveparentsr   r   r\   argsr]   r^   headerr   r   r   r   )r   r   r   r   r8     sT    (




r8   )T)F)Z
__future__r   r   r   Zi18nr   r3   r   r    r   r   r	   r
   r   r   r   Z
interfacesr   rE   r%   r&   r*   r,   rs   r0   r7   r   r8   r   r   r   r   <module>   s$   $	 S
![s"Z 