
    yf                     Z   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
r
S SKrS SKrS SKrS SKrS SKJrJr  SSKJr  SSKJr  SSK7  SSKJrJrJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJ r   SSKJ!r!  SSKJ"r"J#r#  SSK$J%r%J&r&J'r'J(r(  SSK)J*r*J+r+  SSKJ,r,  SSK-J.r.  SSK/J0r0J1r1  SSK2J3r3  SSK4J5r5  \*" \65      r)Sr7\0" \5      r8Su  r9r:r;r<Sr=Sr>S r? " S S\5      r@ " S S\@5      rA " S  S!\5      rB " S" S#\5      rC " S$ S%\5      rD " S& S'\5      rE " S( S)\5      rF0 S*S+_S,S-_S.S/_S0S/_S1S/_S2S3_S4S5_S6S7_S8S7_S9S:_S;S/_S<S/_S=S>_S?S@_SAS/_SBSC_rGSD rH " SE SF5      rI " SG SH5      rJSI rK " SJ SK5      rLSL rM " SM SN5      rN " SO SP\N5      rOSQSSSSQSR.SS jrPg)T    N)PopenPIPE   )__version__)
Compressor)*)ErrorErrorWithTracebackIntegrityError)
bin_to_hex)get_base_dir)get_limited_unpacker)replace_placeholders)sysinfo)format_file_size)safe_unlink)prepare_subprocess_envignore_sigint)LockTimeout	NotLocked	NotMyLock
LockFailed)create_loggersetup_logging)msgpack)
Repository)parse_versionformat_version)xxh64)EfficientCollectionQueue   )   i   m   a   rd   皙?c                     [        U5      =p#U(       aJ  [        R                  " X5      nX4-  nU(       d   U$ XS n[        R                  " US-  5        U(       a  MJ  U$ )z;os.write wrapper so we do not lose data for partial writes.Ng&.>)lenoswritetimesleep)fddataamount	remainingcounts        -/usr/lib/python3/dist-packages/borg/remote.pyos_writer4   1   s_     T"F
"	 M F|

55=! ) M    c                       \ rS rSrSrSrSrg)ConnectionClosedD   z Connection closed by remote hostP    N__name__
__module____qualname____firstlineno____doc__
exit_mcode__static_attributes__r:   r5   r3   r7   r7   D   s
    *Jr5   r7   c                       \ rS rSrSrSrSrg)ConnectionClosedWithHintI   z$Connection closed by remote host. {}Q   r:   Nr;   r:   r5   r3   rD   rD   I   s
    .Jr5   rD   c                       \ rS rSrSrSrSrg)PathNotAllowedN   zRepository path not allowed: {}S   r:   Nr;   r:   r5   r3   rH   rH   N   s
    )Jr5   rH   c                       \ rS rSrSrSrSrg)InvalidRPCMethodrJ   zRPC method {} is not validR   r:   Nr;   r:   r5   r3   rL   rL   S   s
    $Jr5   rL   c                       \ rS rSrSrSrSrg)!UnexpectedRPCDataFormatFromClientX   z4Borg {}: Got unexpected RPC data format from client.U   r:   Nr;   r:   r5   r3   rO   rO   X   s
    >Jr5   rO   c                   0   ^  \ rS rSrSrSrU 4S jrSrU =r$ )!UnexpectedRPCDataFormatFromServer]   z.Got unexpected RPC data format from server:
{}V   c                    >  UR                  5       S S n[
        TU ]  U5        g ! [         aI    US S nU Vs/ s H  nSU-  PM
     Os  snf nn[        R                  " SR	                  U5      S5      n Nbf = f)N   z%02X 0   )decodeUnicodeDecodeErrortextwrapfilljoinsuper__init__)selfr/   byte	__class__s      r3   r`   *UnexpectedRPCDataFormatFromServer.__init__a   sx    	9;;=#&D
 		 " 	9:D.23ddFTMd3D3==$8D	9s   & A9A	.A98A9r:   )	r<   r=   r>   r?   r@   rA   r`   rB   __classcell__rc   s   @r3   rS   rS   ]   s    9J r5   rS   c                       \ rS rSrSrSrSrg)ConnectionBrokenWithHintk   z'Connection to remote host is broken. {}W   r:   Nr;   r:   r5   r3   rh   rh   k   s
    1Jr5   rh   check)repair
save_spacecommit)rm   rollbackr:   destroy__len__list)limitmarkerput)idr/   get)rv   deletesave_key)keydataload_key
break_lock	negotiate)client_dataopen)pathcreate	lock_waitlock	exclusiveappend_onlyget_free_noncecommit_nonce_reservation)next_unreservedstart_noncec                 R    U  Vs0 s H  oR                  5       X   _M     sn$ s  snf N)rZ   )dks     r3   decode_keysr      s%    &'(aHHJa(((s   $c                   P    \ rS rSrSrS rS rS rS rS r	S r
  SS
 jrS rSrg	)RepositoryServer   )rq   rk   rn   rx   rp   rw   rr   scanr}   r   ru   ro   ry   r{   r|   r   r   inject_exceptionc                 b    S U l         Xl        X l        X0l        X@l        [        S5      U l        g )N1.0.8)
repositoryrestrict_to_pathsrestrict_to_repositoriesr   storage_quotar   client_version)ra   r   r   r   r   s        r3   r`   RepositoryServer.__init__   s0    !2(@%
 '*+G4r5   c                     [        [        U   5       VVs0 s H
  u  p4XBU   _M     snn$ s  snnf ! [         aP    US:X  a  [        U5      S:X  a  [        U   SS nOe [        U5       VVs0 s H
  u  p4XBU   _M     Os  snnf snns $ f = f)z5Translate from positional protocol to named protocol.r      N)	enumerate	compatMap
IndexErrorr)   )ra   methodargvposnamemappings         r3   positional_to_named$RepositoryServer.positional_to_named   s    	I5>y?P5QR5Q	Ds)O5QRRR 	ICIN#F+BQ/5>w5GH5G	Ds)O5GHH	Is'   2 ,2 2 ;B-A?>BBc                     [        [        R                  " U5      R                  5      nU Vs0 s H  oDU;   d  M
  XBU   _M     sn$ s  snf )zWRemove unknown named parameters from call, because client did (implicitly) say it's ok.)setinspect	signature
parameters)ra   fkwargsknownr   s        r3   filter_argsRepositoryServer.filter_args   sC    G%%a(334/5Gvt"Tl"vGGGs
   	A	Ac                    [         R                  R                  5       n[         R                  R                  5       n[         R                  R                  5       n[        R
                  " US5        [        R
                  " US5        [        R
                  " US5        [        S5      n [        R                  " U// / S5      u  pVnU(       Ga  [        R                  " U[        5      nU(       dV  U R                  b  U R                  R                  5         g [        USR                  [        5      R                  5       5        g UR!                  U5        U GHk  n	[#        U	[$        5      (       a5  Sn
U	[&           nU	[(           R+                  5       n[-        U	[.           5      nO[#        U	[0        5      (       a8  [3        U	5      S:X  a)  Sn
U	u  ppUR+                  5       nU R5                  X5      nO6U R                  b  U R                  R                  5         [7        [        5      e XR8                  ;  a  [;        U5      e [=        X5      nU RA                  X5      nU" S0 UD6nU
(       a/  [        U[B        RD                  " [&        U[F        U05      5        GMG  [        U[B        RD                  " SUS U45      5        GMn     U(       a  U R                  R                  5         g GME  ! [>         a    [=        U R                  U5      n Nf = f! [H         Ga!  nU
(       Ga  [J        RL                  " URN                  U5      n[J        RP                  " [         RR                  " 5       6 nSn[#        U[T        5      (       a  URW                  5       /nURJ                  n[#        U[X        RZ                  [X        R\                  [^        45      (       a  O%[`        Rb                  " SRe                  U5      5         [B        RD                  " [&        US	URN                  Rf                  S
URh                  SUSUSUS[k        5       05      nO! [l         a    [B        RD                  " [&        US	URN                  Rf                  S
URh                   Vs/ s H'  n[#        U[n        [p        [r        45      (       a  UOS PM)     Os  snf snSUSUSUS[k        5       05      n Of = f[        UU5         S nAGM  [#        U[X        RZ                  [X        R\                  [^        45      (       a  O[#        U[T        5      (       aB  URJ                  (       a  [`        Rt                  O[`        Rv                  nURW                  5       nO)[`        Rt                  nSURN                  Rf                  -  n[J        Rx                  " 5        S[k        5        3n[`        Rz                  " U5        [`        R|                  " UU5        Sn[        U[B        RD                  " SUURN                  Rf                  U45      5         S nAGM  S nAff = f)NFTserver
   z<Borg {}: Got connection close before repository was opened.
r   r   
   exception_class   exception_args   exception_full   exception_short   exception_trace   sysinfoz%s Exception in RPC callz3Remote Exception (see remote log for the traceback)r:   )?sysstdinfilenostdoutr*   set_blockingr   selectreadBUFSIZEr   closer4   formatr   encodefeed
isinstancedictMSGIDMSGrZ   r   ARGStupler)   r   rO   rpc_methodsrL   getattrAttributeErrorr   r   packbRESULTBaseException	tracebackformat_exception_onlyrc   format_exceptionexc_infor	   get_messager   DoesNotExistAlreadyExistsrH   loggingdebugr^   r<   argsr   	TypeErrorstrbytesintERRORDEBUG
format_excerrorlog)ra   stdin_fd	stdout_fd	stderr_fdunpackerrwesr/   unpacked
dictFormatmsgidr   r   _r   reseex_shortex_fullex_tracemsgxtb_log_leveltbexcs                             r3   serveRepositoryServer.serve   s   99##%JJ%%'	JJ%%'	
%(
	4(
	4('1}}hZR<HA"wwx12--/  !,k"(&"5ffh@d# (H!(D11%)
 (!)#!5!5!7*8D>:#He44X!9K%*
19.&!'#77E??6 OO113?LLBV!)9)99"26"::A ' 5A  $//8i$in &$YueVUX>Y0Z[$Yq%s>S0TUe !)f %%'C B  . A ' @AA ) 4f%'0'F'Fq{{TU'VH&/&@&@#,,.&QG'+H)!U33,-MMO+<+,;;)!j.E.EzG_G_ao-pqq !% 'dii.@ AL&-mmUE4FH\H\4Eqvv4Ew4F4F4>	5K 'L $- L&-mmUE4FH\H\4EQRQWQWHYQWA NXXY\_afhk[lMmMmswHwQWHY4Ew4F4F4>	5K 'LL %Y44)!j.E.EzG_G_ao-pqq !%#-a#7#7DEKK7==U\UbUbL*+--/C3:==L*Dq{{G[G[*[C(1(<(<(>'?r')%M 'c 2 'L" ="WC$Yq%I]I]_b>c0deei4fsv   .L	K1L1 LLLLY"CX> AQX>AS#.SS# X>"S##X>9D>X>>Yc                 >   U[         :X  a  [         $ [        U[        5      (       af  US   U l        [        R
                  " [        R                  " S5      R                  5      n[        SSUS9  [        R                  S5        S[        0$ [        U l        S[        0$ )N   client_version T)is_servejsonlevelz2Initialized logging system for JSON-based protocolserver_version)RPC_PROTOCOL_VERSIONr   r   r   r   getLevelName	getLoggerr  r   loggerr   BORG_VERSION)ra   r~   r  s      r3   r}   RepositoryServer.negotiate;  s    ..'' k4(("-.?"@D(():):2)>)D)DEE4d%@LLMN
 !,// #/D !,//r5   c                    [        U[        5      (       a  [        R                  " U5      nUR	                  S5      (       a,  [        R
                  R                  [        5       USS  5      nOUR	                  S5      (       a,  [        R
                  R                  [        5       USS  5      nOUR	                  S5      (       a#  [        R
                  R                  USS  5      nOQUR	                  S5      (       a   [        R
                  R                  U5      nOUR	                  S5      (       a  USS  n[        R
                  R                  U5      $ )	Nz/~/   z~/r!   z/~r   ~z/./)
r   r   r*   fsdecode
startswithr   r^   r   
expanduserrealpath)ra   r   s     r3   _resolve_pathRepositoryServer._resolve_pathL  s    dE"";;t$D??5!!77<<QR9D__T""77<<QR9D__T""77%%d12h/D__S!!77%%d+D__U##8Dww%%r5   Nc                    [         R                  " SU5        U R                  U5      n[         R                  " SU5        [        R                  R                  US5      nU R                  (       as  U R                   HX  n	[        R                  R                  [        R                  R                  U	5      S5      n
UR                  U
5      (       d  MX    O   [        U5      eU R                  (       ab  U R                   HG  n[        R                  R                  [        R                  R                  U5      S5      nX:X  d  MG    O   [        U5      eU(       + =(       a    U R                  =(       d    Un[        XX4UU R                  UUS9U l        U R                  R                  5         U R                  R                   $ )NzResolving repository path %rzResolved repository path to %rr   )r   r   r   r   r   make_parent_dirs)r   r   r  r*   r   r^   r   r  r  rH   r   r   r   r   r   	__enter__rv   )ra   r   r   r   r   r   r   r  path_with_seprestrict_to_pathrestrict_to_path_with_seprestrict_to_repositoryrestrict_to_repository_with_seps                r3   r   RepositoryServer.open\  s]   4d;!!$'6=T2.!! %)$:$: ,.GGLL9I9IJZ9[]_,`) ++,EFF %;
 %T**((*.*G*G&24'',,rww?O?OPf?gik2l/2C +H
 %T** "z6d&6&6F;$TY1<373E3E/86F	H
 	!!#!!!r5   c                    UR                  5       nSnSnUS:X  a  [        R                  " U5      eUS:X  a  [        R                  " U5      eUS:X  a  [        R                  " U5      eUS:X  a  [        U5      eUS:X  a  [        S5      eUS	:X  a  [        R                  " X#5      eUS
:X  a  [        U5      eUS:X  a  SS-    g g )Nztest stringztest string2r   r   CheckNeededr   rH   fooObjectNotFoundrL   divider   )	rZ   r   r   r   r  r   rH   r   rL   )ra   kinds1s2s       r3   r   !RepositoryServer.inject_exception  s    {{}>!))"--_$**2..]"((,,%% $$%% ''%%++B33''"2&&XF r5   )r   r   r   r   r   r   )FNTNFF)r<   r=   r>   r?   r   r`   r   r   r   r}   r  r   r   rB   r:   r5   r3   r   r      s@    K*
5
IH
iV0"&  _d#!"Fr5   r   c                        \ rS rSrS rS rSrg)SleepingBandwidthLimiteri  c                     U(       aC  [        U[        -  5      U l        [        R                  " 5       U l        U R                  U l        g S U l        g r   )r   RATELIMIT_PERIOD	ratelimitr,   	monotonicratelimit_lastratelimit_quota)ra   rs   s     r3   r`   !SleepingBandwidthLimiter.__init__  s9     )9!9:DN"&.."2D#'>>D !DNr5   c                    U R                   (       Ga  [        R                  " 5       nU R                  [        -   U::  aV  U =R
                  U R                   -  sl        U R
                  SU R                   -  :  a  SU R                   -  U l        X0l        U R
                  S:X  ae  U R                  [        -   U-
  n[        R                  " U5        U =R
                  U R                   -  sl        [        R                  " 5       U l        [        U5      U R
                  :  a  US U R
                   n [        R                  " X5      nU R                   (       a  U =R
                  U-  sl        U$ ! [         a    [        S5      S ef = f)Nr!   r   zBroken Pipe)r*  r,   r+  r,  r)  r-  r-   r)   r*   r+   BrokenPipeErrorrh   )ra   r.   to_sendnowtosleepwrittens         r3   r+   SleepingBandwidthLimiter.write  s:   >>>.."C""%55<$$6$''!dnn*<<+,t~~+=D(&)###q(--0@@3F

7#$$6$&*nn&6#7|d222!"74#7#78	Dhhr+G >>  G+ 	  	D*=9tC	Ds   3E1 1F)r*  r,  r-  N)r<   r=   r>   r?   r`   r+   rB   r:   r5   r3   r'  r'    s    "r5   r'  c                    ^ ^ UU 4S jnU$ )a  Check version requirements and use self.call to do the remote method call.

<since> specifies the version in which borg introduced this method.
Calling this method when connected to an older version will fail without transmitting anything to the server.

Further kwargs can be used to encode version specific restrictions:

<previously> is the value resulting in the behaviour before introducing the new parameter.
If a previous hardcoded behaviour is parameterized in a version, this allows calls that use the previously
hardcoded behaviour to pass through and generates an error if another behaviour is requested by the client.
E.g. when 'append_only' was introduced in 1.0.7 the previous behaviour was what now is append_only=False.
Thus @api(..., append_only={'since': parse_version('1.0.7'), 'previously': False}) allows calls
with append_only=False for all version but rejects calls using append_only=True on versions older than 1.0.7.

<dontcare> is a flag to set the behaviour if an old version is called the new way.
If set to True, the method is called without the (not yet supported) parameter (this should be done if that is the
more desirable behaviour). If False, an exception is generated.
E.g. before 'threshold' was introduced in 1.2.0a8, a hardcoded threshold of 0.1 was used in commit().
c                 L   >^  [         R                  " T 5      U UU4S j5       nU$ )Nc           	      >  > [         R                  " T
5      nUR                  " U /UQ70 UD6n0 n0 nUR                  R	                  5        Hq  u  pxUS:X  a  M  XtR
                  ;   a,  US:X  a  UR
                  U   Xg'   M5  UR
                  U   XW'   MH  UR                  UR                  Ld  Mc  UR                  XW'   Ms     U R                  T:  a%  U R                  T
R                  [        T5      5      eTR	                  5        Hw  u  pyU	S   U R                  ::  a  M  SU	;   a  XW   U	S   :X  a  M-  U	R                  SS5      (       a  MF  U R                  T
R                   SU SXW   < 3[        U	S   5      5      e   U R                  " T
R                  U40 UD6$ )	Nra   waitsince
previouslydontcareFrX   =)r   r   bindr   items	argumentsdefaultemptyr  RPCServerOutdatedr<   r   rw   call)ra   r   r   sig
bound_argsnamedextrar   paramrestrictionr   kwargs_decoratorr:  s             r3   do_rpc&api.<locals>.decorator.<locals>.do_rpc  s   ##A&C$888JEE"~~3356>///v~&0&:&:4&@&0&:&:4&@}}EKK7&+mm  6 ""U*,,QZZ9NOO%5%;%;%=!w'4+>+>>;.5;+lB[3[??:u55,,

|1TF!EK?-S-;K<P-QS S &> 99QZZ8%88r5   )	functoolswraps)r   rL  rK  r:  s   ` r3   	decoratorapi.<locals>.decorator  s&    			9 
	9@ r5   r:   )r:  rK  rP  s   `` r3   apirR    s    ("F r5   c            	          \ rS rSr/ r " S S\5      r " S S\5      rSr	  S8S	 jr
S
 rS rS rS r\S 5       rS rS rS rS rS9S jr\" \" S5      \" S5      SS.\" S5      SS.S9  S:S j5       r\" \" S5      \" S5      SS.S9S;S j5       r\" \" S5      \" S5      SSS.\" S 5      S!SS.\" S5      SSS.S"9S<S# j5       r\" \" S5      S$9S% 5       r\" \" S5      S$9S& 5       r\" \" S5      S$9S' 5       r\" \" S5      S$9S=S( j5       r\" \" S)5      S$9S=S* j5       rS+ r S>S, jr!\" \" S5      S$9S?S- j5       r"\" \" S5      S$9S?S. j5       r#\" \" S5      S$9S/ 5       r$\" \" S5      S$9S0 5       r%\" \" S5      S$9S1 5       r&\" \" S5      S$9S2 5       r'\" \" S5      S$9S3 5       r(S4 r)S?S5 jr*S6 r+S7r,g)@RemoteRepositoryi  c                   `    \ rS rSrS rS r\S 5       r\S 5       r\S 5       r	\S 5       r
Srg	)
RemoteRepository.RPCErrori  c                     Xl         g r   r   )ra   r   s     r3   r`   "RemoteRepository.RPCError.__init__  s	     %Mr5   c                     SU R                   ;   a,  SR                  U R                   S   5      R                  5       $ U R                  $ )Nr      
)r   r^   rZ   exception_classra   s    r3   r   %RemoteRepository.RPCError.get_message  s<    !T]]2zz$--0B"CDKKMM+++r5   c                 :    U R                   R                  SS5      $ )Nr   T)r   rw   r]  s    r3   r   #RemoteRepository.RPCError.traceback  s    ==$$%7>>r5   c                 <    U R                   S   R                  5       $ )Nr   r   rZ   r]  s    r3   r\  )RemoteRepository.RPCError.exception_class  s    ==!34;;==r5   c                     SU R                   ;   a,  SR                  U R                   S   5      R                  5       $ U R                  5       S-   $ )Nr   r[  z4
Remote Exception (see remote log for the traceback))r   r^   rZ   r   r]  s    r3   exception_full(RemoteRepository.RPCError.exception_full  sE     DMM1zz$--0A"BCJJLL''),cccr5   c                 ^    SU R                   ;   a  U R                   S   R                  5       $ g)Nr   r   rb  r]  s    r3   r   !RemoteRepository.RPCError.sysinfo  s)    T]]*}}Z07799r5   rX  N)r<   r=   r>   r?   r`   r   propertyr   r\  re  r   rB   r:   r5   r3   RPCErrorrV    s^    	%
	, 
	? 
	? 
	> 
	> 
	d 
	d 
	 
	r5   rj  c                   <    \ rS rSrSrSr\S 5       r\S 5       rSr	g)"RemoteRepository.RPCServerOutdatedi  z2Borg server is too old for {}. Required version {}T   c                      U R                   S   $ Nr   r   r]  s    r3   r   )RemoteRepository.RPCServerOutdated.method      99Q<r5   c                      U R                   S   $ )Nr   rp  r]  s    r3   required_version3RemoteRepository.RPCServerOutdated.required_version  rr  r5   r:   N)
r<   r=   r>   r?   r@   rA   ri  r   rt  rB   r:   r5   r3   rC  rl    s0    @
		  
	  
	  
	 r5   rC  FNTc	           
        ^ ^^^^^^ U=T l         T l        / T l        ST l        ST l        ST l        [        S[        5      T l        ST l	        0 T l
        [        5       T l        0 T l        0 T l        S T l        [!        U(       a   UR"                  (       a  UR"                  S-  OS5      T l        U(       a#  UR&                  (       a  UR&                  S-  S-  OST l        [+        S5      T l        [/        S5      T l        S T l        UT l        UR6                  S:H  n	[9        U	(       + S9n
T R;                  X5      nU	(       d  T R=                  U5      U-   n[>        RA                  S	U5        [C        US[D        [D        [D        U
[F        S
9T l        T R2                  RH                  RK                  5       T l&        T R2                  RN                  RK                  5       T l(        T R2                  RR                  RK                  5       T l*        [V        RX                  " T RL                  S5        [V        RX                  " T RP                  S5        [V        RX                  " T RT                  S5        T RP                  T RT                  /T l-        T RL                  T RP                  T RT                  /T l.          T R_                  SSS[`        005      nU[f        :X  a  ST l4        O;[k        U[l        5      (       a  SU;   a  ST l4        US   T l        O[o        SU-  5      eUUUUUUU 4S jnT Rh                  (       a  U" 5         g  U" 5         g ! [b         a    [e        S5      S ef = f! T Rp                   a\  nURr                  S:w  a  e Sn[t        RR                  Rw                  U5        [/        S5      T l        S[x        S'   U" 5          S nAg S nAff = f! [n         a    T R{                  5         e f = f)Nr   i   r5   i   clientr   __testsuite__)systemzSSH command line: %s)bufsizer   r   stderrenv
preexec_fnFr}   r~   r   zIs borg working on the server?s   server_versionTz8Server insisted on using unsupported protocol version %sc            
      b   > TR                  TR                  R                  TTTTT TS9Tl        g )N)r   r   r   r   r   r   r  )r   locationr   rv   )r   r   r   r   r   r  ra   s   r3   do_open*RemoteRepository.__init__.<locals>.do_open[  s5    ))););FV_)-P[5E $ Gr5   r   ao  Please note:
If you see a TypeError complaining about the number of positional arguments
given to open(), you can ignore it if it comes from a borg version < 1.0.7.
This TypeError is a cosmetic side effect of the compatibility code borg
clients >= 1.0.7 have to support older borg servers.
This problem will go away as soon as the server has been upgraded to 1.0.7+.
z1.0.6)r   r   r   r   r   )>r  	_locationpreload_idsr   rx_bytestx_bytesr    r   r1  stderr_receivedchunkid_to_msgidsr   ignore_responses	responsesasync_responsesshutdown_timer'  upload_ratelimitr*  upload_bufferupload_buffer_size_limitr   r   r   r  p_argshostr   borg_cmdssh_cmdr  r   r   r   r   r   r   r   r   r   r{  r   r*   r   r_fdsx_fdsrD  r	  r7   rD   r  r   r   r   	Exceptionrj  r\  r   r+   r   r   )ra   r  r   r   r   r   r   r  r   testingr|  r  versionr  errr   s   ` ``````        r3   r`   RemoteRepository.__init__$  s3   )11
/UC"!# #!!1RV[_[p[p$2G2G$2NvwxLPUYUgUg(:(:T(AD(Hmn%,X6+G4
--?2 %K8==/||H-8H+X6 x$tDVYfst++---/--/
u-
.
.nndnn5
mmT^^T^^D
-	[))K-%|B 2 
 .."'GT**/@G/K"&&-.?&@# Z]d deeG G
 	I) $ [./OPVZZ[* }} **k9C JJ$$S)*7*@D'(QIf%II!"  	JJL	sD   7M A1O M& M##O &O6AOO OO O1c                     [        U R                  5      (       a-  [        R                  " S[        U R                  5      4-  5        U R                  (       a  U R                  5          S5       eg )Nz2still %d cached responses left in RemoteRepositoryz&cleanup happened in Repository.__del__)r)   r  r   r   r  r   r]  s    r3   __del__RemoteRepository.__del__{  sS    t~~MMNRUVZVdVdReQggh66JJLBBB5 r5   c                 l    SU R                   R                   SU R                  R                  5        S3$ )N<rX   >)rc   r<   r  canonical_pathr]  s    r3   __repr__RemoteRepository.__repr__  s0    4>>**+1T]]-I-I-K,LANNr5   c                     U $ r   r:   r]  s    r3   r  RemoteRepository.__enter__      r5   c           	          Ub-  [         R                  " 5       S-   U l        U R                  5         [        R                  S[        U R                  5      [        U R                  5      U R                  5        U R                  5         g ! [        R                  S[        U R                  5      [        U R                  5      U R                  5        U R                  5         f = f)N   zDRemoteRepository: %s bytes sent, %s bytes received, %d messages sent)r,   r+  r  ro   r  r   r   r  r  r   r   ra   exc_typeexc_valexc_tbs       r3   __exit__RemoteRepository.__exit__  s    
	#%)^^%5%:"
 LL_)$--8:J4==:Y[_[e[egJJL LL_)$--8:J4==:Y[_[e[egJJLs   0B AC%c                 ,    [        U R                  5      $ r   )r   rv   r]  s    r3   id_strRemoteRepository.id_str  s    $''""r5   c                    / nUGb  [         R                  " 5       nUR                  [         R                  5      (       a  UR	                  S5        OUR                  [         R
                  5      (       a  UR	                  S5        OUR                  [         R                  5      (       a  OwUR                  [         R                  5      (       a  UR	                  S5        OAUR                  [         R                  5      (       a  UR	                  S5        O[        S5      eUR                   H*  nSU;  a  SU-   nSU;   d  M  UR	                  S	U-  5        M,     S
U;   a/  UR                  (       a  UR	                  SUR                  -  5        / nU(       a'  U[        R                  SSS/-   U-   U R                  -   $ UR                  =(       d     [         R"                  R%                  SS5      n['        U5      nXgS/-   U-   $ )z return a borg serve command linez--debugz--infoz--errorz
--criticalz log level missing, fix this code.zborg.debug.r   z--debug-topic=%sr   z--storage-quota=%sz-mzborg.archiverr   BORG_REMOTE_PATHborg)r   r  isEnabledForr   appendINFOWARNINGr   CRITICAL
ValueErrordebug_topicsr   r   
executableextra_test_argsremote_pathr*   environrw   r   )ra   r   r  optsroot_loggertopicenv_varsr  s           r3   r  RemoteRepository.borg_cmd  s    !++-K''66I&))',,77H%))'//::))'--88I&))'*:*:;;L) !CDD **e#)E1E5(KK 2U :;	 + $&4+=+=043E3EEFs~~t_gNNQUUX\XlXlll**Xbjjnn=OQW.XK.{;KG44t;;r5   c                    U R                   R                  =(       d     [        R                  R	                  SS5      n[
        R                  " U5      nUR                  (       a  US[        UR                  5      /-  nUR                  (       a,  UR                  UR                   SUR                   35        U$ UR                  SUR                  -  5        U$ )zEreturn a ssh command line that can be prefixed to a borg command lineBORG_RSHsshz-p@%s)r  rshr*   r  rw   shlexsplitportr   userr  r  )ra   r  r  r   s       r3   r  RemoteRepository.ssh_cmd  s    jjnnA

z5 A{{3==T3x}}-..D==KK8==/8==/:;  KKx}},-r5   c                 D    [         U    Vs/ s H  o2U   PM	     sn$ s  snf r   )r   )ra   r   r   r   s       r3   named_to_positional$RemoteRepository.named_to_positional  s#    )26):;):t):;;;s   c                 >    U R                   " X/40 UD6 H  nUs  $    g r   	call_many)ra   cmdr   kwresps        r3   rD  RemoteRepository.call  s!    NN35"5DK 6r5   c              #   <  ^ #    U(       d  US:w  a  g U 4S jnU 4S jnU 4S jn[        U5      n/ n	U(       a  SOT R                  n
U" 5         U(       d  U(       Gac  T R                  (       aW  [        R                  " 5       T R                  :  a4  [
        R                  S[        U	5      [        T R                  5      5        g U	(       ab   T R                  R                  U	S   5      nU	R                  S5        SU;   a	  U" U5        OU[           v   U	(       d  U(       d  g U	(       a  Mb  US:X  a;    T R                  R                  5       u  pSU;   a	  U" U5        OU[           v    M:  T R                  (       d+  U(       d  T R                   (       a!  [        U	5      ["        :  a  T R$                  /nO/ n[&        R&                  " T R(                  UT R*                  S	5      u  pnU(       a  [-        S
5      eU GHX  nUT R.                  L Ga_  [0        R2                  " U[4        5      nU(       d
  [7        5       eT =R8                  [        U5      -  sl        T R:                  R=                  U5        T R:                   H  n[?        U[@        5      (       a
  U[B           nOW[?        U[D        5      (       a7  [        U5      S:X  a(  Uu  nnnnU(       a  [B        USU0nO[B        U[        U0nO[G        U5      eUT R                  ;   aO  T R                  RI                  U5        SU;   a  UT R                  U'   M  U[           b  UT R                  U'   M  M  UT R                  U'   M     GMs  UT RJ                  L d  GM  [0        R2                  " US5      nU(       d
  [7        5       eT =R8                  [        U5      -  sl        T RL                  (       a  T RL                  U-   nST l&        URO                  SS9nU(       a.  US   RQ                  S5      (       d  UR                  5       T l&        U H  n[S        URU                  5       5        M     GM[     U(       GaH  [        T R                  5      U
::  Ga'  U(       d  T R                   (       Ga  [        U	5      ["        :  Ga  U(       Gat  U(       aN  US:X  d   S5       eUS   S   T RV                  ;   a)  U	RY                  U" UR                  S5      S   5      5        GOUR                  S5      nUS:X  a.  US   T RV                  ;   a  U	RY                  U" US   5      5        OT =RZ                  S	-  sl-        U	RY                  T RZ                  5        T R\                  (       aL  T R                  R_                  [`        Rb                  " [B        T RZ                  [d        U[f        U05      5        OMT R                  R_                  [`        Rb                  " S	T RZ                  UT Ri                  UU5      45      5        T R                  (       Gd%  T R                   (       Ga  T R                   R                  S5      nSU0nT =RZ                  S	-  sl-        T RV                  Rk                  U/ 5      RY                  T RZ                  5        T R\                  (       aL  T R                  R_                  [`        Rb                  " [B        T RZ                  [d        S[f        U05      5        OMT R                  R_                  [`        Rb                  " S	T RZ                  ST Ri                  SU5      45      5        [        T R                  5      U
::  a.  U(       d  T R                   (       a  [        U	5      ["        :  a  GM  U" 5         U(       a  GMY  U(       a  GMc  T =R                  [m        U	5      -  sl        g ! [         a     GM  f = f! [         a    U(       a  T R                  (       a   GM   g f = f7f)Nr  c                    > TR                   (       ap   TR                  R                  TR                  TR                   R	                  5       5      n T=R
                  U -  sl        TR                   R                  U 5        g g ! [         a9  nUR                  [        R                  [        R                  4;  a  e  S nAg S nAff = fr   )r1  r*  r+   r   
peek_frontr  	pop_frontOSErrorerrnoEAGAINEWOULDBLOCK)r4  r   ra   s     r3   send_buffer/RemoteRepository.call_many.<locals>.send_buffer  s    ||	"nn224==$,,BYBYB[\GMMW,MLL**73	 
   wwu||U5F5F&GG H	s   A.B 
C/CCc                    > TR                   U    R                  S5      nTR                   U    (       d  TR                   U 	 U$ ro  )r  pop)chunkidr   ra   s     r3   pop_preload_msgid5RemoteRepository.call_many.<locals>.pop_preload_msgid  s?    **7377:E))'2**73Lr5   c                 N  > U S   R                  5       nSU ;  nU R                  S5      nUS:X  a  [        US   R                  5       5      eUS:X  a  [        US   R                  5       5      eUS:X  a*  [        R
                  " TR                  R                  5      eUS:X  a*  [        R                  " TR                  R                  5      eUS:X  a*  [        R                  " TR                  R                  5      eUS	:X  a.  U(       a  [        S
5      e[        US   R                  5       5      eUS:X  aD  U(       a  [        R                  " S
5      e[        R                  " US   R                  5       5      eUS:X  a.  U(       a  [        S5      e[        US   R                  5       5      eUS:X  a'  [        R                  " US   R                  5       5      eUS:X  a'  [        R                  " US   R                  5       5      eUS:X  an  U(       a+  [        R                  " S
TR                  R                  5      e[        R                  " US   R                  5       TR                  R                  5      eUS:X  a.  U(       a  [!        S
5      e[!        US   R                  5       5      eUS:X  a.  U(       a  [#        S
5      e[#        US   R                  5       5      eUS:X  aA  U(       a  [%        S
S5      e[%        US   R                  5       US   R                  5       5      eUS:X  a.  U(       a  ['        S
5      e['        US   R                  5       5      eUS:X  a.  U(       a  [)        S
5      e[)        US   R                  5       5      eTR+                  U 5      e)Nr   r   r	   r   r
   r   r   r  r   z(not available)AtticRepositoryrH   z	(unknown)PathPermissionDeniedParentPathDoesNotExistr   rL   r   r   r   r   r   r   )rZ   rw   r	   r
   r   r   r  	processedr   r  r   r  rH   r  r  r   rL   r   r   r   r   rj  )r   r   
old_serverr   ra   s       r3   handle_error0RemoteRepository.call_many.<locals>.handle_error  s   /0779E*(:J<< 12DDGNN,--..(a)9::.( --dmm.E.EFF/) ..t}}/F/FGG-' ,,T]]-D-DEE**():;;(a)9::++$445FGG$44T!W^^5EFF**(55(a)9::00 55d1gnn6FGG22 77Q8HII**$334Et}}G^G^__$33DGNN4DdmmF]F]^^,,*+<==*47>>+;<<-'%&788%d1gnn&677,&$%6;;$T!W^^%5tAw~~7GHH+%#$566#DGNN$455+%#$566#DGNN$455mmH--r5   r   zPshutdown_time reached, shutting down with %d waiting_for and %d async_responses.r   Tr   zFD exception occurredr   i   r5   )keepends)   r[  rw   z&is_preload is only supported for 'get'rv   )7rr   r  r  r,   r+  r  r   r)   r  r  r  r   KeyErrorpopitemr  r1  r  MAX_INFLIGHTr   r   r  r  r  r   r*   r   r   r7   r  r   r   r   r   r   r   rS   remover   r  
splitlinesendswithhandle_remote_linerZ   r  r  r   r   	push_backr   r   r   r   r  
setdefaultr   )ra   r  callsr9  is_preloaded
async_waitr  r  r  waiting_formaximum_to_sendr   r   w_fdsr   r   r   r.   r/   r   r   r   linesliner   chunk_ids   `                         r3   r  RemoteRepository.call_many  sS     11		A	.F U#!)F)Fe!!dnn&69K9K&K o -s43G3G/HJ
#~~11+a.AHOOA&)X5$X.&v..*5" + ''3*.*>*>*F*F*H .9(2"*6"22  ||$*:*:K@PS_@_mmDJJtzz1EGA! 788'772w/D.00MMSY.MMM&&t,$(MM%h55$,UOE'%88S]a=O3;0AueS$,15:Le+T,15&#+F"CD"II D$9$99 1188?1X=>F 4 4U ; $,F#3#?BJD$8$8$? $@ 5=DNN511 %22 4>>)772u-D.00MMSY.M++#33d:/2, OOTO:EU2Y%7%7%G%G/4yy{, %*4;;=9 !&[ ^ 4<<(O;%4K[K[K[adepaq  uA  bA'#&%<Y1YY<$Qx~1G1GG + 2 23DUYYq\RVEW3X Y#(99Q<D"e|T
d>T>T0T + 2 23DT$Z3P Q $

a
 + 2 24:: >#'??$(LL$:$:7==%QUQ[Q[]`begkmqIr;s$t$(LL$:$:7==!TZZY\^b^v^vwz  }A  _B  JC  <D  %E<<<D,<,<,<#'#3#3#7#7#: $h/

a
..99(BGNNtzzZ?? LL227==%UXZ_aegkAl3mn LL227==!TZZQVX\XpXpqvx|X}A~3  A3 4<<(O;%4K[K[adepaq  uA  bA6 k deel 	[!11K    $ #%$*?*?!"#sz   C`=_ 	`
_ #`-`5_0 H-`P`$`5`?`
_-(`,_--`0"````z1.0.0z1.0.7)r:  r;  z1.1.9)r:  r   r  c                     gz;actual remoting is done via self.call in the @api decoratorNr:   )ra   r   r   r   r   r   r   r  s           r3   r   RemoteRepository.open      r5   z1.2.0a4r   )r:  max_durationc                     gr	  r:   )ra   rl   rm   r  s       r3   rk   RemoteRepository.check  r  r5   z1.2.0a0)r:  r;  r<  z1.2.0a8r'   )r:  compact	thresholdcleanup_commitsc                     gr	  r:   )ra   rm   r  r  r  s        r3   rn   RemoteRepository.commit  r  r5   )r:  c                     gr	  r:   r]  s    r3   ro   RemoteRepository.rollback  r  r5   c                     gr	  r:   r]  s    r3   rp   RemoteRepository.destroy  r  r5   c                     gr	  r:   r]  s    r3   rq   RemoteRepository.__len__  r  r5   c                     gr	  r:   ra   rs   rt   s      r3   rr   RemoteRepository.list  r  r5   z1.1.0b3c                     gr	  r:   r  s      r3   r   RemoteRepository.scan  r  r5   c                 :    U R                  U/5       H  nUs  $    g r   )get_many)ra   rv   r  s      r3   rw   RemoteRepository.get  s    MM2$'DK (r5   c              #   r   #    U R                  SU Vs/ s H  nSU0PM	     snUS9 S h  vN   g s  snf  N
7f)Nrw   rv   )r  r  )ra   idsr  rv   s       r3   r   RemoteRepository.get_many  s7     >>%s)Cs4*s)CR^>___)C_s   70
	757c                     gr	  r:   )ra   rv   r/   r9  s       r3   ru   RemoteRepository.put  r  r5   c                     gr	  r:   )ra   rv   r9  s      r3   rx   RemoteRepository.delete  r  r5   c                     gr	  r:   )ra   rz   s     r3   ry   RemoteRepository.save_key  r  r5   c                     gr	  r:   r]  s    r3   r{   RemoteRepository.load_key  r  r5   c                     gr	  r:   r]  s    r3   r   RemoteRepository.get_free_nonce  r  r5   c                     gr	  r:   )ra   r   r   s      r3   r   )RemoteRepository.commit_nonce_reservation  r  r5   c                     gr	  r:   r]  s    r3   r|   RemoteRepository.break_lock  r  r5   c                     U R                   (       aj  U R                   R                  R                  5         U R                   R                  R                  5         U R                   R	                  5         S U l         g g r   )r  r   r   r   r9  r]  s    r3   r   RemoteRepository.close  sJ    66FFLL FFMM!FFKKMDF	 r5   c                 :    U R                  S/ SUS9 H  nUs  $    g )Nr  T)r  r9  r   r  )ra   r9  r  s      r3   async_responseRemoteRepository.async_response  s%    NN#4BTVZN[DK \r5   c                 .    U =R                   U-  sl         g r   )r  )ra   r#  s     r3   preloadRemoteRepository.preload  s    Cr5   )r  r  r  r  r   rv   r  r  r   r  r  r  r*  r  r  r  r  r   r  r   r   r1  r  r   r  r  )FFNTFFN)TFT)FNTFFF)FFr   )FTr'   F)NN)FT)-r<   r=   r>   r?   r  r  rj  r	   rC  r   r`   r  r  r  r  ri  r  r  r  r  rD  r  rR  r   r   rk   rn   ro   rp   rq   rr   r   rw   r   ru   rx   ry   r{   r   r   r|   r   r6  r9  rB   r:   r5   r3   rT  rT    s   O 9  D
 E 
  Jgl.2UnCO # #,<\
<T2l 	}W%,W5UK$1'$:%PR `e#JRJ 	}W% -i 8JLJLJ 	}W%(34UYZ*95SVZ[#0#;5^bceJ	eJ 	}W%&J 'J 	}W%&J 'J 	}W%&J 'J 	}W%&J 'J 	}Y'(J )J` 	}W%&J 'J 	}W%&J 'J 	}W%&J 'J 	}W%&J 'J 	}W%&J 'J 	}W%&J 'J 	}W%&J 'J r5   rT  c                 $   U R                  S5      (       d   eU R                  S5      (       Ga  [        R                  " U 5      nUS   S;  a  [        R                  SUS   U 5        gUS   S:X  a  [        [        US   [        R                  5      n[        U[        5      (       d   e[        R                  " US	   5      nS
US   -   US'   [        R                  " S5      R                  (       aJ  X#R                  5       :  a7  [        R                  R                  [        R                   " U5      S-   5        gUR#                  USUS   5        gUS   R                  S5      (       a  [        R                  " S5      nUR                  5       [        R$                  :X  a  [        R                  " S5      R                  (       aH  SU;   a  S
US   -   US'   [        R                  R                  [        R                   " U5      S-   5        gSU;   a)  [        R                  R                  S
US   -   S-   5        ggggU R                  S5      (       a  U R'                  SS5      u  pRn[        [        U[        R                  5      nUR                  S5      (       a%  [        R"                  " X!R)                  5       5        gUR'                  SS5      u  pa[        R                  " U5      R#                  X!R)                  5       5        g[        R                  " S5      R                  (       a7  [        R                  " S5      R                  S
U R+                  5       -   5        g[        R                  R                  S
U -   5        g)zj
Handle a remote log line.

This function is remarkably complex because it handles multiple wire formats.
)r   {type)progress_messageprogress_percentlog_messagez3Dropped remote log message with unknown type %r: %sNrB  	levelnamer   zRemote: messager  r   r  	progress_zborg.output.progressr=  z$LOG rX   r!   zRemote:r   r   )r  r  r  loadsr  warningr   r   r  r   r   r  getEffectiveLevelr   r{  r+   dumpsr   r  r  rstripstrip)r  r   r  target_loggerprogress_loggerr   lognames          r3   r  r  	  s    ==&&&&s jjv;UUNNPRUV\R]_cdv;-'GS%5w7G7GHEeS))))#--c&k:M'#i.8C	N  (--%;Z;Z;\2\

  C4!78!!%s9~>[##K00
 &//0FGO002gllB $$V,11 !C')3c)n)DIJJ$$TZZ_t%;<#%
 JJ$$Z#i.%@4%GH & C 1* 
	!	!
 

3*#(8(89>>)$$KKzz|, 99S!,LGg&**5**,?
 V$))b!))*tzz|*CD JJZ$./r5   c                   J    \ rS rSrSrSS jrS rS rS rS r	SS	 jr
S
 rSrg)RepositoryNoCacheiS  a>  A not caching Repository wrapper, passes through to repository.

Just to have same API (including the context manager) as RepositoryCache.

*transform* is a callable taking two arguments, key and raw repository data.
The return value is returned from get()/get_many(). By default, the raw
repository data is returned.
Nc                 2    Xl         U=(       d    S U l        g )Nc                     U$ r   r:   )keyr/   s     r3   <lambda>,RepositoryNoCache.__init__.<locals>.<lambda>^  s    r5   r   	transform)ra   r   rW  s      r3   r`   RepositoryNoCache.__init__\  s    $">'=r5   c                     g r   r:   r]  s    r3   r   RepositoryNoCache.close`      r5   c                     U $ r   r:   r]  s    r3   r  RepositoryNoCache.__enter__c  r  r5   c                 $    U R                  5         g r   )r   r  s       r3   r  RepositoryNoCache.__exit__f  s    

r5   c                 6    [        U R                  U/SS95      $ )NF)cache)nextr   ra   rS  s     r3   rw   RepositoryNoCache.geti  s    DMM3%uM566r5   c              #      #    [        XR                  R                  U5      5       H  u  p4U R                  X45      v   M     g 7fr   )zipr   r   rW  )ra   keysra  rS  r/   s        r3   r   RepositoryNoCache.get_manyl  s5     T??#;#;D#ABIC..++ Cs   AAc                     g r   r:   r]  s    r3   log_instrumentation%RepositoryNoCache.log_instrumentationp  r[  r5   rV  r   r;  )r<   r=   r>   r?   r@   r`   r   r  r  rw   r   rj  rB   r:   r5   r3   rP  rP  S  s*    ?7,r5   rP  c                   ^   ^  \ rS rSrSrSU 4S jjrS rS rS rS r	S r
S	 rSS
 jrSrU =r$ )RepositoryCacheit  aJ  
A caching Repository wrapper.

Caches Repository GET operations locally.

*pack* and *unpack* complement *transform* of the base class.
*pack* receives the output of *transform* and should return bytes,
which are stored in the cache. *unpack* receives these bytes and
should return the initial data (as returned by *transform*).
c                 :  > [         TU ]  X5        U=(       d    S U l        U=(       d    S U l        [	        5       U l        [        R                  " SS9U l        U R                  5         SU l
        SU l        SU l        SU l        SU l        SU l        SU l        g )Nc                     U $ r   r:   r/   s    r3   rT  *RepositoryCache.__init__.<locals>.<lambda>  s    $r5   c                     U $ r   r:   rp  s    r3   rT  rq    s    dr5   zborg-cache-)prefixr   g        )r_   r`   packunpackr   ra  tempfilemkdtempbasedirquery_size_limitsizehitsmissesslow_missesslow_lat	evictionsenospc)ra   r   rt  ru  rW  rc   s        r3   r`   RepositoryCache.__init__  s    //.	3!2U
''}=		r5   c                     [         R                  " U R                  5      R                  n[	        [        US-  S5      5      U l        g )Ng      ?l        )shutil
disk_usagerx  freer   min
size_limit)ra   available_spaces     r3   ry   RepositoryCache.query_size_limit  s4     ++DLL9>>c/D"8%@Ar5   c                 h    [         R                  R                  U R                  [	        U5      5      $ r   )r*   r   r^   rx  r   rc  s     r3   key_filenameRepositoryCache.key_filename  s    ww||DLL*S/::r5   c                    U R                  5         [        SU R                  -  5      nU R                  U:  a  U R                  (       a  U R                  R                  5       nU R                  U5      nU =R                  [        R                  " U5      R                  -  sl        [        R                  " U5        U =R                  S-  sl        U R                  U:  a  U R                  (       a  M  g g g g )Ng?r   )ry  r   r  rz  ra  r  r  r*   statst_sizeunlinkr  )ra   target_sizerS  files       r3   backoffRepositoryCache.backoff  s    #/0ii+%$****.."C$$S)DII...IIIdONNaN ii+%$***%*%r5   c                    U R                  X5      nU(       d  U$ U R                  U5      nU R                  U5      n [        US5       nUR	                  U5        S S S 5        U =R
                  [        U5      -  sl        U R                  R                  U5        U R
                  U R                  :  a  U R                  5         U$ ! , (       d  f       Ns= f! [         al  n [        U5        O! [         a     Of = fUR                  [        R                  :X  a+  U =R                   S-  sl        U R                  5          S nAU$ e S nAff = f)Nwbr   )rW  rt  r  r   r+   rz  r)   ra  addr  r  r  r   FileNotFoundErrorr  ENOSPCr  )	ra   rS  r/   ra  transformedpackedr  r.   os_errors	            r3   	add_entryRepositoryCache.add_entry  s	   nnS/;'  %	dD!R  " IIV$IJJNN3yy4??*# "! 		D!$ ~~-q   		sT   C 
C	C 	
CC 
E%C10E1
C>;E=C>>AE
EEc                 *   [         R                  S[        U R                  5      [	        U R
                  5      [	        U R                  5      U R                  U R                  U R                  U R                  U R                  U R                  5
        g )NzyRepositoryCache: current items %d, size %s / %s, %d hits, %d misses, %d slow misses (+%.1fs), %d evictions, %d ENOSPC hit)r  r   r)   ra  r   rz  r  r{  r|  r}  r~  r  r  r]  s    r3   rj  #RepositoryCache.log_instrumentation  sa     3_&6tyy&ACSTXTcTcCdYYT-=-=t}}^^T[[		2r5   c                     U R                  5         U R                  R                  5         [        R                  " U R
                  5        g r   )rj  ra  clearr  rmtreerx  r]  s    r3   r   RepositoryCache.close  s.      "

dll#r5   c              #   T  #    U Vs/ s H  o3U R                   ;  d  M  UPM     nn[        X@R                  R                  U5      5      nU GH5  nX0R                   ;   a^  U R	                  U5      n[        US5       nU =R                  S-  sl        U R                  UR                  5       5      v   S S S 5        Mq  U H8  u  pX:X  d  M  U R                  X9U5      n
U =R                  S-  sl
        U
v     M     [        R                  " 5       nU R                  R                  U5      n	U =R                  [        R                  " 5       U-
  -  sl        U R                  X9U5      n
U =R                  S-  sl        U
v   GM8     U H  nM     g s  snf ! , (       d  f       GMY  = f7f)Nrbr   )ra  rf  r   r   r  r   r{  ru  r   r  r|  r,   perf_counterrw   r~  r}  )ra   rg  ra  rS  unknown_keysrepository_iteratorr  r.   key_r/   r  t0r   s                r3   r   RepositoryCache.get_many  sT    '+Et$**/DtE!,0H0H0VWCjj ((-$%IINI++bggi00 &% #6JD{&*nnS&Fq()) #6 **,B??..s3DMMT%6%6%82%==M"&..E"BK$$)$%%) , %A %1 F
 &%s4   F(FFAF(<7F3F(C
F(
F%		F()rx  ra  r  r  r{  r|  rt  rz  r  r~  r}  ru  )NNNr;  )r<   r=   r>   r?   r@   r`   ry  r  r  r  rj  r   r   rB   re   rf   s   @r3   rm  rm  t  s6    	 B; 42$
 r5   rm  F)decrypted_cachert  ru  rW  force_cachec                8  ^^^ U(       a   U(       d  U(       d  U(       a  [        S5      eU(       a7  Um[        R                  " S5      m[        S5      mUU4S jnUU4S jnU4S jn[	        U [
        5      (       d  U(       a  [        XX45      $ [        X5      $ )a  
Return a Repository(No)Cache for *repository*.

If *decrypted_cache* is a key object, then get and get_many will return a tuple
(csize, plaintext) instead of the actual data in the repository. The cache will
store decrypted data, which increases CPU efficiency (by avoiding repeatedly decrypting
and more importantly MAC and ID checking cached objects).
Internally, objects are compressed with LZ4.
z:decrypted_cache and pack/unpack/transform are incompatiblez=I8slz4c                 j   > U u  pTR                  U5      nTR                  U[        U5      5      U-   $ r   )compressrt  r   )r/   csize	decrypted
compressedcache_struct
compressors       r3   rt  cache_if_remote.<locals>.pack  s8    #E#,,Y7J$$UE*,=>KKr5   c                    > [        U 5      n TR                  U S TR                   5      u  pU TR                  S  nU[        U5      :w  a  [	        S5      eUTR                  U5      4$ )Nz)detected corrupted data in metadata cache)
memoryviewru  rz  r   r   
decompress)r/   r  checksumr  r  r  s       r3   ru  cache_if_remote.<locals>.unpack  so    d#D*11$7I8I8I2JKOEl//01J5,,$%PQQ*//
;;;r5   c                 B   > [        U5      nTR                  X5      nX#4$ r   )r)   decrypt)id_r/   r  r  rS  s       r3   rW  "cache_if_remote.<locals>.transform  s#    IEC.I##r5   )r  structStructr   r   rT  rm  rP  )	r   r  rt  ru  rW  r  r  r  rS  s	         @@@r3   cache_if_remoter    st     DFiUVV	}}V,&
	L
	<	$
 *.//;zCC 77r5   )Qr  rN  r   r  r   r*   r   r  r  r  r   rv  r\   r,   r   
subprocessr   r   r   r   r  r   	constantshelpersr	   r
   r   r   r   r   r   r   r   r   r   r   lockingr   r   r   r   r  r   r   r   r   r   r  r   r   algorithms.checksumsr   helpers.datastructr    r<   r  r	  r   r   r   r   r  r)  r4   r7   rD   rH   rL   rO   rS   rh   r   r   r   r'  rR  rT  r  rP  rm  r  r:   r5   r3   <module>r     s1        	     
     "     > >  ! ) )  %   : B B 0  " 2 ' 8	x	  [)1 sD& &u 
/ 
U 
u 
 
 u 4'  r	
 r ! 
 
8 h   " " Q b   D!	()u up B7tV  V rG0T Bm' m` 49tD\`ns '8r5   