
    	^c(E                        d dl Z d dlZd dlZddlmZ ddlmZ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(dS )    N   )_)getattrsetattr)
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S )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                                        D ]7}|                    |          }|| j        |         }t          | ||           8	 t          | j                  | _        d S # 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getr   intcontext
ValueErrorr	   
InputErrorr   bytestr)selfoptskvs       1/usr/lib/python3/dist-packages/mercurial/mdiff.py__init__zdiffopts.__init__K   s    #D))##%% 	  	 AAyM!$D!Q	t|,,DLLL 	 	 	"HII"4<001  	s   'B ACc                       fd j         D             }t          j        |          }|                    |           t	          di |S )Nc                 2    i | ]}|t          |          S  )r   ).0r   r   s     r!   
<dictcomp>z!diffopts.copy.<locals>.<dictcomp>\   s%    ;;;74##;;;    r%   )r   r   	strkwargsupdater   )r   kwargsr   s   `  r!   copyzdiffopts.copy[   sT    ;;;;T];;;!$''F$r(   N)__name__
__module____qualname____doc___HAS_DYNAMIC_ATTRIBUTESr   r"   r,   r%   r(   r!   r   r   (   s         #A 	U 		
 	E 	U 	U 	! 	U 	5 	 	U 	E 	5 	U  	%!H&            r(   r   Tc                 .   | j         rt                              |d          }n"| j        rt                              |d          }|r0| j        r)t          j        dd|                              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!   wscleanr>   e   s    } ${{4##		 ${{4## 8& 8vfeT**0077 6v&55Kr(   c              #   z  K   fd|D             }fd|D             }dt          |          }}dt          |          }}||k     s||k     r||d}}
}	|	|k    s||	         dk    s|
|k    s||
         dk    rUd}|	|k     r#||	         dk    r|	dz  }	|	|k     r||	         dk    |
|k     r#||
         dk    r|
dz  }
|
|k     r||
         dk    nF|	|k     r@||	         dk    r4||
         dk    r(|	dz  }	|
dz  }
|	|k     r||	         dk    r||
         dk    (| |z   | |	z   ||z   ||
z   g|fV  |	}|
}||k     ||k     d S d S )Nc                 8    g | ]}t          |          rd pdS r   r   r>   r&   lr   s     r!   
<listcomp>zsplitblock.<locals>.<listcomp>t   -    <<<wtQ%A*<<<r(   c                 8    g | ]}t          |          rd pdS rA   rB   rC   s     r!   rE   zsplitblock.<locals>.<listcomp>u   rF   r(   r      =   ~r   len)base1lines1base2lines2r   s1e1s2e2i1i2btypes       `       r!   
splitblockrW   q   s      =<<<V<<<F<<<<V<<<FFBFB
r''R"WWBB88vbzQ"((fRjAooEr''fRjAooa r''fRjAoor''fRjAooa r''fRjAoo r''fRjAoo&*//aa r''fRjAoo&*// rz52:urz52:>EEEE! r''R"WWWWWWr(   c                 4    | \  }}|\  }}|||z   k     o||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:+==r(   c                    |\  }}d\  }}g }| D ]}|\  \  }}	}
}}||
k    r||k    r|dk    r||
z
  |z   }||
z
  |z   }nB|
|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|          r|                    |           ||||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`.
    )NNrH   Ns   line range exceeds file size)r_   appendr	   r   r   )blocksrangeblbbubblbaubafilteredblocksblocka1a2b1b2stypes                r!   blocksinrangero      sI    HCHCN ) )"'RR%"99u}} (R-C(R-CCS~~~~2~~~~~D==S/CCCC~~~~2~~~~~D==b/CCCR"W// 	)!!%(((
{ckS3YYq!@AABBBC:%%r(   c                 x    | !| j         rt          j        t          d          st          j        S t          j        S )Ns   xdiffblocks)xdiffr   safehasattrr   rb   xdiffblocksr   s    r!   chooseblocksfuncru      s9    z 	~66 	 |  r(   c           
   #     K   |t           }|j        s|j        s|j        r"t	          || d          } t	          ||d          } t          |          | |          }t          |          D ]\  }}|dk    r||dz
           }ng d}|d         |d         |d         |d         g}|d         |d         k    s|d         |d         k    rd}	|j        r|t          |           }|t          |          }t	          |d		                    ||d         |d                                      }
t	          |d		                    ||d         |d                                      }|
|k    rd
}	||	fV  |dfV  dS )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         !r(   rI   rH   )
defaultoptsr4   r6   r;   r>   ru   	enumerater7   splitnewlinesjoin)text1text2r   rM   rO   diffirP   stypeoldnews               r!   	allblocksr      s      |} ,+ ,t/? ,eU++eU++!D!!%//D4  2
 q55QUAAAqT2a5!A$1& Q41Q4<<1Q41Q4<<D$  >*511F>*511FdCHHVAaD1Q4K-@$A$ABBdCHHVAaD1Q4K-@$A$ABB#::DT'MMM$h3 r(   c                    dfd	}g df}	| s|s|	S j         rdx}
}nd}
d}t          j        d          }t          j        |          }t          j        |          }|r9| r*|r(t          |           t          |          k    r| |k    r|	S g }dd|z  gff}n| s|                    d	           }t          |          }| d
 ||          z  }nd|
| |||          fz  }d||z    |||          fz  }||g}t          |          }ddd|f}d|z  gd |D             z   }|r/|dxx         d	z  cc<   |                    t          j
                   ||ff}n|s|                     d	           }t          |           } d|
| |||          fz  }|d ||          z  }nd|| |||          fz  }||g}t          |           }d|ddf}d|z  gd | D             z   }|r/|dxx         d	z  cc<   |                    t          j
                   ||ff}nGt          | |          }t          |          s|	S d|
| |||          fz  d|| |||          fz  g}||fS )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                 >    j         sj        sd| z  S |rd|v rdS dS )Ns   	%s       	r(   )gitnodates)datefnr   s     r!   datetagzunidiff.<locals>.datetag  s:    x 	" 	"T>! 	$"**5sr(   r%   r(   s   a/s   b/)r   r   s   Binary file %s has changed
r3   s   --- /dev/null%ss
   --- %s%s%ss   +++ %s%sr   r   s   @@ -0,0 +1,%d @@
c                     g | ]}d |z   S    +r%   r&   es     r!   rE   zunidiff.<locals>.<listcomp>3      5J5J5J1dQh5J5J5Jr(   s   +++ /dev/null%ss
   +++ %s%s%ss   @@ -1,%d +0,0 @@
c                     g | ]}d |z   S    -r%   r   s     r!   rE   zunidiff.<locals>.<listcomp>C  r   r(   rt   N)noprefixr   datestrr   pconvertrK   endswithr{   ra   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	hunkliness          `             r!   unidiffr     s`         2vH Q } ''V$$E
-

C
-

C -
 	 	s1vvQ''AFFO83>?@B (
jj///!9#ggenn4BB'3C0@0@!AABGcM772s+;+;<<2h1vv1dO	*T125J5J5J5J5JJ	 	@bMMMU"MMMZ>???Y') 
jj///!gsGGB,<,<==9#ggenn4BB'3C0@0@!AAB2h1vvaO	*T125J5J5J5J5JJ	 	@bMMMU"MMMZ>???Y')AD)))E{{ 	O Wc772s+;+;<<Wc772s+;+;<<

 r(   c              #   P   K   t                     t                    fdfd}ddg fd}d}d}d}t                     D ]$\  }}	|\  }
}}}|	dk    r|	d	k    r|||z
  ||
z
  z
  z  }(g }|
|         }||         }||z  }||z  } ||
          } ||          }d}|rD||d
         j        z   d
z   k     r|}|d
         }|d         }n|sd}dV   ||          D ]}|V  |r||d
<   ||d<   |d         }n|||||g}d ||
         D             |t          |          d<   d |D             |t          |          d<   d |D             |t          |          d<   &|r|sd}dV   ||          D ]}|V  dS |sdV  dS dS )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                 ,    | j         z   }||k    r|}|S r   r   )rD   rK   retr   s      r!   
contextendz_unidiff.<locals>.contextendc  s"    $,99C
r(   c                 ,    | j         z
  }|dk     rdS |S Nr   r   )rD   r   r   s     r!   contextstartz_unidiff.<locals>.contextstarti  s"    $,771
r(   r   r(   c              3     K   | \  }}}}} |t                              }||z
  }||z
  |z   |z
  }d}	j        r\  }
}	t          |dz
  |
dz
  d          D ]f}|         dd                                         rBd|                                         z   }	t          j        |	          r
|	d d         }	|	d<    ng|d<   |r|dz  }|r|dz  }||||f}d||	fz   z  g|z   fdt          ||          D             z   }d	}                    d
          s||z   t                    dz   k    rt          t          |          dz
  dd          D ]o}||                             d          rR||                             d          rd}||xx         d
z  cc<   |	                    |dz   t          j                    np|s                    d
          s||z   t                    dz   k    rtt          t          |          dz
  dd          D ]R}||                             d          r5||xx         d
z  cc<   |	                    |dz   t          j                    nS||fV  d S )Nr(   r   r   r   r   )   s   @@ -%d,%d +%d,%d @@%s
c                 &    g | ]}d |         z   S r   r%   )r&   xr   s     r!   rE   z/_unidiff.<locals>.yieldhunk.<locals>.<listcomp>  s!    555tbe|555r(   Fr3   )r   r   Tr   )rK   showfuncrangeisalnumrstripr   
isasciistrr   
startswithinsertr   r   )rY   astartrk   bstartrm   deltaaendalenblenfunclastposr   r   r   skipr   r   r   lastfuncr   t1t2s                  r!   	yieldhunkz_unidiff.<locals>.yieldhunkq  s     *.'VRz"c"gg&&f}F{T!B&= 	!$MGT 6A:w{B77  a51:%%'' "Q%,,..0D  *400 )#CRCy"&HQKE !HQK  	aKF 	aKFD&$.	'9w+>?@5555U2t__5556 	 {{5!! 	ftms2ww{&B&B3y>>A-r266  Q<**<88  |..t44 $#aLLLE)LLL$$QUJ,MNNNE  	BKK.. 	6D=CGGaK3O3O3y>>A-r266  Q<**400 aLLLE)LLL$$QUJ,MNNNE """"""r(   NFrx   rI   r   r   T   c                     g | ]}d |z   S r   r%   r&   r   s     r!   rE   z_unidiff.<locals>.<listcomp>  s    ???Atax???r(   c                     g | ]}d |z   S r   r%   r   s     r!   rE   z_unidiff.<locals>.<listcomp>      555Atax555r(   c                     g | ]}d |z   S r   r%   r   s     r!   rE   z_unidiff.<locals>.<listcomp>  r   r(   )r{   r   r   rK   )r   r   r   r   r   rY   ignoredlines	has_hunksr   rn   rj   rk   rl   rm   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3 *6 *65BBD==}}
 bR"W 55BiBi
l
lb!!b!! 	Q$,.222aa   $IJJJ"4  AGGGG 	3DGDGGEE BE2D??F2I???c%jjll55555c%jjll55555c%jjll  	IJJJ4 	 	AGGGG	 	  r(   c                 x   d }d	d}| d} |d}| |k    rdS g }|                     d           |                     dt          |          z              |t          j        |                    D ] }|                      ||                     !|                     d           d                    |          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)rK   r   bytechrordr   	b85encode)linerD   s     r!   fmtlinezb85diff.<locals>.fmtline  sw    II77 TQ!233AA R#d))!3a!788AAt~dD99:::r(   4   c              3   p   K   t          |           }d}||k     r| |||z            V  ||z  }||k     d S d S r   rJ   )r<   csizerD   r   s       r!   chunkzb85diff.<locals>.chunk  sT      II!eeq1u9}%%%%JA !eeeeeer(   Nr(   s   GIT binary patch
s   literal %d
r3   )r   )ra   rK   zlibcompressr|   )totnr   r   r   rD   s         r!   b85diffr     s    ; ; ;    
z	z	Rxxs CJJ$%%%JJR()))U4=$$%%  

771::JJu88C==r(   c                    d}g }|t          |           k     rat          j        d| ||dz                      \  }}}|dz  }|                    | |||z                       ||z  }|t          |           k     ad                    |          S )Nr      >lll   r(   )rK   structunpackra   r|   )binpostp1p2rD   s         r!   	patchtextr     s    
C
A
C..M'3sS2X~+>??	Br		S37]#$$$q	 C..
 88A;;r(   c                     t          |           dk    rt          j        |d          S t                              | |g          S )Nr   r   )rK   r   bufferr   patches)r   r   s     r!   patchr     s9    
1vv{{{3###>>!cU###r(   c                 L    d t                               | |          D             S )Nc                 N    g | ]"}|d          |d         |d         |d          z
  f#S )r   rw   r   r%   )r&   ds     r!   rE   z'get_matching_blocks.<locals>.<listcomp>#  s3    BBB!QqT1Q41!%BBBr(   )r   rb   )r   r   s     r!   get_matching_blocksr  "  s$    BBu||Aq/A/ABBBBr(   c                 8    | rt          j        ddd|           ndS )Nr   r   r(   r   pack)r\   s    r!   trivialdiffheaderr  &  s"    17@6;w1f---S@r(   c                 0    t          j        dd| |          S )Nr   r   r  )oldlennewlens     r!   replacediffheaderr  *  s    ;w66222r(   )Tr   )NNN))r8   r   r   i18nr   r   r   r    r   r   r	   r
   r   utilsr   	importmodr   r   rb   r5   r   patchedsizetextdiffr{   r   ry   r>   rW   r_   ro   ru   r   r   r   r   r   r   r  r  r  r%   r(   r!   <module>r     sX   
			                                    !!		(	#	#	
. ;#7  7  7  7  7  7  7  7 t hjj	 	 	 	  4> > >4%& %& %&P! ! ! !' ' ' 'T 2= P P P Pf & R R R Rj" " "J  $ $ $C C CA A A3 3 3 3 3r(   