
    	^c                     p   d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
mZmZmZmZmZmZmZ dd	lmZ dd
lmZmZmZ ddlmZ dZ G d d          Zd#dZd#dZd$dZd#dZd Zd Z  ej!        dd           G d d                      Z"d Z#d Z$dZ%d Z&d Z'd Z(d#dZ) G d  d!          Z*d" Z+dS )%z4Helper class to compute deltas stored inside revlogs    N   nullrev)_)getattr   )COMP_MODE_DEFAULTCOMP_MODE_INLINECOMP_MODE_PLAINKIND_CHANGELOGKIND_FILELOGKIND_MANIFESTLOGREVIDX_ISCENSOREDREVIDX_RAWTEXT_CHANGING_FLAGS)attr)errormdiffutil)flagutilc                   8    e Zd ZdZddZd Zd Zd Zd	 Zd
 Z	dS )_testrevlogz)minimalist fake revlog to use in doctests      ?r    c                 f    || _         || _        || _        t          |          | _        d| _        dS )z.data is an list of revision payload boundariesN)_data_srdensitythreshold_srmingapsizeset	_snapshotindex)selfdatadensitymingapsnapshots        >/usr/lib/python3/dist-packages/mercurial/revlogutils/deltas.py__init__z_testrevlog.__init__/   s1    
#* #X


    c                 L    |t           k    rdS |dk    rdS | j        |dz
           S )Nr   r   r   r   r!   revs     r&   startz_testrevlog.start7   s/    '>>1!881z#'""r(   c                 6    |t           k    rdS | j        |         S Nr   r*   r+   s     r&   endz_testrevlog.end>   s    '>>1z#r(   c                 X    |                      |          |                     |          z
  S Nr0   r-   r+   s     r&   lengthz_testrevlog.lengthC   s!    xx}}tzz#..r(   c                 *    t          | j                  S r2   )lenr   )r!   s    r&   __len__z_testrevlog.__len__F   s    4:r(   c                 .    |t           k    rdS || j        v S )NT)r   r   r+   s     r&   
issnapshotz_testrevlog.issnapshotI   s    '>>4dn$$r(   N)r   r   r   )
__name__
__module____qualname____doc__r'   r-   r0   r4   r7   r9   r   r(   r&   r   r   ,   sy        33   # # #  
/ / /  % % % % %r(   r   c              #       K   |t          | j                  }t           j        dd          }| fd} || j         j                  D ]}t           ||          D ]}|V  dS )a  slice revs to reduce the amount of unrelated data to be read from disk.

    ``revs`` is sliced into groups that should be read in one time.
    Assume that revs are sorted.

    The initial chunk is sliced until the overall density (payload/chunks-span
    ratio) is above `revlog._srdensitythreshold`. No gap smaller than
    `revlog._srmingapsize` is skipped.

    If `targetsize` is set, no chunk larger than `targetsize` will be yield.
    For consistency with other slicing choice, this limit won't go lower than
    `revlog._srmingapsize`.

    If individual revisions chunk are larger than this limit, they will still
    be raised individually.

    >>> data = [
    ...  5,  #00 (5)
    ...  10, #01 (5)
    ...  12, #02 (2)
    ...  12, #03 (empty)
    ...  27, #04 (15)
    ...  31, #05 (4)
    ...  31, #06 (empty)
    ...  42, #07 (11)
    ...  47, #08 (5)
    ...  47, #09 (empty)
    ...  48, #10 (1)
    ...  51, #11 (3)
    ...  74, #12 (23)
    ...  85, #13 (11)
    ...  86, #14 (1)
    ...  91, #15 (5)
    ... ]
    >>> revlog = _testrevlog(data, snapshot=range(16))

    >>> list(slicechunk(revlog, list(range(16))))
    [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]]
    >>> list(slicechunk(revlog, [0, 15]))
    [[0], [15]]
    >>> list(slicechunk(revlog, [0, 11, 15]))
    [[0], [11], [15]]
    >>> list(slicechunk(revlog, [0, 11, 13, 15]))
    [[0], [11, 13, 15]]
    >>> list(slicechunk(revlog, [1, 2, 3, 5, 8, 10, 11, 14]))
    [[1, 2], [5, 8, 10, 11], [14]]

    Slicing with a maximum chunk size
    >>> list(slicechunk(revlog, [0, 11, 13, 15], targetsize=15))
    [[0], [11], [13], [15]]
    >>> list(slicechunk(revlog, [0, 11, 13, 15], targetsize=20))
    [[0], [11], [13, 15]]

    Slicing involving nullrev
    >>> list(slicechunk(revlog, [-1, 0, 11, 13, 15], targetsize=20))
    [[-1, 0], [11], [13, 15]]
    >>> list(slicechunk(revlog, [-1, 13, 15], targetsize=5))
    [[-1], [13], [15]]
    Nslicechunktodensityc                 (    t          | ||          S r2   )_slicechunktodensity)xyzrevlogs      r&   <lambda>zslicechunk.<locals>.<lambda>   s    )=faA)N)N r(   )maxr   r   r    r   _slicechunktosize)rE   revs
targetsizedensityslicingchunksubchunks   `     r&   
slicechunkrN   O   s      x V%9::
 V\+@$GGNNNNNf(&*>    *&%DD 	 	HNNNN	 r(   c              #     K   |d|k    sJ |                      |d                   }|                     |d                   }||z
  }|||k    r|V  dS d}d}t          |          }t          |           |D ]x\  }	}
|                     |
          |z
  }|                     |
          }||k    r|r|	dz   }n4t          | |||          }|r|V  |	}|                      |
          }|	dz   }|s nyt          |          }||z
  |k    r|}||z
  dk    rn|                     ||dz
                     }||z
  }||k    r>||z
  dk    rn4|||z
  dz  z  }|                     ||dz
                     }||z
  }||k    >t          | |||          }|r|V  |}|                      ||                   }||z
  |k    t          | ||          }|r|V  dS dS )aJ  slice revs to match the target size

    This is intended to be used on chunk that density slicing selected by that
    are still too large compared to the read garantee of revlog. This might
    happens when "minimal gap size" interrupted the slicing or when chain are
    built in a way that create large blocks next to each other.

    >>> data = [
    ...  3,  #0 (3)
    ...  5,  #1 (2)
    ...  6,  #2 (1)
    ...  8,  #3 (2)
    ...  8,  #4 (empty)
    ...  11, #5 (3)
    ...  12, #6 (1)
    ...  13, #7 (1)
    ...  14, #8 (1)
    ... ]

    == All snapshots cases ==
    >>> revlog = _testrevlog(data, snapshot=range(9))

    Cases where chunk is already small enough
    >>> list(_slicechunktosize(revlog, [0], 3))
    [[0]]
    >>> list(_slicechunktosize(revlog, [6, 7], 3))
    [[6, 7]]
    >>> list(_slicechunktosize(revlog, [0], None))
    [[0]]
    >>> list(_slicechunktosize(revlog, [6, 7], None))
    [[6, 7]]

    cases where we need actual slicing
    >>> list(_slicechunktosize(revlog, [0, 1], 3))
    [[0], [1]]
    >>> list(_slicechunktosize(revlog, [1, 3], 3))
    [[1], [3]]
    >>> list(_slicechunktosize(revlog, [1, 2, 3], 3))
    [[1, 2], [3]]
    >>> list(_slicechunktosize(revlog, [3, 5], 3))
    [[3], [5]]
    >>> list(_slicechunktosize(revlog, [3, 4, 5], 3))
    [[3], [5]]
    >>> list(_slicechunktosize(revlog, [5, 6, 7, 8], 3))
    [[5], [6, 7, 8]]
    >>> list(_slicechunktosize(revlog, [0, 1, 2, 3, 4, 5, 6, 7, 8], 3))
    [[0], [1, 2], [3], [5], [6, 7, 8]]

    Case with too large individual chunk (must return valid chunk)
    >>> list(_slicechunktosize(revlog, [0, 1], 2))
    [[0], [1]]
    >>> list(_slicechunktosize(revlog, [1, 3], 1))
    [[1], [3]]
    >>> list(_slicechunktosize(revlog, [3, 4, 5], 2))
    [[3], [5]]

    == No Snapshot cases ==
    >>> revlog = _testrevlog(data)

    Cases where chunk is already small enough
    >>> list(_slicechunktosize(revlog, [0], 3))
    [[0]]
    >>> list(_slicechunktosize(revlog, [6, 7], 3))
    [[6, 7]]
    >>> list(_slicechunktosize(revlog, [0], None))
    [[0]]
    >>> list(_slicechunktosize(revlog, [6, 7], None))
    [[6, 7]]

    cases where we need actual slicing
    >>> list(_slicechunktosize(revlog, [0, 1], 3))
    [[0], [1]]
    >>> list(_slicechunktosize(revlog, [1, 3], 3))
    [[1], [3]]
    >>> list(_slicechunktosize(revlog, [1, 2, 3], 3))
    [[1], [2, 3]]
    >>> list(_slicechunktosize(revlog, [3, 5], 3))
    [[3], [5]]
    >>> list(_slicechunktosize(revlog, [3, 4, 5], 3))
    [[3], [4, 5]]
    >>> list(_slicechunktosize(revlog, [5, 6, 7, 8], 3))
    [[5], [6, 7, 8]]
    >>> list(_slicechunktosize(revlog, [0, 1, 2, 3, 4, 5, 6, 7, 8], 3))
    [[0], [1, 2], [3], [5], [6, 7, 8]]

    Case with too large individual chunk (must return valid chunk)
    >>> list(_slicechunktosize(revlog, [0, 1], 2))
    [[0], [1]]
    >>> list(_slicechunktosize(revlog, [1, 3], 1))
    [[1], [3]]
    >>> list(_slicechunktosize(revlog, [3, 4, 5], 2))
    [[3], [5]]

    == mixed case ==
    >>> revlog = _testrevlog(data, snapshot=[0, 1, 2])
    >>> list(_slicechunktosize(revlog, list(range(9)), 5))
    [[0, 1], [2], [3, 4, 5], [6, 7, 8]]
    Nr   r   r   )r-   r0   	enumeratenextr9   
_trimchunkr6   )rE   rI   rJ   	startdataenddatafullspanstartrevidx	endrevidxiterrevsidxrspanr%   rL   nbitemlocalenddatas                   r&   rH   rH      sv     F jT!W%%Ijjb""G"HX33


KIHNNN  Qzz!}}y($$Q'':(aIIvt[)DDE KQIaI 	E	 YYFY*
,
,	K1$$zz$y1}"566i'Z;&!++)k1a77I!::d9q=&9::L)+D Z 64i@@ 	KKKLLk!233	! Y*
,
,$ vt[11E  r(   r   c              #   P  K   | j         }| j        t          |          dk    r|V  dS t          | |          }||k     r|V  dS |}t	          fd|D                       }|r|t          |          z  }nd}||k    r|V  dS g }	d}
t          |          D ]K\  }} ||          } |          }|dk    r"|
"||
z
  }||k    r|	                    ||f           ||z   }
L|	                                 g }|	rZ||k     rT|		                                \  }}|                    |           ||z  }|dk    r|t          |          z  }nd}|	r||k     T|                                 d}|D ]}t          | |||          }|r|V  |}t          | ||          }|r|V  dS dS )a  slice revs to reduce the amount of unrelated data to be read from disk.

    ``revs`` is sliced into groups that should be read in one time.
    Assume that revs are sorted.

    The initial chunk is sliced until the overall density (payload/chunks-span
    ratio) is above `targetdensity`. No gap smaller than `mingapsize` is
    skipped.

    >>> revlog = _testrevlog([
    ...  5,  #00 (5)
    ...  10, #01 (5)
    ...  12, #02 (2)
    ...  12, #03 (empty)
    ...  27, #04 (15)
    ...  31, #05 (4)
    ...  31, #06 (empty)
    ...  42, #07 (11)
    ...  47, #08 (5)
    ...  47, #09 (empty)
    ...  48, #10 (1)
    ...  51, #11 (3)
    ...  74, #12 (23)
    ...  85, #13 (11)
    ...  86, #14 (1)
    ...  91, #15 (5)
    ... ])

    >>> list(_slicechunktodensity(revlog, list(range(16))))
    [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]]
    >>> list(_slicechunktodensity(revlog, [0, 15]))
    [[0], [15]]
    >>> list(_slicechunktodensity(revlog, [0, 11, 15]))
    [[0], [11], [15]]
    >>> list(_slicechunktodensity(revlog, [0, 11, 13, 15]))
    [[0], [11, 13, 15]]
    >>> list(_slicechunktodensity(revlog, [1, 2, 3, 5, 8, 10, 11, 14]))
    [[1, 2], [5, 8, 10, 11], [14]]
    >>> list(_slicechunktodensity(revlog, [1, 2, 3, 5, 8, 10, 11, 14],
    ...                           mingapsize=20))
    [[1, 2, 3, 5, 8, 10, 11], [14]]
    >>> list(_slicechunktodensity(revlog, [1, 2, 3, 5, 8, 10, 11, 14],
    ...                           targetdensity=0.95))
    [[1, 2], [5], [8, 10, 11], [14]]
    >>> list(_slicechunktodensity(revlog, [1, 2, 3, 5, 8, 10, 11, 14],
    ...                           targetdensity=0.95, mingapsize=12))
    [[1, 2], [5, 8, 10, 11], [14]]
    r   Nc              3   .   K   | ]} |          V  d S r2   r   ).0r[   r4   s     r&   	<genexpr>z'_slicechunktodensity.<locals>.<genexpr>s  s+      //Qvvayy//////r(   g      ?r   )r-   r4   r6   segmentspansumfloatrQ   appendsortpoprS   )rE   rI   targetdensity
mingapsizer-   deltachainspanreaddatachainpayloadr#   gapsprevendir,   revstartrevlengapsizeselectedgapidxprevidxrZ   rL   r4   s                        @r&   rA   rA   4  sQ     b LE]F
4yyA~~


 ..N
""


H////$/////L ~!6!66-


 DGD// $ $35:: Q;;(G##WaL)))V#IIKKK H
 7]**((** 	Ga<<"U8__4GGG  7]** MMOOO G  64#66 	KKKvtW--E  r(   c                    | j         }|t          |          }||dz
           t          |           k     rM|dk    rG||k    rA |||dz
                     dk    r)|dz  }|dk    r||k    r |||dz
                     dk    )|||         S )a  returns revs[startidx:endidx] without empty trailing revs

    Doctest Setup
    >>> revlog = _testrevlog([
    ...  5,  #0
    ...  10, #1
    ...  12, #2
    ...  12, #3 (empty)
    ...  17, #4
    ...  21, #5
    ...  21, #6 (empty)
    ... ])

    Contiguous cases:
    >>> _trimchunk(revlog, [0, 1, 2, 3, 4, 5, 6], 0)
    [0, 1, 2, 3, 4, 5]
    >>> _trimchunk(revlog, [0, 1, 2, 3, 4, 5, 6], 0, 5)
    [0, 1, 2, 3, 4]
    >>> _trimchunk(revlog, [0, 1, 2, 3, 4, 5, 6], 0, 4)
    [0, 1, 2]
    >>> _trimchunk(revlog, [0, 1, 2, 3, 4, 5, 6], 2, 4)
    [2]
    >>> _trimchunk(revlog, [0, 1, 2, 3, 4, 5, 6], 3)
    [3, 4, 5]
    >>> _trimchunk(revlog, [0, 1, 2, 3, 4, 5, 6], 3, 5)
    [3, 4]

    Discontiguous cases:
    >>> _trimchunk(revlog, [1, 3, 5, 6], 0)
    [1, 3, 5]
    >>> _trimchunk(revlog, [1, 3, 5, 6], 0, 2)
    [1]
    >>> _trimchunk(revlog, [1, 3, 5, 6], 1, 3)
    [3, 5]
    >>> _trimchunk(revlog, [1, 3, 5, 6], 1)
    [3, 5]
    Nr   r   )r4   r6   )rE   rI   startidxendidxr4   s        r&   rS   rS     s    L ]F~T FQJ#f++%% QJJ6H,,VaZ8H1I1IQ1N1NaKF QJJ6H,,VaZ8H1I1IQ1N1N   r(   c                 |    |sdS |                      |d                   }||                     |d                   z
  S )a  Get the byte span of a segment of revisions

    revs is a sorted array of revision numbers

    >>> revlog = _testrevlog([
    ...  5,  #0
    ...  10, #1
    ...  12, #2
    ...  12, #3 (empty)
    ...  17, #4
    ... ])

    >>> segmentspan(revlog, [0, 1, 2, 3, 4])
    17
    >>> segmentspan(revlog, [0, 4])
    17
    >>> segmentspan(revlog, [3, 4])
    5
    >>> segmentspan(revlog, [1, 2, 3,])
    7
    >>> segmentspan(revlog, [1, 3])
    7
    r   rP   r3   )rE   rI   r0   s      r&   rc   rc     sA    0  q
**T"X

Cd1g&&&&r(   c                 &   t          j        d          }|d|         t          j        |                    |          t          |          |z
            k    r||d         }	n,|                    ||           }
t          j        |
|          }		 t          j	        ||	|          }|r|
                    |	|||           |t          z  r$t          j        t          d          |z            n # t          j        $ r |t          z  s Y nw xY w|	S )z<build full text from a (base, delta) pair and other metadatas   >lllN_df)p1p2s   node %s is not censored)structcalcsizer   replacediffheaderrawsizer6   revisionpatchr   processflagsraw	checkhashr   r   StorageErrorr   CensoredNodeError)fhrE   baserevdeltar~   r   flagsexpectednodehlenfulltextbasetextvalidatehashs               r&   _textfromdeltar     sF   
 ?7##DUdU|u.wUd!2    < ??7?33;x///%HH 	CX|rBBB$$ 	$,--<  	 "   (( 		 	 Os   AC1 1DDT)slotsfrozenc                       e Zd Z ej                    Z ej                    Z ej                    Z ej                    Z ej                    Z	 ej                    Z
 ej                    Z ej                    ZdS )
_deltainfoN)r:   r;   r<   r   ibdistancedeltalenr"   base	chainbasechainlencompresseddeltalensnapshotdepthr   r(   r&   r   r   %  sw        twyyHtwyyH4799D4799D		ItwyyH DGIIMMMr(   r   c           
          | j         d         dk    sJ | j         d                     t          | j        | j        dz
  d| j         d         f| j        | j        | j        | j        | j                  S )zturn into a "u" (no-compression) into no-compression without header

    This is useful for revlog format that has better compression method.
    r      ur   r(   )	r"   r   r   r   r   r   r   r   r   )r   s    r&   drop_u_compressionr   1  ss    
 :a=D   %*Q-   	ejm
 	 	 	r(   c                    |dS |j         }|dz  }| j        }|s|j        }t          ||          }| j        s||j        k     rdS ||j        k     rdS |t          z  |j        k     rdS | j        r| j        |j	        k     rdS |j
        ||j
        z	  |j        k     rdS |j
        r%|                     |j                  |j        k     rdS dS )zReturns True if the given delta is good. Good means that it is within
    the disk span, disk size, and chain length bounds that we know to be
    performant.NF   T)textlen_maxdeltachainspanr   rG   _sparserevlogr   LIMIT_DELTA2TEXTr   _maxchainlenr   r   r4   r   )rE   	deltainforevinfor   
defaultmaxmaxdists         r&   isgooddeltainfor   C  s    u oG1J'G %$':&&G  Gi.@$@$@u ###u
 !!I$@@@u
  v2Y5GGGu 	+	//93EEEu
 	MM).))I,>>>u4r(   i  c              #     K   t          |           r| j        sdV  dS | j        }| j        }| j        }d}|t
          z  }	t          h}
t          | |||          }	 |                    |          }|ng }|D ]}| j	        r[|t          k    sP||
v sL ||          sA|

                    |            ||          }| j	        r|t          k    s||
v s ||          A|t          k    rq||
v rv|

                    |           |	|                     |          k     r|r"|                     |          |t          z  k     r|                     |          t          z  r|                     |          \  }}| j        r|| j        k    r|	|k     r|r| j        | j        }||t          f}||vr|                     |          rl|                     |          }|                     |          }t)          ||z
  d          }||z  }||z	  }||k     r|                     |          }||k     r|                    |           |rt-          |          V }dV  dS )zProvides group of revision to be tested as delta base

    This top level function focus on emitting groups with unique and worthwhile
    content. See _raw_candidate_groups for details about the group order.
    NTr   )r6   _storedeltachainsr4   deltaparentr   r   r   _refinedgroupssend_generaldeltaaddr   LIMIT_BASE2TEXTr   r   
_chaininfor   upperboundcompr9   r   rG   rf   tuple)rE   r   r~   r   
cachedeltadeltalengthr   sparsegooddeltas_limittested
candidates
temptativegroupr,   r   	chainsizemaxcompbasenotsnapr   revsizerawsizedistancelowestrealisticdeltalensnapshotlimit	revlengths                            r&   _candidategroupsr     s      KK F4 


-K$K!FD--LYFB
;;JE&__T**
 ;	 ;	C& 'w#--;;s3C3C-

3!k#&&	 & 'w#--;;s3C3C- g~~f}}JJsOOOfmmC0000 &..--O1KLL||C  #@@ 
 #)"3"3C"8"8Hi" x63F'F'Fi'' !&/; /!2w/k))f.?.?.D.D)$*$8$8$=$=M %nnS11G&)'G*;Q&?&?O.=.H+ %,}$<M$'>>>  !'c 2 2I #::: LL 	& u%%DKE&L JJJJJr(   c                    t          j        | j        d          r| j                            ||           dS | j        }| j        }|                     |          D ]1} ||          r$| ||                                       |           2dS )z#find snapshot from start_rev to tips   findsnapshotsN)r   safehasattrr    findsnapshotsr   r9   rI   rf   )rE   cache	start_revr   r9   r,   s         r&   _findsnapshotsr     s    &677 4""5)44444(&
;;y)) 	4 	4Cz# 4kk#&&'..s333	4 	4r(   c              #   6  K   d }|r!| j         r| j        r|d         fV }|d V  d S t          j        t                    }t          | ||||          D ]
}|V }| n| j        sd V  d S ||||fvr|                     |          rd }||k    r.|}|                     |          }|t          k    rn|fV }||k    .|st          | ||dz              d }||k    r8|}t          t          d ||         D                                 }	|	V }||k    8d V  d S )Nr   r   c              3      K   | ]}|V  d S r2   r   )ra   cs     r&   rb   z!_refinedgroups.<locals>.<genexpr>%  s"      #?#?!A#?#?#?#?#?#?r(   )r   _lazydeltabasecollectionsdefaultdictlist
_rawgroupsr   r9   r   r   r   r   sorted)
rE   r~   r   r   r   	snapshotsr   previousr   childrens
             r&   r   r     s     D  f* v/D  !m%%%JJJF'--I RYGG  
E   


 DR00V5F5Ft5L5L0$H%%d++Dw==D $  	869dQh777hHV#?#?y#?#?#???@@H!>>D h JJJJJr(   c              #      K    j         }|o j        }t                     }|dz
  } fd|rjd ||fD             }	 j        s>t          |	          dk    r+|	                                 |	d         fV  |	d         fV  nt          |	          dk    r|	V  |rY|	rV|t          j        t                    }t          j        t                    }
fd|	D             }|D ]I}t          |          D ]7\  }} 
                    |          s n|
|                             |           8Jt          |
d                   dz   }t           ||           t                      }|D ]}|                    |           d}                     ||          D ]
}||vr|} n|t!          |
                                          } |          }t          |          D ]F\  }}||k     r||k     r n3 
                    |          s n|
|                             |           Gdt%          |
                                d	          D ]\  }}t                      }|D ]}|                    ||                    fd
|D             }t)          t%          |                    V  t)          t%          |                    V  t          |          t)          |t*                             V  |s|fV  dS dS )zProvides group of revision to be tested as delta base

    This lower level function focus on emitting delta theorically interresting
    without looking it any practical details.

    The group order aims at providing fast or small candidates first.
    r   c                 :                         |           d         S r/   )_deltachain)r,   rE   s    r&   rF   z_rawgroups.<locals>.<lambda>9  s    V//44Q7 r(   c                 (    g | ]}|t           k    |S r   r   )ra   ps     r&   
<listcomp>z_rawgroups.<locals>.<listcomp>=  s    777!w,,1,,,r(   r   r   Nc                 &    g | ]} |          S r   r   )ra   r   
deltachains     r&   r   z_rawgroups.<locals>.<listcomp>T  s!    ;;;aJJqMM;;;r(   T)reversec                      g | ]
}|k     |S r   r   )ra   r[   floors     r&   r   z_rawgroups.<locals>.<listcomp>  s    ===!5199A999r(   )r   r   r6   _deltabothparentsrg   r   r   r   r   rQ   r9   r   minr   updaterI   rG   keysr   itemsr   r   )rE   r~   r   r   r   gdeltar   currprevparentsparents_snapscandidate_chainschainrZ   s	snapfloorall_revsotherr[   	max_depthsnapssiblingsr   r   s   `                     @@r&   r   r   ,  s      !F,,Fv;;D!8D7777J 77r2h777' 		CLLA,=,=LLNNN 1:-1:-\\AMMM S(' S(#/55I $/44;;;;7;;;% 	* 	*E#E** * *Q((++ Ec"&&q))))a())A-	vy)444 55% 	# 	#EOOE""""T9-- 	 	A   !  M..0011IJu%%E#E** * *Qy==s??E((++ Ec"&&q))))  !4!4!6!6EEE 	 	JCuuH . .	!----  
 >===x===x(()))))u&&&&&JJEE Ig&'''''  g r(   c                   6    e Zd Zd	dZd Zd Zd Zd Zd
dZdS )deltacomputerNFc                 0    || _         || _        || _        d S r2   )rE   _write_debug_debug_search)r!   rE   write_debugdebug_searchs       r&   r'   zdeltacomputer.__init__  s    ')r(   c           
          |j         }|d         |d         S | j        }|j        }|d         }|d         }t          |||||j        |j        |j        |j                  x}|d<   |S )zBuilds a fulltext version of a revision

        revinfo: revisioninfo instance that contains all needed info
        fh:      file handle to either the .i or the .d revlog file,
                 depending on whether it is inlined or not
        r   Nr   )btextrE   r   r   r~   r   r   node)	r!   r   r   r  rE   r   r   r   r   s	            r&   	buildtextzdeltacomputer.buildtext  s     88O'
Q-1,JJML	
 	
 		
58 r(   c                 8   | j         }|                     ||          }|                    |          r;t          j        |                    |          t          |                    }||z   }n,|                    ||          }t          j        ||          }|S )Nr|   )	rE   r  
iscensoredr   r   r   r6   rawdatatextdiff)	r!   r   r   r   rE   theaderr   ptexts	            r&   _builddeltadiffzdeltacomputer._builddeltadiff  s    NN7B''T"" 	- ,V^^D-A-A3q66JJFQJEENN4RN00EN5!,,Er(   c           
      B   | j         }| j        d uo| j        }|                    |          }|j        r|}n|}d }|j        r|t          k    rd}n|j        r|                    |          rw|                    |j	                  |                    |j
                  }
}	||	|
fvr=|                    |          r(t          |                    |          d                   }d }|j        r|j        \  }}|}|t          k    rm||k    rg| j                             |          dk    rI| j                             |          }|t          k    r$||k    r| j                             |          dk    I| j         j        r||k    r|j        d         }||                     |||          }|r)d}|t          |          z  }|                     |           |j        |rt          |          |j        z  }|j        |z	  }|rd}||z  }|                     |           ||k     r|rd}|                     |           d S |                    |          |k     r|rd}|                     |           d S |                    |          \  }}t          |          t          |          z   }|                    t          |          dz
            }||z   |                    |          z
  }|                    |          \  }}|dz  }||z  }t1          ||||f|||||          S )Nr   r   s2   DBG-DELTAS-SEARCH:     uncompressed-delta-size=%d
s/   DBG-DELTAS-SEARCH:     projected-lower-size=%d
s2   DBG-DELTAS-SEARCH:     DISCARDED (snapshot limit)
s-   DBG-DELTAS-SEARCH:     DISCARDED (prev size)
)rE   r   r   r   r   r   r   r9   r,   r~   r   r6   r   r   r4   r   
_lazydeltar  r   r   compressr0   r-   r   r   )r!   r   r   r   rE   r  r   	deltabaser   r~   r   r   	cachebase	cachediffcurrentbasemsgr   r   r  r"   r   offsetdistr   r   s                            r&   _builddeltainfozdeltacomputer._builddeltainfo  s   (4K9K$$T**	 	"II!I 	FI$8$8MM! 	Ff&7&7	&B&B 	F ZZ
++VZZ
-C-CBR((V->->y-I-I( #F$6$6y$A$A!$D E E 	.#*#5 Iy#Kw&&4''K&&{33q88"k55kBB	 w&&4''K&&{33q88 {% .+*=*=*1-=((w;;E 	#HC3u::Cc""" ,,&)%jjF4I&I##O}<M 'I..!!#&&&666 +PC%%c***t}}T""%<<< +KC%%c***tu--v;;T*CKK!O,,& 6<<	#:#::'-'8'8'>'>$$Ah&TN	
 	
 		
r(   c           
          |                      ||          }| j                            |          }t          |d                   t          |d                   z   x}x}}|x}	}
d}d}t	          ||||	|
|||          S )Nr   r   )r  rE   r  r6   r   )r!   r   r   r   rawtextr"   r   r   r  r  r   r   r   s                r&   _fullsnapshotinfozdeltacomputer._fullsnapshotinfo  s    .."--{##G,,/247||c$q'll/JJJX $$	I	
 	
 		
r(   c                   " |t          | j                  }|j        s|                     |||          S |t	                      }|j        t          z  r|                     |||          S | j        t          j	                    }| j        duo| j
        }d}d}d}	|j        }
|j        }|j        }| j        }d}|                    |          |                    |          }}| j        R|t          k    r|                    |          d         }nd}|t          k    r|                    |          d         }nd}|rd}||z  }|                     |           t#          | j        |j        |||
          }t%          |          }|>|dz  }|rd"||j        "||v s||v rd}nB"t)          "fd|D                       rd	}n""t)          "fd
|D                       rd}nd}d}||t          |          |fz  }|                     |           g }|?|r(d}||j        |j        fz  }|                     |           |                    |           |D ])}|rd}||z  }|                     |           d}||k    rd}nB||k    rd}n9| j                            |          rd}|| j                            |          z  }|d}||z  }|                     |           d}|| j                            |          z  }|                     |           d}|| j                            |          z  }|                     |           ||v r|rd}|                     |           ||k    r|rd}|                     |           4|dz  }|rt          j	                    }|                     |||          }|r2t          j	                    }d}|||z
  z  }|                     |           |ut9          | j        ||          r:|r!d}||j        z  }|                     |           |                    |           |r!d}||j        z  }|                     |           |rd}|                     |           +|rt;          |d           }||                    |j                  }nt%          |          }|>|d}	|                     |||          }n|j        rd}	nd }	| j        t          j	                    }||z
  ||||	||d!}|j        	 |j        |d"<   nd|d"<   d#}| j        j        d         } | j        j        d         }!| t@          k    rd$}n/| tB          k    rd%}|!r|d&|!z  z  }n| tD          k    rd'}|!r|d&|!z  z  }||d(<   d)}||d(         |d*         |d+         |d,         |d-         |d"         |d.         |d/         |d0         f	z  }|                     |           |S )1ay  Find an acceptable delta against a candidate revision

        revinfo: information about the revision (instance of _revisioninfo)
        fh:      file handle to either the .i or the .d revlog file,
                 depending on whether it is inlined or not

        Returns the first acceptable candidate revision, as ordered by
        _candidategroups

        If no suitable deltabase is found, we return delta info for a full
        snapshot.

        `excluded_bases` is an optional set of revision that cannot be used as
        a delta base. Use this to recompute delta suitable in censor or strip
        context.
        Nr   s   unknownrP   s!   DBG-DELTAS-SEARCH: SEARCH rev=%d
r   s   parentsc              3   $   K   | ]
}|k     V  d S r2   r   ra   r   r   s     r&   rb   z.deltacomputer.finddeltainfo.<locals>.<genexpr>  '      -N-N1a$h-N-N-N-N-N-Nr(   s   refine-downc              3   $   K   | ]
}|k    V  d S r2   r   r  s     r&   rb   z.deltacomputer.finddeltainfo.<locals>.<genexpr>  r   r(   s	   refine-ups   search-downs2   DBG-DELTAS-SEARCH: ROUND #%d - %d candidates - %s
s3   DBG-DELTAS-SEARCH:   CONTENDER: rev=%d - length=%d
s'   DBG-DELTAS-SEARCH:   CANDIDATE: rev=%d
s   p1s   p2s   snapshot-%ds   DBG-DELTAS-SEARCH:     type=%s
s   DBG-DELTAS-SEARCH:     size=%d
s   DBG-DELTAS-SEARCH:     base=%d
s    DBG-DELTAS-SEARCH:     EXCLUDED
s    DBG-DELTAS-SEARCH:     TOO-HIGH
s,   DBG-DELTAS-SEARCH:     delta-search-time=%f
s/   DBG-DELTAS-SEARCH:     DELTA: length=%d (GOOD)
s.   DBG-DELTAS-SEARCH:     DELTA: length=%d (BAD)
s    DBG-DELTAS-SEARCH:     NO-DELTA
c                     | j         S r2   )r   )rB   s    r&   rF   z-deltacomputer.finddeltainfo.<locals>.<lambda>  s    qz r(   )keys   fulls   snapshots   delta)durationr   search_round_countdelta_try_counttypep1-chain-lenp2-chain-lenzsnapshot-depths   UNKNOWNs
   CHANGELOG:s   MANIFESTLOG:s   %s:s   FILELOG:ztarget-revlogs   DBG-DELTAS: %-12s rev=%d: search-rounds=%d try-count=%d - delta-type=%-6s snap-depth=%d - p1-chain-length=%d p2-chain-length=%d - duration=%f
r   r%  r&  r'  r(  r)  r$  )#r6   rE   r   r  r   r   r   r   r   timerr   r   r~   r   r,   r   r   r   rR   r   allr   rf   r9   r   r4   r   r  r   r   r   targetr   r   r   )#r!   r   r   excluded_bases
target_revr-   r  dbg_try_countdbg_try_roundsdbg_typer   r~   r   rE   r   p1rp2rp1_chain_lenp2_chain_lenr  groupscandidaterevs
round_typenominateddeltascandidaterevcandidate_typedelta_startcandidatedelta	delta_endr0   dbgtarget_revlogtarget_type
target_keyr   s#                                     @r&   finddeltainfozdeltacomputer.finddeltainfo2  s   " T[))J 	C))"gzBBB! UUN
 =88 	C))"gzBBB(JLLE(4K9K '
ZZ	::b>>6::b>>S(g~~%0055a8!g~~%0055a8! 	#7C:Cc"""!K#sJ
 
 V'aN '($>D&&"*=*=!+JJ%#-N-N-N-N-N-N-N*N*N%!/JJ%#-N-N-N-N-N-N-N*N*N%!-JJ!/JLM(:(:JGG!!#&&& O$ +O  INI,>??C%%c***  &&y111 - ;+ ;+ +EC<'C%%c***%)N#r))).%++).//== )7&$+*C*C(+ +  &1A~-))#...=C4;--l;;;C%%c***=C4;22<@@@C%%c***>11# /B))#...:--# /B))#..." /"&*,,K!%!5!5g|R!P!P + $
IJC9{22C%%c***!-&t{NGLL 	/' 3"UC>#::C --c222'..~>>>>% /P~66))#...! +>C%%c*** K5I5IJJJ	$ &IN ; ; $V} '@ H..r7JGGII$ 	 "HHH(*,,C%K&&4#0  , , C '
 + $  )*$%&M+,Q/K+A.Jn,, - 000 / 9!Vj%88M,, + 9!Vj%88M#0C 
  O$J()%&F$%N#N#J
 
C c"""r(   )NF)NN)	r:   r;   r<   r'   r  r  r  r  rC  r   r(   r&   r   r     s        * * * *
  8  H
 H
 H
T
 
 
&i i i i i ir(   r   c                     |j         \  }}t          }|s
|st          }nF|s&|dd         }|dk    rt          }n,|| k    rt          }n|dk    rd}t          }t	          |          }||fS )zreturn (COMPRESSION_MODE, deltainfo)

    used by revlog v2+ format to dispatch between PLAIN and DEFAULT
    compression.
    r   r       r   r(   )r"   r
   r   r	   r   )default_compression_headerr   hdcompression_moder  s         r&   delta_compressionrJ    s     >DAq' 2Q 2* 
2acF::.,,,0	
d*&y11	Y&&r(   r2   )r   r   ),r=   r   r   r  r   i18nr   pycompatr   	constantsr	   r
   r   r   r   r   r   r   
thirdpartyr    r   r   r   r   r   r   rN   rH   rA   rS   rc   r   r   r   r   r   r   r   r   r   r   r   rJ  r   r(   r&   <module>rP     s   ; :                       	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	                        %  %  %  %  %  %  %  %FG G G GTX X X Xv{ { { {|3! 3! 3! 3!l' ' '<  > d4          !   $F F FX Z Z Zz	4 	4 	4. . .bv v v vrv v v v v v v vr' ' ' ' 'r(   