
    d{                        d Z ddlZddlZddlZddlZddlZddlZddlmZ	 ddl
Z
ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZmZmZ dd
lmZmZmZmZ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. ddl/m0Z0m1Z1m2Z2 ddl3m4Z4m5Z5 ddl6m7Z7m8Z8 	  G d de          Z9d,dZ:d Z;d Z<d,dZ= G d de>          Z? G d d          Z@ G d d          ZA G d de!          ZB G d de           ZC G d  d!e          ZD G d" d#e0          ZE G d$ d%e5          ZF G d& d'e7          ZGd( ZHd) ZIejJ        fd*ZKeLd+k    r eK             dS dS )-z)Repo implementation atop OpenStack SWIFT.    N)ConfigParserBytesIO)
HTTPClient   )GreenThreadsMissingObjectFinder)LRUSizeCache)INFODIRPACKDIRPackBasedObjectStore)S_ISGITLINKBlobCommitTagTree)PackPackDataPackIndexerPackStreamCopier_compute_object_sizecompute_file_sha	iter_sha1load_pack_index_fileread_pack_headerunpack_objectwrite_pack_headerwrite_pack_index_v2write_pack_object)TCP_GIT_PORT)InfoRefsContainerread_info_refswrite_info_refs)	OBJECTDIRBaseRepo)BackendTCPGitServerc                       e Zd Zd ZdS )PackInfoMissingObjectFinderc                    	 | j         sd S | j                                         \  }}}|| j        vrn1|s| j                            |          }|d         t
          j        k    r |                     |d         ddfg           nq|d         t          j        k    r&|                     d |d         D                        n5|d         t          j        k    r|                     |d         d dfg           || j
        v r$|                     | j
        |         d dfg           | j                            |           |                     dt          | j                  z             ||fS )	NTr   r    Fc                 ,    g | ]}t          |          S  )tuple).0is     Y/home/feoh/.local/pipx/venvs/poetry/lib/python3.11/site-packages/dulwich/contrib/swift.py
<listcomp>z4PackInfoMissingObjectFinder.next.<locals>.<listcomp>`   s    999AuQxx999       zcounting objects: %d)objects_to_sendpopsha_doneobject_storepack_info_getr   type_numadd_todor   r   _taggedaddprogresslen)selfshanameleafinfos        r0   nextz PackInfoMissingObjectFinder.nextT   sx   	' t $ 4 8 8 : :S$$-''	  		A$22377DAw&/))QU345555aDM))99a999::::aCL((Qu56777dl""S 14>?@@@#.T]1C1CCDDDT{r2   N)__name__
__module____qualname__rD   r,   r2   r0   r(   r(   S   s#            r2   r(   c                    t                      }|r?	 |                    ||            n%# t          $ r |                    |           Y nw xY w|S d}| s6	 t          j        d         }n$# t          $ r}t          d          |d}~ww xY w| }t          j        	                    |          st          d|z            |
                    |           |S )zLoad configuration in global var CONF

    Args:
      path: The path to the configuration file
      file: If provided read instead the file like object
    NDULWICH_SWIFT_CFGz(You need to specify a configuration filez$Unable to read configuration file %s)r   	read_fileAttributeErrorreadfposenvironKeyError	Exceptionpathisfileread)rQ   fileconfconfpathexcs        r0   	load_confrX   j   s    >>D 	NN4&&&& 	 	 	KK	 H 	Ez"56HH 	E 	E 	E:< <ADE	E 7>>(## K>IJJJIIhKs'   ) A
AA( (
B2BBc                     |                      |          5 }t          ||          cddd           S # 1 swxY w Y   dS )zRead a pack index file from Swift

    Args:
      scon: a `SwiftConnector` instance
      filename: Path to the index file objectise
    Returns: a `PackIndexer` instance
    N)
get_objectr   )sconfilenamefs      r0   swift_load_pack_indexr^      s     
	"	" 1a#Ha001 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1s   377c                 :   t          j        | |          }i }|                                D ]}|j        t          j        k    r|j        |j        |j        f||j        <   4|j        t          j        k    r0d |	                                D             }|j        |f||j        <   y|j        t          j        k    rd ||j        <   |j        t          j        k    r|j        |j        d         f||j        <   t          j        t          j        |                    S )Nc                 d    g | ]-\  }}}t          |          ||t          j        |           f.S r,   )r   statS_ISDIR)r.   nmss       r0   r1   z$pack_info_create.<locals>.<listcomp>   sL       Aq!"1~~A4<??*+  r2   r3   )r   from_objectsiterobjectsr9   r   parentstreeidr   itemsr   r   objectzlibcompressjsondumps)	pack_data
pack_indexpackrC   objshass         r0   pack_info_createrv      s   Y
33DD!! 9 9<6?**L#+sx@DLL\T]** "yy{{  D
  L$/DLL\T]**DLL\S\))L#*Q-8DL=D))***r2   c                 
   |s|                     |           }n|}|sd S 	 t          j        t          j        |                                                    |                                 S # |                                 w xY wN)rZ   ro   loadsrm   
decompressrS   close)r\   r[   rT   r]   s       r0   load_pack_infor|      st     OOH%% tz$/!&&((3344									s   7A, ,Bc                       e Zd ZdS )SwiftExceptionN)rE   rF   rG   r,   r2   r0   r~   r~      s        Dr2   r~   c                   V    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZddZd Zd Zd
S )SwiftConnectorzCA Connector to swift that manage authentication and errors catchingc                 
   || _         | j                             dd          | _        | j        dvrt          d          | j                             dd          | _        | j                             dd          | _        | j                             dd          | _        | j                             dd          pd	| _        | j                             dd
          pd| _	        | j                             dd          pd	| _
        | j                             dd          pd| _        | j                             dd          pd| _        | j                             dd          pd| _        | j                             dd          pd| _        || _        d}| j        dk    r"|                                 \  | _        | _        n!|                                 \  | _        | _        dt)          | j                  i}t+          j        t)          | j                  | j
        || j	        | j	        |          | _        t)          t1          j        t5          j        | j                  j        | j                            | _        dS )zInitialize a SwiftConnector

        Args:
          root: The swift container that will act as Git bare repository
          conf: A ConfigParser Object
        swiftauth_ver)12z.Wrong authentication version use either 1 or 2auth_urlusernamepasswordconcurrency
   http_timeout   http_pool_lengthregion_name	RegionOneendpoint_typeinternalURLcache_lengthchunk_lengthi/  i 0  r   X-Auth-Token)r   
block_sizeconnection_timeoutnetwork_timeoutheadersN)rU   getr   NotImplementedErrorr   userr   getintr   r   r   r   r   r   r   rootswift_auth_v1storage_urltokenswift_auth_v2strr   from_url
httpclient	posixpathjoinurlparserQ   	base_path)r?   r   rU   r   token_headers        r0   __init__zSwiftConnector.__init__   s5    		gz::=
**%&VWWW	gz::IMM':66		gz::9++G]CCIr I,,WnEEK $	 0 0:L M M SQS9==-@@OK!Y]]7ODDU I,,WnEEK I,,WnEEN	
=C+/+=+=+?+?(Ddjj+/+=+=+?+?(Ddj&DJ8$- !!-!#0 - 
 
 
 N8,T-=>>CTYOO
 
r2   c                 .   | j                             dd          | _         t          j        | j        | j        | j                  }| j         | j        d}t          j        | j                  j        }|	                    d||          }|j
        dk     s|j
        dk    rat          d	t          |                                          |z   d
|j
        dt          |                                          dz             |d         }|d         }||fS )N;:r   r   )zX-Auth-Userz
X-Auth-KeyGETr      ,  zAUTH v1.0 request failed on  with error code  ()zX-Storage-Urlr   )r   replacer   r   r   r   r   r   rQ   requeststatus_coder~   r   get_base_urlrk   )r?   auth_httpclientr   rQ   retr   r   s          r0   r   zSwiftConnector.swift_auth_v1   s&   I%%c3//	$-M#0 -
 
 

 #')4=II //4%%eT7%CC ?S  COs$:$: . 446677$>>>OOO		$$$$	   /*N#E!!r2   c                      j                             d          \   _         _         i } j          j        d j        d|d<   t	          j        |          }ddi}t          j         j         j	         j	                  }t          j
         j                  j        }|                    d          st          j        |d          }|                    d	|||
          }|j        dk     s|j        dk    rat#          dt%          |                                          |z   d|j        dt%          |                                          dz             t	          j        |                                          }|d         d         d         }|d         d         }	d |	D             d         }
|
d         } fd|D             d         }| j                 |fS )Nr   )r   r   )passwordCredentials
tenantNameauthzContent-Typezapplication/jsonr   tokensPOSTbodyr   r   r   zAUTH v2.0 request failed on r   r   r   accessr   rj   serviceCatalogc                 *    g | ]}|d          dk    |S )typezobject-storer,   )r.   o_stores     r0   r1   z0SwiftConnector.swift_auth_v2.<locals>.<listcomp>(  s-     
 
 
wv./P/PG/P/P/Pr2   r   	endpointsc                 6    g | ]}|d          j         k    |S )region)r   )r.   endpr?   s     r0   r1   z0SwiftConnector.swift_auth_v2.<locals>.<listcomp>,  s*    UUUT$x.DDT2T2TD2T2T2Tr2   )r   splittenantr   ro   rp   r   r   r   r   r   rQ   endswithr   r   r   r   r~   r   r   rk   ry   rS   r   )r?   	auth_dict	auth_jsonr   r   rQ   r   auth_ret_jsonr   catalogsr7   r   endpoints   `            r0   r   zSwiftConnector.swift_auth_v2  s   !%!5!5TY	 !I M$ $ +
 
	& Jy))	!#56$-M#0 -
 
 

  //4}}X&& 	2>$11D%%fdG%TT?S  COs$:$: . 446677$>>>OOO		$$$$	   
388::..h'06 *+;<
 
#+
 
 

 !-	UUUUYUUUVWX*+U22r2   c                     | j                             d| j                  }|j        dk    rdS |j        dk     s|j        dk    rt	          d|j        z            dS )zXCheck that Swift container exist

        Returns: True if exist or None it not
        HEAD  Nr   r   &HEAD request failed with error code %sT)r   r   r   r   r~   r?   r   s     r0   test_root_existszSwiftConnector.test_root_exists/  sk    
 o%%fdn==?c!!4?S  COc$9$9 83?J   tr2   c                     |                                  sM| j                            d| j                  }|j        dk     s|j        dk    rt          d|j        z            dS dS )zbCreate the Swift container

        Raises:
          SwiftException: if unable to create
        PUTr   r   %PUT request failed with error code %sN)r   r   r   r   r   r~   r   s     r0   create_rootzSwiftConnector.create_root=  sv     $$&& 	/))%@@C$$#(=(=$;coM  	 	(=(=r2   c                    d}| j         |z   }| j                            d|          }|j        dk    rdS |j        dk     s|j        dk    rt	          d|j        z            |                                }t          j        |          S )zRetrieve objects list in a container

        Returns: A list of dict that describe objects
                 or None if container does not exist
        z?format=jsonr   r   Nr   r   %GET request failed with error code %s)r   r   r   r   r~   rS   ro   ry   )r?   qsrQ   r   contents        r0   get_container_objectsz$SwiftConnector.get_container_objectsJ  s     ~"o%%eT22?c!!4?S  COc$9$9 7#/I   ((**z'"""r2   c                 0   | j         dz   |z   }| j                            d|          }|j        dk    rdS |j        dk     s|j        dk    rt	          d|j        z            i }|                                D ]\  }}|||                                <   |S )zRetrieve object stat

        Args:
          name: The object name
        Returns:
          A dict that describe the object or None if object does not exist
        /r   r   Nr   r   r   )r   r   r   r   r~   rk   lower)r?   rA   rQ   r   resp_headersheadervalues          r0   get_object_statzSwiftConnector.get_object_stat\  s     ~#d*o%%fd33?c!!4?S  COc$9$9 83?J    YY[[ 	1 	1MFE+0L((r2   c                 l    |                     d           |                                 j        dz   |z   dt          t	                              i fd}	  |            }n# t
          $ r  |            }Y nw xY w|j        dk     s|j        dk    rt          d|j        z            dS )	zPut an object

        Args:
          name: The object name
          content: A file object
        Raises:
          SwiftException: if unable to create
        r   r   zContent-Lengthc                  D    j                             d          } | S )Nr   r   )r   r   )r   datar   rQ   r?   s    r0   _sendz(SwiftConnector.put_object.<locals>._send  s&    /))%D')RRCJr2   r   r   r   N)seekrS   r   r   r>   rP   r   r~   )r?   rA   r   r   r   r   r   rQ   s   `    @@@r0   
put_objectzSwiftConnector.put_objectq  s     	Q||~~~#d*#ST^^4	 	 	 	 	 	 	 		%''CC 	 	 	%''CCC	 ?S  COc$9$9 7#/I   %:$9s   "
A- -BBNc                 0   i }|rd|z  |d<   | j         dz   |z   }| j                            d||          }|j        dk    rdS |j        dk     s|j        d	k    rt	          d
|j        z            |                                }|r|S t          |          S )a	  Retrieve an object

        Args:
          name: The object name
          range: A string range like "0-10" to
                 retrieve specified bytes in object content
        Returns:
          A file like instance or bytestring if range is specified
        zbytes=%sRanger   r   r   r   Nr   r   r   )r   r   r   r   r~   rS   r   )r?   rA   ranger   rQ   r   r   s          r0   rZ   zSwiftConnector.get_object  s      	2)E1GG~#d*o%%eT7%CC?c!!4?S  COc$9$9 7#/I   ((** 	Nwr2   c                     | j         dz   |z   }| j                            d|          }|j        dk     s|j        dk    rt	          d|j        z            dS )zDelete an object

        Args:
          name: The object name
        Raises:
          SwiftException: if unable to delete
        r   DELETEr   r   (DELETE request failed with error code %sN)r   r   r   r   r~   )r?   rA   rQ   r   s       r0   
del_objectzSwiftConnector.del_object  si     ~#d*o%%h55?S  COc$9$9 :S_L   %:$9r2   c                    |                                  D ]}|                     |d                    | j                            d| j                  }|j        dk     s|j        dk    rt          d|j        z            dS )zDelete the root container by removing container content

        Raises:
          SwiftException: if unable to delete
        rA   r   r   r   r   N)r   r   r   r   r   r   r~   )r?   rt   r   s      r0   del_rootzSwiftConnector.del_root  s     --// 	) 	)COOCK((((o%%h???S  COc$9$9 :S_L   %:$9r2   rx   )rE   rF   rG   __doc__r   r   r   r   r   r   r   r   rZ   r   r   r,   r2   r0   r   r      s        MM'
 '
 '
R" " "8(3 (3 (3T    # # #$  *  <       6      r2   r   c                   2    e Zd ZdZd Zd	dZd Zd Zd ZdS )
SwiftPackReaderab  A SwiftPackReader that mimic read and sync method

    The reader allows to read a specified amount of bytes from
    a given offset of a Swift object. A read offset is kept internally.
    The reader will read from Swift a specified amount of data to complete
    its internal buffer. chunk_length specify the amount of data
    to read from Swift.
    c                 |    || _         || _        || _        d| _        d| _        d| _        | j         j        | _        dS )zInitialize a SwiftPackReader

        Args:
          scon: a `SwiftConnector` instance
          filename: the pack filename
          pack_length: The size of the pack object
        r   r2   N)r[   r\   pack_lengthoffsetbase_offsetbuffr   buff_length)r?   r[   r\   r   s       r0   r   zSwiftPackReader.__init__  sC     	 &	91r2   Fc                     |r| j         dz  | _         | j        }t          | j        | j         z   | j                  }| j                            | j        d                    ||                    }|| _        d S )Nr   z{}-{}r   )	r  r   minr   r[   rZ   r\   formatr  )r?   morer   rr   s        r0   _readzSwiftPackReader._read  st     	4#/!3D! 4#33T5EFFi""4=vq8Q8Q"RR			r2   c                 6   | j         |z   }| j        |z   | j        k    r| j        | j         d         }|| _         |S |t	          | j                  k    r+|                     d           |                     |          S | j        | j         |         }|| _         |S )zRead a specified amount of Bytes form the pack object

        Args:
          length: amount of bytes to read
        Returns:
          a bytestring
        NT)r  )r   r   r   r  r>   r	  rS   )r?   lengthendr   s       r0   rS   zSwiftPackReader.read  s     kF"c!D$4449T[]]+DDKKTYJJDJ!!!99V$$$ys*+r2   c                 J    || _         |                                  d| _        dS )zZSeek to a specified offset

        Args:
          offset: the offset to seek to
        r   N)r   r	  r   )r?   r   s     r0   r   zSwiftPackReader.seek  s$     "

r2   c                 D    | j                             | j        d          S )zRRead the checksum from the pack

        Returns: the checksum bytestring
        z-20r  )r[   rZ   r\   r?   s    r0   read_checksumzSwiftPackReader.read_checksum	  s!    
 y##DM#???r2   N)F)	rE   rF   rG   r   r   r	  rS   r   r  r,   r2   r0   r   r     ss         2 2 2      *  @ @ @ @ @r2   r   c                   *    e Zd ZdZd Zd Zd Zd ZdS )SwiftPackDatazThe data contained in a packfile.

    We use the SwiftPackReader to read bytes from packs stored in Swift
    using the Range header feature of Swift.
    c                 x   || _         || _        d| _        | j                             | j                  }t	          |d                   | _        t          | j         | j        | j                  }t          |j                  \  }| _	        t          d| j         j        z  t                    | _        d| _        dS )zInitialize a SwiftPackReader

        Args:
          scon: a `SwiftConnector` instance
          filename: the pack filename
           zcontent-lengthi   )compute_sizeN)r[   	_filename_header_sizer   intr   r   r   rS   _num_objectsr	   r   r   _offset_cachers   )r?   r[   r\   r   pack_readerversions         r0   r   zSwiftPackData.__init__  s     	!)++DN;;w'7899%diAQRR'78H'I'I$$#)$)00-
 
 
 			r2   c                    || j         v r| j         |         S || j        k    sJ t          | j        | j        | j                  }|                    |           t          |j                  \  }}|j	        |
                                fS rx   )r  r  r   r[   r  r   r   r   rS   pack_type_num_obj)r?   r   r  unpacked_s        r0   get_object_atzSwiftPackData.get_object_at,  s    T'''%f--*****%diAQRR   #K$455!&88r2   c                 j    t          | j        | j        | j                  }|                                S rx   )r   r[   r  r   r  )r?   r  s     r0   get_stored_checksumz!SwiftPackData.get_stored_checksum5  s,    %diAQRR((***r2   c                     d S rx   r,   r  s    r0   r{   zSwiftPackData.close9  s    r2   N)rE   rF   rG   r   r   r"  r$  r{   r,   r2   r0   r  r    sZ           (9 9 9+ + +    r2   r  c                   8     e Zd ZdZ fdZed             Z xZS )	SwiftPackzA Git pack object.

    Same implementation as pack.Pack except that _idx_load and
    _data_load are bounded to Swift version of load_pack_index and
    PackData.
    c                      |d          _         |d=  t                      j        |i |  j        dz    _        d  _         fd _         fd _         fd _        d S )Nr[   .infoc                  8    t           j         j                  S rx   )r|   _pack_info_pathr[   r  s   r0   <lambda>z$SwiftPack.__init__.<locals>.<lambda>K  s    ~d6JDI'V'V r2   c                  8    t           j         j                  S rx   )r^   r[   	_idx_pathr  s   r0   r,  z$SwiftPack.__init__.<locals>.<lambda>L  s    !6ty$.!Q!Q r2   c                  8    t           j         j                  S rx   )r  r[   
_data_pathr  s   r0   r,  z$SwiftPack.__init__.<locals>.<lambda>M  s    -	4?"K"K r2   )	r[   superr   	_basenamer+  
_pack_info_pack_info_load	_idx_load
_data_load)r?   argskwargs	__class__s   `  r0   r   zSwiftPack.__init__E  s}    6N	6N$)&)))#~7VVVVQQQQKKKKr2   c                 P    | j         |                                 | _         | j         S )z The pack data object being used.)r3  r4  r  s    r0   	pack_infozSwiftPack.pack_infoO  s'     ?""2244DOr2   )rE   rF   rG   r   r   propertyr;  __classcell__r9  s   @r0   r'  r'  =  sb         L L L L L   X    r2   r'  c                   r     e Zd ZdZ fdZd Zd Zd Z e            fdZ	d Z
d Zd	 Zd
 Zd Zd Z xZS )SwiftObjectStorezA Swift Object Store

    Allow to manage a bare Git repository from Openstack Swift.
    This object store only supports pack files and not loose objects.
    c                     t                                                       || _        | j        j        | _        t	          j        t          t                    | _        d| _	        dS )z^Open a Swift object store.

        Args:
          scon: A `SwiftConnector` instance
        N)
r1  r   r[   r   r   r   r#   r   pack_dir_alternates)r?   r[   r9  s     r0   r   zSwiftObjectStore.__init__^  sN     		IN	!y'::r2   c                     | j                                         }d |D             }g }|D ]7}t          || j                   }|| j        |<   |                    |           8|S )Nc                 |    g | ]9}|d                               d          |d                              dd          :S )rA   .packr*   )r   r   r.   os     r0   r1   z7SwiftObjectStore._update_pack_cache.<locals>.<listcomp>l  sT     
 
 
y!!'**
fIgr**
 
 
r2   r[   )r[   r   r'  _pack_cacheappend)r?   objects
pack_filesr   basenamers   s         r0   _update_pack_cachez#SwiftObjectStore._update_pack_cachej  s    )1133
 

 
 


 " 	 	HXDI666D)-DX&JJt
r2   c                     g S )z2Loose objects are not supported by this repositoryr,   r  s    r0   _iter_loose_objectsz$SwiftObjectStore._iter_loose_objectsx  s    	r2   c                 @    | j         D ]}||v r|j        |         c S d S rx   )packsr;  )r?   r@   rs   s      r0   r8   zSwiftObjectStore.pack_info_get|  s>    J 	+ 	+Dd{{~c**** 	+ 	+r2   c                 T     fd}t                      }t                      }g }|                    |           |rj|                    d          }||v r|                    |           n9||vr5|                    |            ||          }|                    |           |j||fS )Nc                 ~    j         D ]3}| |v r-	 |j        |          d         }n# t          $ r g cY c S w xY w|c S 4d S )Nr3   )rS  r;  rO   )commitrs   rh   r?   s      r0   _find_parentsz:SwiftObjectStore._collect_ancestors.<locals>._find_parents  sw    
 # #T>>""&."8";# " " "!					" #NNN "# #s   $55r   )setextendr5   r<   )	r?   headscommonrW  basescommitsqueueerh   s	   `        r0   _collect_ancestorsz#SwiftObjectStore._collect_ancestors  s    	# 	# 	# 	# 	# %%U 	&		!AF{{		!'!!A'-**W%%%  	& r2   c                 >     t                       fd}d }||fS )zAdd a new pack to this object store.

        Returns: Fileobject to write to and a commit function to
            call when the pack is finished.
        c                                          d           t          d          } |                                 }|rt          j        j        dt          d |D                       z            }t                      }t          ||| 	                                           j
                            |dz                                               j
                            |dz   |           |                                 t          |j
                  }|                                                     ||           |S d S )	Nr   r*   )rT   r\   zpack-%sc              3   &   K   | ]}|d          V  dS r   Nr,   )r.   entrys     r0   	<genexpr>z<SwiftObjectStore.add_pack.<locals>.commit.<locals>.<genexpr>  s&      )H)Hu%()H)H)H)H)H)Hr2   rF  .idxrI  )r   r   sorted_entriesr   r   rB  r   r   r   r$  r[   r   r{   r'  check_length_and_checksum_add_cached_pack)rs   entriesrN  index
final_packr]   r?   s        r0   rV  z)SwiftObjectStore.add_pack.<locals>.commit  s6   FF1IIIR000D))++G $>M	)H)H)H)H)H H HH   		#E7D4L4L4N4NOOO	$$X%7;;;				$$X%6>>>&xdi@@@
44666%%h
;;;!!tr2   c                      d S rx   r,   r,   r2   r0   abortz(SwiftObjectStore.add_pack.<locals>.abort  s    Dr2   r   )r?   rV  ro  r]   s   `  @r0   add_packzSwiftObjectStore.add_pack  sK     II	 	 	 	 	 	,	 	 	 &%r2   c                 6    |                      |d fg           d S rx   )add_objects)r?   rt   s     r0   
add_objectzSwiftObjectStore.add_object  s0    d	
 	
 	
 	
 	
r2   c                     dS NFr,   r  s    r0   _pack_cache_stalez"SwiftObjectStore._pack_cache_stale  s    ur2   c                     d S rx   r,   )r?   r@   s     r0   _get_loose_objectz"SwiftObjectStore._get_loose_object  s    tr2   c                    t          j        d          \  }}t          j        |d          }	 t	          || j                  }t          ||||          }|                                 |                     ||||          |	                                 t          j
        |           S # |	                                 t          j
        |           w xY w)zRead a thin pack

        Read it from a stream and complete it in a temporary file.
        Then the pack and the corresponding index file are uploaded to Swift.
        	tmp_pack_)prefixzw+b)resolve_ext_ref)
delta_iter)tempfilemkstemprM   fdopenr   get_rawr   verify_complete_thin_packr{   unlink)r?   read_all	read_somefdrQ   r]   indexercopiers           r0   add_thin_packzSwiftObjectStore.add_thin_pack  s     #;777DIb%  	!!T\BBBG%h	1QQQFMMOOO++AtVWEEGGIIIIdOOOO GGIIIIdOOOOs   AB, ,*Cc           
      P   t          |          }|                    d           t          |t          |          t          |                                          z              |                                 t          |d          }|                    dt          j                   |                                D ]n}t          |          dk    sJ | 	                    |          \  }}	|
                                }
t          |||	|          }|                    ||
|f           o|                                }|                    |           |                                 |                                 t!          j        | j        dt          j        t)          d |D                                 z             }| j                            |dz   |           |d	z   }t/                      }t1          |||           | j                            ||           |                    d           t3          d
|          }|                    d           t5          d
|          }t7          ||          }|                                 |                                 t/          |          }|dz   }| j                            ||           |                                 t;          || j                  }|                                 |                     ||           |S )Nr   i)end_ofsr   )r@   zpack-c              3   &   K   | ]}|d          V  dS rd  r,   )r.   r_  s     r0   rf  z7SwiftObjectStore._complete_thin_pack.<locals>.<genexpr>  s&      +B+BQAaD+B+B+B+B+B+Br2   rF  rg  r*   )r\   rT   r)  rI  ) listr   r   r>   ext_refsflushr   rM   SEEK_CURr  tellr   rK  digestwritesortr   r   rB  fsdecoder   r[   r   r   r   r   r   rv   r{   r'  ri  rj  )r?   r]   rQ   r  r  rk  new_shaext_shar9   r   r   crc32pack_shapack_base_namer\   
index_filerq   rr   serialized_pack_infopack_info_filerm  s                        r0   r  z$SwiftObjectStore._complete_thin_pack  s   w-- 	
q			!S\\C0@0@0B0B,C,CCDDD 	
			 #1c222 	
q"+ '')) 	5 	5Gw<<2%%%%!\\'22NHdVVXXF%a4WEEEENNGVU34444>>##					 	"Mbk)+B+B'+B+B+B"B"BCCC
 
 		^g5q999 "F*YY
J:::	Xz222 	
q			bq111	)"j99
/	:FF				 !566!G+	X~666 ~DI>>>
,,...nj999r2   )rE   rF   rG   r   r   rO  rQ  r8   rX  r`  rp  rs  rv  rx  r  r  r=  r>  s   @r0   r@  r@  W  s         
  
  
  
  
     + + +
 03suu        2!  !  ! F
 
 
      ": : : : : : :r2   r@  c                   @     e Zd ZdZ fdZd Zd Zd Zd Zd Z	 xZ
S )SwiftInfoRefsContainerz&Manage references in info/refs object.c                     || _         d| _        || _        | j                             | j                  }|st	          d          }t                                          |           d S )Nz	info/refsr2   )r[   r\   storerZ   r   r1  r   )r?   r[   r  r]   r9  s       r0   r   zSwiftInfoRefsContainer.__init__  s`    	#
I  // 	Ar2   c                     |                      |           | j                            | j                  }|si S t	          |          }|||         |k    rdS |S ru  )_check_refnamer[   rZ   r\   r!   )r?   rA   old_refr]   refss        r0   _load_check_refz&SwiftInfoRefsContainer._load_check_ref$  sf    D!!!I  // 	Ia  DzW$$ur2   c                     t                      }|                    t          || j                             | j                            | j        |           d S rx   )r   
writelinesr"   r  r[   r   r\   )r?   r  r]   s      r0   _write_refsz"SwiftInfoRefsContainer._write_refs/  sI    II	_T4:66777	T]A.....r2   c                     |dk    rdS |                      ||          }t          |t                    sdS |||<   |                     |           || j        |<   dS )z=Set a refname to new_ref only if it currently equals old_ref.r   TFr  
isinstancedictr  _refs)r?   rA   r  new_refr  s        r0   set_if_equalsz$SwiftInfoRefsContainer.set_if_equals4  sj    6>>4##D'22$%% 	5T
"
4tr2   c                     |dk    rdS |                      ||          }t          |t                    sdS ||= |                     |           | j        |= dS )z5Remove a refname only if it currently equals old_ref.r   TFr  )r?   rA   r  r  s       r0   remove_if_equalsz'SwiftInfoRefsContainer.remove_if_equals@  sf    6>>4##D'22$%% 	5JJttr2   c                     	 | j         d         | j         d<   n# t          $ r Y nw xY w| j                                         S )Nzrefs/heads/masterr   )r  rO   keysr  s    r0   allkeyszSwiftInfoRefsContainer.allkeysL  sP    	!%,?!@DJv 	 	 	D	z   s    
%%)rE   rF   rG   r   r   r  r  r  r  r  r=  r>  s   @r0   r  r    s        00    	 	 	/ / /

 
 

 
 
! ! ! ! ! ! !r2   r  c                   6    e Zd Zd Zd Zd Zed             ZdS )	SwiftRepoc                    |                     d          | _        || _        t          | j        | j                  | _        | j                                        }|st          d| j        z            d |D             }t          |vrt          d| j        z            d| _        | j        | _	        t          | j                  }t          | j        |          }t          j        | ||           dS )ab  Init a Git bare Repository on top of a Swift container.

        References are managed in info/refs objects by
        `SwiftInfoRefsContainer`. The root attribute is the Swift
        container that contain the Git bare repository.

        Args:
          root: The container which contains the bare repo
          conf: A ConfigParser object
        r   z#There is not any GIT repo here : %sc                 P    g | ]#}|d                               d          d         $S )rA   r   r   )r   rG  s     r0   r1   z&SwiftRepo.__init__.<locals>.<listcomp>f  s-    <<<q1V9??3''*<<<r2   z!This repository (%s) is not bare.TN)lstripr   rU   r   r[   r   rP   r#   bare_controldirr@  r  r$   r   )r?   r   rU   rL  r7   r  s         r0   r   zSwiftRepo.__init__U  s     KK$$		"49di88	)1133 	OADIMNNN<<G<<<G##?$)KLLL	9'	22%di>>$d33333r2   c                     dS )zProbe the file-system to determine whether permissions can be trusted.

        Returns: True if permissions can be trusted, False otherwise.
        Fr,   r  s    r0   _determine_file_modezSwiftRepo._determine_file_modeo  s	    
 ur2   c                     t                      5 }|                    |           | j                            ||           ddd           dS # 1 swxY w Y   dS )zPut an object in a Swift container

        Args:
          filename: the path to the object to put on Swift
          contents: the content as bytestring
        N)r   r  r[   r   )r?   r\   contentsr]   s       r0   _put_named_filezSwiftRepo._put_named_filev  s     YY 	.!GGHI  1---	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.s   1AAAc                 8   |                                  t          j        t          t                    t          j        t
          d          fD ]%}|                    |t          d                     & | |j        |          }|	                    d           |S )zCreate a new bare repository.

        Args:
          scon: a `SwiftConnector` instance
          conf: a ConfigParser object
        Returns:
          a `SwiftRepo` instance
        r  r2   T)
r   r   r   r#   r   r
   r   r   r   _init_files)clsr[   rU   rt   r   s        r0   	init_barezSwiftRepo.init_bare  s     	N9g..N7F++
 	/ 	/C OOC....c$)T""
r2   N)rE   rF   rG   r   r  r  classmethodr  r,   r2   r0   r  r  T  s\        4 4 44  	. 	. 	.   [  r2   r  c                       e Zd Zd Zd ZdS )SwiftSystemBackendc                 "    || _         || _        d S rx   )rU   logger)r?   r  rU   s      r0   r   zSwiftSystemBackend.__init__  s    	r2   c                 b    | j                             d|           t          || j                  S )Nzopening repository at %s)r  rC   r  rU   )r?   rQ   s     r0   open_repositoryz"SwiftSystemBackend.open_repository  s-    3T:::ty)))r2   N)rE   rF   rG   r   r  r,   r2   r0   r  r    s2          * * * * *r2   r  c                    ddl }|                                }|                    ddddd           |                    d	d
dt          t          d           |                    ddddd           |                    |           \  }} 	 ddl}ddl}n3# t          $ r& t          d           t          j        d           Y nw xY wddl}|j                                         ddlm} |                    t$                    }t'          |j                  }t+          ||          }	|                                 t/          |	|j        |j                  }
|
                                 dS )z*Entry point for starting a TCP git server.r   Nz-lz--listen_addresslisten_addressz	127.0.0.1zBinding IP address.destdefaulthelpz-pz--portportzBinding TCP port.)r  r   r  r  -c--swift_configswift_configr*   1Path to the configuration file for Swift backend.zOgevent and geventhttpclient libraries are mandatory  for use the Swift backend.r3   )	log_utils)r  )optparseOptionParser
add_optionr  r   
parse_argsgeventgeventhttpclientImportErrorprintsysexitgevent.monkeymonkeypatch_socketdulwichr  	getLoggerrE   rX   r  r  default_logging_configr&   r  r  serve_forever)r7  r  parseroptionsr  r  r  r  rU   backendservers              r0   
cmd_daemonr    s   OOO""$$F
"           @     %%d++MGT   *	
 	
 	
 	 
M   !!!!!!  **FW)**D ..G$$&&&'7#9MMMF
s   B -CCc                 ^   dd l }|                                }|                    ddddd           |                    |           \  }} t	          |j                  }| g k    r|                    d           | d         }t          ||          }t          	                    ||           d S )	Nr   r  r  r  r*   r  r  zmissing repository name)
r  r  r  r  rX   r  errorr   r  r  )r7  r  r  r  rU   repor[   s          r0   cmd_initr    s    OOO""$$F
@     %%d++MGTW)**Drzz.///7D$%%Dd#####r2   c           	         t           t          d}t          t          j                  dk     rlt          d                    t          j        d         d                    |                                                               t          j	        d           t          j        d         }||vr&t          d|z             t          j	        d            ||         t          j        dd                     d S )N)initdaemonr   zUsage: {} <{}> [OPTIONS...]r   |r3   zNo such subcommand: %s)
r  r  r>   r  argvr  r  r   r  r  )r  commandscmds      r0   mainr    s     H
 38}}q+2238A;@Y@YZZ[[[
(1+C
(&,---HSM#(122,r2   __main__)NN)Mr   ro   rM   r   ra   r  r~  urllib.parseparser   rm   configparserr   ior   r  r   greenthreadsr   	lru_cacher	   r7   r
   r   r   rL  r   r   r   r   r   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   protocolr   r  r    r!   r"   r  r#   r$   r  r%   r&   r(   rX   r^   rv   r|   rP   r~   r   r   r  r'  r@  r  r  r  r  r  r  r  rE   r,   r2   r0   <module>r     s  . 0 /  				      



         % % % % % %       ' ' ' ' ' ' : : : : : : $ $ $ $ $ $ A A A A A A A A A A : : : : : : : : : : : : : :O O O O O O O O O O O O O O O O O O O O O O O O O O O O O O $ # # # # # E E E E E E E E E E & & & & & & & & * * * * * * * *8    "A   .   <	1 	1 	1+ + +0
 
 
 
	 	 	 	 	Y 	 	 	H H H H H H H HVF@ F@ F@ F@ F@ F@ F@ F@R) ) ) ) )H ) ) )X       4~ ~ ~ ~ ~+ ~ ~ ~B9! 9! 9! 9! 9!. 9! 9! 9!x? ? ? ? ? ? ? ?D* * * * * * * *1 1 1h$ $ $* h        " zDFFFFF r2   