³ò ¢l‡Jc@sádZddkZddkZddkZddklZlZlZlZdddgZ hZ dZ d d „Z d „Z d „Zddd „ƒYZd d„Zee d„Zd„Zd„Zedjo 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þtti|ƒƒ}tti|ƒƒ}|dtijp|dtijotSn|o||jotSn|d|djotSnti||fƒ}|o#||f|d jo |dSnt||ƒ}|||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/sys/lib/python/filecmp.pyRs( cCsti|iƒ|i|ifS(N(R tS_IFMTtst_modetst_sizetst_mtime(tst((s/sys/lib/python/filecmp.pyR;scCsyt}t|dƒ}t|dƒ}xNtoF|i|ƒ}|i|ƒ}||jotSn|ptSq'q'WdS(Ntrb(tBUFSIZEtopenR treadR (RRtbufsizetfp1tfp2tb1tb2((s/sys/lib/python/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. cCsq||_||_|djotitig|_n ||_|djodddg|_n ||_dS(NtRCStCVSttags(tlefttrighttNoneRtcurdirtpardirthidetignore(tselftatbR.R-((s/sys/lib/python/filecmp.pyt__init__ps     cCsntti|iƒ|i|iƒ|_tti|iƒ|i|iƒ|_|ii ƒ|ii ƒdS(N( t_filterRtlistdirR(R-R.t left_listR)t right_listtsort(R/((s/sys/lib/python/filecmp.pytphase0|s  cCs»ttttii|iƒ|iƒƒ}ttttii|iƒ|iƒƒ}t|i t |i |ƒƒ|_ t|i t |i |ƒƒ|_t|i t |i |ƒƒ|_dS(N(tdictRRRtpathtnormcaseR5R6tmapt __getitem__Rthas_keytcommonRt left_onlyt right_only(R/R0R1((s/sys/lib/python/filecmp.pytphase1„s **!!c Cs‰g|_g|_g|_xg|iD]\}tii|i|ƒ}tii|i|ƒ}d}yti |ƒ}Wnti j o}d}nXyti |ƒ}Wnti j o}d}nX|o¡t i |i ƒ}t i |i ƒ} || jo|ii |ƒqt i|ƒo|ii |ƒqt i|ƒo|ii |ƒq|ii |ƒq%|ii |ƒ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/sys/lib/python/filecmp.pytphase2‹s6       cCs7t|i|i|iƒ}|\|_|_|_dS(N(RR(R)RDt same_filest diff_filest funny_files(R/txx((s/sys/lib/python/filecmp.pytphase3®scCssh|_xc|iD]X}tii|i|ƒ}tii|i|ƒ}t|||i|i ƒ|i|dG|iG|iGH|io(|iiƒdG|iGdG|iGHn|io(|iiƒdG|iGdG|iGHn|io|iiƒdG|iGHn|io|iiƒdG|iGHn|io|iiƒdG|iGHn|io|iiƒdG|iGHn|i o|i iƒdG|i GHndS( NtdiffsOnly int:sIdentical files :sDiffering files :sTrouble with common files :sCommon subdirectories :sCommon funny cases :( R(R)R@R7RARURVRWRCRE(R/((s/sys/lib/python/filecmp.pytreportÁs,              cCs3|iƒx"|iiƒD]}H|iƒqWdS(N(RcRZR^(R/R`((s/sys/lib/python/filecmp.pytreport_partial_closureÚs  cCs3|iƒx"|iiƒD]}H|iƒqWdS(N(RcRZR^treport_full_closure(R/R`((s/sys/lib/python/filecmp.pyReàs  RZRURVRWRCRDRER?R@RAR5R6cCs;||ijo t|‚n|i||ƒt||ƒS(N(t methodmaptAttributeErrortgetattr(R/tattr((s/sys/lib/python/filecmp.pyt __getattr__ìs N(t__name__t __module__t__doc__R*R2R8RBRTRYR]R_RcRdReR9RfRj(((s/sys/lib/python/filecmp.pyRNs"    #      cCskgggf}xU|D]M}tii||ƒ}tii||ƒ}|t|||ƒi|ƒqW|S(s]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:RFt_cmpRH(R0R1R?RtresRKtaxtbx((s/sys/lib/python/filecmp.pyRòs !cCs<y|||||ƒƒ SWntij o dSnXdS(Ni(RRG(R0R1tshtabsR((s/sys/lib/python/filecmp.pyRn scCstt|i|ƒƒS(N(tlistRt __contains__(tflisttskip((s/sys/lib/python/filecmp.pyR3scCs ddk}ddk}|i|iddƒ\}}t|ƒdjo|iddƒ‚nt|d|dƒ}d |jo|iƒn |iƒdS( Niÿÿÿÿitrisneed exactly two argsis-rt(s-rRy( tsystgetopttargvtlent GetoptErrorR*RReRc(RzR{toptionstargstdd((s/sys/lib/python/filecmp.pytdemos   t__main__i ((RmRR twarningst itertoolsRRRRt__all__R RRRRRRRsRnR3R‚Rk(((s/sys/lib/python/filecmp.pys s"   " %  ¤