
    q&fE                        d dl Z d dlZd dlZddlmZ ddlmZmZmZm	Z	m
Z
mZ ddlmZ  e	j                  d      Z e	j                  d      Zej"                  Zej$                  Zej&                  Zej(                  Zej                  Zej,                  Z G d d	      Z e       Zdd
Zd Zd Zd ZddZddZefdZefdZ d Z!d Z"d Z#d Z$d Z%d Z&y)    N   )_)
diffhelperencodingerrorpolicypycompatutil)dateutilbdiffmpatchc                       e Zd ZdZdZi ddddddddd	dd
dddddddddddddddddddddZd Zd Zd Z e	j                  e      Zy)diffoptsa  context is the number of context lines
    text treats all files as text
    showfunc enables diff -p output
    git enables the git extended patch format
    nodates removes dates from diff headers
    nobinary ignores binary files
    noprefix disables the 'a/' and 'b/' prefixes (ignored in plain mode)
    ignorews ignores all whitespace changes in the diff
    ignorewsamount ignores changes in the amount of whitespace
    ignoreblanklines ignores changes whose lines are all blank
    upgrade generates git diffs to avoid data loss
    Ts   context   s   textFs   showfuncs   gits   nodatess   nobinarys   noprefixs   indexr   s   ignorewss   ignorewsamounts   ignorewseols   ignoreblankliness   upgrades   showsimilaritys   worddiffs   xdiffc                    t        j                  |      }| j                  j                         D ]D  }|j	                  |      }|| j                  |   }t        | t        j                  |      |       F 	 t        | j                        | _        y # t        $ r? t        j                  t        d      t        j                  | j                        z        w xY w)Ns3   diff context lines count must be an integer, not %r)r	   byteskwargsdefaultskeysgetsetattrsysstrintcontext
ValueErrorr   
InputErrorr   bytestr)selfoptskvs       1/usr/lib/python3/dist-packages/mercurial/mdiff.py__init__zdiffopts.__init__G   s    ##D)##% 	1AAyMM!$D(//!,a0		1	t||,DL 	""HI""4<<01 	s   8B ACc           
          | j                   D ci c]"  }|t        | t        j                  |            $ }}t        j                  |      }|j                  |       t        di |S c c}w )N )r   getattrr	   r   	strkwargsupdater   )r   kwargsr   r   s       r!   copyzdiffopts.copyW   s^    >BmmL74!344LL!!$'F$ Ms   'A)c                 L     dj                   fd j                  D              S )Ns   , c           	   3   f   K   | ](  }d |t        t        j                  |            fz   * yw)s   %s: %rN)r%   r	   r   ).0r   r   s     r!   	<genexpr>z%diffopts.__bytes__.<locals>.<genexpr>^   s3      
 GD(//!*<=>>
s   .1)joinr   )r   s   `r!   	__bytes__zdiffopts.__bytes__]   s%    zz 
]]
 
 	
    N)__name__
__module____qualname____doc___HAS_DYNAMIC_ATTRIBUTESr   r"   r)   r/   r   	strmethod__str__r$   r0   r!   r   r   $   s     #A 	U 		
 	E 	U 	U 	! 	U 	5 	 	U 	E 	5 	U  	%!H&  
 !h  +Gr0   r   c                 >   | j                   rt        j                  |d      }n"| j                  rt        j                  |d      }|r2| j                  r&t        j                  dd|      j                  d      }| j                  rt        j                  dd|      }|S )Nr   r   s   
+   
s   [ \t\r\f]+\ns   \n)	ignorewsr   fixwsignorewsamountignoreblanklinesresubstripignorewseol)r   textblanks      r!   wscleanrD   i   s{    }}{{4#			{{4#&&vvfeT*007vv&5Kr0   c              #   j  K   |D cg c]  }t        ||      xr dxs d }}|D cg c]  }t        ||      xr dxs d }}dt        |      }}dt        |      }	}||k  s||	k  r||d}}}
|
|k\  s||
   dk(  s||	k\  s||   dk(  rCd}|
|k  r||
   dk(  r|
dz  }
|
|k  r	||
   dk(  r||	k  rQ||   dk(  rI|dz  }||	k  r?||   dk(  rn5|
|k  r0||
   dk(  r(||   dk(  r |
dz  }
|dz  }|
|k  r||
   dk(  r	||   dk(  r | |z   | |
z   ||z   ||z   g|f |
}|}||k  r||	k  ry y c c}w c c}w w)Nr   r      =   ~)rD   len)base1lines1base2lines2r   ls1e1s2e2i1i2btypes                r!   
splitblockrU   u   s     6<<wtQ%A**<F<5;<wtQ%A**<F<FBFB
r'R"WBB8vbzQ"(fRjAoEr'fRjAoa r'fRjAor'fRjAoa r'fRjAo r'fRjAo&*/aa r'fRjAo&*/ rz52:urz52:>EE! r'R"W	 =<s9   D3D)D3D.A'D3+D35D3D3!D3'D3c                 4    | \  }}|\  }}|||z   k  xr ||k  S )a  Return True if `hunk` defined as (start, length) is in `linerange`
    defined as (lowerbound, upperbound).

    >>> hunkinrange((5, 10), (2, 7))
    True
    >>> hunkinrange((5, 10), (6, 12))
    True
    >>> hunkinrange((5, 10), (13, 17))
    True
    >>> hunkinrange((5, 10), (3, 17))
    True
    >>> hunkinrange((5, 10), (1, 3))
    False
    >>> hunkinrange((5, 10), (18, 20))
    False
    >>> hunkinrange((5, 10), (1, 5))
    False
    >>> hunkinrange((5, 10), (15, 27))
    False
    r$   )hunk	linerangestartlength
lowerbound
upperbounds         r!   hunkinranger]      s0    * ME6&J
&=5:+==r0   c                    |\  }}d\  }}g }| D ]  }|\  \  }}	}
}}||
k\  r||k  r|dk(  r||
z
  |z   }||
z
  |z   }n<|
|cxk  r|k  rn n|dk(  r	|	||z
  z
  }n|}|
|cxk  r|k  rn n|dk(  r	|||
z
  z   }n|	}t        |
||
z
  f|      s{|j                  |        ||||k  rt        j                  t	        d            |||ffS )a  filter `blocks` like (a1, a2, b1, b2) from items outside line range
    `rangeb` from ``(b1, b2)`` point of view.

    Return `filteredblocks, rangea` where:

    * `filteredblocks` is list of ``block = (a1, a2, b1, b2), stype`` items of
      `blocks` that are inside `rangeb` from ``(b1, b2)`` point of view; a
      block ``(b1, b2)`` being inside `rangeb` if
      ``rangeb[0] < b2 and b1 < rangeb[1]``;
    * `rangea` is the line range w.r.t. to ``(a1, a2)`` parts of `blocks`.
    )NNrF   s   line range exceeds file size)r]   appendr   r   r   )blocksrangeblbbubblbaubafilteredblocksblocka1a2b1b2stypes                r!   blocksinrangerm      s    HCHCN )"'RR%"9u} (R-C(R-CS~2~D=S/CCC~2~D=b/CCR"W/!!%(')( {ckS3Yq!@ABBC:%%r0   c                 ~    | | j                   rt        t        d      st        j                  S t        j                  S )Nxdiffblocks)xdiffhasattrr   r`   ro   r   s    r!   chooseblocksfuncrs      s,    |4::WUM-J||   r0   c           
   #   \  K   |t         }|j                  s|j                  s|j                  rt	        || d      } t	        ||d      } t        |      | |      }t        |      D ]  \  }}|dkD  r	||dz
     }ng d}|d   |d   |d   |d   g}|d   |d   k7  s|d   |d   k7  r}d}	|j                  ri|t        |       }|t        |      }t	        |d	j                  ||d   |d                }
t	        |d	j                  ||d   |d                }|
|k(  rd
}	||	f |df  yw)ab  Return (block, type) tuples, where block is an mdiff.blocks
    line entry. type is '=' for blocks matching exactly one another
    (bdiff blocks), '!' for non-matching blocks and '~' for blocks
    matching only after having filtered blank lines.
    line1 and line2 are text1 and text2 split with splitnewlines() if
    they are already available.
    NFr   r   )r   r   r   r   r         !r0   rG   rF   )
defaultoptsr:   r<   rA   rD   rs   	enumerater=   splitnewlinesr.   )text1text2r   rJ   rL   diffirN   stypeoldnews               r!   	allblocksr      sZ     |}}++t/?/?eU+eU+!D!%/D4 2
 q5QUAAqT2a5!A$1& Q41Q4<1Q41Q4<D$$>*51F>*51FdCHHVAaD1Q4-@$ABdCHHVAaD1Q4-@$AB#:DT'M$h3s   D*D,c                    dfd	}g df}	| s|s|	S j                   rdx}
}nd}
d}t        j                  d      }t        j                  |      }t        j                  |      }|r1| r |rt        |       t        |      k(  r| |k(  r|	S g }dd|z  gff}||fS | s|j                  d	       }t        |      }| d
 ||      z  }nd|
| |||      fz  }d||z    |||      fz  }||g}t        |      }ddd|f}d|z  g|D cg c]  }d|z   	 c}z   }|r,|dxx   d	z  cc<   |j                  t        j                         ||ff}||fS |s| j                  d	       }t        |       } d|
| |||      fz  }|d ||      z  }nd|| |||      fz  }||g}t        |       }d|ddf}d|z  g| D cg c]  }d|z   	 c}z   }|r,|dxx   d	z  cc<   |j                  t        j                         ||ff}||fS t        | |      }t        |      s|	S d|
| |||      fz  d|| |||      fz  g}||fS c c}w c c}w )a|  Return a unified diff as a (headers, hunks) tuple.

    If the diff is not null, `headers` is a list with unified diff header
    lines "--- <original>" and "+++ <new>" and `hunks` is a generator yielding
    (hunkrange, hunklines) coming from _unidiff().
    Otherwise, `headers` and `hunks` are empty.

    Set binary=True if either a or b should be taken as a binary file.
    Nc                 N    j                   sj                  sd| z  S |rd|v ryy)Ns   	%s       	r0   )gitnodates)datefnr   s     r!   datetagzunidiff.<locals>.datetag  s)    xxT>!$"*r0   r$   r0   s   a/s   b/)r   r   s   Binary file %s has changed
r9   s   --- /dev/null%ss
   --- %s%s%ss   +++ %s%sr   r   s   @@ -0,0 +1,%d @@
   +s   +++ /dev/null%ss
   +++ %s%s%ss   @@ -1,%d +0,0 @@
   -rr   N)noprefixr   datestrr
   pconvertrH   endswithry   r_   r   MISSING_NEWLINE_MARKER_unidiffnext)aadbbdfn1fn2binaryr   r   sentinelaprefixbprefixepochheaderlineshunkswithout_newlinel1l2size	hunkrangee	hunkliness          `              r!   unidiffr     s    2vHQ}}'V$E
--
C
--
Cs1vQ'AFO83>?@BV U jj//!9#gen4B'3C0@!AABGcM72s+;<<2h1v1dO	*T125J1dQh5JJ	bMU"MZ>>?Y')6 5 jj//!gsGB,<==9#gen4B'3C0@!AAB2h1vaO	*T125J1dQh5JJ	bMU"MZ>>?Y')  AD)E{O Wc72s+;<<Wc72s+;<<

 ? 6K  6Ks   H:5H?c              #      K   t               t              fdfd}ddg fd}d}d}d}t               D ]  \  }}	|\  }
}}}|	dk7  r|	d	k(  r|||z
  ||
z
  z
  z  }'g }|
| }|| }||z  }||z  } ||
      } ||      }d}|r>||d
   j                  z   d
z   k  r|}|d
   }|d   }n|sd}d  ||      D ]  }|  |r||d
<   ||d<   |d   }n|||||g}||
 D cg c]  }d|z   	 c}|t        |      d |D cg c]  }d|z   	 c}|t        |      d |D cg c]  }d|z   	 c}|t        |      d 
 |r|sd}d  ||      D ]  }|  y|sd yyc c}w c c}w c c}w w)a  Yield hunks of a headerless unified diff from t1 and t2 texts.

    Each hunk consists of a (hunkrange, hunklines) tuple where `hunkrange` is a
    tuple (s1, l1, s2, l2) representing the range information of the hunk to
    form the '@@ -s1,l1 +s2,l2 @@' header and `hunklines` is a list of lines
    of the hunk combining said header followed by line additions and
    deletions.

    The hunks are prefixed with a bool.
    c                 4    | j                   z   }||kD  r|}|S r   r   )rM   rH   retr   s      r!   
contextendz_unidiff.<locals>.contextendc  s"    $,,9C
r0   c                 2    | j                   z
  }|dk  ry|S Nr   r   )rM   r   r   s     r!   contextstartz_unidiff.<locals>.contextstarti  s     $,,7
r0   r   r0   c              3   N  K   | \  }}}}} |t                    }||z
  }||z
  |z   |z
  }d}	j                  ro\  }
}	t        |dz
  |
dz
  d      D ]O  }|   dd j                         sd|   j	                         z   }	t        j                  |	      r|	d d }	|	d<    n |d<   |r|dz  }|r|dz  }||||f}d||	fz   z  g|z   t        ||      D cg c]
  }d|   z    c}z   }d}j                  d	      s||z   t              dz   k(  rzt        t        |      dz
  dd      D ]^  }||   j                  d
      s||   j                  d      rd}||xx   d	z  cc<   |j                  |dz   t        j                          n |sj                  d	      sx||z   t              dz   k(  rdt        t        |      dz
  dd      D ]H  }||   j                  d      s||xx   d	z  cc<   |j                  |dz   t        j                          n ||f y c c}w w)Nr0   r   r   r   r   )   s   @@ -%d,%d +%d,%d @@%s
Fr9   )r   r   Tr   )rH   showfuncrangeisalnumrstripr   
isasciistrr   
startswithinsertr   r   )rW   astartri   bstartrk   deltaaendalenblenfunclastposr}   r   xr   skipr   r   r   lastfuncr   t1t2s                   r!   	yieldhunkz_unidiff.<locals>.yieldhunkq  sl    *.'VR"c"g&f}F{T!B&==$MGT 6A:w{B7 a51:%%'"Q%,,.0D  **40#CRy"&HQK !HQK aKFaKFD&$.	'9w+>?@%*2t_5tbe|56 	 {{5!ftms2w{&B3y>A-r26 Q<**<8 |..t4#aLE)L$$QUJ,M,MN BKK.6D=CGaK3O3y>A-r26 Q<**40aLE)L$$QUJ,M,MN	
 ""- 6s'   A*H%.A+H%H (AH%B H%&?H%NFrv   rG   r   r   T   r   r   r   )ry   r   r   rH   )r   r   r   r   r   rW   ignoredlines	has_hunksr~   rl   rh   ri   rj   rk   r   r   r   r   r   prevr   r   r   r   r   s   ```                  @@@@r!   r   r   U  s     
r	B	r	B 3xH:# :#@ DLIb"dB3 *65BBD=}
 bR"W 55BiBi
l
lb!b!Q$,,.22aa  $IJ"4 AGDGDGGE BE2D13F2?Atax?c%jl145Atax5c%jl145Atax5c%jlU*6X IJ4 	AG	  @55s+   C4F=E=	FF(F;FAFc                 >   d }dd}| d} |d}| |k(  ryg }|j                  d       |j                  dt        |      z          |t        j                  |            D ]  }|j                   ||              |j                  d       dj	                  |      S )z print base85-encoded binary diffc                     t        |       }|dk  r%t        j                  t        d      |z   dz
        }n't        j                  |dz
  t        d      z   dz
        }d|t	        j
                  | d      fz  S )N      Ar      as   %c%s
T)rH   r	   bytechrordr
   	b85encode)linerM   s     r!   fmtlinezb85diff.<locals>.fmtline  sl    I7  TQ!23A  R#d)!3a!78AAt~~dD9:::r0   c              3   \   K   t        |       }d}||k  r| |||z     ||z  }||k  ry y wr   )rH   )rB   csizerM   r}   s       r!   chunkzb85diff.<locals>.chunk  s>     I!eq1u9%%JA !es   ',,r0   s   GIT binary patch
s   literal %d
r9   )4   )r_   rH   zlibcompressr.   )totnr   r   r   rM   s         r!   b85diffr     s    ; 
z	z	Rx CJJ$%JJR()4==$% 

71:JJu88C=r0   c                     d}g }|t        |       k  rPt        j                  d| ||dz          \  }}}|dz  }|j                  | |||z           ||z  }|t        |       k  rPdj	                  |      S )Nr      >lll   r0   )rH   structunpackr_   r.   )binpostp1p2rM   s         r!   	patchtextr     s~    
C
A
C.MM'3sS2X+>?	Br		S37#$q	 C.
 88A;r0   c                 x    t        |       dk(  rt        j                  |d      S t        j	                  | |g      S )Nr   r   )rH   r
   bufferr   patches)r   r   s     r!   patchr     s1    
1v{{{3##>>!cU##r0   c                 x    t         j                  | |      D cg c]  }|d   |d   |d   |d   z
  f c}S c c}w )Nr   ru   r   )r   r`   )r   r   ds      r!   get_matching_blocksr   "  s<    /4||Aq/AB!QqT1Q41!%BBBs   7c                 :    | rt        j                  ddd|       S dS )Nr   r   r0   r   pack)rZ   s    r!   trivialdiffheaderr   &  s    176;;w1f-@S@r0   c                 2    t        j                  dd| |      S )Nr   r   r   )oldlennewlens     r!   replacediffheaderr   *  s    ;;w6622r0   )Tr   )NNN)'r>   r   r   i18nr    r   r   r   r   r	   r
   utilsr   	importmodr   r   r`   r;   r   patchedsizetextdiffry   r   rw   rD   rU   r]   rm   rs   r   r   r   r   r   r   r   r   r   r$   r0   r!   <module>r     s    
     !			(	#	
..  ;;##?, ?,D j	4>4%&P!'T 2= Pf & Rj"J$CA3r0   