o
    "if"                     @  s   d Z ddlmZ ddlZddlZddlmZ ddlmZ ddl	m
Z
 ddl	mZ ddlZddlmZ dd	lmZ dd
lmZ G dd dZdS )zk
1:N rsync implementation on top of execnet.

(c) 2006-2009, Armin Rigo, Holger Krekel, Maciej Fijalkowski
    )annotationsN)md5)Queue)Callable)Literal)Gateway)BaseGateway)Channelc                   @  s   e Zd ZdZd=d>dd	Zd?ddZd@ddZd@ddZd@ddZd@ddZ	dAddZ
dBd!d"ZdCdDd$d%Z	dEdFd+d,ZdGd/d0ZdHd5d6ZdId7d8ZdId9d:ZdId;d<ZdS )JRSyncaT  This class allows to send a directory structure (recursively)
    to one or multiple remote filesystems.

    There is limited support for symlinks, which means that symlinks
    pointing to the sourcetree will be send "as is" while external
    symlinks will be just copied (regardless of existence of such
    a path on remote side).
    NTverboseboolreturnNonec                 C  sB   t || _|| _|d u st|sJ || _i | _t | _g | _d S N)	str
_sourcedir_verbosecallable	_callback	_channelsr   _receivequeue_links)self	sourcedircallbackr    r   F/var/www/html/corbot_env/lib/python3.10/site-packages/execnet/rsync.py__init__    s   

zRSync.__init__pathr   c                 C  s   dS NTr   )r   r   r   r   r   filter5   s   zRSync.filterchannelr	   c                 C  s(   || j v r|  td|j dd S )Nz connection unexpectedly closed:  )r   	waitcloseOSErrorgateway)r   r!   r   r   r   _end_of_channel8   s   
zRSync._end_of_channelc                 C  s$   | j D ]}|| q|d d S )N*   )r   send)r   r!   linkr   r   r   _process_link?   s   
zRSync._process_linkc                 C  s"   | j |}|r|  |  dS )zCall all callbacks.N)r   popr#   )r   r!   finishedcallbackr   r   r   _doneE   s   zRSync._donec                   s8    j rt fdd j| D }  d|| d S d S )Nc                   s   g | ]} j | qS r   )_paths).0ir   r   r   
<listcomp>O   s    z$RSync._list_done.<locals>.<listcomp>list)r   sum_to_send)r   r!   sr   r1   r   
_list_doneL   s   zRSync._list_donemodified_rel_path_components	list[str]checksumbytesc                 C  s   t jj| jg|R  }zt|d}| }W n ty!   d}Y nw d|}|dur3t|| j|< nd| j|< || j	vrBg | j	|< | j	| 
| |durh|  |dura|t| krad}n| |j| || dS )zSend one item.rbN/r   )osr   joinr   openreadr$   lenr.   r5   appendcloser   digest_report_send_filer%   r(   )r   r!   r8   r:   modifiedpathfdatamodified_rel_pathr   r   r   
_send_itemR   s(   




zRSync._send_itemr%   r   rJ   c                 C  s    | j rt| d|  d S d S )Nz <= )r   print)r   r%   rJ   r   r   r   rF   s   s   zRSync._report_send_fileraisesc                 C  s.  | j s|r	tddS tjtj| jd| _| | j i | _i | _	| j r| j
 \}}|du r8| | nX|d dkrD| | nL|d dkrP| | n@|d dkrf| jre| d| j|d  | n*|d d	krr| | n|d d
kr| ||d d |d d  nd|d  sJ | j s'dS dS )zSends a sourcedir to all added targets.

        raises indicates whether to raise an error or return in case of lack of
        targets.
        z=no targets available, maybe you are trying call send() twice?Nxr   linksdoneack   	list_doner(   zUnknown command %s)r   r$   r>   r   dirnamer?   r   _send_directory_structurer.   r5   r   getr&   r*   r-   r   r7   rK   )r   rM   r!   reqr   r   r   r(   w   s8    z
RSync.sendr   destdirstr | os.PathLike[str]r,   Callable[[], None] | Nonec                   sn   |D ]}|dv s
J qd
 fdd}| tj  jddd  j|dd	  t||f |j < dS )zWAdd a remote target specified via a gateway and a remote destination
        directory.)deleter   r   c                   s   j  | f d S r   )r   put)rW   r!   r   r   r   itemcallback   s   z&RSync.add_target.<locals>.itemcallbackF)py2str_as_py3strpy3str_as_py2strN)	endmarker)r   r   )remote_execexecnetrsync_remotereconfiguresetcallbackr(   r   r   )r   r%   rX   r,   optionsnamer^   r   r]   r   
add_target   s   	zRSync.add_targetmsgobjectc                 C  s   | j D ]}|| qd S r   )r   r(   )r   rj   r!   r   r   r   
_broadcast   s   
zRSync._broadcastlinktypeLiteral['linkbase', 'link']basename	linkpointc                 C  s   | j |||f d S r   )r   rC   )r   rm   ro   rp   r   r   r   
_send_link   s   zRSync._send_linkc                 C  sx   g }g }t |D ]}t j||}| |r!|| || q	t |j}| |g| |D ]}| 	| q2d S r   )
r>   listdirr   r?   r    rC   lstatst_moderl   rU   )r   r   namessubpathsrh   pmoder   r   r   _send_directory   s   


zRSync._send_directoryc                 C  s   | j }|t| j d d  }t|}tjjdkr)|dr)| j ds)d| j  }z	tj||}W n ty=   d }Y nw |d ur[|tj	tj
fvr[|tj
tj s[| d|| n| d|| | d  d S )NrR   ntpathz\\?\linkbaser)   )r   rB   r>   readlinkr   __name__
startswithrelpath
ValueErrorcurdirpardirseprq   rl   )r   r   r   ro   rp   r   r   r   r   _send_link_structure   s*   


zRSync._send_link_structurec                 C  s   zt |}W n ty   | d Y d S w t|jr*| |j|j|jf d S t	|jr7| 
| d S t|jrD| | d S td|)N)Nr   r   zcannot sync )r>   rs   r$   rl   statS_ISREGrt   st_mtimest_sizeS_ISDIRry   S_ISLNKr   r   )r   r   str   r   r   rU      s   
zRSync._send_directory_structurer   )r   r   r   r   )r   r   r   r   )r!   r	   r   r   )r!   r	   r8   r9   r:   r;   r   r   )r%   r   rJ   r   r   r   )T)rM   r   r   r   r   )r%   r   rX   rY   r,   rZ   r   r   )rj   rk   r   r   )rm   rn   ro   r   rp   r   r   r   )r   r   r   r   )r}   
__module____qualname____doc__r   r    r&   r*   r-   r7   rK   rF   r(   ri   rl   rq   ry   r   rU   r   r   r   r   r
      s$    	






!.



r
   )r   
__future__r   r>   r   hashlibr   queuer   typingr   r   execnet.rsync_remoterc   execnet.gatewayr   execnet.gateway_baser   r	   r
   r   r   r   r   <module>   s    