o
    ta'                     @   s   d Z ddlZddlZddlmZ ddlmZ g dZi ZdZ	g dZ
dd	 ZdddZdd Zdd ZG dd dZdddZeefddZdd Zdd ZedkrWe  dS dS )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_cachecmpdircmpcmpfilesDEFAULT_IGNORESi    )ZRCSZCVStagsz.gitz.hgz.bzrZ_darcs__pycache__c                   C   s   t   dS )zClear the filecmp cache.N)_cacheclear r   r   "/root/Python-3.10.2/Lib/filecmp.pyr      s   r   Tc                 C   s   t t| }t t|}|d tjks|d tjkrdS |r&||kr&dS |d |d kr0dS t| |||f}|du rSt| |}ttdkrKt  |t| |||f< |S )aM  Compare 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().

    r   FT   Nd   )	_sigosstatS_IFREGr   get_do_cmplenr   )f1f2shallows1s2outcomer   r   r   r      s   
r   c                 C   s   t | j| j| jfS N)r   S_IFMTst_modest_sizest_mtime)str   r   r   r   F   s   
r   c              	   C   s   t }t| dG}t|d1}	 ||}||}||kr,	 W d    W d    dS |s=	 W d    W d    dS q1 sAw   Y  W d    d S 1 sQw   Y  d S )NrbTF)BUFSIZEopenread)r   r   bufsizefp1fp2Zb1Zb2r   r   r   r   K   s   

4r   c                   @   s   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zee	eeeeeeeeeeedZdd ZeeZdS )r   a  A 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                 C   sF   || _ || _|d u rtjtjg| _n|| _|d u rt| _d S || _d S r   )leftrightr   curdirpardirhider   ignore)selfabr0   r/   r   r   r   __init__|   s   

zdircmp.__init__c                 C   sP   t t| j| j| j | _t t| j| j| j | _| j	  | j	  d S r   )
_filterr   listdirr+   r/   r0   	left_listr,   
right_listsortr1   r   r   r   phase0   s   


zdircmp.phase0c                 C   s   t tttjj| j| j}t tttjj| j| j}tt|j	t
|j|| _tt|j	t|j|| _tt|j	t|j|| _d S r   )dictzipmapr   pathnormcaser7   r8   list__getitem__filter__contains__commonr   	left_only
right_only)r1   r2   r3   r   r   r   phase1   s
   zdircmp.phase1c           	   	   C   s  g | _ g | _g | _| jD ]x}tj| j|}tj| j|}d}zt	|}W n t
y2   d}Y nw zt	|}W n t
yE   d}Y nw |r~t	|j}t	|j}||kr_| j| qt	|rk| j | qt	|rw| j| q| j| q| j| qd S )Nr   r   )common_dirscommon_filescommon_funnyrE   r   r?   joinr+   r,   r   OSErrorr   r    appendS_ISDIRS_ISREG)	r1   xZa_pathZb_pathokZa_statZb_stata_typeZb_typer   r   r   phase2   s:   


zdircmp.phase2c                 C   s&   t | j| j| j}|\| _| _| _d S r   )r   r+   r,   rJ   
same_files
diff_filesfunny_files)r1   Zxxr   r   r   phase3   s   zdircmp.phase3c                 C   sP   i | _ | jD ]}tj| j|}tj| j|}| ||| j| j	| j |< qd S r   )
subdirsrI   r   r?   rL   r+   r,   	__class__r0   r/   )r1   rQ   Za_xZb_xr   r   r   phase4   s   
zdircmp.phase4c                 C   s$   |    | j D ]}|  q	d S r   )r[   rY   valuesphase4_closurer1   sdr   r   r   r]      s   
zdircmp.phase4_closurec                 C   s   t d| j| j | jr| j  t d| jd| j | jr*| j  t d| jd| j | jr8| j  t d| j | jrF| j  t d| j | jrT| j  t d| j | j	rb| j	  t d| j	 | j
rr| j
  t d| j
 d S d S )	NZdiffzOnly in:zIdentical files :zDiffering files :zTrouble with common files :zCommon subdirectories :zCommon funny cases :)printr+   r,   rF   r9   rG   rU   rV   rW   rI   rK   r:   r   r   r   report   s.   






zdircmp.reportc                 C   s*   |    | j D ]	}t  |   q	d S r   )rb   rY   r\   ra   r^   r   r   r   report_partial_closure   
   
zdircmp.report_partial_closurec                 C   s*   |    | j D ]	}t  |  q	d S r   )rb   rY   r\   ra   report_full_closurer^   r   r   r   re      rd   zdircmp.report_full_closure)rY   rU   rV   rW   rI   rJ   rK   rE   rF   rG   r7   r8   c                 C   s*   || j vr	t|| j | |  t| |S r   )	methodmapAttributeErrorgetattr)r1   attrr   r   r   __getattr__   s   

zdircmp.__getattr__)NN)__name__
__module____qualname____doc__r4   r;   rH   rT   rX   r[   r]   rb   rc   re   r<   rf   rj   classmethodr   __class_getitem__r   r   r   r   r   X   s(    
##r   c                 C   sJ   g g g f}|D ]}t j| |}t j||}|t||| | q|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.

    )r   r?   rL   _cmprN   )r2   r3   rE   r   resrQ   ZaxZbxr   r   r   r     s   
r   c                 C   s*   z
||| || W S  t y   Y dS w )N   )rM   )r2   r3   shabsr   r   r   r   rq     s
   rq   c                 C   s   t t|j| S r   )rA   r   rD   )flistskipr   r   r   r5   &  s   r5   c                  C   st   dd l } dd l}|| jdd  d\}}t|dkr!|dd t|d |d }d|v r4|  d S |  d S )Nr   r   rrs   zneed exactly two args)z-r )sysgetoptargvr   GetoptErrorr   re   rb   )rz   r{   optionsargsddr   r   r   demo,  s   r   __main__)T)rn   r   r   	itertoolsr   typesr   __all__r   r%   r   r   r   r   r   r   r   ru   rq   r5   r   rk   r   r   r   r   <module>   s,    
( 
+	
