
    ch"                         S SK Jr  S SKJrJrJr  S SKJrJr  S SK	J
r
JrJrJr  S SKJrJr  S SKJrJrJrJrJrJrJrJrJrJrJrJr  S SKJrJ r J!r!J"r"  S SK#J$r$  S S	K%r%S S	K&r&S S	K'r'S S	K(r(S
r) " S S\\\5      r*g	)    )suppress)
FileDBBase	ObjectDBR	ObjectDBW)	BadObjectAmbiguousObjectName)DecompressMemMapReaderFDCompressedSha1WriterFDStream
Sha1Writer)OStreamOInfo)file_contents_ro_filepathENOENT
hex_to_bin
bin_to_hexexistschmodisfileremoverenamedirnamebasenamejoin)
chunk_sizeloose_object_header_infowrite_objectstream_copy)force_bytesN)LooseObjectDBc                      ^  \ rS rSrSr\r\" SS5      r\	R                  S:X  a	  \" SS5      rU 4S jrS rS	 rS
 rS rU 4S jrS rS rS rS rS rS rSrU =r$ )r    ?   z/A database which operates on loose object files444   nt644c                 n   > [         TU ]  U5        [        5       U l        [	        [
        SS5      U l        g )N	O_NOATIMEr   )super__init__dict_hexsha_to_filegetattros_fd_open_flags)self	root_path	__class__s     aC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\gitdb/db/loose.pyr*   LooseObjectDB.__init__M   s-    ##v &b+q9    c                 &    [        USS USS 5      $ )zk
:return: path at which the object with the given hexsha would be stored,
    relative to the database rootN   )r   )r0   hexshas     r3   object_pathLooseObjectDB.object_pathV   s     F2AJqr
++r5   c                 
   [        [        5         U R                  U   sSSS5        $ ! , (       d  f       O= fU R                  U R	                  U5      5      n[        U5      (       a  X R                  U'   U$ [        U5      e)zu
:return: readable object path to the object identified by hexsha
:raise BadObject: If the object file does not existN)r   KeyErrorr,   db_pathr9   r   r   )r0   r8   paths      r3   readable_db_object_path%LooseObjectDB.readable_db_object_path\   sh     h''/  
 ||D,,V45$<<+/  (Ks   )
7c                     SnU R                  5        H=  n[        U5      R                  [        U5      5      (       d  M-  Ub  [	        U5      eUnM?     Uc  [        U5      eU$ )z:return: 20 byte binary sha1 string which matches the given name uniquely
:param name: hexadecimal partial name (bytes or ascii string)
:raise AmbiguousObjectName:
:raise BadObject: N)sha_iterr   
startswithr   r   r   )r0   partial_hexsha	candidatebinshas       r3   partial_to_complete_sha_hex)LooseObjectDB.partial_to_complete_sha_hexl   sc    
 	mmoF&!,,[-HII(-n=="	 & N++r5   c                 >   U R                  U R                  [        U5      5      5      n [        X R                  S9$ ! [
         aT  nUR                  [        :w  a/   [        U5      s SnA$ ! [
         a  n[        U5      UeSnAff = f[        U5      UeSnAff = f)zn
:return: memory map of that file to allow random read access
:raise BadObject: if object could not be located)flagsN)	r=   r9   r   r   r/   OSErrorerrnor   r   )r0   shar=   enew_es        r3   _map_loose_objectLooseObjectDB._map_loose_object   s     ,,t//
3@A	,,W<O<OPP 
	,ww& 44W== 4#C.e34
  n!+
	,s9   > 
BB
A-'B-
B7BBBBc                    > Ub1  [        U[        5      (       d  [        S[        R                  -  5      e[        TU ]  U5      $ )zI:raise TypeError: if the stream does not support the Sha1Writer interfacez,Output stream musst support the %s interface)
isinstancer   	TypeError__name__r)   set_ostream)r0   streamr2   s     r3   rV   LooseObjectDB.set_ostream   s<    j&D&DJZM`M``aaw"6**r5   c                     U R                  U5      n [        U5      u  p4[        XU5      [        US5      (       a  UR	                  5         $ $ ! [        US5      (       a  UR	                  5         f f = f)Nclose)rP   r   r   hasattrrZ   )r0   rM   mtypsizes        r3   infoLooseObjectDB.info   sd    ""3'	03IC4(q'""	 #wq'""	 #s   A $A2c                 l    U R                  U5      n[        R                  " USS9u  p4n[        XXE5      $ )NT)close_on_deletion)rP   r	   newr   )r0   rM   r\   typer^   rW   s         r3   rW   LooseObjectDB.stream   s6    ""3'377TRFs$//r5   c                 Z     U R                  [        U5      5        g! [         a     gf = f)NTF)r?   r   r   )r0   rM   s     r3   
has_objectLooseObjectDB.has_object   s.    	((C9 		s    
**c                    SnU R                  5       nUcE  [        R                  " SU R                  S9u  pBUR                  c  [        U5      nO[        U5      n  UR                  b;  [        UR                  UR                  [        R                  U R                  5        O?[        UR                  UR                  UR                  UR                  U R                  S9  U(       a  UR!                  5         SnUR                  (       a  UR$                  nOUR'                  SS9nU(       a  U R)                  U R+                  U5      5      n[-        U5      n[.        R0                  " USS9  [3        U5      (       a  [#        U5        O[5        X&5        S H1  n[7        [8        5         [;        X`R<                  5         SSS5          O   [9        S
RC                  U5      5      e[E        U5      Ul        U$ ! U(       a  UR!                  5         f f = f!   U(       a  [#        U5        e = f! , (       d  f       O= f[>        R@                  " US	-  5        M  )z.note: The sha we produce will be hex by natureNobj)prefixdir)r   T)as_hex)exist_ok)      	         $   1   @   Q   d   y            g     @@z&Impossible to apply `chmod` to file {})#ostreamtempfilemkstemp
_root_pathrF   r
   r   r   readwritesysmaxsizestream_chunk_sizer   rd   r^   rZ   r   r8   rM   r=   r9   r   r.   makedirsr   r   r   PermissionErrorr   new_objects_modetimesleepformatr   )	r0   istreamtmp_pathwriterfdr8   obj_pathobj_direxp_backoff_mss	            r3   storeLooseObjectDB.store   s   >#++5dooNLB~~%/3!"	#>>-  fllCKKI_I_` !w||W\\6<<,0,B,BD LLN >>^^FZZtZ,F ||D$4$4V$<=Hh'GKK$/ hx x* #]o. ($9$9:	 /. #] &<CCHM  $F+_ LLN 	x 6 /.
 

>F23s+   BG; $H ,H0;HH H-0
H>	c              #      #    [         R                  " U R                  5       5       HK  u  pn[        U5      n[	        U5      S:w  a  M"  U H#  n[	        U5      S:w  a  M  [        XE-   5      v   M%     MM     g 7f)Nr7   &   )r.   walkr1   r   lenr   )r0   rootdirsfiles	root_basefs         r3   rB   LooseObjectDB.sha_iter   sa     !#)9!:D I9~"q6R< //  ";s   A5A7c                 F    [        [        U R                  5       5      5      $ )N)r   tuplerB   )r0   s    r3   r^   LooseObjectDB.size  s    5)**r5   )r/   r,   )rU   
__module____qualname____firstlineno____doc__r   r   intr   r.   namer*   r9   r?   rG   rP   rV   r_   rW   rg   r   rB   r^   __static_attributes____classcell__)r2   s   @r3   r    r    ?   sv    9 # 5!}	ww$ua=:,  &,*+0
JX
0+ +r5   r    )+
contextlibr   gitdb.db.baser   r   r   	gitdb.excr   r   gitdb.streamr	   r
   r   r   
gitdb.baser   r   
gitdb.utilr   r   r   r   r   r   r   r   r   r   r   r   	gitdb.funr   r   r   r   gitdb.utils.encodingr   r~   r.   r   r   __all__r     r5   r3   <module>r      sp   
   
 
     -  	 
  M+J	9 M+r5   