B
    `                 @   s   d Z ddlmZmZmZ eZddlZddlZddl	Z	ddl
mZ ddlmZ dd ZG d	d
 d
ZG dd dZG dd dZdS )z#Diff parsing functions and classes.    )absolute_importdivisionprint_functionN   )types)ApplicationErrorc             C   s
   t | jS )z;
    :type lines: list[str]
    :rtype: list[FileDiff]
    )
DiffParserfiles)lines r   J/home/dcms/DCMS/lib/python3.7/site-packages/ansible_test/_internal/diff.py
parse_diff   s    r   c               @   s,   e Zd ZdZdd Zdd Zedd ZdS )	FileDiffzParsed diff for a single file.c             C   s,   t |dd| _t |dd| _g | _d| _dS )zA
        :type old_path: str
        :type new_path: str
        F)newTN)DiffSideoldr   headersbinary)selfold_pathnew_pathr   r   r   __init__   s    zFileDiff.__init__c             C   s   | j | dS )z!
        :type line: str
        N)r   append)r   liner   r   r   append_header$   s    zFileDiff.append_headerc             C   s   | j jo| jjS )z
        :rtype: bool
        )r   is_completer   )r   r   r   r   r   *   s    zFileDiff.is_completeN)__name__
__module____qualname____doc__r   r   propertyr   r   r   r   r   r      s   
r   c               @   s>   e Zd ZdZdd Zdd Zdd Zedd	 ZdddZ	dS )r   z1Parsed diff for a single 'side' of a single file.c             C   sP   || _ || _| jrdnd| _d| _d| _g | _g | _g | _d| _d| _	d| _
dS )z9
        :type path: str
        :type new: bool
        +-Tr   N)pathr   prefixeof_newlineexistsr
   lines_and_contextranges_next_line_number_lines_remaining_range_start)r   r#   r   r   r   r   r   4   s    zDiffSide.__init__c             C   s   || _ || _d| _dS )zE
        :type line_start: int
        :type line_count: int
        r   N)r)   r*   r+   )r   Z
line_start
line_countr   r   r   	set_startG   s    zDiffSide.set_startc             C   s   | j dkrtd| j|f}|dr(n0|| jrP| j| | jsX| j| _ntd| j| |  j d8  _ | jr| j	r| j}n|dr| jd }nd}|r| j
| j|f d| _|  jd7  _dS )z!
        :type line: str
        r   zDiff range overflow. zUnexpected diff content prefix.r   N)r*   	Exceptionr)   
startswithr$   r
   r   r+   r'   r   r(   )r   r   entryZ	range_endr   r   r   r   P   s,    




zDiffSide.appendc             C   s
   | j dkS )z
        :rtype: bool
        r   )r*   )r   r   r   r   r   u   s    zDiffSide.is_completeTc                s$   |r j }n j} fdd|D S )z?
        :type context: bool
        :rtype: list[str]
        c                s$   g | ]}d  j |d |d f qS )z	%s:%4d %sr   r   )r#   ).0r   )r   r   r   
<listcomp>   s    z)DiffSide.format_lines.<locals>.<listcomp>)r'   r
   )r   contextr
   r   )r   r   format_lines|   s    zDiffSide.format_linesN)T)
r   r   r   r   r   r-   r   r    r   r5   r   r   r   r   r   2   s   	%r   c               @   sH   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dS )r   zParse diff lines.c             C   s   || _ g | _| j| _d| _d| _d| _d| _x| j D ]| _|  jd7  _y|   W n\ tk
r } z>t	
d || j| jpd| jpdt f }t| W dd}~X Y nX | j| _q4W |   dS )z(
        :type lines: list[str]
        r   Nr   z
                %s

                     Line: %d
                 Previous: %s
                  Current: %s
                %s
                 )r
   r	   process_startactionline_numberprevious_liner   filer/   textwrapdedentstrip	traceback
format_excr   complete_file)r   r
   exmessager   r   r   r      s,    zDiffParser.__init__c             C   sF   |    td| j}|s"tdt|d|d| _| j| _	dS )zProcess a diff start line.z:^diff --git "?a/(?P<old_path>.*)"? "?b/(?P<new_path>.*)"?$zUnexpected diff start line.r   r   N)
rA   researchr   r/   r   groupr;   process_continuer8   )r   matchr   r   r   r7      s    zDiffParser.process_startc             C   sv   t d| j}|std| jjt|dp0dt|d | jj	t|dpXdt|d | j
| _dS )	zProcess a diff range line.zg^@@ -((?P<old_start>[0-9]+),)?(?P<old_count>[0-9]+) \+((?P<new_start>[0-9]+),)?(?P<new_count>[0-9]+) @@zUnexpected diff range line.Z	old_startr   Z	old_countZ	new_startZ	new_countN)rD   rE   r   r/   r;   r   r-   intrF   r   process_contentr8   )r   rH   r   r   r   process_range   s    ((zDiffParser.process_rangec             C   s8   | j dr|   n| j dr,|   n|   dS )z+Process a diff start, range or header line.zdiff z@@ N)r   r0   r7   rK   process_header)r   r   r   r   rG      s
    

zDiffParser.process_continuec             C   sT   | j drd| j_n:| j dkr,d| jj_n$| j dkrBd| jj_n| j| j  dS )zProcess a diff header line.zBinary files Tz--- /dev/nullFz+++ /dev/nullN)r   r0   r;   r   r   r&   r   r   )r   r   r   r   rL      s    


zDiffParser.process_headerc             C   s   | j dkrh| jdr,d| jj_d| jj_n8| jdrDd| jj_n | jdr\d| jj_ntddS | jjr|| 	  dS | j dr| jj
| j  | jj
| j  nD| j dr| jj
| j  n&| j dr| jj
| j  ntddS )	zProcess a diff content line.z\ No newline at end of filer.   Fr"   r!   z&Unexpected previous diff content line.NzUnexpected diff content line.)r   r:   r0   r;   r   r%   r   r/   r   rG   r   )r   r   r   r   rJ      s*    

zDiffParser.process_contentc             C   s   | j s
dS | j| j  dS )z0Complete processing of the current file, if any.N)r;   r	   r   )r   r   r   r   rA      s    zDiffParser.complete_fileN)r   r   r   r   r   r7   rK   rG   rL   rJ   rA   r   r   r   r   r      s   (	r   )r   
__future__r   r   r   type__metaclass__rD   r<   r?   r6   r   tutilr   r   r   r   r   r   r   r   r   <module>   s   W