3 \f&�@s�dZddlZddlZddlmZdddddgZiZd#Zd d d dddddgZdd�Z d$dd�Z dd�Z dd�Z Gdd�d�Z d%dd�Zee fdd�Zdd�Zd d!�Zed"kr�e�dS)&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_IGNORES�iZRCSZCVSZtagsz.gitz.hgz.bzrZ_darcs� __pycache__cCs tj�dS)zClear the filecmp cache.N)�_cache�clear�r r �/usr/lib64/python3.6/filecmp.pyrsTcCs�ttj|��}ttj|��}|dtjks8|dtjkrdS|sdSqWWdQRXWdQRXdS)N�rbFT)�BUFSIZE�open�read)rr�bufsize�fp1�fp2Zb1Zb2r r r rIs  rc@s�eZdZdZddd�Zdd�Zdd�Zd d �Zd d �Zd d�Z dd�Z dd�Z dd�Z dd�Z ee eeeeeeeeeeed� Zdd�ZdS)raMA 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. NcCsD||_||_|dkr$tjtjg|_n||_|dkr:t|_n||_dS)N)�left�rightr�curdir�pardir�hider�ignore)�self�a�br-r,r r r �__init__xszdircmp.__init__cCsPttj|j�|j|j�|_ttj|j�|j|j�|_|jj �|jj �dS)N) �_filterr�listdirr(r,r-� left_listr)� right_list�sort)r.r r r �phase0�s    z dircmp.phase0cCs�ttttjj|j�|j��}ttttjj|j�|j��}tt|j t |j |���|_ tt|j t |j |���|_tt|j t |j |���|_dS)N)�dict�zip�mapr�path�normcaser4r5�list� __getitem__�filter� __contains__�commonr� left_only� right_only)r.r/r0r r r �phase1�s z dircmp.phase1c Cs:g|_g|_g|_�x |jD�]}tjj|j|�}tjj|j|�}d}ytj |�}Wn&t k rz}z d}WYdd}~XnXytj |�}Wn&t k r�}z d}WYdd}~XnX|�r&t j |j �}t j |j �} || kr�|jj |�n>t j|�r�|jj |�n&t j|��r|jj |�n |jj |�q|jj |�qWdS)Nrr)� common_dirs� common_files� common_funnyrArr;�joinr(r)r�OSErrorrr�append�S_ISDIR�S_ISREG) r.�xZa_pathZb_path�okZa_statZwhyZb_statZa_typeZb_typer r r �phase2�s4    z dircmp.phase2cCs&t|j|j|j�}|\|_|_|_dS)N)rr(r)rF� same_files� diff_files� funny_files)r.Zxxr r r �phase3�sz dircmp.phase3cCsRi|_xF|jD]<}tjj|j|�}tjj|j|�}t|||j|j �|j|<qWdS)N) �subdirsrErr;rHr(r)rr-r,)r.rMZa_xZb_xr r r �phase4�s  z dircmp.phase4cCs(|j�x|jj�D] }|j�qWdS)N)rUrT�values�phase4_closure)r.�sdr r r rW�szdircmp.phase4_closurecCs�td|j|j�|jr2|jj�td|jd|j�|jrT|jj�td|jd|j�|jrp|jj�td|j�|jr�|jj�td|j�|jr�|jj�td|j�|j r�|j j�td|j �|j r�|j j�td|j �dS) NZdiffzOnly in�:zIdentical files :zDiffering files :zTrouble with common files :zCommon subdirectories :zCommon funny cases :) �printr(r)rBr6rCrPrQrRrErG)r.r r r �report�s,           z dircmp.reportcCs.|j�x |jj�D]}t�|j�qWdS)N)r[rTrVrZ)r.rXr r r �report_partial_closure�szdircmp.report_partial_closurecCs.|j�x |jj�D]}t�|j�qWdS)N)r[rTrVrZ�report_full_closure)r.rXr r r r]�szdircmp.report_full_closure) rTrPrQrRrErFrGrArBrCr4r5cCs*||jkrt|��|j||�t||�S)N)� methodmap�AttributeError�getattr)r.�attrr r r � __getattr__�s zdircmp.__getattr__)NN)�__name__� __module__� __qualname__�__doc__r1r7rDrOrSrUrWr[r\r]r8r^rbr r r r rVs"  #  cCsNgggf}x>|D]6}tjj||�}tjj||�}|t|||�j|�qW|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. )rr;rH�_cmprJ)r/r0rAr�resrMZaxZbxr r r r�s  c Cs,y|||||�� Stk r&dSXdS)N�)rI)r/r0Zsh�absrr r r rgsrgcCstt|j|��S)N)r=rr@)Zflist�skipr r r r2sr2cCsrddl}ddl}|j|jdd�d�\}}t|�dkrB|jdd��t|d|d�}d|krf|j�n|j�dS) Nrr�rrizneed exactly two args�-r�)rmrn)�sys�getopt�argvrZ GetoptErrorrr]r[)rorpZoptions�argsZddr r r �demo$s   rs�__main__i )T)T)rfrr� itertoolsr�__all__r r"rrrrrrrrjrgr2rsrcr r r r � s&  ' %