
    {                        S r SSKJr  SSKrSSKrSSKrSSKJrJr  SSK	J
r
  SSK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  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%J&r&J'r'  SS	K(J)r)  S
r*Sr+ " S S\,5      r- " S S\-5      r. " S S\.5      r/ " S S\-5      r0 " S S\,5      r1 " S S\15      r2S r3S r4S%S jr5 " S S\,5      r6 " S S\,5      r7S r8 " S  S!\-5      r9S" r: " S# S$\.5      r;g)&z/Git object store interfaces and implementation.    BytesION)tree_changes
walk_trees)NotTreeError)GitFile)CommitShaFileTagTreeZERO_SHA
hex_to_sha
sha_to_hexhex_to_filenameS_ISGITLINKobject_classvalid_hexsha)PackPackDataPackInflaterPackFileDisappearedload_pack_index_file	iter_sha1pack_objects_to_datawrite_pack_headerwrite_pack_index_v2write_pack_datawrite_pack_objectcompute_file_shaPackIndexerPackStreamCopier)ANNOTATED_TAG_SUFFIXinfopackc                       \ rS rSrSrS rS rS rS rS r	\
S 5       rS	 rS
 rS rS rSS jrSS jr    SS jrSS jrSSSS S4S jrS rSS jr S S jrS r\" 5       \" 5       S 4S jrS rSrg)!BaseObjectStoreI   zObject store interface.c                     UR                  5        VVs/ s H6  u  p#X0;  d  M  UR                  [        5      (       a  M(  U[        :X  a  M4  UPM8     snn$ s  snnf N)itemsendswithr"   r   )selfrefsrefshas       'lib/third_party/dulwich/object_store.pydetermine_wants_all#BaseObjectStore.determine_wants_allL   sX     #jjl
*
  LL!56  8O	 *
 	
 
s   AAAAc                     [        X5      $ )zsIterate over the objects for the specified shas.

Args:
  shas: Iterable object with SHAs
Returns: Object iterator
)ObjectStoreIterator)r,   shass     r0   	iter_shasBaseObjectStore.iter_shasU   s     #4..    c                 ,    [        U R                  5      ez=Check if a particular object is present by SHA1 and is loose.)NotImplementedErrorcontains_looser,   r/   s     r0   r<   BaseObjectStore.contains_loose^   s    !$"5"566r8   c                 ,    [        U R                  5      e)>Check if a particular object is present by SHA1 and is packed.)r;   contains_packedr=   s     r0   rA   BaseObjectStore.contains_packedb   s    !$"6"677r8   c                 T    U R                  U5      =(       d    U R                  U5      $ )uCheck if a particular object is present by SHA1.

This method makes no distinction between loose and packed objects.
)rA   r<   r=   s     r0   __contains__BaseObjectStore.__contains__f   s%    
 ##C(DD,?,?,DDr8   c                     [         e)zIterable of pack objects.r;   r,   s    r0   packsBaseObjectStore.packsm   s
     "!r8   c                 ,    [        U R                  5      ez|Obtain the raw text for an object.

Args:
  name: sha for the object.
Returns: tuple with numeric type and object contents.
)r;   get_rawr,   names     r0   rN   BaseObjectStore.get_rawr   s     "$,,//r8   c                 R    U R                  U5      u  p#[        R                  " X#US9$ )zObtain an object by SHA1.r/   )rN   r
   from_raw_string)r,   r/   type_numuncomps       r0   __getitem__BaseObjectStore.__getitem__{   s&    <<,&&xSAAr8   c                 ,    [        U R                  5      e5Iterate over the SHAs that are present in this store.)r;   __iter__rI   s    r0   r\   BaseObjectStore.__iter__   s    !$--00r8   c                 ,    [        U R                  5      e))Add a single object to this object store.)r;   
add_objectr,   objs     r0   r`   BaseObjectStore.add_object   s    !$//22r8   Nc                 ,    [        U R                  5      e)kAdd a set of objects to this object store.

Args:
  objects: Iterable over a list of (object, path) tuples
)r;   add_objectsr,   objectsprogresss      r0   rf   BaseObjectStore.add_objects   s     "$"2"233r8   c                     US:X  a  gU R                  5       u  pEn [        UUUUU R                  S9  U" 5       $ ! [         a	    U" 5         e f = f)z{Add pack data to this object store.

Args:
  num_items: Number of items to add
  pack_data: Iterator over pack data tuples
r   Ncompression_level)add_packr   pack_compression_levelBaseException)r,   count	pack_datari   fcommitaborts          r0   add_pack_dataBaseObjectStore.add_pack_data   sb     A:==?5	"&"="= 8O	  	G	s	   : Ac           
   #   B  #    [        U UUUUUUS9 H  nUR                  R                  UR                  R                  4UR                  R                  UR                  R                  4UR                  R
                  UR                  R
                  44v   M     g7f)a  Find the differences between the contents of two trees

Args:
  source: SHA1 of the source tree
  target: SHA1 of the target tree
  want_unchanged: Whether unchanged files should be reported
  include_trees: Whether to include trees
  change_type_same: Whether to report files changing
    type in the same entry.
Returns: Iterator over tuples with
    (oldpath, newpath), (oldmode, newmode), (oldsha, newsha)
)want_unchangedinclude_treeschange_type_samerename_detectorN)r   oldpathnewmoder/   )r,   sourcetargetry   rz   r{   r|   changes           r0   r   BaseObjectStore.tree_changes   s     * #)'-+
F &**//2&**//20 
s   BBc              #      #    [        XS5       HD  u  p4UR                  b%  [        R                  " UR                  5      (       a	  U(       d  M@  Uv   MF     g7f)a  Iterate the contents of a tree and all subtrees.

Iteration is depth-first pre-order, as in e.g. os.walk.

Args:
  tree_id: SHA1 of the tree.
  include_trees: If True, include tree objects in the iteration.
Returns: Iterator over TreeEntry namedtuples for all the objects in a
    tree.
N)r   r   statS_ISDIR)r,   tree_idrz   entry_s        r0   iter_tree_contents"BaseObjectStore.iter_tree_contents   s@      #4$7HE

&t||EJJ/G/G	 8s   A	A	Ac                     U R                   $ r)   parentsrt   s    r0   <lambda>BaseObjectStore.<lambda>       6>>r8   c           
      L    [        U UUUUUUS9n[        UR                  S5      $ )a   Find the missing objects required for a set of revisions.

Args:
  haves: Iterable over SHAs already in common.
  wants: Iterable over SHAs of objects to fetch.
  shallow: Set of shallow commit SHA1s to skip
  progress: Simple progress function that will be called with
    updated progress strings.
  get_tagged: Function that returns a dict of pointed-to sha ->
    tag sha for including tags.
  get_parents: Optional function for getting the parents of a
    commit.
Returns: Iterator over (sha, path) pairs.
)get_parentsN)MissingObjectFinderiternext)	r,   haveswantsshallowri   
get_taggedr   depthfinders	            r0   find_missing_objects$BaseObjectStore.find_missing_objects   s6    0 %#
 FKK&&r8   c                     / n[        U5      nU(       a;  X0;   a"  UR                  U5        UR                  U5        [        U5      nU(       a  M;  U$ )zFind which revisions this store has in common using graphwalker.

Args:
  graphwalker: A graphwalker object.
Returns: List of SHAs that are in common
)r   appendack)r,   graphwalkerr   r/   s       r0   find_common_revisions%BaseObjectStore.find_common_revisions  sK     ;{S!${#C	 c
 r8   c                 H    U R                  XX45      nU R                  U5      $ )zIterate over the contents of a pack file.

Args:
  have: List of SHA1s of objects that should not be sent
  want: List of SHA1s of objects that should be sent
  shallow: Set of shallow commit SHA1s to skip
  progress: Optional progress reporting method
)r   r6   )r,   havewantr   ri   missings         r0   generate_pack_contents&BaseObjectStore.generate_pack_contents  s%     ++DJ~~g&&r8   c                 8    [        U R                  XX45      5      $ )a8  Generate pack data objects for a set of wants/haves.

Args:
  have: List of SHA1s of objects that should not be sent
  want: List of SHA1s of objects that should be sent
  shallow: Set of shallow commit SHA1s to skip
  ofs_delta: Whether OFS deltas can be included
  progress: Optional progress reporting method
)r   r   )r,   r   r   r   ri   	ofs_deltas         r0   generate_pack_data"BaseObjectStore.generate_pack_data  s!     $''GF
 	
r8   c                     X   n[        UR                  5      nU[        L a  UR                  u  p1X   nU[        L a  M  U$ )zPeel all tags from a SHA.

Args:
  sha: The object SHA to peel.
Returns: The fully-peeled SHA1 of a tag object, after peeling all
    intermediate tags; if the original ref does not point to a tag,
    this will equal the original SHA1.
)r   	type_namer   object)r,   r/   rb   	obj_classs       r0   peel_shaBaseObjectStore.peel_sha.  sD     i /	3 ZZNI)C 3 
r8   c                     U R                   $ r)   r   r   s    r0   r   r   C  r   r8   c                 6   [        5       n[        5       n/ nUR                  U5        U(       ai  UR                  S5      nX;   a  UR                  U5        O8X;  a3  UR                  U5        X;   a  ML  X   n	UR                  U" U	5      5        U(       a  Mi  Xe4$ )a  Collect all ancestors of heads up to (excluding) those in common.

Args:
  heads: commits to start from
  common: commits to end at, or empty set to walk repository
    completely
  get_parents: Optional function for getting the parents of a
    commit.
Returns: a tuple (A, B) where A - all commits reachable
    from heads but not present in common, B - common (shared) elements
    that are directly reachable from heads
r   )setextendpopadd)
r,   headscommonr   r   basescommitsqueueecmts
             r0   _collect_ancestors"BaseObjectStore._collect_ancestors>  s    & %U		!A{		!!A<g[-. e r8   c                     g)z,Close any files opened by this object store.N rI   s    r0   closeBaseObjectStore.closea  s    r8   r   r)   )FFFNF)NN)NNT)__name__
__module____qualname____firstlineno____doc__r1   r6   r<   rA   rE   propertyrJ   rN   rW   r\   r`   rf   rv   r   r   r   r   r   r   r   r   r   r   __static_attributes__r   r8   r0   r&   r&   I   s    !
/78E " "0B
134: "H* 1!'F 
' BF
"& u1! F;r8   r&   c                       \ rS rSrSS jr\S 5       rS rS rS r	S r
S rS	 rS
 r\S 5       rS rS rS rS rS rS rS rS rS rS rSS jrSrg)PackBasedObjectStoreif  c                     0 U l         Xl        g r)   _pack_cachero   )r,   ro   s     r0   __init__PackBasedObjectStore.__init__g  s    &<#r8   c                     / $ r)   r   rI   s    r0   
alternatesPackBasedObjectStore.alternatesk  s    	r8   c                 \    U R                    H  n X;   a    gM     g! [         a     M  f = f)z`Check if a particular object is present by SHA1 and is packed.

This does not check alternates.
TF)rJ   r   )r,   r/   r$   s      r0   rA   $PackBasedObjectStore.contains_packedo  s=    
 JJD;    ' s   
++c                     U R                  U5      (       d  U R                  U5      (       a  gU R                   H
  nX;   d  M
    g   g)rD   TF)rA   r<   r   )r,   r/   	alternates      r0   rE   !PackBasedObjectStore.__contains__|  sD    
 $$(;(;C(@(@I ) r8   c                     U R                   R                  U5      nX2La'  X R                   U'   U(       a  UR                  5         ggg)z/Add a newly appeared pack to the cache by path.N)r   getr   )r,   	base_namer$   	prev_packs       r0   _add_cached_pack%PackBasedObjectStore._add_cached_pack  sC    $$((3	 *.Y'!  !r8   c                     U R                   n0 U l         U(       a,  UR                  5       u  p#UR                  5         U(       a  M+  g g r)   )r   popitemr   )r,   
pack_cacherP   r$   s       r0   _clear_cached_packs(PackBasedObjectStore._clear_cached_packs  s8    %%
%--/LTJJL jr8   c                 6    U R                   R                  5       $ r)   )r   valuesrI   s    r0   _iter_cached_packs'PackBasedObjectStore._iter_cached_packs  s    &&((r8   c                 ,    [        U R                  5      er)   )r;   _update_pack_cacherI   s    r0   r   'PackBasedObjectStore._update_pack_cache  s    !$"9"9::r8   c                 $    U R                  5         g r)   )r   rI   s    r0   r   PackBasedObjectStore.close  s      "r8   c                 h    [        U R                  5       5      [        U R                  5       5      -   $ zList with pack objects.)listr   r   rI   s    r0   rJ   PackBasedObjectStore.packs  s+     D++-.d6M6M6O1PPPr8   c              #   L   #    U R                    H  nU H  nUv   M	     M     g7f)z=Iterate over the SHAs of all the objects in alternate stores.N)r   )r,   r   alternate_objects      r0   _iter_alternate_objects,PackBasedObjectStore._iter_alternate_objects  s$     I$- && %. )s   "$c                 ,    [        U R                  5      ez+Iterate over the SHAs of all loose objects.)r;   _iter_loose_objectsrI   s    r0   r   (PackBasedObjectStore._iter_loose_objects  s    !$":":;;r8   c                 ,    [        U R                  5      er)   )r;   _get_loose_objectr=   s     r0   r  &PackBasedObjectStore._get_loose_object  s    !$"8"899r8   c                 ,    [        U R                  5      er)   )r;   _remove_loose_objectr=   s     r0   r  )PackBasedObjectStore._remove_loose_object  s    !$";";<<r8   c                 ,    [        U R                  5      er)   r;   _remove_packrO   s     r0   r	  !PackBasedObjectStore._remove_pack      !$"3"344r8   c                    [        5       nU R                  5        H%  nUR                  U R                  U5      S45        M'     U R	                  [        U5      5        U H   u  p4U R                  UR                  5        M"     [        U5      $ )z7Pack loose objects.

Returns: Number of objects packed
N)	r   r   r   r  rf   r   r  idlen)r,   rh   r/   rb   r~   s        r0   pack_loose_objects'PackBasedObjectStore.pack_loose_objects  st    
 %++-CKK//4d;< .g' IC%%cff- !7|r8   c                    [        5       nU R                  5        H#  nUR                  U R                  U5      5        M%     U Vs1 s H  o3S4iM     nnU R                   Vs0 s H  oUR                  5       U_M     nnUR                  5        H+  u  pxUR                  S UR                  5        5       5        M-     U R                  U5      n	UR                  U	R                  5       S5        U H  nU R                  UR                  5        M      UR                  5        H  u  pxU R                  U5        M     U R                  5         [        U5      $ s  snf s  snf )zRepack the packs in this repository.

Note that this implementation is fairly naive and currently keeps all
objects in memory while it repacks.
Nc              3   (   #    U  H  oS 4v   M
     g 7fr)   r   ).0rb   s     r0   	<genexpr>.PackBasedObjectStore.repack.<locals>.<genexpr>  s     E2D3;2Ds   )r   r   r   r  rJ   rP   r*   updateiterobjectsrf   r   r  r  r	  r   r  )
r,   loose_objectsr/   rb   rh   p	old_packsrP   r$   consolidateds
             r0   repackPackBasedObjectStore.repack  s    ++-Cd44S9: .*78-3;-8*.**5*QVVXq[*	5#//+JDNNE$2B2B2DEE , ''0l'')40 C%%cff- !#//+JDd# ,!7|# 95s   E#Ec              #     #    U R                  5         U R                  5        H  n U H  nUv   M	     M     U R                  5        H  nUv   M	     U R	                  5        H  nUv   M	     g! [         a     MY  f = f7f)r[   N)r   r   r   r   r   )r,   r$   r/   s      r0   r\   PackBasedObjectStore.__iter__  s}     !++-DCI   . ++-CI .//1CI 2	 ' s'   $B A/;B /
A=9B <A==B c                 (    U R                  U5      SL$ )z_Check if a particular object is present by SHA1 and is loose.

This does not check alternates.
N)r  r=   s     r0   r<   #PackBasedObjectStore.contains_loose  s    
 %%c*$66r8   c                    U[         :X  a  [        U5      e[        U5      S:X  a  [        U5      nUnO#[        U5      S:X  a  UnSnO[	        SU< 35      eU R                  5        H  n UR                  U5      s  $    Uc  [        U5      nU R                  U5      nUb  UR                  UR                  5       4$ U R                  5        H  n UR                  U5      s  $    U R                   H  n UR                  U5      s  $    [        U5      e! [        [        4 a     M  f = f! [         a     Mm  f = f! [         a     MY  f = f)zObtain the raw fulltext for an object.

Args:
  name: sha for the object.
Returns: tuple with numeric type and object contents.
(      NzInvalid object name )r   KeyErrorr  r   AssertionErrorr   rN   r   r   r  rU   as_raw_stringr   r   )r,   rP   r/   hexshar$   retr   s          r0   rN   PackBasedObjectStore.get_raw  sT    84. t9?T"CFY"_CF T!CDD++-D||C(( .
 >%F$$V,?<<!2!2!444 ++-D||C(( .
 I ((00 )
 v' 12   
  s6   *DD-6D>D*)D*-
D;:D;>
EENc                 8    U R                   " [        U5      SU06$ )zAdd a set of objects to this object store.

Args:
  objects: Iterable over (object, path) tuples, should support
    __len__.
Returns: Pack object of the objects written.
ri   )rv   r   rg   s      r0   rf    PackBasedObjectStore.add_objects  s      !!#7#@T8TTr8   r   )r)   )r   r   r   r   r   r   r   rA   rE   r   r   r   r   r   rJ   r   r   r  r  r	  r  r  r\   r<   rN   rf   r   r   r8   r0   r   r   f  s    =  
");# Q Q'<:=587'RUr8   r   c                      ^  \ rS rSrSrSU 4S jjrS r\S 5       r\	S 5       r
S rS rS	 rS
 rS rS rS rS rS rS rS rS rS rS r\S 5       rSrU =r$ )DiskObjectStorei*  z+Git-style object store that exists on disk.c                    > [         [        U ]  US9  Xl        [        R                  R                  U R                  [        5      U l        SU l        X l	        X0l
        g)zOpen an object store.

Args:
  path: Path of the object store.
  loose_compression_level: zlib compression level for loose objects
  pack_compression_level: zlib compression level for pack objects
)ro   N)superr/  r   r~   osjoinPACKDIRpack_dir_alternatesloose_compression_levelro   )r,   r~   r7  ro   	__class__s       r0   r   DiskObjectStore.__init__-  sQ     	ot-#9 	. 	
 	TYY8'>$&<#r8   c                 T    SU R                   R                  < SU R                  < S3$ )N<(z)>)r8  r   r~   rI   s    r0   __repr__DiskObjectStore.__repr__>  s    !^^44dii@@r8   c                 |    [        UR                  SS5      R                  5       5      n [        UR                  SS5      R                  5       5      n [        UR                  SS5      R                  5       5      nU " XU5      $ ! [         a    Sn Nkf = f! [         a    Un NSf = f! [         a    Un N;f = f)N)s   cores   compressionr-  s   looseCompressionpackCompression)intr   decoder%  )clsr~   configdefault_compression_levelr7  ro   s         r0   from_configDiskObjectStore.from_configA  s    	+(+

:~6==?)%
	@&)

:':;BBD'#
	?%(

:'89@@B&"
 42HII  	+(*%	+  	@&?#	@  	?%>"	?s4   )B )B )B, BBB)(B),B;:B;c                     U R                   b  U R                   $ / U l         U R                  5        H'  nU R                   R                  [        U5      5        M)     U R                   $ r)   )r6  _read_alternate_pathsr   r/  )r,   r~   s     r0   r   DiskObjectStore.alternatesW  sZ    '###..0D##OD$9: 1r8   c           	   #   |  #     [        [        R                  R                  U R                  [        S5      S5      nU   UR                  5        H  nUR                  S5      nUR                  S5      (       a  M,  [        R                  R                  U5      (       a  [        R                  " U5      v   Mj  [        R                  " [        R                  R                  [        R                  " U R                  5      U5      5      v   M     S S S 5        g ! [
         a     g f = f! , (       d  f       g = f7f)Nr   rb   
   #)r   r2  r~   r3  INFODIRFileNotFoundError	readlinesrstrip
startswithisabsfsdecodefsencode)r,   rs   lines      r0   rI  %DiskObjectStore._read_alternate_paths`  s     	TYYFMA {{5)??4((77==&&++d++++bggll2;;tyy3I4&PQQ & Q ! 		Qs?   D<9D D<CD+	D<
D(%D<'D((D<+
D95D<c                 :    [         R                  " [         R                  R                  U R                  [        5      5        [         R                  R                  U R                  [        S5      n[        US5       n [        US5      nU   UR                  UR                  5       5        SSS5        UR                  [         R                  " U5      S-   5        SSS5        [         R                  R                  U5      (       d*  [         R                  R                  U R                  U5      nU R                  R                  [        U5      5        g! [
         a     GN#f = f! , (       d  f       N= f! [         a     Nf = f! , (       d  f       N= f)z+Add an alternate path to this object store.r   wbrL  NrM  )r2  mkdirr~   r3  rO  FileExistsErrorr   openwritereadrP  rV  rT  r   r   r/  )r,   r~   alternates_pathrs   orig_fs        r0   add_alternate_path"DiskObjectStore.add_alternate_patho  s   	HHRWW\\$))W56 '',,tyy'<H_d+q+ot4 GGFKKM* GGBKK%-. , ww}}T""77<<		40Dt45  		 V %  ,+sZ   AE ?FE<F E+/0F
E('E(+
E9	5F<
F	FF		F
Fc                     [         R                  " U R                  5      n[        5       nU H  nUR                  S5      (       d  M  UR                  S5      (       d  M3  [         R                  R                  U5      S   S-   nXA;   d  M_  US[        S5      *  nUR                  U5        M     / nU Hf  nXpR                  ;  d  M  [        [         R                  R                  U R                  U5      5      nUR                  U5        XR                  U'   Mh     [        U R                  5      U-
   H,  nU R                  R!                  U5      R	                  5         M.     U$ ! [         a    U R	                  5         / s $ f = f)z4Read and iterate over new pack files and cache them.pack-.packr   .idxN)r2  listdirr5  rP  r   r   rS  r+   r~   splitextr  r   r   r   r3  r   r   )	r,   pack_dir_contents
pack_filesrP   idx_name	pack_name	new_packsrs   r$   s	            r0   r   "DiskObjectStore._update_pack_cache  sB   	 "

4== 9 U
%Dw''DMM',B,B 77++D1!4v=0 $_G} 5INN9- & 	A(((BGGLL:;  &&*  #	  T%%&3A  #))+ 4/ ! 	JJLI	s    E) )FFc                 .    [        U R                  U5      $ r)   )r   r~   r=   s     r0   _get_shafile_path!DiskObjectStore._get_shafile_path  s    tyy#..r8   c              #   b  #    [         R                  " U R                  5       H  n[        U5      S:w  a  M  [         R                  " [         R                  R	                  U R                  U5      5       H1  n[         R
                  " X-   5      n[        U5      (       d  M-  Uv   M3     M     g 7f)N   )r2  rh  r~   r  r3  rV  r   )r,   baserestr/   s       r0   r   #DiskObjectStore._iter_loose_objects  st     JJtyy)D4yA~

277<<		4#@Akk$+.#C((		 B *s   B-B/c                 r    U R                  U5      n [        R                  " U5      $ ! [         a     g f = fr)   )rq  r
   	from_pathrP  r,   r/   r~   s      r0   r  !DiskObjectStore._get_loose_object  s:    %%c*	$$T**  		s   ) 
66c                 N    [         R                  " U R                  U5      5        g r)   )r2  removerq  r=   s     r0   r  $DiskObjectStore._remove_loose_object  s    
		$((-.r8   c                 V    U R                   [        R                  R                  UR                  5      	 UR                  5         [        R                  " UR                  R                  5        [        R                  " UR                  R                  5        g ! [
         a     Nqf = fr)   )
r   r2  r~   basename	_basenamer%  r   r}  dataindex)r,   r$   s     r0   r	  DiskObjectStore._remove_pack  so    	  !1!1$..!AB 	


		$))..!
		$**//"	  		s   4B 
B('B(c                     [        S U 5       5      nUR                  S5      n[        R                  R	                  U R
                  SU-   5      $ )Nc              3   *   #    U  H	  oS    v   M     g7fr   Nr   r  r   s     r0   r  5DiskObjectStore._get_pack_basepath.<locals>.<genexpr>  s     98   asciire  )r   rB  r2  r~   r3  r5  )r,   entriessuffixs      r0   _get_pack_basepath"DiskObjectStore._get_pack_basepath  s>    999w'ww||DMM7V+;<<r8   c           	      F   [        U5      nUR                  S5        [        U[        U5      [        UR	                  5       5      -   5        UR                  5         [        USS9nUR                  S[        R                  5        UR	                  5        Ha  n[        U5      S:X  d   eU R                  U5      u  pUR                  5       n
[        UUU	UU R                  S9nUR                  XzU45        Mc     UR                  5       nUR                  U5        UR!                  5         UR#                  5         U R%                  U5      nUS-   n[&        R(                  S:X  a   [        R*                  " U5        [        R.                  " X.5        [1        US-   S	5      n [3        XU5        UR!                  5         UR5                  5         [7        U5      nUR9                  5         U R;                  UU5        U$ ! [,         a     Nf = f! UR5                  5         f = f)
aC  Move a specific file containing a pack into the pack directory.

Note: The file should be on the same file system as the
    packs directory.

Args:
  f: Open file object for the pack.
  path: Path to the pack file.
  copier: A PackStreamCopier to use for writing pack data.
  indexer: A PackIndexer for indexing the pack.
r   end_ofsr$  )r/   rm   rf  win32rg  rZ  )r   seekr   r  ext_refsflushr   r2  SEEK_CURrN   tellr   ro   r   digestr^  r   sortr  sysplatformr}  rP  renamer   r   ru   r   check_length_and_checksumr   )r,   rs   r~   copierindexerr  new_shaext_sharU   r  offsetcrc32pack_shapack_base_nametarget_pack
index_file
final_packs                    r0   _complete_thin_pack#DiskObjectStore._complete_thin_pack  s    w- 	
q	!S\C0@0@0B,CCD 	
	 #1c2 	
q"++ '')Gw<2%%%!\\'2NHVVXF%"&"="=E NNGU34 * >>#			 	009$w.<<7"		+& 			$$ ^f4d;
	
X> .)
,,.nj9! %  s   'G> #H >
H
HH c                 $   SSK nUR                  U R                  SS9u  pE[        R                  " US5       n[        X`R                  S9n[        XXgS9nUR                  5         U R                  XeX5      sSSS5        $ ! , (       d  f       g= f)a  Add a new thin pack to this object store.

Thin packs are packs that contain deltas with parents that exist
outside the pack. They should never be placed in the object store
directly, and always indexed and completed as they are copied.

Args:
  read_all: Read function that blocks until the number of
    requested bytes are read.
  read_some: Read function that returns at least one byte, but may
    not return the number of bytes requested.
Returns: A Pack object pointing at the now-completed thin pack in the
    objects/pack directory.
r   N	tmp_pack_)dirprefixzw+bresolve_ext_ref
delta_iter)
tempfilemkstempr~   r2  fdopenr    rN   r!   verifyr  )	r,   read_all	read_somer  fdr~   rs   r  r  s	            r0   add_thin_packDiskObjectStore.add_thin_pack  sq     	##		+#FYYr5!Q!!\\BG%h1QFMMO++AVE	 "!!s   ?B
Bc                    [        U5       nUR                  5       nU R                  U5      nUS-   n[        R                  R                  U5      (       d/  [        US5       n[        XcUR                  5       5        SSS5        SSS5        U R                   H  nUR                  W:X  d  M  Us  $    WS-   n[        R                  S:X  a   [        R                  " U5        [        R                  " X5        [!        U5      n	U R#                  XI5        U	$ ! , (       d  f       N= f! , (       d  f       N= f! [         a     Nbf = f)zMove a specific file containing a pack into the pack directory.

Note: The file should be on the same file system as the
    packs directory.

Args:
  path: Path to the pack file.
rg  rZ  Nrf  r  )r   sorted_entriesr  r2  r~   existsr   r   get_stored_checksumrJ   r  r  r  r}  rP  r  r   r   )
r,   r~   r  r  r  
index_namers   r$   r  r  s
             r0   move_in_packDiskObjectStore.move_in_pack'  s
    d^q&&(G..w7H!F*J77>>*--Z.!'A4I4I4KL /  JJD~~)  (<<7"		+& 			$$(^
h3! /. ^  % s6   AD*#D>D*D; 
D'	#D**
D8;
EEc                    ^ ^^^ SSK nUR                  T R                  SS9u  mm[        R                  " TS5      mUUUU 4S jnUU4S jnTX#4$ )Add a new pack to this object store.

Returns: Fileobject to write to, a commit function to
    call when the pack is finished and an abort
    function.
r   Nrf  )r  r  rZ  c                    > T R                  5         [        R                  " T5        T R                  5         [        R                  R                  T5      S:  a  TR                  T5      $ [        R                  " T5        g Nr   )r  r2  fsyncr   r~   getsizer  r}  )rs   r  r~   r,   s   r0   rt   (DiskObjectStore.add_pack.<locals>.commitS  sT    GGIHHRLGGIwwt$q(((..		$r8   c                  R   > T R                  5         [        R                  " T5        g r)   )r   r2  r}  )rs   r~   s   r0   ru   'DiskObjectStore.add_pack.<locals>.abort]  s    GGIIIdOr8   )r  r  r5  r2  r  )r,   r  rt   ru   rs   r  r~   s   `   @@@r0   rn   DiskObjectStore.add_packG  sQ     	##g#FDIIb$	 		 &r8   c                    U R                  UR                  5      n[        R                  R	                  U5      n [        R
                  " U5        [        R                  R                  U5      (       a  g[        US5       nUR                  UR                  U R                  S95        SSS5        g! [         a     Nof = f! , (       d  f       g= f)zFAdd a single object to this object store.

Args:
  obj: Object to add
NrZ  rl   )rq  r  r2  r~   dirnamer[  r\  r  r   r^  as_legacy_objectr7  )r,   rb   r~   r  rs   s        r0   r`   DiskObjectStore.add_objectc  s     %%cff-ggood#	HHSM 77>>$T4 AGG$$t7S7S$T ! 	  		 ! s   B5 )C5
CC
Cc                 8    [         R                  " U5        [         R                  " [         R                  R	                  US5      5        [         R                  " [         R                  R	                  U[
        5      5        U " U5      $ ! [         a     Nf = f)Nr#   )r2  r[  r\  r~   r3  r4  )rC  r~   s     r0   initDiskObjectStore.initv  sh    	HHTN 	dF+,
dG,-4y	  		s   B 
BB)r6  r7  ro   r5  r~   )r-  r-  )r   r   r   r   r   r   r=  classmethodrF  r   r   rI  rb  r   rq  r   r  r  r	  r  r  r  r  rn   r`   r  r   __classcell__r8  s   @r0   r/  r/  *  s    5="A J J*    R6*://#=ENF0@ 8&  r8   r/  c                      ^  \ rS rSrSrU 4S jrS rS rS rS r	\
S 5       rS	 rS
 rS rS rSS jrS rS rS rSrU =r$ )MemoryObjectStorei  z.Object store that keeps all objects in memory.c                 F   > [         [        U ]  5         0 U l        SU l        g )Nr-  )r1  r  r   _dataro   )r,   r8  s    r0   r   MemoryObjectStore.__init__  s     /1
&(#r8   c                 v    [        U5      S:X  a  U$ [        U5      S:X  a  [        U5      $ [        SU< 35      e)Nr#  r$  zInvalid sha )r  r   
ValueErrorr=   s     r0   
_to_hexshaMemoryObjectStore._to_hexsha  s5    s8r>JX^c?"677r8   c                 >    U R                  U5      U R                  ;   $ r:   )r  r  r=   s     r0   r<    MemoryObjectStore.contains_loose  s    s#tzz11r8   c                     g)r@   Fr   r=   s     r0   rA   !MemoryObjectStore.contains_packed  s    r8   c                 H    [        U R                  R                  5       5      $ rZ   )r   r  keysrI   s    r0   r\   MemoryObjectStore.__iter__  s    DJJOO%&&r8   c                     / $ r   r   rI   s    r0   rJ   MemoryObjectStore.packs  s	     	r8   c                 `    X R                  U5         nUR                  UR                  5       4$ rM   )r  rU   r'  )r,   rP   rb   s      r0   rN   MemoryObjectStore.get_raw  s-     ??4()||S..000r8   c                 Z    U R                   U R                  U5         R                  5       $ r)   )r  r  copyrO   s     r0   rW   MemoryObjectStore.__getitem__  s#    zz$//$/05577r8   c                 <    U R                   U R                  U5      	 g)z3Delete an object from this store, for testing only.N)r  r  rO   s     r0   __delitem__MemoryObjectStore.__delitem__  s    JJtt,-r8   c                 R    UR                  5       U R                  UR                  '   g)r_   N)r  r  r  ra   s     r0   r`   MemoryObjectStore.add_object  s     XXZ

366r8   c                 <    U H  u  p4U R                  U5        M     g)re   N)r`   )r,   rh   ri   rb   r~   s        r0   rf   MemoryObjectStore.add_objects  s     !ICOOC  !r8   c                 6   ^ ^ [        5       mUU 4S jnS nTX4$ )zAdd a new pack to this object store.

Because this object store doesn't support packs, we extract and add the
individual objects.

Returns: Fileobject to write to and a commit function to
    call when the pack is finished.
c                    > [         R                  " [        TR                  5       5      TR	                  5       5      n TR                  5         [        R                  " U TR                  5       H  nTR                  U5        M     g r)   )
r   	from_filer   getvaluer  r   r   for_pack_datarN   r`   )r  rb   rs   r,   s     r0   rt   *MemoryObjectStore.add_pack.<locals>.commit  sW    ""71::<#8!&&(CAGGI#11!T\\B$ Cr8   c                      g r)   r   r   r8   r0   ru   )MemoryObjectStore.add_pack.<locals>.abort  s    r8   r   )r,   rt   ru   rs   s   `  @r0   rn   MemoryObjectStore.add_pack  s#     I	%	 &r8   c                 z   [        U5      nUR                  S5        [        U[        U5      [        UR	                  5       5      -   5        [        USS9nUR	                  5        H1  n[        U5      S:X  d   eU R                  U5      u  pg[        XXtS9  M3     UR                  5       nUR                  U5        g)zComplete a thin pack by adding external references.

Args:
  f: Open file object for the pack.
  indexer: A PackIndexer for indexing the pack.
r   r  r  r$  rS   N)
r   r  r   r  r  r   rN   r   r  r^  )	r,   rs   r  r  r  r  rU   r  r  s	            r0   r  %MemoryObjectStore._complete_thin_pack  s     w- 	
q	!S\C0@0@0B,CCD #1c2 '')Gw<2%%%!\\'2NHa4= * >>#	r8   c                     U R                  5       u  p4n [        X0R                  S9n[        XX6S9nUR	                  5         U R                  X65        U" 5         g! [         a	    U" 5         e f = f)a  Add a new thin pack to this object store.

Thin packs are packs that contain deltas with parents that exist
outside the pack. Because this object store doesn't support packs, we
extract and add the individual objects.

Args:
  read_all: Read function that blocks until the number of
    requested bytes are read.
  read_some: Read function that returns at least one byte, but may
    not return the number of bytes requested.
r  r  N)rn   r    rN   r!   r  r  rp   )r,   r  r  rs   rt   ru   r  r  s           r0   r  MemoryObjectStore.add_thin_pack  sj      ==?5		!!\\BG%h1QFMMO$$Q0
 H	  	G	s   >A A.)r  ro   r)   )r   r   r   r   r   r   r  r<   rA   r\   r   rJ   rN   rW   r  r`   rf   rn   r  r  r   r  r  s   @r0   r  r    s`    8)
82'  18.(! ,0 r8   r  c                       \ rS rSrSrS rSrg)ObjectIteratori  z%Interface for iterating over objects.c                 ,    [        U R                  5      er)   )r;   r  rI   s    r0   r  ObjectIterator.iterobjects  s    !$"2"233r8   r   N)r   r   r   r   r   r  r   r   r8   r0   r  r    s
    /4r8   r  c                   T    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rS rSrg)r4   i  z3ObjectIterator that works on top of an ObjectStore.c                 *    Xl         X l        / U l        g)zxCreate a new ObjectIterator.

Args:
  store: Object store to retrieve from
  sha_iter: Iterator over (sha, path) tuples
N)storesha_iter_shas)r,   r
  r  s      r0   r   ObjectStoreIterator.__init__  s     
 
r8   c              #   d   #    U R                  5        H  u  pU R                  U   U4v   M     g7f)z&Yield tuple with next object and path.N)itershasr
  rz  s      r0   r\   ObjectStoreIterator.__iter__  s*     IC**S/4'' )s   .0c              #   *   #    U  H	  u  pUv   M     g7f)zIterate over just the objects.Nr   )r,   or~   s      r0   r  ObjectStoreIterator.iterobjects"  s     GAG r  c              #      #    U R                    H  nUv   M	     U R                   H"  nU R                   R                  U5        Uv   M$     g7f)zIterate over the SHAs.N)r  r  r   r=   s     r0   r  ObjectStoreIterator.itershas'  s=     ::CI ==CJJc"I !s   AAc                 4    U[         :X  a  gXR                  ;   $ )zCheck if an object is present.

Note: This checks if the object is present in
    the underlying object store, not if it would
    be yielded by the iterator.

Args:
  needle: SHA1 of the object to check for
F)r   r
  )r,   needles     r0   rE    ObjectStoreIterator.__contains__/  s     X##r8   c                      U R                   U   $ )zFind an object by SHA1.

Note: This retrieves the object from the underlying
    object store. It will also succeed if the object would
    not be returned by the iterator.
)r
  )r,   keys     r0   rW   ObjectStoreIterator.__getitem__=  s     zz#r8   c                 F    [        [        U R                  5       5      5      $ )zReturn the number of objects.)r  r   r  rI   s    r0   __len__ObjectStoreIterator.__len__F  s    4())r8   c                 V    SS K nUR                  S[        5        U R                  5       $ )Nr   zUse bool() instead.)warningswarnDeprecationWarning_empty)r,   r   s     r0   emptyObjectStoreIterator.emptyJ  s!    +-?@{{}r8   c                 \    U R                  5       n [        U5        g! [         a     gf = f)NFT)r  r   StopIteration)r,   its     r0   r#  ObjectStoreIterator._emptyP  s2    ]]_	H   		s    
++c                 ,    U R                  5       (       + $ )z*Indicate whether this object has contents.)r#  rI   s    r0   __bool__ObjectStoreIterator.__bool__Y  s    ;;=  r8   )r  r  r
  N)r   r   r   r   r   r   r\   r  r  rE   rW   r  r$  r#  r+  r   r   r8   r0   r4   r4     s7    =	(

$*!r8   r4   c                 t    U " U5      n[        U[        5      (       d  [        U5      eUR                  X5      $ )zLook up an object in a Git tree.

Args:
  lookup_obj: Callback for retrieving object by SHA1
  root_sha: SHA1 of the root tree
  path: Path to lookup
Returns: A tuple of (mode, SHA) of the resulting path.
)
isinstancer   r   lookup_path)
lookup_objroot_shar~   trees       r0   tree_lookup_pathr3  ^  s7     hDdD!!8$$J--r8   c                     X   nUR                  5        HY  u  pEn[        U5      (       a  M  Xb;  d  M  UR                  U5        [        R                  " U5      (       d  MM  [        XU5        M[     g)zCollect SHA1s of files and directories for specified tree.

Args:
  obj_store: Object store to get objects by SHA from
  tree_sha: tree reference to walk
  kset: set to fill with references to files and directories
N)	iteritemsr   r   r   r   _collect_filetree_revs)	obj_storetree_shaksetfiletreerP   r   r/   s          r0   r6  r6  m  sV     "H#--/C4  S_HHSM||D!!&yt<	 0r8   c                    [        5       n[        5       n[        5       nU H  n X   n[        U[        5      (       a  UR                  U5        M0  [        U[        5      (       a<  UR                  U5        UR
                  S   n[        X/US9u  pnX9-  nXJ-  nXW-  nM  UR                  U5        M     X4U4$ ! [         a    U(       d  e  M  f = f)a  Split object id list into three lists with commit, tag, and other SHAs.

Commits referenced by tags are included into commits
list as well. Only SHA1s known in this repository will get
through, and unless ignore_unknown argument is True, KeyError
is thrown for SHA1 missing in the repository

Args:
  obj_store: Object store to get objects by SHA1 from
  lst: Collection of commit and tag SHAs
  ignore_unknown: True to skip SHA1 missing in the repository
    silently.
Returns: A tuple of (commits, tags, others) SHA1s
   )ignore_unknown)r   r.  r	   r   r   r   _split_commits_and_tagsr%  )r7  lstr=  r   tagsothersr   r  taggedcts              r0   r>  r>  }  s     eG5DUF	A
 !V$$AAs##!1xa 	

1' ( 6""#  	! "	s   B;;CCc                   <    \ rS rSrSrSSSS 4S jrS rS r\rSr	g)	r   i  a  Find the objects missing from another object store.

Args:
  object_store: Object store containing at least all objects to be
    sent
  haves: SHA1s of commits not to send (already present in target)
  wants: SHA1s of commits to send
  progress: Optional function to report progress to.
  get_tagged: Function that returns a dict of pointed-to sha -> tag
    sha for including tags.
  get_parents: Optional function for getting the parents of a commit.
  tagged: dict of pointed-to sha -> tag sha for including tags
Nc                     U R                   $ r)   r   r   s    r0   r   MissingObjectFinder.<lambda>  r   r8   c                    Xl         Uc
  [        5       nXpl        [        XS5      u  pn
[        XS5      u  pnUR	                  XU R                  S9S   nUR	                  UUUU R                  S9u  nn[        5       U l        U HD  nU R
                  R                  U5        UU   n[        UUR                  U R
                  5        MF     U	 H  nU R
                  R                  U5        M      UR                  U	5      nUR                  U
5      nUR                  U5      nUR                  U5      n[        U Vs/ s H  nUS S4PM
     sn5      U l        Uc	  S U l        OXPl        U=(       a    U" 5       =(       d    0 U l        g s  snf )NTF)r   r   r   c                     g r)   r   )xs    r0   r   .MissingObjectFinder.__init__.<locals>.<lambda>  s    dr8   )object_storer   _get_parentsr>  r   sha_doner   r6  r2  
differenceunionobjects_to_sendri   _tagged)r,   rL  r   r   r   ri   r   r   have_commits	have_tagshave_otherswant_commits	want_tagswant_othersall_ancestorsmissing_commitscommon_commitshr   rD  missing_tagsmissing_othersws                          r0   r   MissingObjectFinder.__init__  s    )?eG' 0G0
, 0G0
,
 %77t7H7H 8 

 +7*I*I))	 +J +
' 
  AMMa q/C"<4==I  
 AMMa   !++I6$//<  %%l3N+"e#DeQe$4e#DE*DM$M!2jl8b $Es   >F
c                     U R                   R                  U Vs/ s H  o"S   U R                  ;  d  M  UPM     sn5        g s  snf r  )rQ  r  rN  )r,   r  r   s      r0   add_todoMissingObjectFinder.add_todo  s5    ##$U1tt}}?TQ$UV$Us
   AAc                     U R                   (       d  g U R                   R                  5       u  pnXR                  ;  a  OMA  U(       d  U R                  U   n[	        U[
        5      (       a   U R                  UR                  SS4/5        O[	        U[        5      (       ae  U R                  UR                  5        VVVs/ s H5  u  pVn[        U5      (       a  M  Xu[        R                  " U5      (       + 4PM7     snnn5        O7[	        U[        5      (       a"  U R                  UR                  S   S S4/5        XR                  ;   a"  U R                  U R                  U   S S4/5        U R                  R!                  U5        U R#                  S[%        U R                  5      -  R'                  S5      5        X4$ s  snnnf )NT Fr<  zcounting objects: %dr  )rQ  r   rN  rL  r.  r	   rb  r2  r   r5  r   r   r   r   r   rR  r   ri   r  encode)r,   r/   rP   leafr  nmss           r0   r   MissingObjectFinder.next  sl   '' $ 4 4 8 8 :S--'  !!#&A!V$$E234At$$ (){{}'4GA!*1~ 44<<?23'4 As##T59:;,,MMDLL-tT:;<#/#dmm2DDLLWUV{s   G!G)rM  rR  rL  rQ  ri   rN  )
r   r   r   r   r   r   rb  r   __next__r   r   r8   r0   r   r     s.    & 1A9FW6 Hr8   r   c                   2    \ rS rSrSrSS jrS rS r\rSr	g)	ObjectStoreGraphWalkeri  zGraph walker that finds what commits are missing from an object store.

:ivar heads: Revisions without descendants in the local repo
:ivar get_parents: Function to retrieve parents in the local repo
Nc                 d    [        U5      U l        X l        0 U l        Uc
  [        5       nX0l        g)zCreate a new instance.

Args:
  local_heads: Heads to start search with
  get_parents: Function for finding the parents of a SHA1.
N)r   r   r   r   r   )r,   local_headsr   r   s       r0   r   ObjectStoreGraphWalker.__init__   s.     %
&?eGr8   c                    [        U5      S:w  a  [        SU-  5      e[        U/5      nU R                  (       a  U H/  nX0R                  ;   d  M  U R                  R	                  U5        M1     [        5       nU HA  nU R
                  R                  U5      nUb  UR                  U5        SU R
                  U'   MC     U(       d  gUnU R                  (       a  M  gg)z@Ack that a revision and its ancestors are present in the source.r#  zunexpected sha %r receivedN)r  r  r   r   r}  r   r   r  )r,   r/   	ancestorsanew_ancestorspss         r0   r   ObjectStoreGraphWalker.ack.  s    s8r>9C?@@J	 jj

?JJ%%a( 
  EM\\%%a(>!((,"&Q	  !%I# jjjr8   c                     U R                   (       ax  U R                   R                  5       nU R                  U5      nX R                  U'   U R                   R	                  U Vs/ s H  o3U R                  ;  d  M  UPM     sn5        U$ gs  snf )z.Iterate over ancestors of heads in the target.N)r   r   r   r   r  )r,   r)  rv  r  s       r0   r   ObjectStoreGraphWalker.nextH  sm    ::**.."C!!#&B "LLJJ"F"Q0Eq"FGJ Gs   $B;B)r   r   r   r   r)   )
r   r   r   r   r   r   r   r   rl  r   r   r8   r0   rn  rn    s    &4 Hr8   rn  c                    0 nU H>  u  pEn UR                  SS5      u  pxUR                  U/ 5      R                  XU45        M@     UR	                  5        HM  u  p XU	   S      n[        XU
5      n[        U5      S:X  a  X	 M/  [        R                  UR                  4X'   MO     U R                  U5        U$ ! [         a    Uc  X	  M  XV4X'    M  f = f! [
         a    [        5       n Nf = f)a  Commit a specified set of changes to a tree structure.

This will apply a set of changes on top of an existing tree, storing new
objects in object_store.

changes are a list of tuples with (path, mode, object_sha).
Paths can be both blobs and trees. See the mode and
object sha to None deletes the path.

This method works especially well if there are only a small
number of changes to a big tree. For a large number of changes
to a large tree, use e.g. commit_tree.

Args:
  object_store: Object store to store new objects in
    and retrieve old ones from.
  tree: Original tree root
  changes: changes to apply
Returns: New tree root object
   /r<  r   )split
setdefaultr   r  r*   r%  r   commit_tree_changesr  r   S_IFDIRr  r`   )rL  r2  changesnested_changesr~   new_moder  r  subpathrP   
subchangesorig_subtreesubtrees                r0   r~  r~  U  s   . N%,!	X!%D!!4W %%gr2997g:VW &- +002	"'T
16L &l*Mw<1
,,

3DJ 3 D!K%  	1J&0
		1  	"6L	"s)   B;
C;CCCC0/C0c                   Z    \ rS rSrSrSS jrS rSS jr\S 5       r	S r
S	 rS
 rS rSrg)OverlayObjectStorei  z5Object store that can overlay multiple object stores.Nc                     Xl         X l        g r)   )r   	add_store)r,   r   r  s      r0   r   OverlayObjectStore.__init__  s    
"r8   c                 |    U R                   c  [        U R                  5      eU R                   R                  U5      $ r)   )r  r;   r`   )r,   r   s     r0   r`   OverlayObjectStore.add_object  s0    >>!%doo66~~((00r8   c                 |    U R                   c  [        U R                  5      eU R                   R                  X5      $ r)   )r  r;   r`   rf   rg   s      r0   rf   OverlayObjectStore.add_objects  s0    >>!%doo66~~))'<<r8   c                 f    / nU R                    H  nUR                  UR                  5        M      U$ r)   )r   r   rJ   )r,   r)  bs      r0   rJ   OverlayObjectStore.packs  s*    AJJqww 
r8   c              #      #    [        5       nU R                   H(  nU H  nX1;  d  M
  Uv   UR                  U5        M!     M*     g 7fr)   )r   r   r   )r,   doner  o_ids       r0   r\   OverlayObjectStore.__iter__  s:     uA#JHHTN  s
   "AAc                     U R                    H  n UR                  U5      s  $    [        U5      e! [         a     M1  f = fr)   )r   rN   r%  )r,   sha_idr  s      r0   rN   OverlayObjectStore.get_raw  sE    Ayy(( 
 v  s   1
??c                 Z    U R                    H  nUR                  U5      (       d  M    g   gNTF)r   rA   r,   r/   r  s      r0   rA   "OverlayObjectStore.contains_packed  s)    A  %%  r8   c                 Z    U R                    H  nUR                  U5      (       d  M    g   gr  )r   r<   r  s      r0   r<   !OverlayObjectStore.contains_loose  s)    A$$  r8   )r  r   r)   )r   r   r   r   r   r   r`   rf   r   rJ   r\   rN   rA   r<   r   r   r8   r0   r  r    s<    ?#1
=
  #r8   r  c              #      #    U R                  5       R                  5        H@  nU(       d  M  UR                  SS5      u  p#US:w  a  M(  [        R                  " U5      v   MB     g7f)z'Yield the packs listed in a packs file.    r<     PN)r_  
splitlinesr|  r2  rU  )rs   rW  kindrP   s       r0   read_packs_filer    sO     ##%zz$*4<kk$ &s   A$A&c                   N    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS rSrg)BucketBasedObjectStorei  zMObject store implementation that uses a bucket store like S3 as backend.
    c                     [        / 5      $ r   )r   rI   s    r0   r   *BucketBasedObjectStore._iter_loose_objects  s    Bxr8   c                     g r)   r   r=   s     r0   r  (BucketBasedObjectStore._get_loose_object  s    r8   c                     g r)   r   r=   s     r0   r  +BucketBasedObjectStore._remove_loose_object  s    r8   c                 ,    [        U R                  5      er)   r  rO   s     r0   r	  #BucketBasedObjectStore._remove_pack  r  r8   c                 ,    [        U R                  5      er)   )r;   _iter_pack_namesrI   s    r0   r  'BucketBasedObjectStore._iter_pack_names  s    !$"7"788r8   c                 ,    [        U R                  5      er)   )r;   	_get_packrO   s     r0   r   BucketBasedObjectStore._get_pack  s    !$..11r8   c                 `   [        U R                  5       5      n/ nU HD  nX0R                  ;  d  M  U R                  U5      nUR	                  U5        X@R                  U'   MF     [        U R                  5      U-
   H,  nU R                  R                  U5      R                  5         M.     U$ r)   )r   r  r   r  r   r   r   )r,   rk  rn  rs   r$   s        r0   r   )BucketBasedObjectStore._update_pack_cache  s    ..01
 	A(((~~a(  &&*  #	  T%%&3A  #))+ 4r8   c                     [         er)   rH   )r,   r  	pack_filer  s       r0   _upload_pack#BucketBasedObjectStore._upload_pack  s    !!r8   c                 ^   ^ ^^ SSK mTR                  5       mUU U4S jnTUTR                  4$ )r  r   Nc                    > TR                  5       S:X  a  TR                  5         g TR                  S5        [        TR                  T5      n U R                  5       n[        S U 5       5      R                  S5      nT
R                  5       nU R                  5       n[        X1U5        UR                  S5        [        US-   U5      nT	R                   HI  nUR                  5       U R                  5       :X  d  M'  U R                  5         UR                  5         Us  $    TR                  S5        UR                  S5        T	R                  UTU5        [        R                  " X5      nT	R!                  X'5        U$ )Nr   c              3   *   #    U  H	  oS    v   M     g7fr  r   r  s     r0   r  BBucketBasedObjectStore.add_pack.<locals>.commit.<locals>.<genexpr>  s      ?weqwr  r  rg  )r  r   r  r   rP   r  r   rB  SpooledTemporaryFiler  r   r   rJ   r  r   from_objectsr   )r  r  r  idxfchecksumidxr$   r  pfr,   r  s           r0   rt   /BucketBasedObjectStore.add_pack.<locals>.commit  s/   wwyA~
GGAJ"%A&&(G  ?w ??FFwOH002D,,.Hx8IIaL&x&'8$?C

++-1F1F1HHGGIIIKK	 #
 GGAJIIaLhD1**12J!!(7r8   )r  r  r   )r,   rt   r  r  s   ` @@r0   rn   BucketBasedObjectStore.add_pack  s.     	**,	4 6288##r8   r   N)r   r   r   r   r   r   r  r  r	  r  r  r   r  rn   r   r   r8   r0   r  r    s4    592"%$r8   r  r   )<r   ior   r2  r   r  dulwich.diff_treer   r   dulwich.errorsr   dulwich.filer   dulwich.objectsr	   r
   r   r   r   r   r   r   r   r   r   dulwich.packr   r   r   r   r   r   r   r   r   r   r   r   r    r!   dulwich.refsr"   rO  r4  r   r&   r   r/  r  r  r4   r3  r6  r>  r   rn  r~  r  r  r  r   r8   r0   <module>r     s	  . 6  	  
 !        .

Y;f Y;zAU? AUHT* Tn
D DN4V 4L!. L!^.= &#Rp& pf9V 9x-`2 2j O$1 O$r8   