B
    <™cf&  ã               @   s´   d Z ddlZddlZddlmZ dddddgZi Zd	Zd
dddddddgZdd„ Z	d"dd„Z
dd„ Zdd„ ZG dd„ dƒZd#dd„Zee
fdd„Zdd„ Zdd „ Zed!kr°eƒ  dS )$z³Utilities for comparing files and directories.

Classes:
    dircmp

Functions:
    cmp(f1, f2, shallow=True) -> int
    cmpfiles(a, b, common) -> ([], [], [])
    clear_cache()

é    N)ÚfilterfalseÚclear_cacheÚcmpÚdircmpÚcmpfilesÚDEFAULT_IGNORESi    ZRCSZCVSZtagsz.gitz.hgz.bzrZ_darcsÚ__pycache__c               C   s   t  ¡  dS )zClear the filecmp cache.N)Ú_cacheÚclear© r   r   úlib/python3.7/filecmp.pyr      s    Tc             C   sª   t t | ¡ƒ}t t |¡ƒ}|d tjks8|d tjkr<dS |rL||krLdS |d |d kr`dS t | |||f¡}|dkr¦t| |ƒ}ttƒdkr–tƒ  |t| |||f< |S )aÐ  Compare two files.

    Arguments:

    f1 -- First file name

    f2 -- Second file name

    shallow -- Just check stat signature (do not read the files).
               defaults to True.

    Return value:

    True if the files are the same, False otherwise.

    This function uses a cache for past comparisons and the results,
    with cache entries invalidated if their stat information
    changes.  The cache may be cleared by calling clear_cache().

    r   FTé   Néd   )	Ú_sigÚosÚstatÚS_IFREGr	   ÚgetÚ_do_cmpÚlenr   )Úf1Úf2ÚshallowÚs1Ús2Zoutcomer   r   r   r      s    
c             C   s   t  | j¡| j| jfS )N)r   ÚS_IFMTÚst_modeÚst_sizeÚst_mtime)Ústr   r   r   r   D   s    
r   c          
   C   sb   t }t| dƒJ}t|dƒ4}x,| |¡}| |¡}||kr>dS |sdS qW W d Q R X W d Q R X d S )NÚrbFT)ÚBUFSIZEÚopenÚread)r   r   ÚbufsizeÚfp1Úfp2Zb1Zb2r   r   r   r   I   s    

r   c               @   sŠ   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zee	eeeeeeeeeeedZdd„ ZdS )r   aM  A class that manages the comparison of 2 directories.

    dircmp(a, b, ignore=None, hide=None)
      A and B are directories.
      IGNORE is a list of names to ignore,
        defaults to DEFAULT_IGNORES.
      HIDE is a list of names to hide,
        defaults to [os.curdir, os.pardir].

    High level usage:
      x = dircmp(dir1, dir2)
      x.report() -> prints a report on the differences between dir1 and dir2
       or
      x.report_partial_closure() -> prints report on differences between dir1
            and dir2, and reports on common immediate subdirectories.
      x.report_full_closure() -> like report_partial_closure,
            but fully recursive.

    Attributes:
     left_list, right_list: The files in dir1 and dir2,
        filtered by hide and ignore.
     common: a list of names in both dir1 and dir2.
     left_only, right_only: names only in dir1, dir2.
     common_dirs: subdirectories in both dir1 and dir2.
     common_files: files in both dir1 and dir2.
     common_funny: names in both dir1 and dir2 where the type differs between
        dir1 and dir2, or the name is not stat-able.
     same_files: list of identical files.
     diff_files: list of filenames which differ.
     funny_files: list of files which could not be compared.
     subdirs: a dictionary of dircmp objects, keyed by names in common_dirs.
     Nc             C   sD   || _ || _|d kr$tjtjg| _n|| _|d kr:t| _n|| _d S )N)ÚleftÚrightr   ÚcurdirÚpardirÚhider   Úignore)ÚselfÚaÚbr,   r+   r   r   r   Ú__init__x   s    zdircmp.__init__c             C   sP   t t | j¡| j| j ƒ| _t t | j¡| j| j ƒ| _| j 	¡  | j 	¡  d S )N)
Ú_filterr   Úlistdirr'   r+   r,   Ú	left_listr(   Ú
right_listÚsort)r-   r   r   r   Úphase0„   s    
zdircmp.phase0c             C   sŠ   t tttjj| jƒ| jƒƒ}t tttjj| jƒ| jƒƒ}tt|j	t
|j|ƒƒƒ| _tt|j	t|j|ƒƒƒ| _tt|j	t|j|ƒƒƒ| _d S )N)ÚdictÚzipÚmapr   ÚpathÚnormcaser3   r4   ÚlistÚ__getitem__ÚfilterÚ__contains__Úcommonr   Ú	left_onlyÚ
right_only)r-   r.   r/   r   r   r   Úphase1Œ   s
    zdircmp.phase1c       
      C   s:  g | _ g | _g | _x | jD ]}tj | j|¡}tj | j|¡}d}yt 	|¡}W n& t
k
rz } zd}W d d }~X Y nX yt 	|¡}W n& t
k
r° } zd}W d d }~X Y nX |r&t	 |j¡}t	 |j¡}	||	kræ| j |¡ n>t	 |¡rþ| j  |¡ n&t	 |¡r| j |¡ n| j |¡ q| j |¡ qW d S )Nr   r   )Úcommon_dirsÚcommon_filesÚcommon_funnyr@   r   r:   Újoinr'   r(   r   ÚOSErrorr   r   ÚappendÚS_ISDIRÚS_ISREG)
r-   ÚxZa_pathZb_pathÚokZa_statZwhyZb_statZa_typeZb_typer   r   r   Úphase2“   s4    
zdircmp.phase2c             C   s&   t | j| j| jƒ}|\| _| _| _d S )N)r   r'   r(   rE   Ú
same_filesÚ
diff_filesÚfunny_files)r-   Zxxr   r   r   Úphase3¶   s    zdircmp.phase3c             C   sR   i | _ xF| jD ]<}tj | j|¡}tj | j|¡}t||| j| j	ƒ| j |< qW d S )N)
ÚsubdirsrD   r   r:   rG   r'   r(   r   r,   r+   )r-   rL   Za_xZb_xr   r   r   Úphase4º   s
    zdircmp.phase4c             C   s(   |   ¡  x| j ¡ D ]}| ¡  qW d S )N)rT   rS   ÚvaluesÚphase4_closure)r-   Úsdr   r   r   rV   Ä   s    zdircmp.phase4_closurec             C   sä   t d| j| jƒ | jr2| j ¡  t d| jd| jƒ | jrT| j ¡  t d| jd| jƒ | jrp| j ¡  t d| jƒ | jrŒ| j ¡  t d| jƒ | jr¨| j ¡  t d| jƒ | j	rÄ| j	 ¡  t d| j	ƒ | j
rà| j
 ¡  t d| j
ƒ d S )	NZdiffzOnly inú:zIdentical files :zDiffering files :zTrouble with common files :zCommon subdirectories :zCommon funny cases :)Úprintr'   r(   rA   r5   rB   rO   rP   rQ   rD   rF   )r-   r   r   r   ÚreportÉ   s,    






zdircmp.reportc             C   s.   |   ¡  x | j ¡ D ]}tƒ  |  ¡  qW d S )N)rZ   rS   rU   rY   )r-   rW   r   r   r   Úreport_partial_closureâ   s    zdircmp.report_partial_closurec             C   s.   |   ¡  x | j ¡ D ]}tƒ  | ¡  qW d S )N)rZ   rS   rU   rY   Úreport_full_closure)r-   rW   r   r   r   r\   è   s    zdircmp.report_full_closure)rS   rO   rP   rQ   rD   rE   rF   r@   rA   rB   r3   r4   c             C   s*   || j krt|ƒ‚| j | | ƒ t| |ƒS )N)Ú	methodmapÚAttributeErrorÚgetattr)r-   Úattrr   r   r   Ú__getattr__ô   s    
zdircmp.__getattr__)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r0   r6   rC   rN   rR   rT   rV   rZ   r[   r\   r7   r]   ra   r   r   r   r   r   V   s"    
#

c             C   sN   g g g f}x>|D ]6}t j | |¡}t j ||¡}|t|||ƒ  |¡ qW |S )a]  Compare common files in two directories.

    a, b -- directory names
    common -- list of file names found in both directories
    shallow -- if true, do comparison based solely on stat() information

    Returns a tuple of three lists:
      files that compare equal
      files that are different
      filenames that aren't regular files.

    )r   r:   rG   Ú_cmprI   )r.   r/   r@   r   ZresrL   ZaxZbxr   r   r   r   ú   s    

c             C   s,   y||| ||ƒƒ S  t k
r&   dS X d S )Né   )rH   )r.   r/   ZshÚabsr   r   r   r   rf     s    rf   c             C   s   t t|j| ƒƒS )N)r<   r   r?   )ZflistÚskipr   r   r   r1     s    r1   c              C   sr   dd l } dd l}| | jdd … d¡\}}t|ƒdkrB| dd ¡‚t|d |d ƒ}d|krf| ¡  n| ¡  d S )Nr   r   Úrrg   zneed exactly two args)z-rÚ )ÚsysÚgetoptÚargvr   ZGetoptErrorr   r\   rZ   )rl   rm   ZoptionsÚargsZddr   r   r   Údemo$  s    
rp   Ú__main__)T)T)re   r   r   Ú	itertoolsr   Ú__all__r	   r!   r   r   r   r   r   r   r   rh   rf   r1   rp   rb   r   r   r   r   Ú<module>   s&   
' %
	