ó
    6°hò.  ã                  óx  • 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Jr  SSKJr  \R                  r\R                   r\R"                  r\R$                  r\R&                  r\R(                  r\R*                  r\
R                  " 5       r\R/                  \S5      S 5       rSS	 jrS
 rS rS rS rg)é    )ÚannotationsN)Úcommon)Ú	exthelperÚpycompatÚwireprotoserveré   )Ú	blobstoreÚhandlewsgirequestc                ó   ^^^• U " TTUT5      (       a  gTR                   R                  R                  SS5      (       d  g[        TR                   R                  S5      (       d  gTR
                  (       d  g TR
                  S:X  a!  T" TTS5        [        TR                   TU5      $ TR
                  R                  S5      (       a  [        TR                   TUUUU4S	 j5      $ g! [        R                   a�  nUR                   H  u  pgXsR                  U'   M     [        R                  " UR                  [        R                  " U5      5      Ul        UR#                  S
[        R                  " U5      -  5         SnAgSnAff = f)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                ó   >• T" TTU 5      $ ©N© )ÚpermÚ	checkpermÚrctxÚreqs    €€€Ú>/usr/lib/python3/dist-packages/hgext/lfs/wireprotolfsserver.pyÚ<lambda>Ú#handlewsgirequest.<locals>.<lambda>=   s   ø€ ±)¸DÀ#ÀtÔ2Ló    s   0
%s
N)ÚrepoÚuiÚ
configboolÚhasattrÚsvfsÚdispatchpathÚ_processbatchrequestÚ
startswithÚ_processbasictransferÚhgwebcommonÚErrorResponseÚheadersÚstatusmessageÚcoder   ÚbytestrÚstatusÚsetbodybytes)Úorigr   r   Úresr   ÚeÚkÚvs    `` `   r   r
   r
   $   s@  ú€ ñ
 ˆD�#�s˜I×&Ñ&Øà�9‰9�<‰<×"Ñ" ?°L×AÑAØä�4—9‘9—>‘>Ð#6×7Ñ7Øà××ØðØ×ÑÐ=Ó=Ù�d˜C Ô)Ü'¨¯	©	°3¸Ó<Ð<ð ×Ñ×(Ñ(Ð);×<Ñ<Ü(Ø—	‘	˜3 Ö%Lóð ð øÜ×$Ñ$ó ð —I”I‰DˆAØ�K‰K˜‹Nñ ä ×.Ò.¨q¯v©v´x×7GÒ7GÈÓ7JÓKˆŒ
Ø×Ñ˜¤h×&6Ò&6°qÓ&9Ñ9Ô:Üûðús   Á:0C* Â+=C* Ã*FÃ>BFÆFc                óv   • [         R                  " XS9U l        SU R                  S'   U R	                  S5        g )N©Úmessageó   text/plain; charset=utf-8ó   Content-Typer   )r"   r%   r(   r$   r)   )r+   r&   r1   s      r   Ú_sethttperrorr4   K   s0   € Ü×*Ò*¨4ÑA€C„JØ#?€C‡K�K�Ñ Ø×Ñ�SÕr   c                ó  • [         R                  " [        R                  " 5       5      nU R                  S   nSnU R
                  (       a  X0R
                  -  nUSU R                  -   -  nUR                  SX14-  5        g)z=Write information about the current exception to wsgi.errors.s   wsgi.errorsr   ó   /s4   Exception happened while processing request '%s':
%sN)r   ÚsysbytesÚ	tracebackÚ
format_excÚrawenvÚapppathr   Úwrite)r   ÚtbÚerrorlogÚuris       r   Ú_logexceptionr@   Q   sl   € ä	×	Ò	œ9×/Ò/Ó1Ó	2€BØ�z‰z˜.Ñ)€Hà
€CØ
‡{‡{Ø�{‰{ÑˆØˆ4�#×"Ñ"Ñ"Ñ"€Cà‡N�NØ@ÀCÀ9ÑLõr   c                ón  • UR                   S:w  a  [        U[        5        gUR                  S   S:w  a  [        U[        5        gUR                  S   S:w  a  [        U[
        5        g[        R                  " UR                  R                  5       5      nSUR                  SS/5      ;  a  [        U[        S5        gUR                  S	5      n[        R                  " U5      nUS
;  a  [        U[        SU-  5        gU R                  R                  n[        XR                  S/ 5      XE5       Vs/ s H  nUPM     nnSUS.n[         R"                  " [$        5      Ul        SUR                  S'   UR)                  [        R                  " [*        R,                  " U5      5      5        gs  snf )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
s   POSTTr3   s   application/vnd.git-lfs+jsons   AcceptÚbasicÚ	transferss0   Only the basic LFS transfer handler is supportedÚ	operation)ó   uploadó   downloads&   Unsupported LFS transfer operation: %sÚobjects)ÚtransferrG   )Úmethodr4   ÚHTTP_METHOD_NOT_ALLOWEDr$   ÚHTTP_UNSUPPORTED_MEDIA_TYPEÚHTTP_NOT_ACCEPTABLEr   Ú
json_loadsÚbodyfhÚreadÚgetÚHTTP_BAD_REQUESTr'   r   r   Ú_batchresponseobjectsr"   r%   ÚHTTP_OKr(   r)   ÚjsonÚdumps)	r   r   r+   ÚlfsreqrD   Ú
localstoreÚprG   Úrsps	            r   r   r   `   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ô
óò
ˆAó 	
ñ
ð ð ð Øñ€Cô
 ×*Ò*¬7Ó3€C„JØ#B€C‡K�K�Ñ Ø×Ñ”X×%Ò%¤d§j¢j°£oÓ6Ô7àùò!s   Ä7F2c              #  óˆ  ^ #   • U GHM  nUR                  S5      nUR                  S5      nUUR                  S5      S.nSnSn	 UR                  U5      n	U	(       a  US:X  a  UR                  U5        US:X  a+  U(       d  SSS
.US'   Uv •  M‰  U	(       d  SSS
.US'   Uv •  Mž  OU	(       a  Uv •  M¬  [        R                  R                  5       [        R                  " SS9-   nU 4S jnS[        R                  " U5      -  [        R                  " ST R                  T R                  U4-  5      UR!                  S5      U" 5       S.0US'   Uv •  GMP     g! [         a\  n
U
R
                  [
        R                  :w  a1  [        T 5        SU
R                  =(       d    S	S
.US'   Uv •   Sn
A
GM¬  Sn Sn
A
GNFSn
A
ff = f7f)a   Yield 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)r[   r]   TFrE   iô  zInternal Server Server)r&   r1   ÚerrorNrF   i”  zThe object does not existé¦  zThe object is corrupté
   )Úminutesc                 ó¦   >• SS0n TR                   R                  SS5      nUR                  S5      (       a  [        R                  " U5      U S'   U $ )NÚAcceptzapplication/vnd.git-lfss   Authorizationr   s   Basic ÚAuthorization)r$   rP   r    r   Ústrurl)ÚhdrÚauthr   s     €r   Ú_buildheaderÚ+_batchresponseobjects.<locals>._buildheader  sL   ø€ ð Ð6Ð7ˆCà—;‘;—?‘?Ð#3°SÓ9ˆDØ�‰˜y×)Ñ)Ü'/§¢°tÓ'<��OÑ$àˆJr   z%ss   %s%s/.hg/lfs/objects/%sz%Y-%m-%dT%H:%M:%SZ)ÚhrefÚ
expires_atÚheaderÚactions)rP   ÚencodeÚverifyÚlinkfromusercacheÚOSErrorÚerrnoÚENOENTr@   ÚstrerrorÚdatetimeÚnowÚ	timedeltar   re   Úbaseurlr;   Ústrftime)r   rG   ÚactionÚstoreÚobjÚsoidr[   rY   ÚexistsÚverifiesÚinstÚ	expiresatrh   s   `            r   rR   rR   ²   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>   ƒAGÁ/EÁ4C%GÅ
F?Å#AF:Æ+GÆ2F:Æ4GÆ:F?Æ?Gc                óÔ  • UR                   nUR                  S   nU R                  R                  n[	        UR                  5      S:w  a  [        U[        5        gUS:X  a’  U" S5        UR                  U5      n[        R                  n UR                  XQR                  UR                  S   5        U" U(       a  [        O[        5      Ul        S	UR                  S
'   UR'                  S5        gUS:X  aX  U" S5        [        R                  " [        5      Ul        SUR                  S
'    UR'                  UR)                  U5      5        g[        U[*        SU-  S9  g! [         R"                   a    [%        U5        U" SS5      Ul         NÁf = f! [         R"                   a;    [%        U5        [        R                  " SS5      Ul        UR'                  S5         gf = f)aX  Handle 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
éÿÿÿÿé   Ts   PUTrE   s   Content-Lengthr_   s   corrupt blobr2   r3   r   s   GETr   s   application/octet-streams#   Unsupported LFS transfer method: %sr0   )rI   Údispatchpartsr   r   Úlenr4   ÚHTTP_NOT_FOUNDÚhasr"   r%   ÚdownloadrN   r$   rS   ÚHTTP_CREATEDr(   r	   ÚLfsCorruptionErrorr@   r)   rO   rJ   )	r   r   r+   r   rI   r[   rW   Úexistedr%   s	            r   r!   r!   )  s±  € ð �Z‰Z€FØ
×
Ñ
˜BÑ
€CØ—‘×,Ñ,€Jä
ˆ3×ÑÓ Ó"Ü�cœ>Ô*Øà�ÓÙ�)Ôð —.‘. Ó%ˆô $×1Ñ1ˆð	=Ø×Ñ §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&   ÂAE% Ä1 F Å%-FÆFÆAG'Ç&G'r   )Ú
__future__r   ru   rr   rT   r8   Úmercurial.hgwebr   r"   Ú	mercurialr   r   r   Ú r	   rS   rŠ   rQ   r‡   rJ   rL   rK   ÚehÚwrapfunctionr
   r4   r@   r   rR   r!   r   r   r   Ú<module>r“      sÆ   ðõ #ã Û Û Û å 1÷ñ õ à
×
Ñ
€Ø×'Ñ'€Ø×/Ñ/Ð Ø×+Ñ+€Ø%×=Ñ=Ð Ø!×5Ñ5Ð Ø)×EÑEÐ à×ÒÓ€ð ‡��Ð"5Ó6ñ#ó 7ð#ôLòòOòdtónHr   