
    q&fX                        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j0                  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&y)    N)_)binhex)errorpycompatrevlogsshpeerutilwireprotov1peer)hashutilprocutil   )	constantscontentstoremetadatastorec                     t        t        j                  |      j                               }t        j
                  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   /   sC    8==&--/0H77<<(2A,bAA    c                     t        t        j                  |       j                               }t        j
                  j                  ||      S Nr   )r   r   r   s      r   getlocalkeyr#   4   s3    8==&--/0H77<<"%%r    c                 B     G fdd|j                         |_         y )Nc                   |     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                 l    | j                  d      st        j                  d      fd}d|fS )N   x_rfl_getfiles5   configured remotefile server does not support getfilec                 v    | j                  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   s8    WWUA.
dt9++D$==r    s   files   nodecapabler   Abort)selfr   r1   r2   s    `` r   x_rfl_getfilez/peersetup.<locals>.remotefilepeer.x_rfl_getfile;   s;    << 01kkL  "D1699r    c                 `    | j                  d      st        j                  d      d }d|i|fS )Ns   x_rfl_getflogheadss:   configured remotefile server does not support getflogheadsc                 ,    | r| j                  d      S g S )N   
)r+   )r.   s    r   r2   zDpeersetup.<locals>.remotefilepeer.x_rfl_getflogheads.<locals>.decodeR   s    )*qwwu~22r    s   pathr4   )r7   r   r2   s      r   x_rfl_getflogheadsz4peersetup.<locals>.remotefilepeer.x_rfl_getflogheadsJ   s;    << 56kk, 
3 T?F**r    c                    |dk7  ry t         j                  | j                         vry t        | d      sy t         j                  | j
                  j                  vry |j                  d      }|r|g}ng }|j                  t         j                         | j
                  j                  r;dj                  | j
                  j                        }d|z   }|j                  |       | j
                  j                  r;dj                  | j
                  j                        }d|z   }|j                  |       dj                  |      |d<   y )Ns	   getbundle
_localrepos
   bundlecapsr*   s   includepattern=s   excludepattern=   ,)r   NETWORK_CAP_LEGACY_SSH_GETFILEScapabilitieshasattrSHALLOWREPO_REQUIREMENTr>   requirementsgetappendBUNDLE2_CAPABLITYincludepatternr   excludepattern)r7   commandopts
bundlecapspatterns
includecap
excludecaps          r   _updatecallstreamoptsz7peersetup.<locals>.remotefilepeer._updatecallstreamoptsW   s   ,&99((*+ 4.11334 -0J(\

 i99:-- ::doo&D&DE/(:
!!*--- ::doo&D&DE/(:
!!*-"&))J"7Dr    c                 J    | j                  ||       t        | 
  ||fi |S r"   )rP   super_sendrequest)r7   rJ   argsrK   	__class__remotefilepeers       r   rS   z.peersetup.<locals>.remotefilepeer._sendrequest   s4    &&w5;!% r    c                     t        |       }t        |d      s%| j                  |t        j                  |             t        |   |fi |S )NrS   )rR   rB   rP   r   byteskwargs_callstream)r7   rJ   rK   	supertyperU   rV   s       r   rY   z-peersetup.<locals>.remotefilepeer._callstream   sK    nd3I9n5**7H4H4H4NO:7KdKKr    )__name__
__module____qualname__r   	batchabler8   r<   rP   rS   rY   __classcell__)rU   rV   s   @r   rV   r&   :   sL    		"	"	: 
#	: 
	"	"
	+ 
#
	+&	8P		L 	Lr    rV   )rU   )uipeerrV   s     @r   	peersetuprb   9   s!    OL OLb $DNr    c                   0    e Zd ZdZd Zd Zd ZddZd Zy)	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                 J    d x| _         x| _        | _        d | _        d| _        y )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| _	        y )Ns   cache connection already openT)
rf   r   r6   r   r   popen4rg   rh   ri   rj   )r7   cachecommands     r   connectzcacheconnection.connect   sI    ::++a @ABB>Foo?
;
DJ
DO r    c                 ~   d }| j                   r	 | j                  j                  d        || j                         d | _         || j                         d | _         || j
                         d | _        	 | j                  j                          d | _        d| _         y # t        $ r Y w xY w# t        $ r Y )w xY w)Nc                 D    	 | j                          y # t        $ r Y y 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    	 >>

  + TZZ DJTZZ DJTZZ DJ ++- #DO!    s#   B! 8B0 !	B-,B-0	B<;B<c                     | j                   r:	 | j                  j                  |       |r| j                  j                          y y y # t        $ r | j                          Y y w xY wr"   )rj   rg   rw   flushIOErrorrs   )r7   requestrz   s      r   r|   zcacheconnection.request   sW    >>

  )JJ$$&  
  

s   7A A$#A$c                     | j                   sy 	 | j                  j                         d d }|s| j                          |S # t        $ r | j                          Y S w xY w)N)rj   rf   readliners   r{   )r7   results     r   receivelinezcacheconnection.receiveline   s\    ~~	ZZ((*3B/F

   	JJL	s   /A   AANT)	r[   r\   r]   __doc__rl   rp   rs   r|   r    r    r   rd   rd      s     

8
r    rd   c                    | j                         5 }g }|D ],  }|j                  |j                  d||   |dd  d             . t        |      D ]Y  \  }	}||	   j	                         }
d ||	<   ||   }|dd  } |t        j                  dt        |
      |
fz        ||        |        [ 	 d d d        y # 1 sw Y   y xY w)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1ST7&K	 f% 	DAq
!!#AGAJ!HEST7D2::i3q61+&=>tLN	  s   BB66B?c                    | j                  d       d}| j                  }| j                  }|t        |      k  r|}	t	        t        |      |	|z         }
|
}||	|
 D ]$  }|dd  }||   }d||fz  }|j                  |       & |j                          ||	|
 D ]  }|dd  }||   } ||||        |         |t        |      k  r|j                  d       |j                          y )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      s    ()	AMMEMME
c&k/#f+ut|,c* 	$I!#$I#D"i%66JKK
#	$ 	  c* 	I!#$I#D5$	2N		 c&k/* 
KK	KKMr    c                 j   | j                  d       | j                  | j                  }fd}t        j                  |      }d|_        |j                          D ]  }	|	dd  }
|	   } ||||
        |         |j                          j                  d       j                          y )Nr   c                  x    D ]$  } | dd  }|    }d||fz  }j                  |       & j                          y )Nr   r   )rw   rz   )r   r   r   r   r   r   rf   s       r   writerz"_getfiles_threaded.<locals>.writer  sM     	$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     ()MMEMME ##62LL 	cdO	YudI.	 	KK	KKMr    c                   P    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y)fileserverclientz:A client for requesting files from the remote file server.c                 @   |j                   }|| _        || _         |j                  dd      | _        | j                  r$t	        j
                  | j                        | _        |j                  dd      | _        |j                  dd      | _        t               | _
        y )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    WW	II&6H $0A0A BD %'MM9%
! ==)98D*,r    c                 <    || _         || _        || _        || _        y r"   )	datastorehistorystore	writedatawritehistory)r7   r   r   r   r   s        r   setstorezfileserverclient.setstoreF  s     "("(r    c                 t    | j                   j                  j                  | j                   j                        S r"   )r   connectionpoolrE   fallbackpathrk   s    r   _connectzfileserverclient._connectL  s'    yy''++DII,B,BCCr    c           	      	   | j                   j                  s| j                          | j                   }| j                  }| j                  }t        |      }d|z  }i }|j                  }|D ]3  \  }	}
t        ||	|
      }| j                  r||	dz   z  }||dz   z  }|	||<   5 |j                  |       | j                  j                  t        d      |      }|j                  d       g }	 |j                         }|sMt        |      }|D ]  }||vs|j!                  |        | j                  j#                  t        d             nX|dk(  rnR|j%                  d	      r/|j'                  d
      }|j)                  t+        |d                |j!                  |       t,        t        |      z  a|t        |      z
  }|j                  ||       | j                  j/                  dd||||       t1        j2                  d      }	 |r| j                  j4                  }d| j                  _        	 | j7                         5 }|j8                  }|j;                  t<        j>                        rtA        |tB              stE        jF                  d      | j                  jI                  dd      }| j                  jK                  dd      }|dk(  rtL        }ntN        } ||| jP                  |j(                  |||       n|j;                  d      r|j;                  d      rd}nd}| j                  jI                  dd|      }| j                  jS                  dt        |      z         tU        || jP                  |j(                  |||       ntE        jF                  d      ddd       | j                  j/                  dd|jV                  |z
  ||z
         	 || j                  _        d t        |      dj[                  |      fz  }|j                  |       |j]                          |j_                  | j                  j`                         t1        j2                  |       y# 1 sw Y   xY w# tX        $ r1 | j                  j/                  dd|jV                  |z
  ||z
          w xY w# || j                  _        w xY w# t1        j2                  |       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   s@   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    ))LLN  NN	yyG&99 	!HD" 44F((4%<'v~%G E&M	! 	g77''.(9'G))+IK	!& 1I$	1i01 6 D ##I.!-""3uQx=1MM)$- 2 	s6{"CK'		/2 	 	
 88E?W	 ''//"'E. 3D!%!>>%EE $.fj#A&+kk$I'" !" $(77#4#4 0/$D ,077>> 0/,L  ,{:,>	,@	% & $ 3 3 ( 2 2 & % $ $^^,<=%~~h7/2/1(,(9(9 0,)I !GGMM!=?B6{!K + & $ 3 3 ( 2 2 & % ) #(++!C# a3j GGKK-$&.llY&>',y'8	    '.DGGO*c&k5::f;M-NNg& tyy~~.HHX]3 3v ! GGKK-!&.llY&>',y'8	     '.DGGO HHXsJ   *S 8Q: E"Q.*7Q: "A6S .Q73Q: ::R44R7 7S

S S$c                    |j                         d d }|s(t        j                  t        d      t        d            t	        |      }|j                  |      }t        |      |k7  r6t        j                  t        d      t        d      t        |      |fz        | j                  j                  |t        |      t        j                  |             y )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#%%56,-  4yyyt9%%5612c$i5FF 
 	++c$i!6	
r    c                     | j                   rAd| j                   | j                  j                  fz  }| j                  j	                  |       y  G d d      } |       | _        y )Ns   %s %sc                   &    e Zd Zd Zd ZddZd Zy)-fileserverclient.connect.<locals>.simplecachec                      g | _         d| _        y )NT)
missingidsrj   rk   s    r   rl   z6fileserverclient.connect.<locals>.simplecache.__init__	  s    &(DO%)DNr    c                      y r"   r   rk   s    r   rs   z3fileserverclient.connect.<locals>.simplecache.close  s    r    c                     |j                  d      }|d   dk7  ry |dd | _        | j                  j                  d       y )Nr;   r   s   getr   r~   r   )r+   r   rF   )r7   valuerz   liness       r   r|   z5fileserverclient.connect.<locals>.simplecache.request  s>    !KK.EQx6)&+AbkDOOO**40r    c                 j    t        | j                        dkD  r| j                  j                  d      S y )Nr   )r   r   poprk   s    r   r   z9fileserverclient.connect.<locals>.simplecache.receiveline  s+    4??+a/#22155r    Nr   )r[   r\   r]   rl   rs   r|   r   r   r    r   simplecacher     s    *1 r    r  )r   r   _pathr   rp   )r7   cmdr  s      r   rp   zfileserverclient.connect  sT    d//1E1E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                  |       | j                  j                  d|j                  dd      t        t         t        t        dz         | j                  j                  r| j                  j                          y y )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!GGKK)D%(%,%,)4'04'7   %%""$ &r    c                    | j                   }g }|D ]F  \  }}|dk(  st        |      dk(  s|j                  |      s+|j                  |t	        |      f       H | j
                  }	| j                  }
|r8t        j                  |j                   }	t        j                  |j                   }
t               }|r |j                  |	j                  |             |r |j                  |
j                  |             t        |D cg c]!  \  }}|| j                   j                   k(  s d# c}}      }|rP|D cg c]#  \  }}|| j                   j                   k7  s ||f% }}}|j"                  j%                  d|z  d       |r+t&        dz  at&        dk\  r^t&        d	k  rUt&        dk(  r<| j"                  j)                  d
d      }|r| j"                  j+                  |dz          | j-                          t/        |      D cg c]  \  }}|t1        |      f }}}t2        t        |      z  at5        j4                         }| j7                  |      }|r*t9        j:                  t=        d      t        |      z        t>        t5        j4                         |z
  z  a| jA                  |       yyc c}}w c c}}w c c}}w )z.downloads the given file versions to the caches   .hgtags*   NsD   remotefilelog not fetching %d null revs - this is likely hiding bugss   remotefilelog-ext)r   r         r   s   fetchwarningr;   s   unable to download %d files)!r   r   shallowmatchrF   r   r   r   r   unioncontentstoreshareddatastoresr   unionmetadatastoresharedhistorystoresr   r   
getmissingnullidr`   	develwarnr
  r   r   logstacktracesortedr   r  timer|   r   r6   r   r  _lfsprefetch)r7   r   force	fetchdatafetchhistoryr   
idstocheckr   r   r   r   r   unusednullidsffetchwarningr   s                    r   prefetchzfileserverclient.prefetch8  s    yy
 	/HD" 
"r7b=((.tSWo.	/ NN	(($668M8MNI(;;))L U
i22:>?l55jAB $.Ijfb"		8H8H2HTI
 %/!Ar29I9I3IBJ  GG57>? ,   qLG "}2b=#'77>>(/$L $\E%9:""$:@:LMhdB4R/MJMs:&GIIKEj1Jkk45JG  u,,Ig&/  J0 Ns   !J3
&J3
9!J9J9J?c                   
 t         r t        | j                  j                  d      sy t         j                  j                  | j                        sy g }| j                  j                  j                  
|D ]  \  }}t        |      }| j                  j                  |      }|j                  |      t        j                  z  sO|j                  |      }t         j                  j                  |      }|j                         }	
j!                  |	      r|j#                  |        t%        |      dkD  rG| j                  j                  j&                  j)                  |
       t+        
fd|D              sJ y y )Nlfslocalblobstorer   c              3   \   K   | ]#  }j                  |j                                % y wr"   )hasoid).0pstores     r   	<genexpr>z0fileserverclient._lfsprefetch.<locals>.<genexpr>  s      <auyy)<s   ),)_lfsmodrB   r   svfswrappercandownloadr*  r   r   flagsr   REVIDX_EXTSTOREDrawdatapointerdeserializer-  r,  rF   r   lfsremoteblobstore	readbatchall)r7   r   pointersr   r   r1   rlogtextr/  r-  r0  s             @r   r  zfileserverclient._lfsprefetch  s   gdiinn6IJ**4995		00 	'HD"r7D99>>$'Dzz$&"9"99||D)OO//5eegyy~OOA&	' x=1IINN--77%H<8<<<< r    c           	          dd l }| j                  j                  dddj                  d |j	                         D                     y )Nr   r   s"   excess remotefilelog fetching:
%s
r    c              3   F   K   | ]  }t        j                  |        y wr"   )r   sysbytes)r.  ss     r   r1  z1fileserverclient.logstacktrace.<locals>.<genexpr>  s     LaX&&q)Ls   !)	tracebackr`   r   r   format_stack)r7   rE  s     r   r  zfileserverclient.logstacktrace  s6    3HHL93I3I3K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  sC    D-$)D[z
&->%6 BG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   r2  r   r#   rb   rd   r   r   r   r   r   r    r   <module>rM     s    
 	     # 
  
 	


B
&
R$jB BJ>@>m
 m
r    