
    	^cX                        d dl Z d dlZd dl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 d dlmZmZ ddlmZmZmZ ej        Zd ad ad ad adZd Zd	 Z d
 Z! G d d          Z"d Z#d Z$d Z% G d d          Z&dS )    N)_)binhex)errorpycompatrevlogsshpeerutilwireprotov1peer)hashutilprocutil   )	constantscontentstoremetadatastorec                     t          t          j        |                                                    }t          j                            | |d d         |dd          |          S )N   r   r   sha1digestospathjoin)reponamefileidpathhashs       F/usr/lib/python3/dist-packages/hgext/remotefilelog/fileserverclient.pygetcachekeyr   /   sO    8=&&--//00H7<<(2A2,bAAA    c                     t          t          j        |                                                     }t          j                            ||          S Nr   )r   r   r   s      r   getlocalkeyr#   4   s;    8=&&--//00H7<<"%%%r    c                 @     G fdd|j                   |_         d S )Nc                   t     e Zd Zej        d             Zej        d             Zd Z fdZ fdZ	 xZ
S )!peersetup.<locals>.remotefilepeerc                 r    |                      d          st          j        d          fd}d|fS )N   x_rfl_getfiles5   configured remotefile server does not support getfilec                     |                      dd          \  }}t          |          rt          j        |          |S )N    r   )splitintr   LookupError)dcodedatar   nodes      r   decodez?peersetup.<locals>.remotefilepeer.x_rfl_getfile.<locals>.decodeB   sB    WWUA..
dt99 >+D$===r    s   files   nodecapabler   Abort)selfr   r1   r2   s    `` r   x_rfl_getfilez/peersetup.<locals>.remotefilepeer.x_rfl_getfile;   sc    << 011 kL        "D11699r    c                 f    |                      d          st          j        d          d }d|i|fS )Ns   x_rfl_getflogheadss:   configured remotefile server does not support getflogheadsc                 4    | r|                      d          ng S )N   
)r+   )r.   s    r   r2   zDpeersetup.<locals>.remotefilepeer.x_rfl_getflogheads.<locals>.decodeR   s    )*2qwwu~~~2r    s   pathr4   )r7   r   r2   s      r   x_rfl_getflogheadsz4peersetup.<locals>.remotefilepeer.x_rfl_getflogheadsJ   sP    << 566 k,  
3 3 3 T?F**r    c                 x   |dk    rd S t           j        |                                 vrd S t          j        | d          sd S t           j        | j        j        vrd S |                    d          }|r|g}ng }|	                    t           j
                   | j        j        r9d                    | j        j                  }d|z   }|	                    |           | j        j        r9d                    | j        j                  }d|z   }|	                    |           d                    |          |d<   d S )Ns	   getbundle
_localrepos
   bundlecapsr*   s   includepattern=s   excludepattern=   ,)r   NETWORK_CAP_LEGACY_SSH_GETFILEScapabilitiesr
   safehasattrSHALLOWREPO_REQUIREMENTr>   requirementsgetappendBUNDLE2_CAPABLITYincludepatternr   excludepattern)r7   commandopts
bundlecapspatterns
includecap
excludecaps          r   _updatecallstreamoptsz7peersetup.<locals>.remotefilepeer._updatecallstreamoptsW   sO   ,&&9((**+ + #D,77 134 4 -00J  (\


 i9:::- . ::do&DEE/(:
!!*---- . ::do&DEE/(:
!!*---"&))J"7"7Dr    c                 j    |                      ||            t          |           j        ||fi |S r"   )rP   super_sendrequest)r7   rJ   argsrK   	__class__remotefilepeers       r   rS   z.peersetup.<locals>.remotefilepeer._sendrequest   sL    &&w555;5..; !%  r    c                     t          |           }t          j        |d          s(|                     |t	          j        |                      t          |           j        |fi |S )NrS   )rR   r
   rB   rP   r   byteskwargs_callstream)r7   rJ   rK   	supertyperU   rV   s       r   rY   z-peersetup.<locals>.remotefilepeer._callstream   sn    nd33I#I~>> P**7H4H4N4NOOO:5..:7KKdKKKr    )__name__
__module____qualname__r   	batchabler8   r<   rP   rS   rY   __classcell__)rU   rV   s   @r   rV   r&   :   s        		"	: 	: 
#	"	: 
	"
	+ 
	+ 
#	"
	+&	8 &	8 &	8P	 	 	 	 	 		L 	L 	L 	L 	L 	L 	L 	L 	L 	Lr    rV   )rU   )uipeerrV   s     @r   	peersetuprb   9   s[    OL OL OL OL OL OL OL OL OL OLb $DNNNr    c                   2    e Zd ZdZd Zd Zd Zd	dZd ZdS )
cacheconnectionzThe connection for communicating with the remote cache. Performs
    gets and sets by communicating with an external process that has the
    cache-specific implementation.
    c                 L    d x| _         x| _        | _        d | _        d| _        d S )NF)pipeopipeipipee
subprocess	connectedr7   s    r   __init__zcacheconnection.__init__   s)    /33
3TZ$*r    c                     | j         r!t          j        t          d                    t	          j        |          \  | _        | _         | _        | _        d| _	        d S )Ns   cache connection already openT)
rf   r   r6   r   r   popen4rg   rh   ri   rj   )r7   cachecommands     r   connectzcacheconnection.connect   sX    : 	C+a @AABBB>Fo?
 ?
;
DJ
DO r    c                 n   d }| j         r	 | j                            d           n# t          $ r Y nw xY w || j                   d | _         || j                   d | _         || j                   d | _        	 | j                                         n# t          $ r Y nw xY wd | _        d| _         d S )Nc                 R    	 |                                   d S # t          $ r Y d S w xY wr"   )close	Exception)pipes    r   tryclosez'cacheconnection.close.<locals>.tryclose   s:    

   s    
&&s   exit
F)rj   rg   writert   rf   rh   ri   communicate)r7   rv   s     r   rs   zcacheconnection.close   s    	 	 	 > 	#
  ++++   HTZ   DJHTZ   DJHTZ   DJ ++----   "DOs   ' 
44=B 
B$#B$Tc                     | j         r_	 | j                            |           |r| j                                         d S d S # t          $ r |                                  Y d S w xY wd S r"   )rj   rg   rw   flushIOErrorrs   )r7   requestrz   s      r   r|   zcacheconnection.request   s    > 	
  ))) 'J$$&&&&&' '   

	 	s   5A A$#A$c                     | j         sd S 	 | j                                        d d         }|s|                                  n$# t          $ r |                                  Y nw xY w|S )N)rj   rf   readliners   r{   )r7   results     r   receivelinezcacheconnection.receiveline   s{    ~ 	4	Z((**3B3/F 

 	 	 	JJLLLLL	 s   7A A$#A$NT)	r[   r\   r]   __doc__rl   rp   rs   r|   r    r    r   rd   rd      sn         
  
    8   
 
 
 
 
r    rd   c                    |                                  5 }g }|D ]<}|                    |                    d||         |dd          d                     =t          |          D ]q\  }	}||	                                         }
d ||	<   ||         }|dd          } |t          j        dt          |
          |
fz            ||            |             r	 d d d            d S # 1 swxY w Y   d S )Nr(   r3   s   %d
%s)commandexecutorrF   callcommand	enumerater   ioBytesIOlen)remotereceivemissingprogresstickmissedidmap	batchsizeefuturesmirfile_r1   s                r   _getfilesbatchr      s`    
			!	! Q 	 	ANN$a1STT7&K&K     f%% 	 	DAq
!!##AGAJ!HESTT7DN2:i3q661+&=>>tLLLLNNNN	                 s   CC&&C*-C*c                 @   |                      d           d}| j        }| j        }|t          |          k     r|}	t	          t          |          |	|z             }
|
}||	|
         D ]0}|dd          }||         }d||fz  }|                    |           1|                                 ||	|
         D ]+}|dd          }||         } ||||            |             ,|t          |          k     |                    d           |                                 d S )N   x_rfl_getfilesr   r      %s%s
r;   )rY   _pipeo_pipeir   minrw   rz   )r   r   r   r   r   stepr   rf   rg   startend	missingid	versionidr   
sshrequests                  r   _getfiles_optimisticr      sF    ()))	AMEME
c&kk//#f++ut|,,c	* 	$ 	$I!#$$I#D"i%66JKK
####  c	* 	 	I!#$$I#DN5$	222LNNNN% c&kk//* 
KK	KKMMMMMr    c                    |                      d           | j        | j        }fd}t          j        |          }d|_        |                                 D ]+}	|	dd          }
|	         } ||||
            |             ,|                                                     d           	                                 d S )Nr   c                      D ]0} | dd          }|          }d||fz  }                     |           1                                 d S )Nr   r   )rw   rz   )r   r   r   r   r   r   rf   s       r   writerz"_getfiles_threaded.<locals>.writer  s^     	$ 	$I!#$$I#D"i%66JKK
####r    )targetTr   r;   )
rY   r   r   	threadingThreaddaemonr   r   rw   rz   )r   r   r   r   r   r   rg   r   writerthreadr   r   r   rf   s      ``       @r   _getfiles_threadedr     s     ()))MEME       #6222LL  	cddO	YudI...	KK	KKMMMMMr    c                   R    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
	 ddZd Zd ZdS )fileserverclientz:A client for requesting files from the remote file server.c                 B   |j         }|| _        || _         |                    dd          | _        | j        rt	          j        | j                  | _        |                    dd          | _        |                    dd          | _        t                      | _
        d S )N   remotefilelogs   cacheprocesss   cacheprocess.includepaths   debug)r`   repoconfigcacheprocessr
   
expandpath
configboolcacheprocesspasspathdebugoutputrd   remotecache)r7   r   r`   s      r   rl   zfileserverclient.__init__4  s    W	II&6HH 	C $0A B BD %'MM9%
 %
! ==)98DD*,,r    c                 >    || _         || _        || _        || _        d S r"   )	datastorehistorystore	writedatawritehistory)r7   r   r   r   r   s        r   setstorezfileserverclient.setstoreF  s&    "("(r    c                 T    | j         j                            | j         j                  S r"   )r   connectionpoolrE   fallbackpathrk   s    r   _connectzfileserverclient._connectL  s     y'++DI,BCCCr    c           	      	   | j         j        s|                                  | j         }| j        }| j        }t          |          }d|z  }i }|j        }|D ]2\  }	}
t          ||	|
          }| j        r||	dz   z  }||dz   z  }|	||<   3|	                    |           | j
                            t          d          |          }|                    d           g }	 |                                }|sUt          |          }|D ]}||vr|                    |           | j
                            t          d                     np|d	k    rni|                    d
          r>|                    d          }|                    t+          |d                              |                    |           t,          t          |          z  a|t          |          z
  }|                    ||           | j
                            dd||||           t1          j        d          }	 |r_| j
        j        }d| j
        _        	 |                                 5 }|j        }|                    t<          j                  rtA          |tB                    stE          j#        d          | j
        $                    dd          }| j
        %                    dd          }|dk    rtL          }ntN          } ||| j(        |j        |||           n|                    d          r|                    d          rd}nd}| j
        $                    dd|          }| j
        )                    dt          |          z             tU          || j(        |j        |||           ntE          j#        d          ddd           n# 1 swxY w Y   | j
                            dd|j+        |z
  ||z
             n8# tX          $ r+ | j
                            dd |j+        |z
  ||z
              w xY w	 || j
        _        n# || j
        _        w xY wd!t          |          d-                    |          fz  }|	                    |           |.                                 |/                    | j        j0                   t1          j        |           dS # t1          j        |           w xY w)"zTakes a list of filename/node pairs and fetches them from the
        server. Files are stored in the local cache.
        A list of nodes that the server couldn't find is returned.
        If the connection fails, an exception is raised.
        s   get
%d
r*   r;   s   downloading)totalr   Ts@   warning: cache connection closed early - falling back to server
   0s   _hits_   _r   r   s"   remote cache hit rate is %r of %r
)hitr   Fs"   remotefilelog requires ssh serverss   getfilessteps   getfilestypes   threadedr(   s   batchd   
   s	   batchsizes1   requesting %d files from remotefilelog server...
s>   configured remotefilelog server does not support remotefilelogNs   remotefilefetchlogs   Success
)fetched_filestotal_to_fetchs   Fail
s
   set
%d
%s
)1r   rj   rp   r   r   r   namer   r   r|   r`   makeprogressr   updater   setrF   warn
startswithr+   	incrementr,   fetchmisseslogr   umaskverboser   ra   r5   r   r@   
isinstance
_sshv1peerr   r6   	configintr   r   r   r   debugr   posrt   r   completemarkrepor   )r7   fileidscacher   r   r   r|   r   r   r   r   fullidprogressr   r   	missedsetparts	fromcacheoldumaskr   connr   r   getfilestype	_getfilesbatchdefaultr   s                              r   r|   zfileserverclient.requestO  s    ) 	LLNNN N	yG&9 	! 	!HD" 444F( (4%<'v~%G E&MMg7''.(9(9'GG	%))++I KK	!& 1 1I$	11i0006    D  ##I.. !--""3uQx==111MM)$$$-	%2 	s6{{"CKK'		///2 	 	
 	
 	
 8E??W	 N' '/"'E. 3D!%!>>%E  1 $.fj#A#A "&+k$I'" '" !" $(7#4#4 0/$ $D ,07>> 0/, ,L  ,{::,>		,@	%I & $ 3 ( 2 & % $    $^^,<== %~~h77 2/2/1(,(9(9 0,) )I !GMM!=?B6{{!K   + & $ 3 ( 2 & % )    #(+!C# # a3 3 3 3 3 3 3 3 3 3 3 3 3 3 3j GKK-$&.lY&>',y'8	       !   GKK-!&.lY&>',y'8	       '.DGOOgDGO----*c&kk5::f;M;M-NNg&&& ty~...HXBHXs\   .S 
O= EO<O= OO= O,O= <Q =5P22Q 6S QA2S S/c                    |                                 d d         }|s/t          j        t          d          t          d                    t	          |          }|                    |          }t          |          |k    rAt          j        t          d          t          d          t          |          |fz            | j                            |t          |          t          j        |                     d S )Nr~   s    error downloading file contents:s   connection closed earlys   only received %s of %s bytes)r   r   ResponseErrorr   r,   readr   r   addremotefilelognoder   zlib
decompress)r7   ru   filenamer1   linesizer0   s          r   r   zfileserverclient.receivemissing  s    }}ss# 	%566,--   4yyyyt99%566122c$ii5FF  
 	++c$ii!6!6	
 	
 	
 	
 	
r    c                     | j         r2d| j         | j        j        fz  }| j                            |           d S  G d d          } |            | _        d S )Ns   %s %sc                   (    e Zd Zd Zd ZddZd ZdS )-fileserverclient.connect.<locals>.simplecachec                 "    g | _         d| _        d S )NT)
missingidsrj   rk   s    r   rl   z6fileserverclient.connect.<locals>.simplecache.__init__	  s    &(DO%)DNNNr    c                     d S r"   r   rk   s    r   rs   z3fileserverclient.connect.<locals>.simplecache.close  s    Dr    Tc                     |                     d          }|d         dk    rd S |dd         | _        | j                            d           d S )Nr;   r   s   getr   r~   r   )r+   r   rF   )r7   valuerz   liness       r   r|   z5fileserverclient.connect.<locals>.simplecache.request  sR    !KK..EQx6))&+AbDkDOO**400000r    c                 j    t          | j                  dk    r| j                            d          S d S )Nr   )r   r   poprk   s    r   r   z9fileserverclient.connect.<locals>.simplecache.receiveline  s2    4?++a//#2215554r    Nr   )r[   r\   r]   rl   rs   r|   r   r   r    r   simplecacher     sU        * * *  1 1 1 1         r    r  )r   r   _pathr   rp   )r7   cmdr  s      r   rp   zfileserverclient.connect  s     	-d/1EFFC$$S)))))               (  +{}}Dr    c           	         t           rdt          t           t          t          t          t          z
            t          t                    z  dz  t          fz  }| j        r| j                            |           | j                            d|	                    dd          t          t           t          t          dz             | j
        j        r| j
                                         d S d S )NsN   %d files fetched over %d fetches - (%d misses, %0.2f%% hit ratio) over %0.2fs
g      Y@s   remotefilelog.prefetch   %s   %%i  )remotefilelogfetchedremotefilelogfetchesremotefilelogfetchmissesremotefilelogfetchtime)fetchesfetchedr   float	fetchcostr   r`   r   r   replacer   rj   rs   )r7   msgs     r   rs   zfileserverclient.close  s     	B g+,,uW~~=E	C  "S!!!GKK)D%((%,%,)4'04'7     % 	%""$$$$$	% 	%r    FTc                      j         }g }|D ]X\  }}|dk    s(t          |          dk    s|                    |          s4|                    |t	          |          f           Y j        }	 j        }
|r&t          j        |j	         }	t          j        |j         }
t                      }|r(|                    |	                    |                     |r(|                    |
                    |                     t           fd|D                       }|r- fd|D             }|j                            d|z  d           |r9t$          dz  at$          d	k    rdt$          d
k     rYt$          d	k    r: j                            dd          }|r j                            |dz                                                d t-          |          D             }t.          t          |          z  at1          j                    }                     |          }|r1t5          j        t9          d          t          |          z            t:          t1          j                    |z
  z  a                     |           dS dS )z.downloads the given file versions to the caches   .hgtags*   c                 :    g | ]\  }}|j         j        k    d S r"   r   nullid).0unusedr   r7   s      r   
<listcomp>z-fileserverclient.prefetch.<locals>.<listcomp>]  s,    IIIjfb"	8H2H2HT2H2H2Hr    c                 >    g | ]\  }}|j         j        k    ||fS r   r  )r  fr   r7   s      r   r  z-fileserverclient.prefetch.<locals>.<listcomp>`  s7       !Ar29I3I3IB3I3I3Ir    sD   remotefilelog not fetching %d null revs - this is likely hiding bugss   remotefilelog-ext)r   r         r   s   fetchwarningr;   c                 6    g | ]\  }}|t          |          fS r   )r   )r  r   r   s      r   r  z-fileserverclient.prefetch.<locals>.<listcomp>x  s&    MMMhdB4R/MMMr    s   unable to download %d filesN)r   r   shallowmatchrF   r   r   r   r   unioncontentstoreshareddatastoresr   unionmetadatastoresharedhistorystoresr   r   
getmissingr`   	develwarnr
  r   r   logstacktracesortedr  timer|   r   r6   r   r  _lfsprefetch)r7   r   force	fetchdatafetchhistoryr   
idstocheckr   r   r   r   r   nullidsfetchwarningr   s   `              r   prefetchzfileserverclient.prefetch8  s    y
 	/ 	/HD" 
""r77b==((.. ! tSWWo....N	( 	$68MNI(;)L UU
 	@i22:>>??? 	Cl55jAABBB IIIIJIII
 
  
	   %/  J G57>? ,      	'qLG "}}2b==#'7>>(/$ $L $ ;\E%9:::""$$$MM&:L:LMMMJs:&GIKKEj11J k455JG   u,,Ig&&&&&/	' 	'r    c                   
 t           rt          j        | j        j        d          sd S t           j                            | j                  sd S g }| j        j        j        
|D ]\  }}t          |          }| j        	                    |          }|
                    |          t          j        z  rr|                    |          }t           j                            |          }|                                }	
                    |	          s|                    |           t'          |          dk    rB| j        j        j                            |
           t-          
fd|D                       sJ d S d S )Ns   lfslocalblobstorer   c              3   f   K   | ]+}                     |                                          V  ,d S r"   )hasoid)r  pstores     r   	<genexpr>z0fileserverclient._lfsprefetch.<locals>.<genexpr>  s7      <<auyy))<<<<<<r    )_lfsmodr
   rB   r   svfswrappercandownloadlfslocalblobstorer   r   flagsr   REVIDX_EXTSTOREDrawdatapointerdeserializer2  r1  rF   r   lfsremoteblobstore	readbatchall)r7   r   pointersr   r   r1   rlogtextr3  r2  r4  s             @r   r'  zfileserverclient._lfsprefetch  sj    	d.IN0
 
 	 F**4955 	F	0 	' 	'HD"r77D9>>$''Dzz$&"99 '||D))O//55eeggyy~~ 'OOA&&&x==1IN-77%HHH<<<<8<<<<<<<< <<r    c           	          dd l }| j                            ddd                    d |                                D                                  d S )Nr   r   s"   excess remotefilelog fetching:
%s
r    c              3   >   K   | ]}t          j        |          V  d S r"   )r   sysbytes)r  ss     r   r5  z1fileserverclient.logstacktrace.<locals>.<genexpr>  s-      LLaX&q))LLLLLLr    )	tracebackr`   r   r   format_stack)r7   rJ  s     r   r$  zfileserverclient.logstacktrace  s`    3HHLL93I3I3K3KLLLLL	
 	
 	
 	
 	
r    N)FTF)r[   r\   r]   r   rl   r   r   r|   r   rp   rs   r.  r'  r$  r   r    r   r   r   1  s        DD- - -$) ) )D D D[ [ [z
 
 
&- - ->% % %6 BGI' I' I' I'V= = =,
 
 
 
 
r    r   )'r   r   r   r&  r   mercurial.i18nr   mercurial.noder   r   	mercurialr   r   r   r	   r
   r   mercurial.utilsr   r    r   r   r   	sshv1peerr   r  r
  r  r   r6  r   r#   rb   rd   r   r   r   r   r   r    r   <module>rR     s   
			 				             # # # # # # # #                      
          
 	


B B B
& & &
R$ R$ R$jB B B B B B B BJ  >  @  >o
 o
 o
 o
 o
 o
 o
 o
 o
 o
r    