ó õùPc@sÓdZddlZddlZddlmZmZmZmZdddgZiZ dZ d d „Z d „Z d „Z ddd „ƒYZd d„Zee d„Zd„Zd„ZedkrÏeƒndS(sžUtilities for comparing files and directories. Classes: dircmp Functions: cmp(f1, f2, shallow=1) -> int cmpfiles(a, b, common) -> ([], [], []) iÿÿÿÿN(tifiltert ifilterfalsetimaptiziptcmptdircmptcmpfilesiiicCsçttj|ƒƒ}ttj|ƒƒ}|dtjksP|dtjkrTtS|rj||krjtS|d|dkr‚tStj||fƒ}|r»||f|d kr»|dSt||ƒ}|||ft||f<|S(s”Compare two files. Arguments: f1 -- First file name f2 -- Second file name shallow -- Just check stat signature (do not read the files). defaults to 1. Return value: True if the files are the same, False otherwise. This function uses a cache for past comparisons and the results, with a cache invalidation mechanism relying on stale signatures. iii( t_sigtoststattS_IFREGtFalsetTruet_cachetgett_do_cmp(tf1tf2tshallowts1ts2tresulttoutcome((s..\python\lib\filecmp.pyRs&cCstj|jƒ|j|jfS(N(R tS_IFMTtst_modetst_sizetst_mtime(tst((s..\python\lib\filecmp.pyR:sc Cst}t|dƒd}t|dƒL}xBtrn|j|ƒ}|j|ƒ}||kratS|s-tSq-WWdQXWdQXdS(Ntrb(tBUFSIZEtopenR treadR (RRtbufsizetfp1tfp2tb1tb2((s..\python\lib\filecmp.pyR?s  cBsÈeZdZddd„Zd„Zd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z ed e d ed edededededededededeƒ Zd„ZRS(sQA 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 ['RCS', 'CVS', 'tags']. 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. cCsm||_||_|dkr6tjtjg|_n ||_|dkr`dddg|_n ||_dS(NtRCStCVSttags(tlefttrighttNoneRtcurdirtpardirthidetignore(tselftatbR.R-((s..\python\lib\filecmp.pyt__init__ns     cCsnttj|jƒ|j|jƒ|_ttj|jƒ|j|jƒ|_|jj ƒ|jj ƒdS(N( t_filterRtlistdirR(R-R.t left_listR)t right_listtsort(R/((s..\python\lib\filecmp.pytphase0zs  cCs»ttttjj|jƒ|jƒƒ}ttttjj|jƒ|jƒƒ}t|j t |j |ƒƒ|_ t|j t |j |ƒƒ|_t|j t |j |ƒƒ|_dS(N(tdictRRRtpathtnormcaseR5R6tmapt __getitem__Rt __contains__tcommonRt left_onlyt right_only(R/R0R1((s..\python\lib\filecmp.pytphase1‚s **!!c Cs}g|_g|_g|_x[|jD]P}tjj|j|ƒ}tjj|j|ƒ}d}ytj |ƒ}Wntj k r’}d}nXytj |ƒ}Wntj k rÄ}d}nX|ret j |j ƒ}t j |j ƒ} || kr|jj |ƒqut j|ƒr0|jj |ƒqut j|ƒrR|jj |ƒqu|jj |ƒq%|jj |ƒq%WdS(Nii(t common_dirst common_filest common_funnyR?RR:tjoinR(R)R terrorRRtappendtS_ISDIRtS_ISREG( R/txta_pathtb_pathtokta_stattwhytb_statta_typetb_type((s..\python\lib\filecmp.pytphase2‰s4      cCs7t|j|j|jƒ}|\|_|_|_dS(N(RR(R)RDt same_filest diff_filest funny_files(R/txx((s..\python\lib\filecmp.pytphase3¬scCssi|_xc|jD]X}tjj|j|ƒ}tjj|j|ƒ}t|||j|j ƒ|j|(tflisttskip((s..\python\lib\filecmp.pyR3scCsœddl}ddl}|j|jddƒ\}}t|ƒdkr^|jddƒ‚nt|d|dƒ}d |krŽ|jƒn |jƒdS( Niÿÿÿÿitrisneed exactly two argsis-rt(s-rRx( tsystgetopttargvtlent GetoptErrorR*RReRc(RyRztoptionstargstdd((s..\python\lib\filecmp.pytdemos    t__main__i ((RmRR t itertoolsRRRRt__all__R RRRRRRRsRnR3RRk(((s..\python\lib\filecmp.pyt s   " %  ¤