o ]Lb8@sddlmZddlZddlZddlZddlZddlZddlmZddl m Z m Z ddl m Z ddlmZmZmZmZmZmZmZmZmZmZmZmZmZmZddlmZmZej Z!d d Z"d a#d d Z$ddZ%ddZ&ddZ'ddZ(ddZ)ddZ*dS))absolute_importN)_)binhex)open) changegroup changelogcontexterror extensionsmatchpycompatscmutilstore streamcloneutilwireprotoserverwireprototypeswireprotov1server) constants shallowutilcs(t|fdd}ttjd|dS)zGSets up a normal Mercurial repo so it can serve files to shallow repos.c s|jpg}tj|vrTd} d} |jpgD]#} | dr&| tddd} q| dr6| tddd} qt| s?| rItjdd| | t fdd|D}||||||g|Ri|S)Nsincludepattern=sexcludepattern=csg|]}|s|qSr.0fmrI/usr/lib/python3/dist-packages/hgext/remotefilelog/remotefilelogserver.py Csz6setupserver..generatefiles..) _bundlecapsrBUNDLE2_CAPABLITY startswithlensplitr alwaysrootlist) origself changedfiles linknodes commonrevssourceargskwargscapsincludepatternexcludepatterncapreporr generatefiles/s.      z"setupserver..generatefiless generatefilesN) onetimesetupr wrapfunctionrcgpacker)uir7r8rr6r setupserver*s  r=FcstrdSdatjddddttjddddttjd d ddtGd d d t}|fd d}|dftjd<dfdd }t t d|fdd}t td|dd}t t j d|dd}t t d|dS)z9Configures the wireprotocol for both clients and servers.NTx_rfl_getflogheadsspathspull) permissionx_rfl_getfilesr x_rfl_getfiles file nodec@seZdZdZdZdZdS)z!onetimesetup..streamstateNF)__name__ __module__ __qualname__r shallowremotenoflatmfrrrr streamstatebsrGc sd}d}|d}|r|d}|d}|r|d}j}j}j}zGd_t_|ddk_|s:|rEt|jdd||_t||t j t j fdd } t | W|_|_|_S|_|_|_w) NsincludepatternrsexcludepatternTsnoflatmanifestsTruerc3s$VVjD]}|Vq dSN)gen)valuefirstsecond streamresrr rIs  z5onetimesetup..stream_out_shallow..gen) getr&rEr rFr'r(rstreamnextrIrrN) r7protootherr3r4raw oldshallowoldmatch oldnoflatmfrIstaterKr stream_out_shallowis<          z(onetimesetup..stream_out_shallow*sstream_out_shallowc3sjrt|rkt|jjd}|jjj}tj |jjdg}|rk| }||ddD]<\}}} |d|} |t j kr^| ds^| ds^t| |d} t| } tj} | | | jfV|t jkrh|| q,|s"t|r|jD]\} }}|dr| ds| dr| ||fVquj}|r|s|jD]\} }}|d d }|s| ||fVq|jD]}jr|ddd d krq|VqdSt|rttd |||D]}|VqdS)NrsdataT)stat/s.is.dsmeta/ s 00manifest.s0Cannot clone from a shallow repo to a full repo.) rEr isenabledr%rpathrawvfsreaddirosjoinpopr\S_IFREGendswithrpconvert decodedirFILETYPE_OTHERst_sizeS_IFDIRappendristreemanifest datafilesr$r r'topfilesrFr Abortr)r*r7matcherstriplenrdvisitprkindstfpndtusr xrXrr _walkstreamfilessd               z&onetimesetup.._walkstreamfiless_walkstreamfilescsN|||}t|sddr%t|tr|tj|d|d|S)N remotefilelogserverr>rA)rra configbool isinstance _sshv1serverrorNETWORK_CAP_LEGACY_SSH_GETFILES)r*r7rRr2)r<rr _capabilitiess     z#onetimesetup.._capabilitiess _capabilitiesc_sD|j}t|dr|jr|j|j|jS||g|Ri|S)Ns forcelinkrev)_repor safehasattr forcelinkrev_fileloglinkrevrev _filenode)r*r+r0r1r7rrr _adjustlinkrevsz$onetimesetup.._adjustlinkrevs_adjustlinkrevcSs|dkrdS||S)Nr@Fr)r*cmdrrr _iscmdszonetimesetup.._iscmdsiscmdrH)onetimerwireprotocommand getflogheadsgetfilesgetfileobjectcommandsr r:rr basefilectxr)r<rGrZrrrrr)rYr<r r9PsD ) 5  r9c Cstj||t|}tj|rtj|dkr|j||d}||jkr4t |j |_ |j||d}t |}t |}td}zatj|}tj|spzt|Wntyo} z | jtjkreWYd} ~ nd} ~ wwd} z!z t|d} | |Wn ttfyYnwW| r| n| r| wwWt||St|wt|d } | }Wd|S1swY|S)Nr)fileidswbsrb)rerbrfrexistsgetsizefilectxnodenullidrsvfscreatefileblobzlibcompressumaskdirnamemakedirsOSErrorerrnoEEXISTratomictempfilewriteIOErrorcloserread) r7 cachepathrbr filecachepathrtextoldumaskrexrrrr _loadfileblobsX            rcs*|}|}dfdd|DS)z-A server api for requesting a filelog's heads c3s"|] }|jkrt|VqdSrH)rr)rheadr6rr s zgetflogheads..)fileheadsrf)r7rRrbflogrrr6r rs rcCsdt|r dtdS|jdd}|stj|jd}t| }||j kr)dSdt ||||S)afA 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: where 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. s1+cannot fetch remote files from shallow reporservercachepathremotefilelogcaches0) rrarr<configrerbrfrstriprr)r7rRrrrrrr r"s   rcsJtr ttdttsttdfdd}t|S)zDA server api for requesting particular versions of particular files.rs/cannot fetch remote files over non-ssh protocolc3sj}jdd}|stjjd} |dd}|s"dSt|dd}|jkr3dVq|dd}t |||}dt ||fVj q) NrrrT(s0 s%d %s) _finr<rrerbrfreadlinerrrr%_foutflush)finrrequestrrbrrRr7rr streamer=s$   zgetfiles..streamer) rrar rsrrrrrN)r7rRrrrr r6s   rcCs |}|}|j|}|dkr|}n||}|j}|g}zZd|_|dd| Dd}|D]A}| } |j } |j } t | dkrN| d } t | dkrZ| d } d} |} | rf| d} |}|d| | | || f7}q6Wd|_nd|_wtt ||}d |||fS) 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. rTcSsg|]}|qSrrrrrr r!zsz"createfileblob..rrs %s%s%s%s%sFs%s%s%s)filelogfilerev_revlogflagsdatarawdatarrextend ancestorsparentsrr%filenoderenamedrrbuildfileblobheader)rrfrev revlogflagsrr7r ancestortext ancestorctxrp1p2copynamerenamelinknodeheaderrrr r[sH        rcCs"|jdds dSt}|d}|jd}|D]!}||}t|D]\}}t j ||t |} | | q&q|j dd} t| ddd} |jtdd d } | d t |D])\} }}|D]!}t j | |}| ||vrzqht |}|j| krt |qhqa| dS) Nrrsheads(tip~25000:) - nullrsserverexpiration<sremoving old server cachesfiles)unitr)r<rsetrevsvfsrfmanifestr iteritemsrerbradd configinttime makeprogressrupdatewalk incrementr\st_mtimeremovecomplete)r<r7 neededfilesrrrmffilenamerrdays expirationprogressr(dirsfilesrfilepathr\rrr gcservers6         r)+ __future__rrrer\rrmercurial.i18nrmercurial.noderrmercurial.pycompatr mercurialrrr r r r r rrrrrrrrrsshv1protocolhandlerrr=rr9rrrrrrrrrr s,   @#"*% ?