
    .Ph\                         d Z ddlmZ ddlmZmZ ddlmZmZm	Z	 ddl
mZ  e	d          Z G d d	ee                   Zdd
Zd Zd Zd ZdS )z;Implementation of merge-base following the approach of git.    )Iterator)heappopheappush)GenericOptionalTypeVar   )LRUCacheTc                       e Zd ZddZdeeef         ddfdZdeeeef                  fdZ	de
eeef                  fdZdS )	WorkListreturnNc                     g | _         d S Npq)selfs    M/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/dulwich/graph.py__init__zWorkList.__init__$   s    ')    itemc                 @    |\  }}t          | j        | |f           d S r   )r   r   )r   r   dtcmts       r   addzWorkList.add'   s)    CB3*%%%%%r   c                 F    t          | j                  }|r
|\  }}| |fS d S r   )r   r   )r   r   prr   s       r   getzWorkList.get+   s2    tw 	GB38Otr   c              #   2   K   | j         D ]\  }}| |fV  d S r   r   )r   r   r   s      r   iterzWorkList.iter2   s:      w 	 	GB3*	 	r   )r   N)__name__
__module____qualname__r   tupleintr   r   r   r   r   r     r   r   r   r   #   s        * * * *&c1f &$ & & & &XeCFm,    huS!V}-      r   r   c                    g }i }d}d}dd}	dt           ffd}
t                      }|||<   |                     ||          |f           |D ]@}|                    |d          }||z  ||<   |                     ||          |f           A |
||          r|                                \  }}||         ||z  z  z  }|||z  k    r9||         |	z  |	k    s%||         |	z  ||<   |                    ||f           |z  } | |          }|rV|D ]S}|                    |d          }||z  |k    r" ||          }||k     r4||z  ||<   |                    ||f           T |
||          g }|D ]1\  }}||         z  k    s||f|vr|                    ||f           2|                    d 	           d
 |D             }|S )Nr	            r   c                 h    |                                  D ]\  }}||v r||         z  k    s dS dS )NTF)r    )wlstcstatesr   r   _DNCs       r   _has_candidatesz#_find_lcas.<locals>._has_candidatesA   sH    yy{{ 	  	 GBg~~ ,5544ur   r   c                     | d         S )Nr   r&   )xs    r   <lambda>z_find_lcas.<locals>.<lambda>u   s
    qt r   )keyc                     g | ]\  }}|S r&   r&   ).0r   r   s      r   
<listcomp>z_find_lcas.<locals>.<listcomp>v   s    '''GBC'''r   )boolr   r   r   appendsort)lookup_parentsc1c2slookup_stamp	min_stampcandsr-   	_ANC_OF_1	_ANC_OF_2_LCAr/   r,   c2cflagsr   r   parentspcmtpflagspdtresultslcasr.   s                         @r   
_find_lcasrK   7   s   EG IIDD$       ::DGBKHHll2#$$$ ) )R##y(,,r""B'(((( /$
(
( &((**C Y!6!=>i)+,,CL4'D00&s|d2b#Y''' d]F .%% 	& 
& 
& T1-- VO.."l4((?? &#t%%%%3 /$
(
( &: G & &C$--B9G3K3KNNB9%%%LL^^L$$$''w'''DKr   c                      t          d                                            fd}fd}|sg S |d         }t          |          dk    s|gS |dd         }||v r|gS t          ||||          }|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
       	max_cachec                 F    | vrj         |          | <   |          j        S r   object_storecommit_timecmtidcmtcacherepos    r   r=   z%find_merge_base.<locals>.lookup_stamp   ,      "/6HUO**r   c                 N    d }| v r|          }                     | |          S N)commitget_parentsrU   r[   rV   parents_providers     r   r:   z'find_merge_base.<locals>.lookup_parents   5    He_F++E&+AAAr   r   r	   N)r
   r_   lenrK   )	rW   
commit_idsr=   r:   r;   r<   rJ   rV   r_   s	   `      @@r   find_merge_baserc   {   s     #&&&H,,..+ + + + + +
B B B B B B  		ABz??Qt
QRR.C	Syytnb#|<<DKr   c                 \   
 t          d          
                                 
 fd}
fd}|sg S t          |          dk    rt           |          S |d         g}|dd         }|D ];}g }|D ]*}t	          |||g|          }	|                    |	           +|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
    rM   rN   c                 F    | vrj         |          | <   |          j        S r   rQ   rT   s    r   r=   z'find_octopus_base.<locals>.lookup_stamp   rX   r   c                 N    d }| v r|          }                     | |          S rZ   r\   r^   s     r   r:   z)find_octopus_base.<locals>.lookup_parents   r`   r   r(   r   r	   N)r
   r_   ra   rc   rK   extend)rW   rb   r=   r:   rJ   othersr   	next_lcascaresrV   r_   s   `         @@r   find_octopus_baserl      s    #&&&H,,..+ + + + + +
B B B B B B  	
:!tZ000qM?D^F  	 	" 	"B^S2$EECS!!!!|Kr   c                      t          d                                            fd}fd}||k    rdS  ||          }t          |||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
    rM   rN   c                 F    | vrj         |          | <   |          j        S r   rQ   rT   s    r   r=   z&can_fast_forward.<locals>.lookup_stamp   rX   r   c                 N    d }| v r|          }                     | |          S rZ   r\   r^   s     r   r:   z(can_fast_forward.<locals>.lookup_parents   r`   r   T)r>   )r
   r_   rK   )	rW   r;   rC   r=   r:   r>   rJ   rV   r_   s	   `      @@r   can_fast_forwardrp      s     #&&&H,,..+ + + + + +
B B B B B B 
Rxxt R  Inb2$	RRRDB4<r   N)r   )__doc__collections.abcr   heapqr   r   typingr   r   r   	lru_cacher
   r   r   rK   rc   rl   rp   r&   r   r   <module>rv      s   * B A $ $ $ $ $ $ # # # # # # # # - - - - - - - - - -      GCLL    wqz   (@ @ @ @H! ! !H$ $ $N    r   