Yff&@sdZddlZddlZddlmZdddddgZiZd#Zd d d dddddgZddZ dddZ ddZ ddZ GdddZ dddZee ddZddZd d!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_IGNORESiZRCSZCVSZtagsz.gitz.hgz.bzrZ_darcs __pycache__cCstjdS)zClear the filecmp cache.N)_cacheclearr r ,/opt/alt/python35/lib64/python3.5/filecmp.pyrsTcCsttj|}ttj|}|dtjksP|dtjkrTdS|rj||krjdS|d|dkrdStj||||f}|dkrt||}ttdkrt|t||||f<|S)aCompare 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(). rFTNd) _sigosstatS_IFREGr get_do_cmplenr)f1f2shallows1s2Zoutcomer r r rs& cCstj|j|j|jfS)N)rS_IFMTst_modest_sizest_mtime)str r r rDsrcCs{t}t|d_}t|dF}x<|j|}|j|}||kr[dS|s-dSq-WWdQRXWdQRXdS)NrbFT)BUFSIZEopenread)rrbufsizefp1fp2Zb1Zb2r r r rIs$ rc@seZdZdZddddZddZddZd d Zd d Zd dZ ddZ ddZ ddZ ddZ ede dedededededededed ed!ed"e Zd#d$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||_||_|dkr6tjtjg|_n ||_|dkrWt|_n ||_dS)N)leftrightrcurdirpardirhiderignore)selfabr-r,r r r __init__xs      zdircmp.__init__cCsnttj|j|j|j|_ttj|j|j|j|_|jj |jj dS)N) _filterrlistdirr(r,r- left_listr) right_listsort)r.r r r phase0s  z dircmp.phase0cCsttttjj|j|j}ttttjj|j|j}tt|j t |j ||_ tt|j t |j ||_tt|j t |j ||_dS)N)dictzipmaprpathnormcaser4r5list __getitem__filter __contains__commonr left_only right_only)r.r/r0r r r phase1s **''z dircmp.phase1c Csg|_g|_g|_xy|jD]n}tjj|j|}tjj|j|}d}ytj |}Wn+t k r}z d}WYdd}~XnXytj |}Wn+t k r}z d}WYdd}~XnX|rt j |j }t j |j } || kr,|jj |qt j|rN|jj |qt j|rp|jj |q|jj |q%|jj |q%WdS)Nrr) common_dirs common_files common_funnyrArr;joinr(r)rOSErrorrrappendS_ISDIRS_ISREG) r.xZa_pathZb_pathokZa_statZwhyZb_statZa_typeZb_typer r r phase2s4    z dircmp.phase2cCs7t|j|j|j}|\|_|_|_dS)N)rr(r)rF same_files diff_files funny_files)r.Zxxr r r phase3sz dircmp.phase3cCssi|_xc|jD]X}tjj|j|}tjj|j|}t|||j|j |j| s$   '