o
   1‚Må®:Bã                   @   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 )z³Utilities 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    )ÚRCSÚCVSÚtagsz.gitz.hgz.bzrÚ_darcsÚ__pycache__c                   C   s   t  ¡  dS )zClear the filecmp cache.N)Ú_cacheÚclear© r   r   ú-/app/.heroku/python/lib/python3.10/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é   Néd   )	Ú_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Úfp2Úb1Úb2r   r   r   r   K   s   

ûù4ÿr   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Úbr5   r4   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   Úlistdirr0   r4   r5   Ú	left_listr1   Ú
right_listÚsort©r6   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Únormcaser<   r=   ÚlistÚ__getitem__ÚfilterÚ__contains__Úcommonr   Ú	left_onlyÚ
right_only)r6   r7   r8   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_funnyrJ   r   rD   Újoinr0   r1   r   ÚOSErrorr"   r#   ÚappendÚS_ISDIRÚS_ISREG)	r6   ÚxÚa_pathÚb_pathÚokÚa_statÚb_statÚa_typeÚb_typer   r   r   Úphase2—   s:   
þþ

äzdircmp.phase2c                 C   s&   t | j| j| jƒ}|\| _| _| _d S r!   )r   r0   r1   rO   Ú
same_filesÚ
diff_filesÚfunny_files)r6   Ú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!   )
ÚsubdirsrN   r   rD   rQ   r0   r1   Ú	__class__r5   r4   )r6   rV   Úa_xÚb_xr   r   r   Úphase4¾   s   
ýzdircmp.phase4c                 C   s$   |   ¡  | j ¡ D ]}| ¡  q	d S r!   )rh   rd   ÚvaluesÚphase4_closure©r6   Úsdr   r   r   rj   É   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 )	NÚdiffzOnly inú:zIdentical files :zDiffering files :zTrouble with common files :zCommon subdirectories :zCommon funny cases :)Úprintr0   r1   rK   r>   rL   r_   r`   ra   rN   rP   r?   r   r   r   ÚreportÎ   s.   






þzdircmp.reportc                 C   s*   |   ¡  | j ¡ D ]	}tƒ  |  ¡  q	d S r!   )rp   rd   ri   ro   rk   r   r   r   Úreport_partial_closureç   ó
   
þzdircmp.report_partial_closurec                 C   s*   |   ¡  | j ¡ D ]	}tƒ  | ¡  q	d S r!   )rp   rd   ri   ro   Úreport_full_closurerk   r   r   r   rs   í   rr   zdircmp.report_full_closure)rd   r_   r`   ra   rN   rO   rP   rJ   rK   rL   r<   r=   c                 C   s*   || j vr	t|ƒ‚| j | | ƒ t| |ƒS r!   )Ú	methodmapÚAttributeErrorÚgetattr)r6   Úattrr   r   r   Ú__getattr__ù   s   

zdircmp.__getattr__)NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r9   r@   rM   r^   rc   rh   rj   rp   rq   rs   rA   rt   rx   Ú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   rD   rQ   Ú_cmprS   )r7   r8   rJ   r   ÚresrV   ÚaxÚbxr   r   r   r     s   
r   c                 C   s*   z
||| ||ƒƒ W S  t y   Y dS w )Né   )rR   )r7   r8   ÚshÚabsr   r   r   r   r     s
   ÿr   c                 C   s   t t|j| ƒƒS r!   )rF   r   rI   )ÚflistÚskipr   r   r   r:   &  s   r:   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   Úrrƒ   zneed exactly two args)z-rÚ )ÚsysÚgetoptÚargvr   ÚGetoptErrorr   rs   rp   )rŠ   r‹   ÚoptionsÚargsÚddr   r   r   Údemo,  s   r‘   Ú__main__)T)r|   r   r   Ú	itertoolsr   Útypesr   Ú__all__r   r(   r   r   r   r   r   r   r   r…   r   r:   r‘   ry   r   r   r   r   Ú<module>   s,    
( 
+	
ÿ