
                         ,    d Z ddlmZ d Zd Zd Zd Zy)z<
Implementation of merge-base following the approach of git
    )dequec                    g }i }d}d}dd}fd}t               }	|||<   |	j                  |       |D ]  }
|||
<   |	j                  |
         ||	|      r|	j                         }||   }|||z  k(  r%||z  s ||z  }|||<   |j                  |       |z  } | |      }|r-|D ](  }||v r||   |z  ||<   n|||<   |	j                  |       *  ||	|      rg }|D ]  }||   z  r|j                  |        |S )N            c                 2    | D ]  }||v s||   z  r y y)NTF )wlstcstatescmt_DNCs       lib/third_party/dulwich/graph.py_has_candidatesz#_find_lcas.<locals>._has_candidates'   s(    Cg~t+      )r   appendpopleft)lookup_parentsc1c2scandsr   	_ANC_OF_1	_ANC_OF_2_LCAr   r   c2r   flagsparentspcmtresultsr   s                   @r   
_find_lcasr       sA   EG IIDD 7DGBKKKOB  $
(llnY*+DL$S!  %7?$+DME$9GDM$)GDMD!   $
(, Gt#NN3  Nr   c                     |sg S |d   }t        |      dkD  s|gS |dd }||v r|gS | j                         }t        |j                  ||      S )zFind lowest common ancestors of commit_ids[0] and *any* of commits_ids[1:]

    Args:
      repo: Repository object
      commit_ids: list of commit ids
    Returns:
      list of lowest common ancestor commit_ids
    r   r   N)lenparents_providerr    get_parents)repo
commit_idsr   r   r#   s        r   find_merge_baser'   U   sf     		ABz?Qt
QR.C	Syt,,.&22B<<r   c                     |sg S t        |      dk  rt        | |      S | j                         }|d   g}|dd }|D ]9  }g }|D ]+  }t        |j                  ||g      }|j                  |       - |dd }; |S )zFind lowest common ancestors of *all* provided commit_ids

    Args:
      repo: Repository
      commit_ids:  list of commit ids
    Returns:
      list of lowest common ancestor commit_ids
    r   r   r   N)r"   r'   r#   r    r$   extend)	r%   r&   r#   lcasothersr   	next_lcascaress	            r   find_octopus_baser/   j   s     	
:!tZ00,,.qM?D^F	B-993ECS!  |  Kr   c                 j    ||k(  ry| j                         }t        |j                  ||g      }||gk(  S )zIs it possible to fast-forward from c1 to c2?

    Args:
      repo: Repository to retrieve objects from
      c1: Commit id for first commit
      c2: Commit id for second commit
    T)r#   r    r$   )r%   r   r   r#   r*   s        r   can_fast_forwardr1      sB     
Rx ,,.&22B=DB4<r   N)__doc__collectionsr   r    r'   r/   r1   r
   r   r   <module>r4      s$   , 5p=*4r   