
    ^                     t    d Z ddlZddlmZ ddlmZmZ ddlmZmZm	Z	 ddZ
 G d de      Z G d	 d
e	      Zy)z7Utility module for querying an ObjectStore with gevent.    N)pool)CommitTag)MissingObjectFinder_collect_filetree_revsObjectStoreIteratorc                      t               t                fd}|D cg c]  } |j                  ||       }}t        j                  |       fS c c}w )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                    	 |    }t        |t              rj                  |        y t        |t              r0j                  |        j                  |j                  d          y t        d| z        # t
        $ r s Y y w xY w)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_typez1_split_commits_and_tags.<locals>.find_commit_type0   s    	B#A
 !V$C As#AHHQK(:S@AA  	! "	s   A8 8BB)setspawngeventjoinall)	r   lstr   r   r   sjobsr   r   s	   ` `    @@r   _split_commits_and_tagsr   '   sX     eG5DB 699SJDJJ'+SD9
NN4T? :s   Ac                        e Zd ZdZ	 	 	 	 ddZy)GreenThreadsMissingObjectFinderzFind the objects missing from another object store.

    Same implementation as object_store.MissingObjectFinder
    except we use gevent to parallelize object retrieval.
    Nc                      fd} _         t        j                  |      }	t        |d|	      \  }
}t        |d|	      \  }}j	                  |
      d   }j	                  ||      \  }}t                _        |D cg c]  }|	j                  ||       }}t        j                  |       |D ]  } j                  j                  |        |j                  |      }|j                  |      }t        |D cg c]  }|d df	 c}       _        |	d  _        n| _        |xr  |       xs i  _        y c c}w c c}w )Nc                     j                   j                  |        |    }t        |j                  j                          y N)sha_doner   r   tree)r   cmtobject_storeselfs     r   collect_tree_shazBGreenThreadsMissingObjectFinder.__init__.<locals>.collect_tree_shaU   s3    MMc"s#C"<4==I    sizeTFr   c                      y r$    )xs    r   <lambda>z: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wantsr7   
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__z(GreenThreadsMissingObjectFinder.__init__K   sE   	J
 )II;'"9,tUV"Wi"9,uVW"Xi$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)NNr   N)__name__
__module____qualname____doc__rJ   r/   r+   r   r!   r!   D   s     %9r+   r!   c                   6     e Zd ZdZd fd	Zd Zd Zd Z xZS )GreenThreadsObjectStoreIteratorzObjectIterator that works on top of an ObjectStore.

    Same implementation as object_store.ObjectStoreIterator
    except we use gevent to parallelize object retrieval.
    c                 r    || _         t        j                  |      | _        t        t
        |   ||       y )Nr,   )finderr   r2   r>   superrP   rJ   )r)   storeshasrR   r<   	__class__s        r   rJ   z(GreenThreadsObjectStoreIterator.__init__z   s,    ,-t=eTJr+   c                 .    |\  }}| j                   |   |fS r$   )rT   )r)   argsr   paths       r   retrievez(GreenThreadsObjectStoreIterator.retrieve   s    	Tzz#$$r+   c              #      K   | j                   j                  | j                  | j                               D ]  \  }}||f  y wr$   )r>   imap_unorderedrZ   itershas)r)   r   rY   s      r   __iter__z(GreenThreadsObjectStoreIterator.__iter__   s9     ..t}}dmmoNICt)O Os   AAc                 |   t        | j                        dkD  rt        | j                        S t        | j                  j                        rg }t	        dt        | j                  j                              D ]@  }|j                  | j                  j                  | j                  j                               B t        j                  |       |D ]4  }|j                  | j                  j                  |j                         6 t        | j                  j                        rt        | j                        S )Nr   )len_shasrR   r6   rangeappendr>   r   nextr   r   value)r)   r   _js       r   __len__z'GreenThreadsObjectStoreIterator.__len__   s    tzz?Qtzz?"$++--.D1c$++"="=>?DFFLL)9)9:; @NN4 77&JJ%%agg.  $++--. 4::r+   )r   )	rK   rL   rM   rN   rJ   rZ   r^   rh   __classcell__)rV   s   @r   rP   rP   s   s    K
%r+   rP   )FN)rN   r   r   dulwich.objectsr   r   dulwich.object_storer   r   r   r   r!   rP   r/   r+   r   <module>rl      s?   . >   :,9&9 ,9^&9 r+   