
    ^                     v    S r SSKrSSKJr  SSKJrJr  SSKJrJrJ	r	  SS jr
 " S S\5      r " S	 S
\	5      rg)z7Utility module for querying an ObjectStore with gevent.    N)pool)CommitTag)MissingObjectFinder_collect_filetree_revsObjectStoreIteratorc                    ^ ^^^ [        5       m[        5       mUUU U4S jnU Vs/ s H  oSR                  " XE5      PM     nn[        R                  " U5        TT4$ s  snf )zSplit object id list into two list with commit SHA1s and tag SHA1s.

Same implementation as object_store._split_commits_and_tags
except we use gevent to parallelize object retrieval.
c                 4  >  TU    n[        U[        5      (       a  TR                  U 5        g [        U[        5      (       a0  TR                  U 5        TR                  UR                  S   5        g [        SU -  5      e! [
         a    T(       d  e  g f = f)N   zNot a commit or a tag: %s)
isinstancer   addr   objectKeyError)shaocommitsignore_unknown	obj_storetagss     'lib/third_party/dulwich/greenthreads.pyfind_commit_type1_split_commits_and_tags.<locals>.find_commit_type0   s    	B#A
 !V$$C As##AHHQK(:S@AA  	! "	s   B BB)setspawngeventjoinall)	r   lstr   r   r   sjobsr   r   s	   ` `    @@r   _split_commits_and_tagsr    '   sX     eG5DB B 699SJJ'+SD9
NN4T? :s   Ac                   *    \ rS rSrSr    SS jrSrg)GreenThreadsMissingObjectFinderD   zFind the objects missing from another object store.

Same implementation as object_store.MissingObjectFinder
except we use gevent to parallelize object retrieval.
Nc                   ^ ^ UU 4S jnTT l         [        R                  " US9n	[        TUSU	5      u  p[        TUSU	5      u  pTR	                  U
5      S   nTR	                  X5      u  nn[        5       T l        U Vs/ s H  nU	R                  UU5      PM     nn[        R                  " U5        U H  nT R                  R                  U5        M      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      T l        Uc	  S T l        OUT l        U=(       a    U" 5       =(       d    0 T l        g s  snf s  snf )Nc                    > TR                   R                  U 5        TU    n[        TUR                  TR                   5        g N)sha_doner   r   tree)r   cmtobject_storeselfs     r   collect_tree_shaBGreenThreadsMissingObjectFinder.__init__.<locals>.collect_tree_shaU   s3    MMc"s#C"<4==I    sizeTFr   c                     g r&    )xs    r   <lambda>:GreenThreadsMissingObjectFinder.__init__.<locals>.<lambda>m   s    dr.   )r*   r   Poolr    _collect_ancestorsr   r'   r   r   r   r   
differenceunionobjects_to_sendprogress_tagged)r+   r*   haveswantsr;   
get_taggedconcurrencyget_parentsr,   phave_commits	have_tagswant_commits	want_tagsall_ancestorsmissing_commitscommon_commitscr   tmissing_tagsws   ``                    r   __init__(GreenThreadsMissingObjectFinder.__init__K   s?   	J
 )II;'"9,tUV"W"9,uVW"X$77EaH*6*I*I+
' 6DEn(!,nEtAMMa   ++I6%%l3"e#DeQe$4e#DE*DM$DM!2jl8b F $Es    EE)r<   r*   r:   r;   r'   )NNr   N)__name__
__module____qualname____firstlineno____doc__rN   __static_attributes__r2   r.   r   r"   r"   D   s     %9r.   r"   c                   B   ^  \ rS rSrSrSU 4S jjrS rS rS rSr	U =r
$ )	GreenThreadsObjectStoreIterators   zObjectIterator that works on top of an ObjectStore.

Same implementation as object_store.ObjectStoreIterator
except we use gevent to parallelize object retrieval.
c                 j   > X0l         [        R                  " US9U l        [        [
        U ]  X5        g )Nr/   )finderr   r6   rB   superrW   rN   )r+   storeshasrZ   r@   	__class__s        r   rN   (GreenThreadsObjectStoreIterator.__init__z   s(    ,-t=eJr.   c                 ,    Uu  p#U R                   U   U4$ r&   )r\   )r+   argsr   paths       r   retrieve(GreenThreadsObjectStoreIterator.retrieve   s    	zz#$$r.   c              #      #    U R                   R                  U R                  U R                  5       5       H
  u  pX4v   M     g 7fr&   )rB   imap_unorderedrc   itershas)r+   r   rb   s      r   __iter__(GreenThreadsObjectStoreIterator.__iter__   s4     ..t}}dmmoNIC)O Os   AAc                    [        U R                  5      S:  a  [        U R                  5      $ [        U R                  R                  5      (       a  / n[	        S[        U R                  R                  5      5       HA  nUR                  U R                  R                  U R                  R                  5      5        MC     [        R                  " U5        U H7  nUR                  c  M  U R                  R                  UR                  5        M9     [        U R                  R                  5      (       a  M  [        U R                  5      $ )Nr   )len_shasrZ   r:   rangeappendrB   r   nextr   r   value)r+   r   _js       r   __len__'GreenThreadsObjectStoreIterator.__len__   s    tzz?Qtzz?"$++--..D1c$++"="=>?DFFLL)9)9:; @NN4 77&JJ%%agg.  $++--.. 4::r.   )rZ   rB   )r   )rP   rQ   rR   rS   rT   rN   rc   rh   rs   rU   __classcell__)r^   s   @r   rW   rW   s   s"    K
% r.   rW   )FN)rT   r   r   dulwich.objectsr   r   dulwich.object_storer   r   r   r    r"   rW   r2   r.   r   <module>rx      s?   . >   :,9&9 ,9^&9 r.   