a
    &0_r#                     @   s   d Z ddlm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mZmZmZmZmZ G dd dejZG d	d
 d
eejZG dd deejZG dd dejZG dd dejZG dd deZdddZdd ZdS )z~Repository class for "in-memory pull" of one local repository to another,
allowing operations like diff and log with revsets.
    )absolute_import   )_)getattr)	changelogcmdutilencodingerrorfilelog	localrepomanifestmdiffpathutilrevlogutilvfsc                       s^   e Zd Zdd Zdd Z fddZd fd	d
	ZdddZdddZdd Z	dd Z
  ZS )unionrevlogc              
   C   s  t |}tj| || || _t| }|d | _t | _| jD ]}| jj	| }|\}}	}
}}}}}|d@ }|d u r||ksJ |}n||}|d ur||}| j	
|}|d ur| j| q@| j|}| j|}|d |
||| || ||f}| j	| | j| |d7 }q@d S )Nr   i  )vfsmodZreadonlyvfsr   __init__revlog2len
repotiprevsetZ
bundlerevsindexZget_revaddnoderevappend)selfopener	indexfiler   
linkmappernrev2r   Z_startZ_csizeZrsizebaseZlinkrevZp1revZp2revr   flagslinkZthis_revZp1nodeZp2nodee r(   5/usr/lib/python3/dist-packages/mercurial/unionrepo.pyr   $   sD    



zunionrevlog.__init__c                 C   s*   || j krtj| |S | j| |S N)r   r   _chunkr   r   )r   r   r(   r(   r)   r+   Z   s    
zunionrevlog._chunkc                    s|   || j kr>|| j kr>| j| j| || j| |S || j krd|| j krdtt| ||S t| 	|| 	|S )z1return or calculate a delta between two revisions)
r   r   revdiffr   r   superr   r   ZtextdiffZrawdata)r   Zrev1r#   	__class__r(   r)   r,   _   s    zunionrevlog.revdiffNFc                    sd   t |tr|}| |}n|}| |}|| jkrJt| jd| j}|j}ntt	| j}||||dS )N_revlog)_dfraw)

isinstanceintr   r   r   r   r   _revisiondatar-   r   )r   Z	nodeorrevr1   r2   r   r   r   funcr.   r(   r)   r5   k   s    


zunionrevlog._revisiondatac                 C   s   t d S r*   NotImplementedError)r   texttransactionr&   Zp1Zp2dr(   r(   r)   addrevision{   s    zunionrevlog.addrevisionc                 C   s   t d S r*   r7   )r   Zdeltasr!   r:   ZaddrevisioncbZmaybemissingparentsr(   r(   r)   addgroup~   s    zunionrevlog.addgroupc                 C   s   t d S r*   r7   )r   Zminlinkr:   r(   r(   r)   strip   s    zunionrevlog.stripc                 C   s   t d S r*   r7   r   r(   r(   r)   	checksize   s    zunionrevlog.checksize)NF)NNN)NF)__name__
__module____qualname__r   r+   r,   r5   r<   r=   r>   r@   __classcell__r(   r(   r.   r)   r   #   s   6
  

r   c                   @   s   e Zd Zdd ZdS )unionchangelogc                 C   s4   t j | | d }t  |}t| || j|| d S r*   )r   r   r   r    )r   r   opener2r!   Z
changelog2r(   r(   r)   r      s    
zunionchangelog.__init__NrA   rB   rC   r   r(   r(   r(   r)   rE      s   rE   c                   @   s   e Zd Zdd ZdS )unionmanifestc                 C   s0   t j| | t |}t| || j|| d S r*   )r   manifestrevlogr   r   r    )r   r   rF   r!   Z	manifest2r(   r(   r)   r      s
    
zunionmanifest.__init__NrG   r(   r(   r(   r)   rH      s   rH   c                   @   s   e Zd Zdd Zdd ZdS )unionfilelogc                 C   sN   t j | || t  ||}t|| j|j|| _|| _| jj| _| jj| _d S r*   )r
   r   r   r    r0   Z_repor   r   )r   r   pathrF   r!   repoZfilelog2r(   r(   r)   r      s    
zunionfilelog.__init__c                 C   s6   || j krtj| |S | |}| j| j|S )z Check if a revision is censored.)r   r
   
iscensoredr   r   r   )r   r   r   r(   r(   r)   rM      s    

zunionfilelog.iscensoredN)rA   rB   rC   r   rM   r(   r(   r(   r)   rJ      s   
rJ   c                   @   s   e Zd Zdd ZdS )	unionpeerc                 C   s   dS NFr(   r?   r(   r(   r)   canpush   s    zunionpeer.canpushN)rA   rB   rC   rP   r(   r(   r(   r)   rN      s   rN   c                   @   sl   e Zd ZdZdd Zejdd Zej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S )unionrepositoryzRepresents the union of data in 2 repositories.

    Instances are not usable if constructed directly. Use ``instance()``
    or ``makeunionrepository()`` to create a usable instance.
    c                 C   s"   || _ || _| jdddd d S )Ns   phasess   publishFs	   unionrepo)repo2_urluiZ	setconfig)r   rR   urlr(   r(   r)   r      s    zunionrepository.__init__c                 C   s   t | j| jjS r*   )rE   svfsrR   r?   r(   r(   r)   r      s    zunionrepository.changelogc                 C   s.   t | j| jj|  j}t| j| ||  S r*   )rH   rV   rR   
unfiltered_clrevr   manifestlogZnarrowmatch)r   Z	rootstorer(   r(   r)   rY      s    zunionrepository.manifestlogc                 C   s   | j j|}| j|S )z?map from repo2 changelog rev to temporary rev in self.changelog)rR   r   r   r   )r   r#   r   r(   r(   r)   rX      s    zunionrepository._clrevc                 C   s   | j S r*   )rS   r?   r(   r(   r)   rU      s    zunionrepository.urlc                 C   s   t | j|| jj|  j| S r*   )rJ   rV   rR   rW   rX   )r   fr(   r(   r)   file   s    zunionrepository.filec                 C   s   | j   d S r*   )rR   closer?   r(   r(   r)   r\      s    zunionrepository.closec                 C   s   dS rO   r(   r?   r(   r(   r)   cancopy   s    zunionrepository.cancopyc                 C   s   t | S r*   )rN   r?   r(   r(   r)   peer   s    zunionrepository.peerc                 C   s   t  S r*   )r   getcwdr?   r(   r(   r)   r_      s    zunionrepository.getcwdN)rA   rB   rC   __doc__r   r   Zunfilteredpropertycacher   rY   rX   rU   r[   r\   r]   r^   r_   r(   r(   r(   r)   rQ      s   

rQ   Nc           
      C   s   |rt td| dd}|s<tt }|d u r<d}|rzt }||krVd}n$t	|}|
|rz|t|d  }|
dr|ddd dd}t|dkr||d	  }}	q|\}}	n
|| }}	t| ||	S )
Ns"   cannot create new union repositorys   bundles   mainreporoot    s   union:   :r      +r   )r	   ZAbortr   Zconfigr   Zfindrepor   r_   r   Znormasprefix
startswithr   splitmakeunionrepository)
rT   rK   createZintentsZ
createoptsZ
parentpathcwdsZrepopath	repopath2r(   r(   r)   instance   s*    




rk   c                 C   sh   t j| |dd}t j| |dd}dt|t|f }G dd dt|j}|}||_t||| |S )z7Make a union repository object from 2 local repo paths.F)rg   s   union:%s+%sc                   @   s   e Zd ZdS )z3makeunionrepository.<locals>.derivedunionrepositoryN)rA   rB   rC   r(   r(   r(   r)   derivedunionrepository  s   rl   )r   rk   r   Z
expandpathrQ   r/   r   )rT   Z	repopath1rj   Zrepo1rR   rU   rl   rL   r(   r(   r)   rf     s    rf   )NN) r`   Z
__future__r   Zi18nr   Zpycompatr    r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   rE   rI   rH   rJ   Z	localpeerrN   objectrQ   rk   rf   r(   r(   r(   r)   <module>
   s   8l
	4
