
    6h8                        S SK Jr  S SKrS SKrS SKrS SKrS SKJr  S SKJ	r	J
r
  S SKJrJrJrJrJrJrJrJrJrJrJrJrJr  SSKJrJr  \R8                  rS rS	qS
 r S r!S r"S r#S r$S r%S r&g)    )annotationsN)_)binhex)changegroup	changelogcontexterror
extensionsmatchscmutilstorestreamcloneutilwireprotoserverwireprototypeswireprotov1server   )	constantsshallowutilc                t   ^ [        U 5        U4S jn[        R                  " [        R                  SU5        g)zGSets up a normal Mercurial repo so it can serve files to shallow repos.c                \  > UR                   =(       d    / n[        R                  U;   a  S n	S n
UR                   =(       d    /  Hm  nUR                  S5      (       a  U[	        S5      S  R                  S5      n	M8  UR                  S5      (       d  MP  U[	        S5      S  R                  S5      n
Mo     [        R                  " 5       nU	(       d  U
(       a#  [        R                  " TR                  SS X5      nU Vs/ s H  o" U5      (       a  M  UPM     nnU " XX4U/UQ70 UD6$ s  snf )Ns   includepattern=    s   excludepattern=    )	_bundlecapsr   BUNDLE2_CAPABLITY
startswithlensplitr   alwaysroot)origselfchangedfiles	linknodes
commonrevssourceargskwargscapsincludepatternexcludepatterncapmfrepos                 I/usr/lib/python3/dist-packages/hgext/remotefilelog/remotefilelogserver.pygeneratefiles"setupserver.<locals>.generatefiles-   s    %2&&$.!N!N''-2->>"455%(-?)@)B%C%I%I%%PN^^$677%(-?)@)B%C%I%I%%PN	 . AKKIIsD. (4@|!1Q4A|L@	v
@D
HN
 	
 As   ?D)D)r2   N)onetimesetupr   wrapfunctionr   cgpacker)uir0   r2   s    ` r1   setupserverr8   (   s-    
2 o}r   Fc                Z  ^ ^ [         (       a  gSq [        R                  " SSSS9" [        5        [        R                  " SSSS9" [        5        [        R                  " S	S
SS9" [
        5         " S S5      nU" 5       mU4S jnUS4[        R                  S'    SU4S jjn[        R                  " [        SU5        U 4S jn[        R                  " [        SU5        S n[        R                  " [        R                  SU5        S n[        R                  " [        SU5        g)z9Configures the wireprotocol for both clients and servers.NT   x_rfl_getflogheadss   paths   pull)
permission   x_rfl_getfilesr      x_rfl_getfiles	   file nodec                       \ rS rSrSrSrSrSrg)!onetimesetup.<locals>.streamstate`   NF )__name__
__module____qualname____firstlineno__r   shallowremotenoflatmf__static_attributes__rA   r   r1   streamstater?   `   s    r   rI   c                  >^
^^ S nS nUR                  S5      nU(       a  UR                  S5      nUR                  S5      nU(       a  UR                  S5      nTR                  nTR                  nTR                  n STl        [        R
                  " 5       Tl        UR                  S5      S:H  Tl        U(       d  U(       a(  [        R                  " U R                  SS X45      Tl        [        R                  " X5      m[        TR                  5      m
[        TR                  5      mU
UU4S jn	[        R                  " U	" 5       5      UTl        UTl        UTl        $ ! UTl        UTl        UTl        f = f)	Ns   includepatternr   s   excludepatternTs   noflatmanifests   Truer   c               3  J   >#    T v   Tv   TR                    S h  vN   g  N7fN)gen)firstsecond	streamress   r1   rM   5onetimesetup.<locals>.stream_out_shallow.<locals>.gen   s     $==((s   #!#)getr   rF   r   rG   r    r!   r   streamnextrM   r   rP   )r0   protootherr+   r,   raw
oldshallowoldmatcholdnoflatmfrM   rN   rO   rP   states             @@@r1   stream_out_shallow(onetimesetup.<locals>.stream_out_shallowg   s3   ii)* YYu-Nii)* YYu-N((
;;nn	)"&E,,.EK"YY'89WDEN#kkIIsD. *00=I 'E)--(F)
 "++CE2",E"EK(EN #-E"EK(ENs    CE( (E?   *s   stream_out_shallowc              3  ,  >#    TR                   (       Ga  [        R                  " U5      (       Gag  [        UR                  R
                  5      S-   nUR                  R                  R                  n[        R
                  R                  UR                  R
                  S5      /nU(       a  UR                  5       nU" USS9 H  u  pnUS-   U	-   nU
[        R                  :X  a|  UR                  S5      (       df  UR                  S5      (       dP  [        R                  " XS  5      n[        R                   " U5      n[        R"                  " USUR$                  S	9v   U
[        R&                  :X  d  M  UR)                  U5        M     U(       a  M  [*        R,                  " U5      (       aK  UR                  R/                  5        H-  nUR0                  (       d  M  UR2                  (       d  M)  Uv   M/     TR4                  nU(       ap  UR6                  " 5       (       dZ  UR                  R/                  5        H<  nUR0                  (       d  M  TR5                  UR8                  5      (       a  M8  Uv   M>     UR                  R;                  5        H&  nTR<                  (       a  US   S S
 S:X  a  M"  Uv   M(     g [        R                  " U5      (       a  [>        R@                  " [C        S5      5      eU " XX4S9 H  nUv   M	     g 7f)Nr   s   dataT)stat   /s   .is   .dF)
entry_pathis_volatile	file_size   s   00manifest.s0   Cannot clone from a shallow repo to a full repo.)phaseobsolescence)"rF   r   	isenabledr   r   pathrawvfsreaddirosjoinpopr`   S_IFREGendswithr   pconvert	decodedirSimpleStoreEntryst_sizeS_IFDIRappendr   istreemanifestdata_entries	is_revlogis_manifestlogr   r    	target_idtop_entriesrG   r
   Abortr   )r"   r0   matcherrf   rg   striplenrk   visitpr/   kindstfpndentryr   xr[   s                     r1   _walkstreamfiles&onetimesetup.<locals>._walkstreamfiles   sL     $$T**tzz/!3**++33djjoow?@		A'.qt'<X\4<</#%;;u#5#5bkk %? ? %)MM"Y-$@$)OOA$6&+&<&</005.0jj'" !"  4<</!LL, (= e& %%d++!ZZ446E ?? +++#	 7 KKEU\\^^!ZZ446E ??  ;;u77#	 7 ZZ++->>ad3Bi>&A .
 ""4(( ++EF  U s!   E4L;LAL7A?L:BLr   c                (  > U " X5      n[         R                  " U5      (       d  TR                  SS5      (       aV  [        U[        5      (       a  UR                  [        R                  5        UR                  S5        UR                  S5        U$ )N   remotefilelog   serverr:   r=   )r   rh   
configbool
isinstance_sshv1serverrv   r   NETWORK_CAP_LEGACY_SSH_GETFILES)r"   r0   rU   r*   r7   s       r1   _capabilities#onetimesetup.<locals>._capabilities   ss    D   &&"--i+
 +
 %..IEEFKK-.KK()r   r   c                    UR                   n[        US5      (       aO  UR                  (       a>  UR                  R	                  UR                  R                  UR                  5      5      $ U " U/UQ70 UD6$ )Nforcelinkrev)_repohasattrr   _fileloglinkrevrev	_filenode)r"   r#   r(   r)   r0   s        r1   _adjustlinkrev$onetimesetup.<locals>._adjustlinkrev   s_     zz4((T->->==(():):4>>)JKKD*4*6**r   r   c                     US:X  a  gU " U5      $ )Nr<   FrA   )r"   cmds     r1   _iscmdonetimesetup.<locals>._iscmd   s    ##Cyr   iscmd)NFF)onetimer   wireprotocommandgetflogheadsgetfilesgetfilecommandsr   r5   r   r	   basefilectxr   )r7   rI   r\   r   r   r   r   r[   s   `      @r1   r4   r4   N   s    wG &&w7 &&37 &&,7 
 ME%)P 	945 =B<| K);=MN
 -N+ -~
 OWf=r   c                   [         R                  R                  X[        U5      5      n[         R                  R	                  U5      (       a$  [         R                  R                  U5      S:X  GaM  U R                  X#S9nUR                  5       U R                  :X  a4  [        R                  " U R                  5      U l	        U R                  X#S9n[        U5      n[        R                  " U5      n[         R                  " S5      n [         R                  R                  U5      n[         R                  R	                  U5      (       d   [         R                   " U5        S n	 [$        R&                  " US5      n	U	R)                  U5        U	(       a  U	R-                  5         [         R                  " U5        U$ [/        US5       n	U	R1                  5       nS S S 5        U$ ! ["         a     Nf = f! [*         a     Nrf = f! U	(       a  U	R-                  5         f f = f! [         R                  " U5        f = f! , (       d  f       W$ = f)Nr   )fileid   s   wbrb)rl   ri   rm   r   existsgetsizefilectxnodenullidr   svfscreatefileblobzlibcompressumaskdirnamemakedirsFileExistsErrorr   atomictempfilewriteOSErrorcloseopenread)
r0   	cachepathri   r   filecachepathr   textoldumaskr   r/   s
             r1   _loadfileblobr      s   GGLL#d)<M77>>-((BGGOOM,Ja,O,,t,1<<>T[[(&00;DNll4l5Gg&}}T" 88E?	ggoom4G77>>'**KK( A	''u= GGIHHX K -&!668D 'K' '    
 GGI  HHX&&Ksm   AH# G& %H# ((G6 H# H>&
G30H# 2G33H# 6
H H HH H  H# #H;>
Ic                |   ^  T R                  U5      nUR                  5       nSR                  U 4S jU 5       5      $ )z-A server api for requesting a filelog's heads   
c              3  \   >#    U  H!  oTR                   :w  d  M  [        U5      v   M#     g 7frL   )r   r   ).0headr0   s     r1   	<genexpr>getflogheads.<locals>.<genexpr>$  s"     IEDT[[5Hic$iiEs   ,,)fileheadsrm   )r0   rU   ri   flogr   s   `    r1   r   r      s0    99T?DJJLE::IEIIIr   c                ^   [         R                  " U 5      (       a  S[        S5      -   $ U R                  R	                  SS5      nU(       d*  [
        R                  R                  U R                  S5      n[        UR                  5       5      nX0R                  :X  a  gS[        XX#5      -   $ )aN  A server api for requesting a particular version of a file. Can be used
in batches to request many files at once. The return protocol is:
<errorcode> <data/errormsg> where <errorcode> is 0 for success or
non-zero for an error.

data is a compressed blob with revlog flag and ancestors information. See
createfileblob for its content.
s   1 +   cannot fetch remote files from shallow repor      servercachepath   remotefilelogcaches   0 )r   rh   r   r7   configrl   ri   rm   r   stripr   r   )r0   rU   r   r   r   s        r1   r   r   '  s     T""HIII/1CDIGGLL,AB	tzz|D{{M$4>>>r   c                &  ^ ^ [         R                  " T 5      (       a  [        R                  " [	        S5      5      e[        T[        5      (       d  [        R                  " [	        S5      5      eUU 4S jn[        R                  " U" 5       5      $ )zDA server api for requesting particular versions of particular files.r   s/   cannot fetch remote files over non-ssh protocolc               3    >#    TR                   n TR                  R                  SS5      nU(       d*  [        R                  R                  TR                  S5      n U R                  5       S S nU(       d  g [        US S 5      nUTR                  :X  a  Sv   M@  USS  n[        TXU5      nS[        U5      U4-  v   TR                  R                  5         M  7f)Nr   r   r   (   s   0
s   %d
%s)_finr7   r   rl   ri   rm   readliner   r   r   r   _foutflush)finr   requestr   ri   r   rU   r0   s         r1   streamergetfiles.<locals>.streamerB  s     jjGGNN#35GH	TYY0EFIllnSb)Gws|$Dt{{"23<D y=Ds4y$/// KK% s   CC)	r   rh   r
   r}   r   r   r   r   rP   )r0   rU   r   s   `` r1   r   r   ;  se    T""kk!JKLLe\**kk!NOPP 6 ##HJ//r   c                R   U R                  5       nU R                  5       nUR                  R                  U5      nUS:X  a  U R	                  5       nOUR                  U5      nU R                  nU /n SUl        UR                  U R                  5        Vs/ s H  owPM     sn5        SnU H  n	U	R                  5       n
UR                  nUR                  n[        U
5      S:  a  U
S   R                  5       n[        U
5      S:  a  U
S   R                  5       nSnU	R                  5       nU(       a  US   nU	R                  5       nUSU	R                  5       UUUU4-  -  nM     SUl        [         R"                  " [        U5      U5      nSUXH4-  $ s  snf ! SUl        f = f)a  
    format:
        v0:
            str(len(rawtext)) + ' ' + rawtext + ancestortext
        v1:
            'v1' + '
' + metalist + ' ' + rawtext + ancestortext
            metalist := metalist + '
' + meta | meta
            meta := sizemeta | flagmeta
            sizemeta := METAKEYSIZE + str(len(rawtext))
            flagmeta := METAKEYFLAG + str(flag)

            note: sizemeta must exist. METAKEYFLAG and METAKEYSIZE must have a
            length of 1.
    r   Tr   r   s   %s%s%s%s%s Fs   %s %s%s)filelogfilerev_revlogflagsdatarawdatar   r   extend	ancestorsparentsr   r   filenoderenamedr   r   buildfileblobheader)r   r   frevrevlogflagsr   r0   r   r/   ancestortextancestorctxr   p1p2copynamerenamelinknodeheaders                    r1   r   r   `  s    ??D??D,,$$T*Ka||~ ||D!==D	I" W%6%6%89%8!%89:$K!))+GBB7|aQZ((*7|aQZ((*H ((*F!!9"'')HO$$&/  L %, ",,SYDF&$555; :2 "s   4$F F#CF F 	F&c           	        UR                   R                  SS5      (       d  g [        5       nUR                  S5      nUR                  R                  S5      nU Hh  nX   R                  5       nUR                  5        H?  u  px[        R                  R                  XG[        U5      5      n	UR                  U	5        MA     Mj     UR                   R                  SS5      n
[        R                  " 5       U
S-  S-  S-  -
  nU R                  [        S5      S	S
9nUR!                  S5        [        R"                  " U5       H  u  pnU Hy  n[        R                  R                  UU5      nUR%                  5         UU;   a  M;  [        R&                  " U5      nUR(                  U:  d  Mc  [        R*                  " U5        M{     M     UR-                  5         g )Nr   r   s   heads(tip~25000:) - nullr   s   serverexpiration   <   s   removing old server caches   files)unitr   )r7   r   setrevsvfsrm   manifestitemsrl   ri   r   add	configinttimemakeprogressr   updatewalk	incrementr`   st_mtimeremovecomplete)r7   r0   neededfilesr   r   r   mffilenamer   r   days
expirationprogressr!   dirsfilesr   filepathr`   s                      r1   gcserverr    ss   77.	::%KII12E34IZ  ""$((*HGGLLc(mLMOOM* #-  77-/BCDr	B 34Jq!=>XNHOOAWWY/EDww||D$/H ;&778$D}}z)		(#  0 r   )'
__future__r   rl   r`   r  r   mercurial.i18nr   mercurial.noder   r   	mercurialr   r   r	   r
   r   r   r   r   r   r   r   r   r    r   r   sshv1protocolhandlerr   r8   r   r4   r   r   r   r   r   r  rA   r   r1   <module>r     sx    # 	     #   
 33 F f>R&RJ?("0J<6~r   