U e5df&�@s�dZddlZddlZddlmZdddddgZiZd Zd d d d ddddgZdd�Z d"dd�Z dd�Z dd�Z Gdd�d�Z d#dd�Zee fdd�Zdd�Zdd �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_IGNORESi ZRCSZCVSZtagsz.gitz.hgz.bzrZ_darcs� __pycache__cCs t��dS)zClear the filecmp cache.N)�_cache�clear�r r �/usr/lib64/python3.8/filecmp.pyrsTcCs�tt�|��}tt�|��}|dtjks8|dtjkr 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||_dSr)�left�rightr�curdir�pardir�hider�ignore)�self�a�br-r,r r r �__init__xszdircmp.__init__cCsPtt�|j�|j|j�|_tt�|j�|j|j�|_|j� �|j� �dSr) �_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 |���|_dSr)�dict�zip�mapr�path�normcaser4r5�list� __getitem__�filter� __contains__�commonr� left_only� right_only)r.r/r0r r r �phase1�s z dircmp.phase1c Cs4g|_g|_g|_|jD�]}tj�|j|�}tj�|j|�}d}zt� |�}Wn&t k rv}zd}W5d}~XYnXzt� |�}Wn&t k r�}zd}W5d}~XYnX|�r"t � |j �}t � |j �} || kr�|j� |�n>t �|�r�|j� |�n&t �|��r|j� |�n |j� |�q|j� |�qdS)Nr r)� common_dirs� common_files� common_funnyrBrr<�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�}|\|_|_|_dSr)rr(r)rG� same_files� diff_files� funny_files)r.Zxxr r r �phase3�sz dircmp.phase3cCsNi|_|jD]<}tj�|j|�}tj�|j|�}t|||j|j �|j|<q dSr) �subdirsrFrr<rIr(r)rr-r,)r.rNZa_xZb_xr r r �phase4�s  z dircmp.phase4cCs$|��|j��D] }|��qdSr)rVrU�values�phase4_closure�r.Zsdr r r rX�szdircmp.phase4_closurecCs�td|j|j�|jr2|j��td|jd|j�|jrT|j��td|jd|j�|jrp|j��td|j�|jr�|j��td|j�|jr�|j��td|j�|j r�|j ��td|j �|j r�|j ��td|j �dS) NZdiffzOnly in�:zIdentical files :zDiffering files :zTrouble with common files :zCommon subdirectories :zCommon funny cases :) �printr(r)rCr6rDrQrRrSrFrHr7r r r �report�s,           z dircmp.reportcCs*|��|j��D]}t�|��qdSr)r\rUrWr[rYr r r �report_partial_closure�szdircmp.report_partial_closurecCs*|��|j��D]}t�|��qdSr)r\rUrWr[�report_full_closurerYr r r r^�szdircmp.report_full_closure) rUrQrRrSrFrGrHrBrCrDr4r5cCs*||jkrt|��|j||�t||�Sr)� methodmap�AttributeError�getattr)r.�attrr r r � __getattr__�s zdircmp.__getattr__)NN)�__name__� __module__� __qualname__�__doc__r1r8rErPrTrVrXr\r]r^r9r_rcr r r r rVs2! # �cCsJgggf}|D]6}tj�||�}tj�||�}|t|||��|�q|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<rI�_cmprK)r/r0rBr�resrNZaxZbxr r r r�s cCs0z|||||�� WStk r*YdSXdS)N�)rJ)r/r0Zsh�absrr r r rhsrhcCstt|j|��Sr)r>rrA)Zflist�skipr r r r2sr2cCsrddl}ddl}|�|jdd�d�\}}t|�dkrB|�dd��t|d|d�}d|krf|��n|��dS)Nrr �rrjzneed exactly two args)z-r�)�sys�getopt�argvrZ GetoptErrorrr^r\)rorpZoptions�argsZddr r r �demo$s   rs�__main__)T)T)rgrr� itertoolsr�__all__r r"rrrrrrrrkrhr2rsrdr r r r �s6  � ' %