
    6h                   ,   S r SSKJr  SSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJrJrJrJrJrJrJrJrJrJr  SS	KJr  \R0                  (       a  SSKrSS
KJrJrJr  SSKJr  Sr " S S5      rS/S jr S/S jr!S0S jr"S/S jr#S r$S r%\RL                  " SSS9 " S S5      5       r'S r(Sr)Sr*Sr+Sr,Sr-Sr.Sr/ " S  S!\R`                  5      r1 " S" S#\15      r2 " S$ S%\15      r3 " S& S'\15      r4 " S( S)\45      r5 " S* S+5      r6 " S, S-5      r7S. r8g)1z4Helper class to compute deltas stored inside revlogs    )annotationsN   )nullrev)_   )
COMP_MODE_DEFAULTCOMP_MODE_INLINECOMP_MODE_PLAINDELTA_BASE_REUSE_FORCEDELTA_BASE_REUSE_NOKIND_CHANGELOGKIND_FILELOGKIND_MANIFESTLOGREVIDX_ISCENSOREDREVIDX_RAWTEXT_CHANGING_FLAGS)attr)errormdiffutil)flagutilc                  @    \ rS rSrSrSS jrS rS rS rS r	S r
S	rg
)_testrevlog5   z)minimalist fake revlog to use in doctestsc                   SSK Jn  Xl        UR                  5       U l        X R                  l        X0R                  l        UR                  5       U l        UR                  5       U l
        [        U5      U l        SU l        g)z.data is an list of revision payload boundariesr   )revlogN) r   _data
DataConfigdata_configsr_density_thresholdsr_min_gap_sizeDeltaConfigdelta_configFeatureConfigfeature_configset	_snapshotindex)selfdatadensitymingapsnapshotr   s         >/usr/lib/python3/dist-packages/mercurial/revlogutils/deltas.py__init___testrevlog.__init__8   sg    
!,,.07-+1("..0$224X
    c                J    U[         :X  a  gUS:X  a  gU R                  US-
     $ )Nr   r   r   r   r)   revs     r.   start_testrevlog.startE   s)    '>!8zz#'""r1   c                6    U[         :X  a  gU R                  U   $ Nr   r3   r4   s     r.   end_testrevlog.endL   s    '>zz#r1   c                H    U R                  U5      U R                  U5      -
  $ Nr:   r6   r4   s     r.   length_testrevlog.lengthQ   s    xx}tzz#..r1   c                ,    [        U R                  5      $ r=   )lenr   r)   s    r.   __len___testrevlog.__len__T   s    4::r1   c                4    U[         :X  a  gXR                  ;   $ )NT)r   r'   r4   s     r.   
issnapshot_testrevlog.issnapshotW   s    '>nn$$r1   )r   r'   r   r#   r%   r(   N)      ?r    )__name__
__module____qualname____firstlineno____doc__r/   r6   r:   r?   rD   rG   __static_attributes__rJ   r1   r.   r   r   5   s#    3#
/%r1   r   c              #  2  ^ #    Ub   [        UT R                  R                  5      n[        T R                  SS5      nUc  U 4S jnU" UT R                  R
                  T R                  R                  5       H  n[        T XB5       Sh  vN   M     g N	7f)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.data_config.sr_density_threshold`. No gap smaller
than `revlog.data_config.sr_min_gap_size` 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.data_config.sr_min_gap_size`.

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XU5      $ r=   )_slicechunktodensity)xyzr   s      r.   <lambda>slicechunk.<locals>.<lambda>   s    )=faA)Nr1   )maxr   r!   getattrr(   r    _slicechunktosize)r   revs
targetsizedensityslicingchunks   `    r.   
slicechunkra   ]   s     x V%7%7%G%GH
 V\\+@$GNN//**
 %VU???
 	@s   BBB
Bc              #  :  #    Ub  SU::  d   eU R                  US   5      nU R                  US   5      nXC-
  nUb  XR::  a  Uv   gSnSn[        U5      n[        U5        U Ht  u  pU R                  U
5      U-
  nU R	                  U
5      nX::  a  U(       a  U	S-   nO/[        XXg5      nU(       a  Uv   U	nU R                  U
5      nU	S-   nU(       a  Mt    O   [        U5      nXC-
  U:  a  UnX-
  S::  a  OU R                  XS-
     5      nX-
  nX:  a4  Xv-
  S::  a  O+XwU-
  S-  -  nU R                  XS-
     5      nX-
  nX:  a  M4  [        XXg5      nU(       a  Uv   UnU R                  X   5      nXC-
  U:  a  M  [        XU5      nU(       a  Uv   gg7f)a
  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   )r6   r:   	enumeratenextrG   
_trimchunkrB   )r   r]   r^   	startdataenddatafullspanstartrevidx	endrevidxiterrevsidxrspanr-   r`   nbitemlocalenddatas                   r.   r\   r\      s    F j00T!W%Ijjb"G"HX3
KIHNzz!}y($$Q'(aIv[DEKQIaIx & YF*
,	1$zz$1}"56'&!+k1a77I!::dq=&9:L+D  6@KLL!23	! *
,$ v[1E s   CFA3F4FFc              #    ^#    U R                   nU R                  m[        U5      S::  a  Uv   g[        X5      nXS:  a  Uv   gUn[	        U4S jU 5       5      nU(       a  U[        U5      -  nOSnX:  a  Uv   g/ n	Sn
[        U5       H?  u  pU" U5      nT" U5      nUS:X  a  M  U
b  X-
  nX:  a  U	R                  X45        X-   n
MA     U	R                  5         / nU	(       aR  X:  aM  U	R                  5       u  nnUR                  U5        Xo-  nUS:  a  U[        U5      -  nOSnU	(       a  X:  a  MM  UR                  5         SnU H  n[        XUU5      nU(       a  Uv   UnM     [        XU5      nU(       a  Uv   gg7f)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  4   >#    U  H  nT" U5      v   M     g 7fr=   rJ   ).0rn   r?   s     r.   	<genexpr>'_slicechunktodensity.<locals>.<genexpr>  s     /$Qvayy$s   g      ?r   )r6   r?   rB   segmentspansumfloatrd   appendsortpoprf   )r   r]   targetdensity
mingapsizer6   deltachainspanreaddatachainpayloadr+   gapsprevendir5   revstartrevlengapsizeselectedgapidxprevidxrm   r`   r?   s                        @r.   rT   rT   C  s    b LLE]]F
4yA~
 .N"
H/$//L~!66
 DGD/: Q;(G#WL)# "  	IIK H
7*((* 	a<"U8_4GG 7* MMO G6#6K  vW-E s   D6F	;AF	c                    U R                   nUc  [        U5      nXS-
     [        U 5      :  a?  US:  a9  X2:  a4  U" XS-
     5      S:X  a#  US-  nUS:  a  X2:  a  U" XS-
     5      S:X  a  M#  XU $ )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]
r   r   )r?   rB   )r   r]   startidxendidxr?   s        r.   rf   rf     s    L ]]F~T QJ#f+% QJ6,aZ8H1IQ1NaKF QJ6,aZ8H1IQ1N   r1   c                f    U(       d  gU R                  US   5      nX R                  US   5      -
  $ )ay  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   rc   r>   )r   r]   r:   s      r.   rw   rw     s2    0 
**T"X
Cd1g&&&r1   c                   [         R                  " S5      nUSU [        R                  " U R	                  U5      [        U5      U-
  5      :X  a  X'S nO'U R                  U5      n	[        R                  " X5      n [        R                  " XU5      n
U
(       a  U R                  XX4S9  U[        -  (       a"  [        R                  " [        S5      U-  5      e U$ ! [        R                   a    U[        -  (       d  e  U$ f = f)z<build full text from a (base, delta) pair and other metadatas   >lllN)p1p2s   node %s is not censored)structcalcsizer   replacediffheaderrawsizerB   revisionpatchr   processflagsraw	checkhashr   r   StorageErrorr   CensoredNodeError)r   baserevdeltar   r   flagsexpectednodehlenfulltextbasetextvalidatehashs              r.   _textfromdeltar     s    
 ??7#DUd|u..wUd!2  < ??7+;;x///%HXB$$$$,-<  % O	 "" (( )O	s   =AC #DDT)slotsfrozenc                  $   \ rS rSr\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r\R
                  " 5       r	\R
                  " 5       r
\R
                  " 5       r\R
                  " 5       r\R
                  " 5       rSrg)
_deltainfoi3  rJ   N)rK   rL   rM   rN   r   ibdistancedeltalenr*   base	chainbasechainlencompresseddeltalensnapshotdepthrP   rJ   r1   r.   r   r   3  s[    wwyHwwyH779D779D	IwwyHGGIMr1   r   c           
     $   U R                   S   S:X  d   U R                   S   5       e[        U R                  U R                  S-
  SU R                   S   4U R                  U R
                  U R                  U R                  U R                  5      $ )zturn into a "u" (no-compression) into no-compression without header

This is useful for revlog format that has better compression method.
r      ur   r1   )	r*   r   r   r   r   r   r   r   r   )r   s    r.   drop_u_compressionr   ?  s~    
 ::a=D /%**Q-/ 	ejjm

  	 	r1   i  unspecifiedcachedparentsr-   prevfullc                      \ rS rSrSr   SS jrS rS rS r\	S 5       r
\R                  SS	 j5       r\R                  S
 5       rSrg)_BaseDeltaSearchie  zperform the search of a good delta for a single revlog revision

note: some of the deltacomputer.finddeltainfo logic should probably move
here.
Nc	                   Ub*  US   [         :w  d  UR                  R                  (       a   eXl        X l        UR
                  U l        X0l        X@l        XPl        X`l	        Uc  [        U R                  5      U l        Xpl        Uc
  [        5       nXl        [        1U l        [         U l        S U l        U R'                  5         g )Nr   )r   r#   general_deltar   revinfotextlenr   r   
cachedeltaexcluded_basesrB   
target_revSnapshotCachesnapshot_cacher   tested_STAGE_UNSPECIFIEDcurrent_stagecurrent_group_init_group)	r)   r   r   r   r   r   r   r   r   s	            r.   r/   _BaseDeltaSearch.__init__l  s     !} 66&&44	
5 $,!$++.DO$!*_N,i/!r1   c                `    U R                  U5      (       d  gU R                  U5      (       d  gg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.
FT)_is_good_delta_info_universal!_is_good_delta_info_chain_qualityr)   	deltainfos     r.   is_good_delta_info#_BaseDeltaSearch.is_good_delta_info  s/     11)<<55i@@r1   c                   Uc  gU R                   R                  bH  U R                   R                  S   [        :w  d'  U R                  R                  R
                  (       a   eU R                   R                  UR                  :  a  gg)zReturns True if the given delta is good.

This performs generic checks needed by all format variants.

This is used by is_good_delta_info.
Fr   T)r   r   r   r   r#   r   r   r   r   s     r.   r   ._BaseDeltaSearch._is_good_delta_info_universal  st      LL##+||&&q)-CC;;++99	
: <<)"4"44r1   c                   U R                   R                  S-  nU R                  R                  R                  nU(       d  UR
                  n[        X25      nU R                  R                  R                  (       d  X1R
                  :  a  gU R                   R                  [        -  nXAR                  :  a  gU R                  R                  R                  (       a/  U R                  R                  R                  UR                  :  a  gg)zReturns True if the chain associated with the delta is good.

This performs checks for format that use delta chains.

This is used by is_good_delta_info.
   FT)r   r   r   r#   max_deltachain_spanr   rZ   sparse_revlogLIMIT_DELTA2TEXTr   max_chain_lenr   )r)   r   
defaultmaxmaxdistmax_chain_datas        r.   r   2_BaseDeltaSearch._is_good_delta_info_chain_quality  s     \\))A-
++**>>((Gg* ((66,,, --0@@888 KK$$22((669K9KKr1   c                    U R                   SL $ )z1True when all possible candidate have been testedN)r   rC   s    r.   done_BaseDeltaSearch.done  s     !!T))r1   c                    g)aO  move to the next group to test

The group of revision to test will be available in
`self.current_group`.  If the previous group had any good delta, the
best one can be passed as the `good_delta` parameter to help selecting
the next group.

If not revision remains to be, `self.done` will be True and
`self.current_group` will be None.
NrJ   r)   
good_deltas     r.   
next_group_BaseDeltaSearch.next_group  s     	r1   c                    g r=   rJ   rC   s    r.   r   _BaseDeltaSearch._init_group  s    r1   )r   r   r   r   r   r   r   r   r   r   r   r   )NNNr=   )rK   rL   rM   rN   rO   r/   r   r   r   propertyr   abcabstractmethodr   r   rP   rJ   r1   r.   r   r   e  sp     &P
:1f * * 	  	 r1   r   c                  (    \ rS rSrSrS rSS jrSrg)_NoDeltaSearchi  zaSearch for no delta.

This search variant is to be used in case where we should not store delta.
c                    [         U l        g r=   )_STAGE_FULLr   rC   s    r.   r   _NoDeltaSearch._init_group  s
    (r1   Nc                    g r=   rJ   r   s     r.   r   _NoDeltaSearch.next_group  s    r1   r   r=   rK   rL   rM   rN   rO   r   r   rP   rJ   r1   r.   r   r     s    
)r1   r   c                  (    \ rS rSrSrS rSS jrSrg)_PrevDeltaSearchi  zSearch for delta against the previous revision only

This search variant is to be used when the format does not allow for delta
against arbitrary bases.
c                    [         U l        U R                  S-
  /U l        U R                  R                  U R                  5        g Nr   )_STAGE_PREVr   r   r   r   updaterC   s    r.   r   _PrevDeltaSearch._init_group  s6    ("oo124--.r1   Nc                (    [         U l        S U l        g r=   )r   r   r   r   s     r.   r   _PrevDeltaSearch.next_group!  s    (!r1   )r   r   r=   r   rJ   r1   r.   r   r     s    /
"r1   r   c                  X    \ rS rSrSrS rS rSS jrS rS r	S	 r
S
 rS rS rS rSrg)_GeneralDeltaSearchi&  z1Delta search variant for general-delta repositoryc                   U R                   R                  R                  (       d   eU R                  5       U l        S U l        U R                  b  U R                  S   [        :  a  U R                  U R                  S   5      (       a^  [        U l
        U R                  S   4U l        SU l        U R                  U l        U R                  R                  U R                  5        g U R!                  5         g )Nr   r   )r   r#   r   _iter_groups_candidates_iterator
_last_goodr   r   _pre_filter_rev_STAGE_CACHEDr   _internal_group_internal_idxr   r   r   _next_internal_grouprC   s    r.   r   _GeneralDeltaSearch._init_group)  s     {{''5555$($5$5$7!OO'"%88$$T__Q%788 "/D$(OOA$6#8D !"D!%!5!5DKKt112%%'r1   c                j   SU l         U R                  R                  U R                  5      nUb  U R	                  U5      nXl        U R
                  c  S U l        g [        U R
                  5      S:X  a  U R                  5         g U R                  R                  R                  nUS:  a*  U R
                  S U U l        U =R                   U-  sl         O9U R
                  U l        U =R                   [        U R                  5      -  sl         U R                  R                  U R                  5        g r9   )r  r  sendr  _pre_filter_candidate_revsr  r   rB   r   r   r#   candidate_group_chunk_sizer   r   )r)   group
chunk_sizes      r.   r  (_GeneralDeltaSearch._next_internal_groupB  s    ))..t?33E:E$'!%D%%&!+OO11LLJA~%)%9%9+:%F"""j0"%)%9%9"""c$*<*<&=="KKt112r1   Nc                   U R                   nUb  Xl         U R                  [        :X  a   Ub  S U l        S U l        S U l        S U l        g U R
                  [        U R                  5      :  a~  X!:w  ay  U R                  R                  R                  nU R
                  U-   nU R                  U R
                  U U l        U R                  R                  U R                  5        X@l        g U R                  5         g r=   )r  r   r  r  r  r  r   rB   r   r#   r  r   r   r  )r)   r   old_goodr  next_idxs        r.   r   _GeneralDeltaSearch.next_groupX  s    ??!(O.:3I(,D%#'D !%D!%DT%9%9!::" 11LLJ))J6H!%!5!5""X"D KKt112!)%%'r1   c                   U R                   R                  nU R                   R                  nU R                  n/ nU H  nU[        :X  dI  Xd;   dD  U" U5      (       d7  UR                  U5        U" U5      nU[        :X  d  Xd;   d  U" U5      (       d  M7  U R                  U5      (       a  UR                  U5        M  U R                  R                  U5        M     U$ )a(  filter possible candidate before computing a delta

This function use various criteria to pre-filter candidate delta base
before we compute a delta and evaluate its quality.

Such pre-filter limit the number of computed delta, an expensive operation.

return the updated list of revision to test
)r   r?   deltaparentr   r   addr  rz   )r)   
temptativedeltalengthr  r   r  r5   s          r.   r  ._GeneralDeltaSearch._pre_filter_candidate_revs~  s     kk((kk--Cg~+c:J:J

3!#& g~+c:J:J ##C((S!$  r1   c                    U[         :X  a  gXR                  ;   a  gU R                  b  XR                  ;   a  gU R                  b  XR                  :  a  gU R                  R                  U5      [        -  (       a  gg)zpre filtering that is need in all cases.

return True if it seems okay to test a rev, False otherwise.

used by _pre_filter_rev.
FT)r   r   r   r   r   r   r   r4   s     r.   _pre_filter_rev_universal-_GeneralDeltaSearch._pre_filter_rev_universal  sm     '>++ *s6I6I/I ??&3//+A;;S!$AAr1   c                T   U R                   R                  [        -  nX R                  R	                  U5      :  a  gU R                  R                  U5      u  p4U R                  R                  R                  (       a$  X0R                  R                  R                  :  a  gX$:  a  gg)pre filtering that is needed in sparse revlog cases

return True if it seems okay to test a rev, False otherwise.

used by _pre_filter_rev.
FT)r   r   r   r   r?   
_chaininfor#   r   )r)   r5   deltas_limitr   	chainsizes        r.   _pre_filter_rev_delta_chain/_GeneralDeltaSearch._pre_filter_rev_delta_chain  s     ||++.>>
 ++,,S11 #kk44S9 KK$$22KK44BBB#r1   c                `    U R                  U5      (       d  gU R                  U5      (       d  ggz;return True if it seems okay to test a rev, False otherwiseFT)r  r"  r4   s     r.   r  #_GeneralDeltaSearch._pre_filter_rev  s-    --c22//44r1   c              #  d  #    U R                   U R                  4 Vs/ s H  o[        :w  d  M  UPM     nn[        U l        U R
                  R                  R                  (       d0  [        U5      S:X  a!  UR                  5         US   4v   US   4v   g [        U5      S:  a  Uv   g g s  snf 7f)Nr   r   r   )
r   r   r   _STAGE_PARENTSr   r   r#   delta_both_parentsrB   r{   )r)   pr   s      r.   _iter_parents!_GeneralDeltaSearch._iter_parents  s     #ww0A0L10A+((;;G!LLN 1:-1:-\AM  Bs   B0B+B+A<B0c              #  F   #    [         U l        U R                  S-
  4v   g 7fr   )r   r   r   rC   s    r.   
_iter_prev_GeneralDeltaSearch._iter_prev  s!      )"$$s   !c              #     #    S nU R                  5        H  nUv nUc  M    O   Ub   eU R                  5        S h  vN   S v   g  N	7fr=   )r+  r.  )r)   goodr  s      r.   r    _GeneralDeltaSearch._iter_groups  sS     '')E;D *
 <<(((
 )s   A	A	A
A	)r  r  r  r  r   r   r=   )rK   rL   rM   rN   rO   r   r  r   r  r  r"  r  r+  r.  r   rP   rJ   r1   r.   r   r   &  s8    ;(23,$(L46>&%	r1   r   c                  B    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
rg)_SparseDeltaSearchi  z'Delta search variants for sparse-revlogc                    U R                  U5      (       d  gU R                  U5      (       d  gU R                  U5      (       d  ggr   )r   r   (_is_good_delta_info_snapshot_constraintsr   s     r.   r   %_SparseDeltaSearch.is_good_delta_info  sC     11)<<55i@@<<YGGr1   c                    UR                   c  gU R                  R                  UR                   -	  UR                  :  a  gU R                  R                  UR                  5      UR                  :  a  gg)zReturns True if the chain associated with snapshots

This performs checks for format that use sparse-revlog and intermediate
snapshots.

This is used by is_good_delta_info.
TF)r   r   r   r   r   r?   r   r   s     r.   r6  ;_SparseDeltaSearch._is_good_delta_info_snapshot_constraints  si     ""* LL  I$;$;;  ;;inn-	0B0BBr1   c                    U R                  U5      (       d  gU R                  U5      (       d  gU R                  U5      (       d  ggr%  )r  r"  _pre_filter_rev_sparser4   s     r.   r  "_SparseDeltaSearch._pre_filter_rev,  sA    --c22//44**3//r1   c                   U R                   R                  R                  (       d   eU R                   R                  U5      U R                  [
        -  :  a  gU R                   R                  R                  b  U R                   R                  R                  nU R                  U R                  [        4nX;  a  U R                   R                  U5      (       a  U R                   R                  U5      nU R                   R                  U5      n[        U R                  U-
  S5      nXb-  nU R                  U-	  nX:  a  gU R                   R                  U5      n	X:  a  gg)r  Fr   T)r   r#   r   r   r   LIMIT_BASE2TEXTupper_bound_compr   r   r   rG   r   rZ   r?   )
r)   r5   maxcompbasenotsnapr   revsizerawsizedistancelowestrealisticdeltalensnapshotlimit	revlengths
             r.   r;  )_SparseDeltaSearch._pre_filter_rev_sparse6  s"    {{''5555 ;;s#t||'FG;;##44@kk..??G77DGGW5K%$++*@*@*E*E $ 9 9# > ++--c2"%dllW&<a"@*9*D' !% = : ! !KK..s3	6 !r1   c              #  X  ^ #    T R                   R                  R                  (       d   eT R                  [        :X  d   eT R
                  S-
  nU 4S jnT R                  T R                  4 Vs/ s H  o3[        :w  d  M  UPM     nnU(       d  g [        R                  " [        5      nU Vs/ s H
  o2" U5      PM     nnU HM  n[        U5       H;  u  pT R                   R                  U	5      (       d    M6  XX   R                  U	5        M=     MO     [        US   5      S-   n
T R                   R#                  T R                   U
5        [        5       nU H  nUR#                  U5        M     S nT R                   R%                  X5       H  nX;  d  M
  Un  O   Ubx  ['        UR)                  5       5      nU" U5      n[        U5       HH  u  pX:  a  M  X:  a    O9T R                   R                  U	5      (       d    OX_   R                  U	5        MJ     S n[+        UR-                  5       SS9 H  u  nn[        5       nU H+  n	UR#                  T R                   R.                  U	   5        M-     Ub  U Vs/ s H  nUU:  d  M  UPM     nn[1        [+        U5      5      v   [1        [+        U5      5      v   [        U5      nM     T R                   R.                  [            Vs/ s H  oU::  d  M
  UPM     nn[1        [+        U5      5      v   g s  snf s  snf s  snf s  snf 7f)Nr   c                @   > TR                   R                  U 5      S   $ r9   )r   _deltachain)r5   r)   s    r.   rX   9_SparseDeltaSearch._iter_snapshots_base.<locals>.<lambda>c  s    !8!8!=a!@r1   r   T)reverse)r   r#   r   r   _STAGE_SNAPSHOTr   r   r   r   collectionsdefaultdictr&   rd   rG   r  minr   r   r]   rZ   keyssorteditems	snapshotstuple)r)   r   
deltachainr*  r   parents_snapscandidate_chainschainrm   s	snapfloorall_revsotherrn   	max_depthdepthfloorsnapssiblingsr   s   `                   r.   _iter_snapshots_base'_SparseDeltaSearch._iter_snapshots_base_  s    {{''5555!!_444"@
#ww0A0L10A $//43:;7aJqM7;%E#E*{{--a00"&&q) + &
 a()A-	""4;;	: 5%EOOE" &!!$2A  3  M..01Iu%E%e,=${{--a00$((+ -  !4!4!6EJCuH 3 3 = =a @A   
 (0=x!519Ax=x())u&&JE- F@ **44W=
=!aA= 	 
 F4L!!k B <x >
sQ   A-L*0LL(L*/L CL*C#L*:
L L AL**	L%7L%=-L*c              #    #    U R                   R                  R                  (       d   e[        U l        S nU R                  5       nU H  nUv nUc  M    O   UGb  UR                  b  U R                  [        :X  d   eS nXA:w  a>  UnU R                   R                  UR                  5      nU[        :X  a  OU4v nXA:w  a  M>  U R                  R                  (       d3  U R                  R                  U R                   UR                  S-   5        S nX:w  aI  Un[        [        S U R                  R                  UR                      5       5      5      nUv nX:w  a  MI  S v   g 7f)Nr   c              3  $   #    U  H  ov   M     g 7fr=   rJ   )rt   cs     r.   ru   5_SparseDeltaSearch._iter_snapshots.<locals>.<genexpr>  s     O&N1&Ns   )r   r#   r   rM  r   rc  r   r  r   r   r   rT  r   rU  rR  )r)   r1  groups
candidatespreviousr   childrens          r.   _iter_snapshots"_SparseDeltaSearch._iter_snapshots  sF    {{''5555,**, J##D !
  2 2 >%%888H"{{..tyy97?"W} " &&00##**4;;		AFH" Od&9&9&C&CDII&NOO &~ " 
s   AE(A.E(BE(#E(c              #  ,  #    S nU R                  5        H  nUv nUc  M    Ol   Ub   eU R                  R                  R                  (       d   eU R	                  5       nUR                  S 5      nUb  Uv nUR                  U5      nUb  M  S v   g 7fr=   )r+  r   r#   r   rm  r
  )r)   r1  r  	iter_snaps       r.   r   _SparseDeltaSearch._iter_groups  s     '')E;D *
 <<;;++9999 ,,.INN4(E#"{!t, # 
s   BA,BBr   N)rK   rL   rM   rN   rO   r   r6  r  r;  rc  rm  r   rP   rJ   r1   r.   r4  r4    s,    18'R["z@r1   r4  c                  .    \ rS rSrSrS rSS jrS rSrg)	r   i  )rT  
_start_rev_end_revc                ^    [         R                  " [        5      U l        S U l        S U l        g r=   )rN  rO  r&   rT  rs  rt  rC   s    r.   r/   SnapshotCache.__init__  s"    $005r1   c                   [        U5      nUS-
  nX$:  a  gU R                  c"  U R                  b   eU R                  XU5        O|U R                  U::  a  X@R                  ::  d]  X R                  :  a  U R                  XU R                  S-
  5        U R                  U:  a  U R                  XR                  S-   U5        U R                  c  U R                  b   eX@l        X l        O6[	        U R                  U5      U l        [        U R                  U5      U l        U R                  U R                  ::  d   U R                  U R                  45       eg)z$find snapshots from start_rev to tipr   N)rB   rs  rt  _updaterP  rZ   )r)   r   	start_revnb_revsend_revs        r.   r   SnapshotCache.update  s   f+A+??"==(((LLG4//Y.7mm3K??*V!0CD}}w&V]]Q%6@??"==(((#M'O!$//9=DOw7DM$--/ 	
OOMM2
 	
/r1   c                `   U R                   b<  X R                   :  d-  X R                  :  d   U R                   U R                  X#45       eU R                   b<  X0R                   :  d-  X0R                  :  d   U R                   U R                  X#45       eU R                  n[        UR                  S5      (       a  UR                  R                  XBU5        gUR                  nUR                  nUR                  X#5       H+  nU" U5      (       d  M  XE" U5         R                  U5        M-     g)z/internal method that actually do update contentNfindsnapshots)
rs  rt  rT  hasattrr(   r~  r  rG   r]   r  )r)   r   ry  r{  cacher  rG   r5   s           r.   rx  SnapshotCache._update  s    &'9}}+D	@OOT]]I?	@ 
 &oo%==)@	@OOT]]I?	@ 
 6<<11LL&&uA ,,K**J{{96c??+c*+//4 7r1   )rt  rs  rT  N)r   )	rK   rL   rM   rN   	__slots__r/   r   rx  rP   rJ   r1   r.   r   r     s    7I

85r1   r   c                  l    \ rS rSrSr   SS jr\S 5       rS rS r	 SS jr
S	 rSS
 jrS rS rSrg)deltacomputeri&  zobject capable of computing delta and finding delta for multiple revision

This object is meant to compute and find multiple delta applied to the same
revlog.
Nc                h    Xl         X l        Uc  SU l        OX0l        X@l        [	        5       U l        g NF)r   _write_debug_debug_search_debug_infor   _snapshot_cache)r)   r   write_debugdebug_search
debug_infos        r.   r/   deltacomputer.__init__-  s3     '!&D!-%,r1   c                H    U R                   S L=(       d    U R                  S L$ r=   )r  r  rC   s    r.   _gather_debugdeltacomputer._gather_debug=  s#      ,L0@0@0LLr1   c           	         UR                   nUS   b  US   $ U R                  nUR                  nUS   nUS   n[        UUUUR                  UR
                  UR                  UR                  5      =orS'   U$ )zfBuilds a fulltext version of a revision

revinfo: revisioninfo instance that contains all needed info
r   r   )btextr   r   r   r   r   r   node)r)   r   r  r   r   r   r   r   s           r.   	buildtextdeltacomputer.buildtextA  s    
 88O''
Q-1,JJJJMMLL
 	
8 r1   c                $   U R                   nU R                  U5      nUR                  U5      (       a5  [        R                  " UR                  U5      [        U5      5      nXT-   nU$ UR                  U5      n[        R                  " Xt5      nU$ r=   )	r   r  
iscensoredr   r   r   rB   rawdatatextdiff)r)   r   r   r   theaderr   ptexts           r.   _builddeltadiffdeltacomputer._builddeltadiffZ  s|    NN7#T"" ,,V^^D-A3q6JFJE
  NN4(ENN5,Er1   c           
        U R                   nUR                  U5      nUR                  R                  (       a  UnO+Ub&  X#S-
  :w  a  SnXU4-  n[        R
                  " U5      eUnS n	UR                  R                  (       a  U[        :X  a  Sn	OUR                  R                  (       a  U(       a  UR                  U5      (       d   eUR                  UR                  5      UR                  UR                  5      pXzU4;  a3  UR                  U5      (       a  [        UR                  U5      S   5      n	S nUR                  (       a  UR                  S   nUnU[        :w  ao  X:w  aj  U R                   R                  U5      S:X  aK  U R                   R!                  U5      nU[        :w  a&  X:w  a!  U R                   R                  U5      S:X  a  MK  U R                   R                  R"                  (       a  X:X  a  UR                  S   nUc  U R%                  X!5      nU R&                  (       a!  SnU[        U5      -  nU R)                  U5        UR                  R*                  b  U	(       a  [        U5      UR                  R*                  -  nUR,                  U	-	  nU R&                  (       a  SnX-  nU R)                  U5        UU:  a%  U R&                  (       a  SnU R)                  U5        g UR                  U5      U:  a%  U R&                  (       a  SnU R)                  U5        g UR.                  R1                  U5      u  nn[        U5      [        U5      -   nUR3                  [        U5      S-
  5      nUU-   UR5                  U5      -
  nUR7                  U5      u  nnUS-  nUU-  n[9        UUUU4UUUUU	5      $ )Nr   sE   general delta cannot use delta for something else than `prev`: %d<-%dr   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)
)r   r   r#   r   r   ProgrammingErrorr   r   rG   r5   r   r   rB   rJ  r   r?   r  
lazy_deltar  r  r  r?  r   _innercompressr:   r6   r  r   )r)   r   r   r   as_snapshotr   r   	deltabasemsgr   r   r   r   	cachebasecurrentbaserD  rE  r  r*   r   offsetdistr   r   s                           r.   _builddeltainfodeltacomputer._builddeltainfoh  sc    $$T*	,,I%$q.*@+  j)),,S11!I,,g1EM  ..;$$Y//// ZZ

+VZZ

-CR(V->->y-I-I #F$6$6y$A!$D E**1-I#Kw&'KK&&{3q8"kk55kB	 w&'KK&&{3q8 {{''22{7J**1-=((7EHC3u:Cc"//;E
f11BBB $ $OO}<M!!I.!!#&66%%PC%%c*}}T"%<<%%KC%%c*}}--e4v;T*CK!O,& 6<<	#::'-'8'8'>$$Ah&TN	
 		
r1   c           
         U R                  U5      nU R                  R                  R                  U5      n[	        US   5      [	        US   5      -   =n=pgU=pSn
Sn[        UUUUU	UUU
5      $ )Nr   r   )r  r   r  r  rB   r   )r)   r   currrawtextr*   r   r   r  r  r   r   r   s               r.   _fullsnapshotinfodeltacomputer._fullsnapshotinfo  s    ..){{!!**73/247|c$q'l/JJJX $$		
 		
r1   c                  ^* Uc  [        U R                  5      nU R                  nUR                  nU R                  nS=pxUc
  [	        5       nU(       a  [
        R                  " 5       n	U R                  5       n
X:S'   UR                  UR                  5      nUR                  UR                  5      nU[        :w  a  UR                  U5      S   nOSnU[        :w  a  UR                  U5      S   nOSnXS'   XS'   UR                  (       a  UR                  [        -  (       ap  U R!                  X5      nU(       aV  [
        R                  " 5       nUW	-
  W
S'   UR"                  U
S'   SU
S	'   S
U
S'   SU
S'   SU
S'   SU
S'   U R%                  U
5        U$ SnUR&                  R(                  (       Ga  UR                  Gb  UR                  S   [*        :X  Ga  UR                  S   nU[        :X  a  SnU R!                  X5      nU(       a  SnGOX;  a  UR                  S   nUR-                  U5      u  nn[        U5      [        U5      -   nU(       a  UR/                  [        U5      S-
  5      nUR1                  U5      nUU-   UR3                  U5      -
  nUR                  U5      u  nnUS-  nUU-  nX:X  d  X:X  a  SnSnO:UR5                  U5      (       d  SnO!SnUR7                  U5      S-   nO
SnSnSnSnSn[9        UUUU4UUUUUS9nUbh  U(       a_  [
        R                  " 5       nUW	-
  W
S'   UR"                  U
S'   SU
S	'   SU
S'   SU
S'   SU
S'   Wc  SU
S'   OUU
S'   U R%                  U
5        U$ SnSnSnUc6  UR                  UR                  5      nUR                  UR                  5      nU R:                  (       a  SnUU-  nU R=                  U5        [        U R                  5      (       a  U R                  R>                  (       d  [@        nO^U R                  R&                  RB                  (       a  [D        nO2U R                  R&                  R(                  (       a  [F        nO[H        nU" U R                  UUUUUUU RJ                  S9nURL                  (       Gd  URN                  n U c   eU n!US-  nU R:                  (       a  Sm*Ub  UR"                  m*Ub  [        U!5      S:X  a  US   U!;   a  Sn"OQUU!;   d  UU!;   a  Sn"OBT*b  [Q        U*4S jU! 5       5      (       a  Sn"O"T*b  [Q        U*4S jU! 5       5      (       a  Sn"OSn"S nUU[        U!5      U"4-  nU R=                  U5        / n#UbP  U R:                  (       a.  S!nUUR"                  URR                  4-  nU R=                  U5        U#RU                  U5        U! GHM  n$U R:                  (       a  S"nUU$-  nU R=                  U5        Sn%U$U:X  a  S#n%OIU$U:X  a  S$n%O@U R                  R5                  U$5      (       a   S%n%U%U R                  R7                  U$5      -  n%U%b  S&nUU%-  nU R=                  U5        S'nUU R                  RW                  U$5      -  nU R=                  U5        S(nUU R                  RY                  U$5      -  nU R=                  U5        US-  nU R:                  (       a  [
        R                  " 5       n&U R[                  UU$UUR\                  [^        :H  S)9n'U R:                  (       a0  [
        R                  " 5       n(S*nUU(W&-
  -  nU R=                  U5        U'b  URa                  U'5      (       aG  U R:                  (       a"  S+nUU'RR                  -  nU R=                  U5        U#RU                  U'5        GM  U R:                  (       a%  S,nUU'RR                  -  nU R=                  U5        GM#  GM&  U R:                  (       d  GM:  S-nU R=                  U5        GMP     U#(       a  [c        U#S. S/9nURe                  U5        URL                  (       d  GM  Uc  SnU R!                  X5      nOUR6                  (       a  SnOSnU(       a  [
        R                  " 5       nUS:X  a0  USL=(       a$    US:H  =(       a    US:H  =(       a    US   [        :H  n)O5USL=(       a*    US:H  =(       a    US:H  =(       a    UR"                  US   :H  n)UW	-
  W
S'   UR"                  U
S'   UU
S	'   U)U
S'   UU
S'   UU
S'   UR6                   b  UR6                  U
S'   OSU
S'   U R%                  U
5        U$ )0a  Find an acceptable delta against a candidate revision

revinfo: information about the revision (instance of _revisioninfo)

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   r   rc   p1-chain-lenp2-chain-lenduration
delta-basesearch_round_countFusing-cached-basedelta_try_counts   fulltypesnapshot-depthr   r   s   deltas   snapshot)r   r   r*   r   r   r   r   r   Ts   unknowns!   DBG-DELTAS-SEARCH: SEARCH rev=%d
)r   s   cached-deltas   parentsc              3  ,   >#    U  H	  oT:  v   M     g 7fr=   rJ   rt   rg  r   s     r.   ru   .deltacomputer.finddeltainfo.<locals>.<genexpr>       -N1$h   s   refine-downc              3  ,   >#    U  H	  oT:  v   M     g 7fr=   rJ   r  s     r.   ru   r    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
)r   r  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                    U R                   $ r=   )r   )rU   s    r.   rX   -deltacomputer.finddeltainfo.<locals>.<lambda>  s    qzzr1   )key)3rB   r   r  r   r&   r   timer_one_dbg_datar5   r   r   r   r  r   r   r   r  r   _dbg_process_datar#   r   r   r  r:   r   r6   rG   r   r   r  r  _storedeltachainsr   r   r4  r   r   r  r   r   allr   rz   r?   r  r  r   rM  r   rP  r   )+r)   r   r   r   gather_debugr   r   p1rp2rr6   dbgp1_chain_lenp2_chain_lenr   r:   r   dbg_typer   r   r  r*   r   r  r   r   r   r   dbg_try_countdbg_try_roundsr  
search_clssearchr   candidaterevs
round_typenominateddeltascandidaterevcandidate_typedelta_startcandidatedelta	delta_endused_cachedr   s+                                             @r.   finddeltainfodeltacomputer.finddeltainfo  s	    T[[)J))''
! UNJJLE$$&C(
O**WZZ(C**WZZ(Cg~%005a8!g~%005a8!".". '--2O"O..wCIjjl"%+J NN   -.()+0'()*%&%F()$%&&s+	 ---"".""1%)??%%a(Dw" 227G	$%M+**1-%u5v;T2#ZZFa8F & 0 0 6I'&06<<	3JJH393D3DT3J0H0MH&(2&{dk#+(,#..t44(,#.(.(<(<T(BQ(F#H $I#H)-&$(M&%% $'%'9"/		 $**,C&)EkC
O " $ 12C,-/3C+,-.C)*")CK$,02,-0=,-**3/   ;**WZZ(C**WZZ(C7C:Cc" DKK  T[[%B%B'J[[%%33+J[[%%33,J *JKK//	
 +++"00M !,,,)MaN!!($>>D *M*a/"16!0JM)SM-A!+J%#-N-N*N*N!/J%#-N-N*N*N!-J!/JLM(:JGG!!#& O$%%O  INNI,>,>??C%%c*  &&y1 -%%EC<'C%%c*%)N#s*).%,).//==)7&$++*C*C(+  &1A~-))#.=C4;;--l;;C%%c*=C4;;22<@@C%%c*"%%"&**,K!%!5!5 ) & 4 4 G	 "6 " %% $

IJC9{22C%%c*!-00@@--"UC>#:#::C --c2'..~>++P~666))#. , '''>C%%c*o !.p 5IJ	i(E +++H H..wCI$$"HH**,C7"d* 1&!+1%*1 #10	  d* 8&!+8%*8 "*Q-7	  "EkC
O   )7C$%'2C#$%2C!""CK''
 ++ $ )+$%""3'r1   c                   S S S S S S S S S S S S.nSnU R                   R                  S   nU R                   R                  S   nU[        :X  a  SnO7U[        :X  a  SnU(       a  USU-  -  nOU[        :X  a  SnU(       a  USU-  -  nX!S	'   U$ )
N)r  r   r  r  r  r  r  r  r  r  target-revlogs   UNKNOWNr   r   s
   CHANGELOG:s   MANIFESTLOG:s   %s:s   FILELOG:r  )r   targetr   r   r   )r)   r  target_revlogtarget_type
target_keys        r.   r  deltacomputer._one_dbg_data	  s    "&!%#  "!
 #kk((+[[''*
.()M,,+M*!44L('M*!44,O
r1   c                    U R                   b  U R                   R                  U5        U R                  bE  SnUUS   US   US   US   US   US   US   US	   US
   US   US   4-  nU R                  U5        g g )Ns   DBG-DELTAS: %-12s rev=%d: delta-base=%d is-cached=%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  r  r  r  r  )r  rz   r  )r)   r  r  s      r.   r  deltacomputer._dbg_process_data'  s    '##C((  O$JL!'(()%&F$%N#N#J C c"; )r1   )r  r  r  r  r   )NFNr  )NN)rK   rL   rM   rN   rO   r/   r   r  r  r  r  r  r  r  r  rP   rJ   r1   r.   r  r  &  sZ     /  M M2 ;@S
j
&wr	<!#r1   r  c                    UR                   u  p#[        nU(       d  U(       d	  [        nXA4$ U(       d"  USS nUS:X  a	  [        nXA4$ XP:X  a  [        nXA4$ US:X  a  Sn[        n[	        U5      nXA4$ )zsreturn (COMPRESSION_MODE, deltainfo)

used by revlog v2+ format to dispatch between PLAIN and DEFAULT
compression.
r   r       r   r1   )r*   r	   r
   r   r   )default_compression_headerr   hdcompression_moder  s         r.   delta_compressionr  K  s     >>DA'Q* && aF:. && ,0 && 
d*&y1	&&r1   r=   )rI   r   )9rO   
__future__r   r   rN  r   typingr  r   i18nr   	constantsr   r	   r
   r   r   r   r   r   r   r   
thirdpartyr   TYPE_CHECKINGr   r   r   r   r   r   r   ra   r\   rT   rf   rw   r   rZ  r   r   r>  r   r  r(  rM  r   r   ABCr   r   r   r   r4  r   r  r  rJ   r1   r.   <module>r     sF   ; " 
         
    %% %%PH@VXvzz3!l'<> d4   !*  # `sww `F
% 
"' ""V* Vrm, m`45 45nb# b#J'r1   