
    q&f/9                         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
 d dlmZmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ ej8                  Zd Zd	ad
 Z d Z!d Z"d Z#d Z$d Z%d Z&y)    N)_)binhex)open)changegroup	changelogcontexterror
extensionsmatchscmutilstorestreamcloneutilwireprotoserverwireprototypeswireprotov1server   )	constantsshallowutilc                 p    t        |        fd}t        j                  t        j                  d|       y)zGSets up a normal Mercurial repo so it can serve files to shallow repos.c                    |j                   xs g }t        j                  |v rd }	d }
|j                   xs g D ]`  }|j                  d      r|t	        d      d  j                  d      }	2|j                  d      sD|t	        d      d  j                  d      }
b t        j                         }|	s|
r#t        j                  j                  dd |	|
      }|D cg c]  } ||      r| }} | |||||g|i |S c c}w )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generatefilesz"setupserver.<locals>.generatefiles,   s    %2&&$.!N!N''-2 Q>>"45%(-?)@)B%C%I%I%%PN^^$67%(-?)@)B%C%I%I%%PN	Q AKKIIsD.. (4@!1Q4A@L@,	:v
@D
HN
 	
 As   C>(C>r2   N)onetimesetupr   wrapfunctionr   cgpacker)uir0   r2   s    ` r1   setupserverr7   '   s-    
2 o}r   Fc                 L    t         ryda  t        j                  ddd      t                t        j                  ddd      t                t        j                  d	d
d      t
                G d d      } |       fd}|dft        j                  d<   	 dfd	}t        j                  t        d|        fd}t        j                  t        d|       d }t        j                  t        j                  d|       d }t        j                  t        d|       y)z9Configures the wireprotocol for both clients and servers.NT   x_rfl_getflogheadss   paths   pull)
permission   x_rfl_getfilesr      x_rfl_getfiles	   file nodec                       e Zd ZdZdZdZy)!onetimesetup.<locals>.streamstateNF)__name__
__module____qualname__r   shallowremotenoflatmf r   r1   streamstater>   _   s    r   rE   c                   
 d }d }|j                  d      }|r|j                  d      }|j                  d      }|r|j                  d      }j                  }j                  }j                  }	 d_        t        j
                         _        |j                  d      dk(  _        |s|r(t        j                  | j                  dd ||      _        t        j                  | |      t        j                        
t        j                        
fd}	t        j                   |	             |_        |_        |_        S # |_        |_        |_        w xY w)	Ns   includepatternr   s   excludepatternTs   noflatmanifests   Truer   c               3   H   K     j                   D ]  } |   y wN)gen)valuefirstsecond	streamress    r1   rI   z5onetimesetup.<locals>.stream_out_shallow.<locals>.gen   s)     &]]  EK s   ")getr   rB   r   rC   r    r!   r   streamnextrI   r   rM   )r0   protootherr+   r,   raw
oldshallowoldmatcholdnoflatmfrI   rK   rL   rM   states             @@@r1   stream_out_shallowz(onetimesetup.<locals>.stream_out_shallowf   s7   ii)* YYu-Nii)* YYu-N((
;;nn	)"&E,,.EK"YY'89WDEN#kkIIsD.. *00u=I 'E)--(F  "++CE2",E"EK(EN #-E"EK(ENs   6CE E(   *s   stream_out_shallowc              3   z  K   j                   rat        j                  |      rRt        |j                  j
                        dz   }|j                  j                  j                  }t        j
                  j                  |j                  j
                  d      g}|r|j                         } ||d      D ]  \  }	}
}|dz   |	z   }|
t        j                  k(  rs|j                  d      sb|j                  d      sQt        j                  ||d        }t	        j                   |      }t	        j"                  |d|j$                  	       |
t        j&                  k(  s|j)                  |        |rt+        j,                  |      r=|j                  j/                         D ]   }|j0                  s|j2                  s| " j4                  }|r] |j6                         sL|j                  j/                         D ]/  }|j0                  sj5                  |j8                        r,| 1 |j                  j;                         D ]  }j<                  r|d   d d
 dk(  r|   y t        j                  |      rt?        j@                  tC        d             | ||||      D ]  }|  y w)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)"rB   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_entriesrC   r
   Abortr   )r"   r0   matcherra   rb   striplenrf   visitpr/   kindstfpndentryr   xrW   s                     r1   _walkstreamfilesz&onetimesetup.<locals>._walkstreamfiles   sR     $$T*tzz/!3**++33djjoow?@		A'.qt'< -4X\4<</#%;;u#5bkk %? %)MM"XY-$@$)OOA$6&+&<&</005.0jj'" !"  4<</!LL,- & %%d+!ZZ446 $E ?? ++#	$ KKE\U\\^!ZZ446 $E ??  ;;u7#	$ ZZ++- >>ad3Bi>&A
 ""4( ++EF  gU  s!   EJ;#J;9AJ;A*J;0BJ;r   c                 
    | ||      }t        j                  |      sj                  dd      rQt        |t              r|j                  t        j                         |j                  d       |j                  d       |S )N   remotefilelog   serverr9   r<   )r   rc   
configbool
isinstance_sshv1serverrq   r   NETWORK_CAP_LEGACY_SSH_GETFILES)r"   r0   rQ   r*   r6   s       r1   _capabilitiesz#onetimesetup.<locals>._capabilities   sj    D%   &"--i+
 %.IEEFKK-.KK()r   r   c                     |j                   }t        |d      rJ|j                  r>|j                  j	                  |j                  j                  |j                              S  | |g|i |S )Nforcelinkrev)_repohasattrr   _fileloglinkrevrev	_filenode)r"   r#   r(   r)   r0   s        r1   _adjustlinkrevz$onetimesetup.<locals>._adjustlinkrev   s\     zz4(T->->==(():):4>>)JKKD*4*6**r   r   c                     |dk(  ry | |      S )Nr;   FrD   )r"   cmds     r1   _iscmdzonetimesetup.<locals>._iscmd   s    ##Cyr   iscmd)NFF)onetimer   wireprotocommandgetflogheadsgetfilesgetfilecommandsr   r4   r   r	   basefilectxr   )r6   rE   rX   r   r   r   r   rW   s   `      @r1   r3   r3   M   s#    G&&w7&&37&&,7 
 ME&)R 	945 =B<| K);=MN
 -N+ -~
 OWf=r   c                 x   t         j                  j                  ||t        |            }t         j                  j	                  |      r#t         j                  j                  |      dk(  rE| j                  ||      }|j                         | j                  k(  r7t        j                  | j                        | _	        | j                  ||      }t        |      }t        j                  |      }t        j                  d      }	 t         j                  j                  |      }t         j                  j	                  |      s	 t        j                   |       d }		 t%        j&                  |d      }	|	j)                  |       |	r|	j/                          	 t        j                  |       |S t1        |d      5 }	|	j3                         }d d d        |S # t"        $ r Y w xY w# t*        t,        f$ r Y qw xY w# |	r|	j/                          w w xY w# t        j                  |       w xY w# 1 sw Y   S xY w)Nr   )fileid   s   wbs   rb)rg   rd   rh   r   existsgetsizefilectxnodenullidr   svfscreatefileblobzlibcompressumaskdirnamemakedirsFileExistsErrorr   atomictempfilewriteIOErrorOSErrorcloser   read)
r0   	cachepathrd   r   filecachepathr   textoldumaskr   r/   s
             r1   _loadfileblobr      s   GGLLD#d)<M77>>-(BGGOOM,Ja,O,,tD,1<<>T[[(&00;DNll4l5Gg&}}T" 88E?	ggoom4G77>>'*KK( A	''u= GGIHHX K -' 	1668D	K' '  W%  
 GGI  HHX	Ksl   
>H 	G H !'G( H >H/	G%"H $G%%H (G:7G= 9G::G= =HH H,/H9c                 z      j                  |      }|j                         }dj                   fd|D              S )z-A server api for requesting a filelog's heads   
c              3   T   K   | ]  }|j                   k7  st        |       ! y wrH   )r   r   ).0headr0   s     r1   	<genexpr>zgetflogheads.<locals>.<genexpr>$  s      JTddkk6Is4yJs   (()fileheadsrh   )r0   rQ   rd   flogr   s   `    r1   r   r      s0    99T?DJJLE::JUJKKr   c                 L   t        j                  |       rdt        d      z   S | j                  j	                  dd      }|s*t
        j                  j                  | j                  d      }t        |j                               }|| j                  k(  rydt        | |||      z   S )af  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   rc   r   r6   configrg   rd   rh   r   stripr   r   )r0   rQ   r   r   r   s        r1   r   r   '  s     T"HIII/1CDIGGLL,AB	tzz|Dt{{M$	4>>>r   c                     t        j                         rt        j                  t	        d            t        t              st        j                  t	        d             fd}t        j                   |             S )zDA server api for requesting particular versions of particular files.r   s/   cannot fetch remote files over non-ssh protocolc               3     K   j                   } j                  j                  dd      }|s*t        j                  j                  j                  d      }	 | j                         d d }|sy t        |d d       }|j                  k(  rd 9|dd  }t        |||      }dt        |      |fz   j                  j                          xw)Nr   r   r   (   s   0
s   %d
%s)_finr6   r   rg   rd   rh   readliner   r   r   r   _foutflush)finr   requestr   rd   r   rQ   r0   s         r1   streamerz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   rc   r
   rx   r   r   r   r   rM   )r0   rQ   r   s   `` r1   r   r   ;  s_    T"kk!JKLLe\*kk!NOPP 6 ##HJ//r   c                 <   | j                         }| j                         }|j                  j                  |      }|dk(  r| j	                         }n|j                  |      }| j                  }| g}	 d|_        |j                  | j                         D cg c]  }| c}       d}|D ]  }	|	j                         }
|j                  }|j                  }t        |
      dkD  r|
d   j                         }t        |
      dkD  r|
d   j                         }d}|	j                         }|r|d   }|	j                         }|d|	j                         ||||fz  z  } 	 d|_        t!        j"                  t        |      |      }d|||fz  S c c}w # d|_        w xY w)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!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   3$F 	F B>F F 	Fc           	         |j                   j                  dd      sy t               }|j                  d      }|j                  j                  d      }|D ]h  }||   j                         }|j                         D ]@  \  }}t        j                  j                  ||t        |            }	|j                  |	       B j |j                   j                  dd      }
t        j                         |
dz  dz  dz  z
  }| j                  t        d      d	
      }|j!                  d       t        j"                  |      D ]|  \  }}}|D ]q  }t        j                  j                  ||      }|j%                          ||v r8t        j&                  |      }|j(                  |k  s]t        j*                  |       s ~ |j-                          y )Nr   r   s   heads(tip~25000:) - nullr   s   serverexpiration   <   s   removing old server caches   files)unitr   )r6   r   setrevsvfsrh   manifestitemsrg   rd   r   add	configinttimemakeprogressr   updatewalk	incrementr[   st_mtimeremovecomplete)r6   r0   neededfilesr   r   r   mffilenamer   r   days
expirationprogressr!   dirsfilesr   filepathr[   s                      r1   gcserverr	    s   77.	:%KII12E34I +$Z  ""$((* 	+HhGGLLHc(mLMOOM*	++ 77-/BCDr	B 34Jq!=>XNHOOAWWY/ 	$dE 	$Dww||D$/H ;&778$D}}z)		(#	$	$ r   )'rg   r[   r   r   mercurial.i18nr   mercurial.noder   r   mercurial.pycompatr   	mercurialr   r   r	   r
   r   r   r   r   r   r   r   r   r    r   r   sshv1protocolhandlerr   r7   r   r3   r   r   r   r   r   r	  rD   r   r1   <module>r     sx    
     # #   
 33 F g>T&RL?("0J<6~r   