
    q&f.                     j   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	m
Z
 ddlmZ ej                  Zej                  Zej                  Zej                   Zej"                  Zej$                  Zej&                  Z ej                         Zej+                  e
d      d        ZddZd	 Zd
 Zd Zd Zy)    N)common)	exthelperpycompatwireprotoserver   )	blobstorehandlewsgirequestc                     | |      ryj                   j                  j                  dd      syt        j                   j                  d      syj
                  sy	 j
                  dk(  r! d       t        j                   |      S j
                  j                  d      rt        j                   |fd	      S y# t        j                  $ r}|j                  D ]  \  }}||j                  |<    t        j                  |j                  t        j                  |            |_        |j#                  d
t        j                  |      z         Y d}~yd}~ww xY w)zWrap 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/dist-packages/hgext/lfs/wireprotolfsserver.py<lambda>z#handlewsgirequest.<locals>.<lambda><   s    )D#t2L     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#sI&99<<""?LA499>>#67==dC)'		3<< (();<(		3%L  $$  II 	DAqCKKN	 ..qvvx7G7G7JK
h&6&6q&99:s   &/C 7C E."BE))E.c                 |    t        j                  ||      | _        d| j                  d<   | j	                  d       y )Nmessage   text/plain; charset=utf-8   Content-Typer   )r    r#   r&   r"   r'   )r)   r$   r/   s      r   _sethttperrorr2   J   s2    **4ACJ#?CKK Sr   c                     t        j                  t        j                               }| j                  d   }d}| j
                  r|| j
                  z  }|d| j                  z   z  }|j                  d||fz         y)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>   P   sp    			9//1	2Bzz.)H
C
{{s{{4#""""CNN@C9Lr   c                 T   |j                   dk7  rt        |t               y|j                  d   dk7  rt        |t               y|j                  d   dk7  rt        |t
               yt        j                  |j                  j                               }d|j                  ddg      vrt        |t        d       y|j                  d	      }t        j                  |      }|d
vrt        |t        d|z         y| j                  j                  }t        ||j                  dg       ||      D cg c]  }| }}d|d}t!        j"                  t$              |_        d|j                  d<   |j)                  t        j                  t+        j,                  |                   yc c}w )zHandle 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   POSTTr1   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)transferrE   )methodr2   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)   lfsreqrB   
localstoreprE   rsps	            r   r   r   _   s   4 zzWc23
{{?#'FFc67
{{9!@@c./   !23F fjjwi88?	

 

;'I  +I005	A	

 ,,J 'Ir*Iz
 	
G  C
 **73CJ#BCKK X%%djjo67!s   0	F%c              #   >   K   |D ]1  }|j                  d      }|j                  d      }||j                  d      d}d}d}		 |j                  |      }	|	r|dk(  r|j                  |       |dk(  r|sddd
|d<   | ||	sddd
|d<   | |	r| t        j                  j                         t        j                  d      z   } fd}dt        j                  |      z  t        j                  d j                   j                  |fz        |j!                  d       |       di|d<   | 4 y# t        $ rU}
|
j
                  t
        j                  k7  r+t                d|
j                  xs d	d
|d<   | Y d}
~
d}Y d}
~
'd}
~
ww xY ww)a4  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)rY   r[   TFrC   i  zInternal Server Server)r$   r/   errorNrD   i  zThe object does not exist  zThe object is corrupt
   )minutesc                      ddi} j                   j                  dd      }|j                  d      rt        j                  |      | d<   | S )NAcceptzapplication/vnd.git-lfss   Authorizationr   s   Basic Authorization)r"   rN   r   r   strurl)hdrauthr   s     r   _buildheaderz+_batchresponseobjects.<locals>._buildheader  sI     67C;;??#3S9Dy)'/t'<O$Jr   z%ss   %s%s/.hg/lfs/objects/%sz%Y-%m-%dT%H:%M:%SZ)href
expires_atheaderactions)rN   encodeverifylinkfromusercacheIOErrorerrnoENOENTr>   strerrordatetimenow	timedeltar   rc   baseurlr9   strftime)r   rE   actionstoreobjsoidrY   rW   existsverifiesinst	expiresatrf   s   `            r   rP   rP      s    8  Xwwu~kk'"GGFO
 	||C(HFi/ '',  [ : G 	6 G 	I%%))+h.@.@.LL	
	 oof%& .#++s{{C1PP (001EF&.(

I 	qX4  	zzU\\)c"  #}}H0H G 	F	s>   AF)D<.CF<	FAFFFFFFc                    |j                   }|j                  d   }| j                  j                  }t	        |j                        dk7  rt        |t               y|dk(  r |d       |j                  |      }t        j                  }	 |j                  ||j                  |j                  d           ||rt        nt              |_        d	|j                  d
<   |j'                  d       y|dk(  rW |d       t        j                  t              |_        d|j                  d
<   	 |j'                  |j)                  |             yt        |t*        d|z         y# t         j"                  $ r t%        |        |dd      |_        Y w xY w# t         j"                  $ r: t%        |       t        j                  dd      |_        |j'                  d       Y yw xY w)ap  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   PUTrC   s   Content-Lengthr]   s   corrupt blobr0   r1   r   s   GETr   s   application/octet-streams#   Unsupported LFS transfer method: %sr.   )rG   dispatchpartsr   r   lenr2   HTTP_NOT_FOUNDhasr    r#   downloadrL   r"   rQ   HTTP_CREATEDr&   r   LfsCorruptionErrorr>   r'   rM   rH   )	r   r   r)   r   rG   rY   rU   existedr#   s	            r   r   r   (  s    ZZF


B
C,,J
3"c>*) ..% $11	=SZZ=N1OP&'w|LCJ (DO$	6	' ..w7
'BO$	"
 Z__S12 #:VC	

 M ++ 	=# 'sO<CJ		=0 ++ 	"# %223HCJS!	"s&   
AE  ) F  ,FFA
GGr   )rr   ro   rR   r6   mercurial.hgwebr   r    	mercurialr   r   r    r   rQ   r   rO   r   rH   rJ   rI   ehwrapfunctionr	   r2   r>   r   rP   r   r   r   r   <module>r      s        1  


''// ++%== !55 )EE Y "56# 7#LOdtnHr   