�`^c@s�dZddlZddlZddlmZmZmZmZdddgZiZ dZ
d d
�Zd�Zd�Z
ddd
��YZd d�Zeed�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(tifiltertifilterfalsetimaptiziptcmptdircmptcmpfilesiiicCs�ttj|��}ttj|��}|dtjksP|dtjkrTtS|rj||krjtS|d|dkr�tStj||||f�}|dkr�||�}t
t�dkr�tj�n|t||||f<n|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.
iiidN(t_sigtoststattS_IFREGtFalsetTruet_cachetgettNonet_do_cmptlentclear(tf1tf2tshallowts1ts2toutcome((s/sys/lib/python2.7/filecmp.pyRs&
cCstj|j�|j|jfS(N(R tS_IFMTtst_modetst_sizetst_mtime(tst((s/sys/lib/python2.7/filecmp.pyR;sc
Cst}t|d��}t|d��}xBtrn|j|�}|j|�}||kratS|s-tSq-WWdQXWdQXdS(Ntrb(tBUFSIZEtopenRtreadR(RRtbufsizetfp1tfp2tb1tb2((s/sys/lib/python2.7/filecmp.pyR@s cBs�eZdZddd�Zd�Zd�Zd�Zd�Zd�Z d�Z
d�Zd �Zd
�Z
ede ded
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(tlefttrightRRtcurdirtpardirthidetignore(tselftatbR/R.((s/sys/lib/python2.7/filecmp.pyt__init__os cCsnttj|j�|j|j�|_ttj|j�|j|j�|_|jj �|jj �dS(N(
t_filterRtlistdirR*R.R/t left_listR+t
right_listtsort(R0((s/sys/lib/python2.7/filecmp.pytphase0{s
cCs�ttttjj|j�|j��}ttttjj|j�|j��}t|j t
|j|��|_t|j t
|j|��|_t|j t
|j|��|_dS(N(tdictRRRtpathtnormcaseR6R7tmapt__getitem__Rt__contains__tcommonRt left_onlyt
right_only(R0R1R2((s/sys/lib/python2.7/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(tcommon_dirstcommon_filestcommon_funnyR@RR;tjoinR*R+R terrorRRtappendtS_ISDIRtS_ISREG(
R0txta_pathtb_pathtokta_stattwhytb_statta_typetb_type((s/sys/lib/python2.7/filecmp.pytphase2�s4
cCs7t|j|j|j�}|\|_|_|_dS(N(RR*R+REt
same_filest
diff_filestfunny_files(R0txx((s/sys/lib/python2.7/filecmp.pytphase3�scCssi|_xc|jD]X}tjj|j|�}tjj|j|�}t|||j|j �|j|<qWdS(N(
tsubdirsRDRR;RGR*R+RR/R.(R0RLta_xtb_x((s/sys/lib/python2.7/filecmp.pytphase4�s
cCs2|j�x!|jj�D]}|j�qWdS(N(R^R[t
itervaluestphase4_closure(R0tsd((s/sys/lib/python2.7/filecmp.pyR`�s
cCs0dG|jG|jGH|jrC|jj�dG|jGdG|jGHn|jrs|jj�dG|jGdG|jGHn|jr�|jj�dG|jGHn|jr�|jj�dG|jGHn|jr�jj�dG|jGHn|jr|jj�dG|jGHn|j r,|j j�dG|j GHndS( NtdiffsOnly int:sIdentical files :sDiffering files :sTrouble with common files :sCommon subdirectories :sCommon funny cases :(
R*R+RAR8RBRVRWRXRDRF(R0((s/sys/lib/python2.7/filecmp.pytreport�s,
cCs3|j�x"|jj�D]}H|j�qWdS(N(RdR[R_(R0Ra((s/sys/lib/python2.7/filecmp.pytreport_partial_closure�s
cCs3|j�x"|jj�D]}H|j�qWdS(N(RdR[R_treport_full_closure(R0Ra((s/sys/lib/python2.7/filecmp.pyRf�s
R[RVRWRXRDRERFR@RARBR6R7cCs9||jkrt|�n|j||�t||�S(N(t methodmaptAttributeErrortgetattr(R0tattr((s/sys/lib/python2.7/filecmp.pyt__getattr__�sN(t__name__t
__module__t__doc__RR3R9RCRURZR^R`RdReRfR:RgRk(((s/sys/lib/python2.7/filecmp.pyRMs" #
cCskgggf}xU|D]M}tjj||�}tjj||�}|t|||�j|�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;RGt_cmpRI(R1R2R@RtresRLtaxtbx((s/sys/lib/python2.7/filecmp.pyR�s
!cCs=y|||||��SWntjtfk
r8dSXdS(Ni(RRHtIOError(R1R2tshtabsR((s/sys/lib/python2.7/filecmp.pyRoscCstt|j|��S(N(tlistRR?(tflisttskip((s/sys/lib/python2.7/filecmp.pyR4scCs�ddl}ddl}|j|jdd�\}}t|�dkr^|jdd��nt|d|d�}d |kr�|j�n
|j�dS(
Ni�itrisneed exactly two argsis-rt(s-rRz( tsystgetopttargvRtGetoptErrorRRRfRd(R{R|toptionstargstdd((s/sys/lib/python2.7/filecmp.pytdemos
t__main__i ((RnRR t itertoolsRRRRt__all__R
RRRRRRRuRoR4R�Rl(((s/sys/lib/python2.7/filecmp.pyt<module>
s "&
�
|