f'dZddlZddlZddlmZddlmZgdZiZdZ gdZ dZ dd Z d Z d ZGd d ZddZee fdZdZdZedk(reyy)zUtilities for comparing files and directories. Classes: dircmp Functions: cmp(f1, f2, shallow=True) -> int cmpfiles(a, b, common) -> ([], [], []) clear_cache() N) filterfalse) GenericAlias) clear_cachecmpdircmpcmpfilesDEFAULT_IGNORESi )RCSCVStagsz.gitz.hgz.bzr_darcs __pycache__c,tjy)zClear the filecmp cache.N)_cacheclear/usr/lib/python3.12/filecmp.pyrrs  LLNrcttj|}ttj|}|dtjk7s|dtjk7ry|r||k(ry|d|dk7rytj ||||f}|5t ||}ttdkDr t|t||||f<|S)aMCompare two files. Arguments: f1 -- First file name f2 -- Second file name shallow -- treat files as identical if their stat signatures (type, size, mtime) are identical. Otherwise, files are considered different if their sizes or contents differ. [default: 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(). rFTd) _sigosstatS_IFREGrget_do_cmplenr)f1f2shallows1s2outcomes rrrs. bggbk B bggbk B !u 1 528 !u1~jj"b"b)*G"b/ v;  M!(r2r2~ Nrcntj|j|j|jfSN)rS_IFMTst_modest_sizest_mtime)sts rrrFs* KK # JJ KK rc"t}t|d5}t|d5} |j|}|j|}||k7r ddddddy|s ddddddyN#1swYnxYwdddy#1swYyxYw)NrbTF)BUFSIZEopenread)rr bufsizefp1fp2b1b2s rrrKsG b$3R#'"B'"BRx  s4 B*A0 BA0B/A00A9 5BBceZdZdZddZdZdZdZdZdZ d Z d Z d Z d Z ee eeeeeeeeeee ZdZeeZy)raA 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 instances (or MyDirCmp instances if this object is of type MyDirCmp, a subclass of dircmp), keyed by names in common_dirs. Nc||_||_|&tjtjg|_n||_| t |_y||_yr&)leftrightrcurdirpardirhider ignore)selfabr=r<s r__init__zdircmp.__init__|sC  <BII.DIDI >)DK DKrcttj|j|j|j z|_ttj|j|j|j z|_|j j|jjyr&) _filterrlistdirr8r<r= left_listr9 right_listsortr>s rphase0z dircmp.phase0sx DII!6!%4;;!68!"**TZZ"8"&))DKK"79  rc ttttjj |j |j }ttttjj |j|j}tt|jt|j||_ tt|jt|j||_tt|jt|j||_yr&)dictzipmaprpathnormcaserErFlist __getitem__filter __contains__commonr left_only right_only)r>r?r@s rphase1z dircmp.phase1s S))4>>:DNNK L S))4??;T__M N3q}}fQ^^Q.GHI c!--Q^^Q1OPQs1==+anna2PQRrcg|_g|_g|_|jD]}tj j |j|}tj j |j|}d} t j|} t j|}|rtjj}tjj}||k7r|jj|tj|r|jj|tj|r|jj|K|jj|h|jj|y#t$rd}Y%wxYw#t$rd}Y!wxYw)NTF) common_dirs common_files common_funnyrTrrNjoinr8r9rOSErrorr'r(appendS_ISDIRS_ISREG) r>xa_pathb_pathoka_statb_stata_typeb_types rphase2z dircmp.phase2s^ ,AWW\\$))Q/FWW\\$**a0FB   V^^4V^^4V#%%,,Q/\\&)$$++A.\\&)%%,,Q/%%,,Q/!!((+9 ,     s$=F)F;) F87F8; G  G ct|j|j|j}|\|_|_|_yr&)rr8r9rZ same_files diff_files funny_files)r>xxs rphase3z dircmp.phase3s1 diiT->-> ?=?:$*:rcFi|_|jD]}tjj |j |}tjj |j |}|j|||j|j|j|<yr&) subdirsrYrrNr\r8r9 __class__r=r<)r>raa_xb_xs rphase4z dircmp.phase4sv  !! PA'',,tyy!,C'',,tzz1-C#~~c3 TYYODLLO Prc|j|jjD]}|jyr&)rurqvaluesphase4_closurer>sds rrxzdircmp.phase4_closures3 ,,%%' B     rctd|j|j|jr<|jj td|jd|j|j r<|j j td|jd|j |j r0|j j td|j |jr0|jj td|j|jr0|jj td|j|jr0|jj td|j|jr1|jj td|jyy) NdiffzOnly in:zIdentical files :zDiffering files :zTrouble with common files :zCommon subdirectories :zCommon funny cases :) printr8r9rUrGrVrkrlrmrYr[rHs rreportz dircmp.reportsE fdii, >> NN   ! )TYYT^^ < ?? OO " )TZZdoo > ?? OO " %t 7 ?? OO " %t 7       ! ! # /1A1A B       ! ! # +T-=-= >       " " $ ($*;*; < rc|j|jjD]}t|jyr&)rrqrwr~rys rreport_partial_closurezdircmp.report_partial_closures5 ,,%%' B G IIK rc|j|jjD]}t|j yr&)rrqrwr~report_full_closurerys rrzdircmp.report_full_closures8 ,,%%' %B G  " " $ %r) rqrkrlrmrYrZr[rTrUrVrErFcv||jvr t||j||t||Sr&) methodmapAttributeErrorgetattr)r>attrs r __getattr__zdircmp.__getattr__s9 t~~ % & &tT"tT""r)NN)__name__ __module__ __qualname____doc__rArIrWrirorurxrrrrKrr classmethodr__class_getitem__rrrrrXsx! F !S!,F@ P =2 % V &6v!'f6"f%& :I # $L1rrcgggf}|D]a}tjj||}tjj||}|t|||j |c|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. )rrNr\_cmpr^)r?r@rTr!resraaxbxs rrrsi r2,C - WW\\!Q  WW\\!Q  DR !"))!,- JrcD ||||| S#t$rYywxYw)N)r])r?r@shabsrs rrrs/s1a}%%% s  c@tt|j|Sr&)rPrrS)flistskips rrCrC&s  D--u5 66rcddl}ddl}|j|jddd\}}t|dk7r|j ddt |d|d}d|vr|j y|jy)Nrrrrzneed exactly two args)z-r)sysgetoptargvr GetoptErrorrrr)rroptionsargsdds rdemor,svMM#((12,4MGT 4yA~  !8$?? Qa !BW   r__main__)T)rrr itertoolsrtypesr__all__rr.r rrrrrrrrrCrrrrrrs  ! I  J&P g2g2T67  zFr