U e5df&@sdZddlZddlZddlmZdddddgZiZd Zd d d d ddddgZddZ d"ddZ ddZ ddZ GdddZ d#ddZee fddZddZdd Zed!kredS)$zUtilities for comparing files and directories. Classes: dircmp Functions: cmp(f1, f2, shallow=True) -> int cmpfiles(a, b, common) -> ([], [], []) clear_cache() N) filterfalse clear_cachecmpdircmpcmpfilesDEFAULT_IGNORESi ZRCSZCVSZtagsz.gitz.hgz.bzrZ_darcs __pycache__cCs tdS)zClear the filecmp cache.N)_cacheclearr r /usr/lib64/python3.8/filecmp.pyrsTcCstt|}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)leftrightrcurdirpardirhiderignore)selfabr-r,r r r __init__xszdircmp.__init__cCsPtt|j|j|j|_tt|j|j|j|_|j |j dSr) _filterrlistdirr(r,r- left_listr) right_listsortr.r r r phase0s     z dircmp.phase0cCsttttjj|j|j}ttttjj|j|j}tt|j t |j ||_ tt|j t |j ||_tt|j t |j ||_dSr)dictzipmaprpathnormcaser4r5list __getitem__filter __contains__commonr left_only right_only)r.r/r0r r r phase1s 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)rOSErrorrrappendS_ISDIRS_ISREG) r.xZa_pathZb_pathokZa_statZwhyZb_statZa_typeZb_typer r r phase2s4     z dircmp.phase2cCs&t|j|j|j}|\|_|_|_dSr)rr(r)rG same_files diff_files funny_files)r.Zxxr r r phase3sz dircmp.phase3cCsNi|_|jD]<}tj|j|}tj|j|}t|||j|j |j|<q dSr) subdirsrFrr<rIr(r)rr-r,)r.rNZa_xZb_xr r r phase4s  z dircmp.phase4cCs$||jD] }|qdSr)rVrUvaluesphase4_closurer.Zsdr r r rXszdircmp.phase4_closurecCstd|j|j|jr2|jtd|jd|j|jrT|jtd|jd|j|jrp|jtd|j|jr|jtd|j|jr|jtd|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 reports,           z dircmp.reportcCs*||jD]}t|qdSr)r\rUrWr[rYr r r report_partial_closureszdircmp.report_partial_closurecCs*||jD]}t|qdSr)r\rUrWr[report_full_closurerYr r r r^szdircmp.report_full_closure) rUrQrRrSrFrGrHrBrCrDr4r5cCs*||jkrt||j||t||Sr) methodmapAttributeErrorgetattr)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/r0rBrresrNZaxZbxr r r rs cCs0z||||| WStk r*YdSXdS)N)rJ)r/r0Zshabsrr r r rhsrhcCstt|j|Sr)r>rrA)Zflistskipr r r r2sr2cCsrddl}ddl}||jddd\}}t|dkrB|ddt|d|d}d|krf|n|dS)Nrr rrjzneed exactly two args)z-r)sysgetoptargvrZ GetoptErrorrr^r\)rorpZoptionsargsZddr r r demo$s   rs__main__)T)T)rgrr itertoolsr__all__r r"rrrrrrrrkrhr2rsrdr r r r s6   ' %