
    i"                        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          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                      e Zd ZdZd.d/dZd0dZd1dZd1dZd1dZd1dZ	d2dZ
d3dZd4d5dZ	 d6d7d"Zd8d%Zd9d*Zd:d+Zd:d,Zd:d-ZdS );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                    t          |          | _        || _        |t          |          sJ || _        i | _        t                      | _        g | _        d S N)	str
_sourcedir_verbosecallable	_callback	_channelsr   _receivequeue_links)self	sourcedircallbackr   s       T/home/ubuntu/.hermes/hermes-agent/venv/lib/python3.11/site-packages/execnet/rsync.py__init__zRSync.__init__    s]    i..8H#5#55!CE GG 	 KM    pathr   c                    dS NT )r   r!   s     r   filterzRSync.filter5   s    tr    channelr
   c                p    || j         v r,|                                 t          d|j         d          d S )Nz connection unexpectedly closed:  )r   	waitcloseOSErrorgateway)r   r&   s     r   _end_of_channelzRSync._end_of_channel8   sE    dn$$OW_OOOPPP	 %$r    c                n    | j         D ]}|                    |           |                    d           d S )N*   )r   send)r   r&   links      r   _process_linkzRSync._process_link?   s@    K 	 	DLLRr    c                z    | j                             |          }|r
 |             |                                 dS )zCall all callbacks.N)r   popr)   )r   r&   finishedcallbacks      r   _donezRSync._doneE   sG    >--g66 	r    c                      j         r?t           fd j        |         D                       }                      d||           d S d S )Nc                *    g | ]}j         |         S r$   )_paths).0ir   s     r   
<listcomp>z$RSync._list_done.<locals>.<listcomp>O   s    DDDT[^DDDr    list)r   sum_to_send)r   r&   ss   `  r   
_list_donezRSync._list_doneL   s\    > 	/DDDDT]7-CDDDEEANN61g.....	/ 	/r    modified_rel_path_components	list[str]checksumbytesc                f   t          j        j        | j        g|R  }	 t	          |d          }|                                }n# t          $ r d}Y nw xY wd                    |          }|t          |          | j        |<   n
d| j        |<   || j	        vr
g | j	        |<   | j	        |         
                    |           |Y|                                 |(|t          |                                          k    rd}n|                     |j        |           |                    |           dS )zSend one item.rbN/r   )osr!   joinr   openreadr*   lenr8   r>   appendcloser   digest_report_send_filer+   r/   )r   r&   rA   rC   modifiedpathfdatamodified_rel_paths           r   
_send_itemzRSync._send_itemR   sI    w|DOS6RSSS	\4((A6688DD 	 	 	DDD	  HH%ABB-0YYDK)**-.DK)*$-''%'DM'"g%%&7888 GGIII#CII4D4D4F4F(F(F&&w8IJJJTs   $A AAr+   r	   rT   c                @    | j         rt          | d|            d S d S )Nz <= )r   print)r   r+   rT   s      r   rP   zRSync._report_send_files   s9    = 	7W55"35566666	7 	7r    raisesc                z   | j         s|rt          d          dS t          j                            t          j                            | j        d                    | _        |                     | j                   i | _        i | _	        | j         r)| j
                                        \  }}||                     |           n|d         dk    r|                     |           n|d         dk    r|                     |           n|d         dk    r0| j        r(|                     d| j        |d                  |           nk|d         d	k    r|                     |           nI|d         d
k    r0|                     ||d         d         |d         d                    nd|d         z  sJ | j         '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*   rH   r!   dirnamerI   r   _send_directory_structurer8   r>   r   getr,   r1   r5   r   r@   rU   )r   rX   r&   reqs       r   r/   z
RSync.sendw   s    ~ 	 S   F'//"',,t*L*LMM&&t777 ')24 n 	9-1133LGS{$$W----q6W$$&&w////Vv%%JJw''''Vu__~ Ludk#a&.A7KKKV{**OOG,,,,Vv%%OOGSVAYAq	BBBB/#a&8888# n 	9 	9 	9 	9 	9r    r   destdirstr | os.PathLike[str]r4   Callable[[], None] | Nonec                $    |D ]}|dv sJ 	d	 fd}|                     t          j                                      dd                               |d                               t          |          |f           | j        <   dS )
zWAdd a remote target specified via a gateway and a remote destination
        directory.)deleter   r   c                @    j                             | f           d S r   )r   put)rc   r&   r   s    r   itemcallbackz&RSync.add_target.<locals>.itemcallback   s$    ""GS>22222r    F)py2str_as_py3strpy3str_as_py2strN)	endmarker)r   r   )remote_execexecnetrsync_remotereconfiguresetcallbackr/   r   r   )r   r+   rd   r4   optionsnamerk   r&   s   `      @r   
add_targetzRSync.add_target   s      	' 	'D;&&&&&	3 	3 	3 	3 	3 	3 	3 %%g&:;;UUKKKLD999c'llG,---"2wr    msgobjectc                D    | j         D ]}|                    |           d S r   )r   r/   )r   rw   r&   s      r   
_broadcastzRSync._broadcast   s2    ~ 	 	GLL	 	r    linktypeLiteral['linkbase', 'link']basename	linkpointc                @    | j                             |||f           d S r   )r   rM   )r   r{   r}   r~   s       r   
_send_linkzRSync._send_link   s'     	Hh	:;;;;;r    c                   g }g }t          j        |          D ]a}t           j                            ||          }|                     |          r*|                    |           |                    |           bt          j        |          j        }|                     |g|           |D ]}| 	                    |           d S r   )
rH   listdirr!   rI   r%   rM   lstatst_moderz   ra   )r   r!   namessubpathsru   pmodes          r   _send_directoryzRSync._send_directory   s    Jt$$ 	# 	#DT4((A{{1~~ #T""""""x~~%''' 	. 	.A**1----	. 	.r    c                   | j         }|t          | j                   dz   d          }t          j        |          }t          j        j        dk    r9|                    d          r$| j                             d          s
d| j         z   }	 t          j                            ||          }n# t          $ r d }Y nw xY w|^|t          j	        t          j
        fvrD|                    t          j
        t          j        z             s|                     d||           n|                     d||           |                     d            d S )Nr^   ntpathz\\?\linkbaser0   )r   rL   rH   readlinkr!   __name__
startswithrelpath
ValueErrorcurdirpardirsepr   rz   )r   r!   r   r}   r~   r   s         r   _send_link_structurezRSync._send_link_structure   sK   O	DO,,q0223K%%	
 G(($$Y// )O..y99 ) "DO3I	gooi;;GG 	 	 	GGG	 	29555&&ry26'9:: 6 OOJ':::: OOFHi888s   
 B+ +B:9B:c                   	 t          j        |          }n&# t          $ r |                     d           Y d S w xY wt	          j        |j                  r)|                     |j        |j        |j        f           d S t	          j	        |j                  r| 
                    |           d S t	          j        |j                  r|                     |           d S t          d|          )N)Nr   r   zcannot sync )rH   r   r*   rz   statS_ISREGr   st_mtimest_sizeS_ISDIRr   S_ISLNKr   r   )r   r!   sts      r   ra   zRSync._send_directory_structure   s    	$BB 	 	 	OOL)))FF	 <
## 	6OORZbjABBBBB\"*%% 	6  &&&&&\"*%% 	6%%d+++++4D44555s    ::r#   )r   r   r   r   )r!   r   r   r   )r&   r
   r   r   )r&   r
   rA   rB   rC   rD   r   r   )r+   r	   rT   r   r   r   )T)rX   r   r   r   r   )r+   r   rd   re   r4   rf   r   r   )rw   rx   r   r   )r{   r|   r}   r   r~   r   r   r   )r!   r   r   r   )r   
__module____qualname____doc__r   r%   r,   r1   r5   r@   rU   rP   r/   rv   rz   r   r   r   ra   r$   r    r   r   r      si        M M M M M*   Q Q Q Q      / / / /   B7 7 7 7(9 (9 (9 (9 (9\ 7;	3 3 3 3 3*   < < < <. . . .   86 6 6 6 6 6r    r   )r   
__future__r   rH   r   hashlibr   queuer   typingr   r   execnet.rsync_remoterp   execnet.gatewayr   execnet.gateway_baser	   r
   r   r$   r    r   <module>r      s     # " " " " " 				                              # # # # # # , , , , , , ( ( ( ( ( (d6 d6 d6 d6 d6 d6 d6 d6 d6 d6r    