Ë PxÌú¥æê:ãón—ddlZddlZddlZddlZddlmZddlmZm Z m Z m Z ddl m Z ejZejZej Zej"Zej$Zej&Zej(Zej«Zej-e d«d„«Zd d„Zd „Zd „Zd „Zd „Zy)éN)Úcommon)Ú exthelperÚpycompatÚutilÚwireprotoserveré)Ú blobstoreshandlewsgirequestcóö‡‡‡—|‰‰|‰«ry‰jjjdd«sytj‰jj d«sy‰j sy ‰j dk(r!‰‰‰d«t‰j‰|«S‰j jd«rt‰j‰|ˆˆˆfd „«Sy#tj$rŒ}|jD]\}}||j|<Œtj|jtj |««|_|j%d tj |«z«Yd }~yd }~wwxYw) z…Wrap wireprotoserver.handlewsgirequest() to possibly process an LFS request if it is left unprocessed by the wrapped method. Ts experimentals lfs.serveFÚlfslocalblobstores.git/info/lfs/objects/batchópulls.hg/lfs/objectscó•—‰‰‰|«S©N©)ÚpermÚ checkpermÚrctxÚreqs €€€ú@usr/lib/python3.12/site-packages/hgext/lfs/wireprotolfsserver.pyÚz#handlewsgirequest..=sø€±)¸DÀ#ÀtÔ2Lós0 %s N)ÚrepoÚuiÚ configboolrÚ safehasattrÚsvfsÚ dispatchpathÚ_processbatchrequestÚ startswithÚ_processbasictransferÚ hgwebcommonÚ ErrorResponseÚheadersÚ statusmessageÚcoderÚbytestrÚstatusÚ setbodybytes)ÚorigrrÚresrÚeÚkÚvs `` ` rÚhandlewsgirequestr-$s>ú€ñ  ˆD�#�s˜IÔ&Øà �9‰9�<‰<× "Ñ " ?°LÔ AØä × Ñ ˜DŸI™IŸN™NÐ,?Ô @Øà × Ò ØðØ × Ñ Ð=Ò =Ù �d˜C Ô )Ü'¨¯ © °3¸Ó<Ð <ð× Ñ × (Ñ (Ð);Ô <Ü(Ø— ‘ ˜3 Õ%Lóð ðøÜ × $Ñ $òð—I”I‰DˆAˆq؈C�K‰K˜ŠNðä ×.Ñ.¨q¯v©v´x×7GÑ7GÈÓ7JÓKˆŒ Ø ×ј¤h×&6Ñ&6°qÓ&9Ñ9Ô:ÜûðúsÁ0/C 7CÃE8Ã,BE3Å3E8có|—tj||¬«|_d|jd<|j d«y)N©Úmessageótext/plain; charset=utf-8ó Content-Typer)r r#r&r"r')r)r$r0s rÚ _sethttperrorr3Ks2€Ü×*Ñ*¨4¸ÔA€C„JØ#?€C‡K�K�Ñ Ø×Ñ�SÕrcóú—tjtj««}|jd}d}|j r||j z }|d|j zz }|jd||fz«y)z=Write information about the current exception to wsgi.errors.s wsgi.errorsró/s4Exception happened while processing request '%s': %sN)rÚsysbytesÚ tracebackÚ format_excÚrawenvÚapppathrÚwrite)rÚtbÚerrorlogÚuris rÚ _logexceptionr?Qsp€ä × Ñ œ9×/Ñ/Ó1Ó 2€BØ�z‰z˜.Ñ)€Hà €CØ ‡{‚{Ø ˆs�{‰{ш؈4�#×"Ñ"Ñ "Ñ"€Cà ‡N�NØ@ÀCÈÀ9ÑLõrcóT—|jdk7rt|t«y|jddk7rt|t«y|jddk7rt|t «yt j|jj««}d|jddg«vrt|td«y|jd «}t j|«}|d vrt|td |z«y|jj}t||jd g«||«D�cgc]}|‘Œ}}d|d œ}t!j"t$«|_d|jd<|j)t jt+j,|«««ycc}w)z Handle a request for the Batch API, which is the gateway to granting file access. https://github.com/git-lfs/git-lfs/blob/master/docs/api/batch.md sPOSTTr2sapplication/vnd.git-lfs+jsonsAcceptÚbasicÚ transferss0Only the basic LFS transfer handler is supportedÚ operation)óuploadódownloads&Unsupported LFS transfer operation: %sÚobjects)ÚtransferrF)Úmethodr3ÚHTTP_METHOD_NOT_ALLOWEDr"ÚHTTP_UNSUPPORTED_MEDIA_TYPEÚHTTP_NOT_ACCEPTABLErÚ json_loadsÚbodyfhÚreadÚgetÚHTTP_BAD_REQUESTr%rr Ú_batchresponseobjectsr r#ÚHTTP_OKr&r'ÚjsonÚdumps) rrr)ÚlfsreqrCÚ localstoreÚprFÚrsps rrr`s’€ð4 ‡z�z�WÒÜ�cÔ2Ô3Øà ‡{�{�?Ñ#Ð'FÒFÜ�cÔ6Ô7Øà ‡{�{�9ÑÐ!@Ò@Ü�cÔ.Ô/Øô× Ñ  §¡§¡Ó!2Ó 3€Fð�f—j‘j ¨w¨iÓ8Ñ8ÜØ Ü Ø ?ô ð à— ‘ ˜;Ó'€IÜ× Ñ  Ó+€IàÐ0Ñ0ÜØ Ü Ø 5¸ Ñ Aô ð à—‘×,Ñ,€Jô'Ø �—‘˜I rÓ*¨I°zô óñ ˆAò ð ð ððØñ €Cô ×*Ñ*¬7Ó3€C„JØ#B€C‡K�K�Ñ Ø×Ñ”X×%Ñ%¤d§j¡j°£oÓ6Ô7à ùò!sÄ0 F%c#ó>‡K—|D�]1}|jd«}|jd«}||jd«dœ}d}d} |j|«} | r|dk(r|j|«|d k(r|s ddd œ|d <|–—Œ|| sddd œ|d <|–—Œ‹| r|–—Œ’tjj«tjd¬«z} ˆfd„} dtj|«ztjd‰j‰j|fz«| j!d«| «dœi|d<|–—�Œ4y #t$rU} | j t j k7r+t‰«d| jxsd d œ|d <|–—Yd } ~ �Œ‡d}Yd } ~ �Œ'd } ~ wwxYw­w)a4Yield one dictionary of attributes for the Batch API response for each object in the list. req: The parsedrequest for the Batch API request objects: The list of objects in the Batch API object request list action: 'upload' or 'download' store: The local blob store for servicing requestsÚoidÚasciiÚsize)rZr\TFrDiôzInternal Server Server)r$r0ÚerrorNrEi”zThe object does not existé¦zThe object is corrupté )Úminutescóš•—ddi}‰jjdd«}|jd«rtj|«|d<|S)NÚAcceptzapplication/vnd.git-lfss AuthorizationrsBasic Ú Authorization)r"rOrrÚstrurl)ÚhdrÚauthrs €rÚ _buildheaderz+_batchresponseobjects.._buildheadersIø€ðÐ6Ð7ˆCà—;‘;—?‘?Ð#3°SÓ9ˆDØ�‰˜yÔ)Ü'/§¡°tÓ'<��OÑ$àˆJrz%ss%s%s/.hg/lfs/objects/%sz%Y-%m-%dT%H:%M:%SZ)ÚhrefÚ expires_atÚheaderÚactions)rOÚencodeÚverifyÚlinkfromusercacheÚIOErrorÚerrnoÚENOENTr?ÚstrerrorÚdatetimeÚnowÚ timedeltarrdÚbaseurlr:Ústrftime) rrFÚactionÚstoreÚobjÚsoidrZrXÚexistsÚverifiesÚinstÚ expiresatrgs ` rrQrQ²s²øèø€ô8ˆà�w‰w�u‹~ˆØ�k‰k˜'Ó"ˆàØ—G‘G˜F“Oñ ˆð ˆØˆð Ø—|‘| CÓ(ˆHÙ˜F iÒ/ð×'Ñ'¨Ô,ð �[Ò ÙàØ:ñ ��G‘ ð’ ØáàØ6ñ ��G‘ ð’ Øá ØŠIØ ä×%Ñ%×)Ñ)Ó+¬h×.@Ñ.@ÈÔ.LÑLˆ ô ð Ü�o‰o˜fÓ%ñ &ä Ÿ™Ø.°#·+±+¸s¿{¹{ÈCÐ1PÑPóð(×0Ñ0Ð1EÓFÙ&›.ñ (ð  ˆˆI‰ðŒ ñqøô4ò Ø�z‰zœUŸ\™\Ò)ܘcÔ"ð Ø#Ÿ}™}ÒHÐ0Hñ ��G‘ ð’ ÝàŽFûð üs>ƒAFÁ)D<Á.CFÄ< FÅAFÆFÆ FÆFÆFÆFcóÄ—|j}|jd}|jj}t |j«dk7rt |t «y|dk(rŽ|d«|j|«}tj} |j||j|jd«||rtnt«|_d |jd <|j'd «y|d k(rW|d «tjt«|_d|jd < |j'|j)|««yt |t*d|z¬«y#t j"$rt%|«|dd«|_YŒÁwxYw#t j"$r:t%|«tjdd«|_|j'd «YywxYw)apHandle a single file upload (PUT) or download (GET) action for the Basic Transfer Adapter. After determining if the request is for an upload or download, the access must be checked by calling ``checkperm()`` with either 'pull' or 'upload' before accessing the files. https://github.com/git-lfs/git-lfs/blob/master/docs/api/basic-transfers.md éÿÿÿÿéTsPUTrDsContent-Lengthr^s corrupt blobr1r2rsGETr sapplication/octet-streams#Unsupported LFS transfer method: %sr/)rHÚ dispatchpartsrr Úlenr3ÚHTTP_NOT_FOUNDÚhasr r#ÚdownloadrMr"rRÚ HTTP_CREATEDr&r ÚLfsCorruptionErrorr?r'rNrI) rrr)rrHrZrVÚexistedr#s rrr)s³€ð�Z‰Z€FØ × Ñ ˜BÑ €CØ—‘×,Ñ,€Jä ˆ3× Ñ Ó Ò"Ü�cœ>Ô*Øà �ÒÙ�)Ôð—.‘. Ó%ˆô $×1Ñ1ˆ ð =Ø × Ñ   S§Z¡Z°·±Ð=NÑ1OÔ PÙ&±'¥w¼|ÓLˆCŒJð(Dˆ� ‰ �OÑ$Ø ×јÔàØ �6Ò Ù�'Ôä ×.Ñ.¬wÓ7ˆŒ Ø'Bˆ� ‰ �OÑ$ð "ð × Ñ ˜ZŸ_™_¨SÓ1Ô 2ðäØ Ü #Ø:¸VÑCõ ð øôM×+Ñ+ò =Ü ˜#Ô ñ' s¨OÓ<ˆCŽJð  =ûô0×+Ñ+ò "Ü ˜#Ô ô%×2Ñ2°3¸ÓHˆCŒJØ × Ñ ˜SÕ !àð "ús& AE Ä) FÅ ,FÆFÆA GÇGr)rsrprSr7Úmercurial.hgwebrr Ú mercurialrrrrÚr rRrˆrPr…rIrKrJÚehÚ wrapfunctionr-r3r?rrQrrrrÚr�sÅðóÛ Û Ûå1÷óõà × Ñ €Ø×'Ñ'€ Ø×/Ñ/ÐØ×+Ñ+€Ø%×=Ñ=ÐØ!×5Ñ5ÐØ)×EÑEÐà€Y×ÑÓ€ð‡��Ð"6Ó7ñ#ó8ð#óLò òOòdtónHr