a
    e\                     @   s|  d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	 d dl
mZ d dlmZmZ d dlmZmZmZ d dlmZ d dlmZmZmZmZmZmZmZmZmZ d d	lm Z m!Z! d d
l"m#Z# e#r
d dl$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z- d dl.m/Z/ e0e1Z2dd Z3dd Z4e4dd Z5dd Z6dd Z7dd Z8G dd de9Z:G dd de9Z;G dd de9Z<dS )    )absolute_importN)pkg_resources)UninstallationError)bin_pybin_user)WINDOWScache_from_sourceuses_pycache)
indent_log)	FakeFileaskdist_in_usersitedist_is_localegg_link_pathis_localnormalize_pathrenamesrmtree)AdjacentTempDirectoryTempDirectory)MYPY_CHECK_RUNNING)	AnyCallableDictIterableIteratorListOptionalSetTuple)Distributionc                 C   sl   t | rt}nt}tj||}|g}trh||d  ||d  |rZ||d  n||d  |S )zCreate the fully qualified name of the files created by
    {console,gui}_scripts for the given ``dist``.
    Returns the list of file names
    z.exez.exe.manifestz-script.pywz
-script.py)r   r   r   ospathjoinr   append)distscript_nameZis_guibin_dirZexe_namepaths_to_remove r)   S/var/www/sunrise/env/lib/python3.9/site-packages/pip/_internal/req/req_uninstall.py_script_names0   s    r+   c                    s   t   fdd}|S )Nc                  ?   s6   t  } | i |D ]}||vr|| |V  qd S N)setadd)argskwseenitemfnr)   r*   uniqueH   s
    
z_unique.<locals>.unique)	functoolswraps)r4   r5   r)   r3   r*   _uniqueF   s    r8   c                 c   s   t t| d}|D ]t}tj| j|d }|V  |drtj	|\}}|dd }tj||d }|V  tj||d }|V  qdS )a  
    Yield all the uninstallation paths for dist based on RECORD-without-.py[co]

    Yield paths to all the files in RECORD. For each .py file in RECORD, add
    the .pyc and .pyo in the same directory.

    UninstallPathSet.add() takes care of the __pycache__ .py[co].
    RECORDr   .pyN.pyc.pyo)
csvreaderr   get_metadata_linesr!   r"   r#   locationendswithsplit)r%   rrowr"   dnr4   baser)   r)   r*   uninstallation_pathsS   s    
rH   c                    sJ   t jjt }t| tdD ]* t fdd|D }|s|  q|S )zCompact a path set to contain the minimal number of paths
    necessary to contain all paths in the set. If /a/path/ and
    /a/path/to/a/file.txt are both in the set, leave only the
    shorter path.keyc                 3   s:   | ]2}  |d o0 t|d  kV  qdS )*N)
startswithrstriplen).0Z	shortpathr"   sepr)   r*   	<genexpr>u   s   zcompact.<locals>.<genexpr>)r!   r"   rQ   r-   sortedrN   anyr.   )pathsZshort_pathsZshould_skipr)   rP   r*   compactk   s    rV   c           	         s   t dd | D }t|}ttdd | D td}t }dd |D ]tfdd|D rfqJt }t }tD ]B\ }}| fdd|D  | fd	d|D  q||| sJ|	| |
tj  qJtt|j||B S )
zReturns a set containing the paths that need to be renamed.

    This set may include directories when the original sequence of paths
    included every file on disk.
    c                 s   s   | ]}t j||fV  qd S r,   )r!   r"   normcaserO   pr)   r)   r*   rR          z&compress_for_rename.<locals>.<genexpr>c                 s   s   | ]}t j|d  V  qdS )r   N)r!   r"   rC   rX   r)   r)   r*   rR      s   rI   c                  W   s   t jt jj|  S r,   )r!   r"   rW   r#   )ar)   r)   r*   	norm_join   s    z&compress_for_rename.<locals>.norm_joinc                 3   s    | ]}t j |V  qd S r,   )r!   r"   rW   rL   )rO   w)rootr)   r*   rR      s   c                 3   s   | ]} |V  qd S r,   r)   )rO   ddirnamer\   r^   r)   r*   rR      s   c                 3   s   | ]} |V  qd S r,   r)   )rO   fr`   r)   r*   rR      s   )dictr-   rS   valuesrN   rT   r!   walkupdatedifference_updater.   rQ   map__getitem__)	rU   Zcase_map	remainingZ	unchecked	wildcardsZ	all_filesZall_subdirssubdirsfilesr)   r`   r*   compress_for_rename   s6    


rn   c                 C   s   t | }t  }t  }t  }|D ]>}|dr.q|ds@d|v rR|tj| || qt ttjj|}t|}|D ]d}t	|D ]T\}}	}
|
D ]D}|drqtj
||}tj|rtj||vr|| qqq||dd |D B }||fS )as  Returns a tuple of 2 sets of which paths to display to user

    The first set contains paths that would be deleted. Files of a package
    are not added and the top-level directory of the package has a '*' added
    at the end - to signify that all it's contents are removed.

    The second set contains files that would have been skipped in the above
    folders.
    r<   z__init__.py
.dist-infoc                 S   s   h | ]}t j|d qS )rK   )r!   r"   r#   )rO   folderr)   r)   r*   	<setcomp>   s   z.compress_for_output_listing.<locals>.<setcomp>)r-   rB   r.   r!   r"   ra   rh   rW   rV   re   r#   isfile)rU   will_remove	will_skipZfoldersrm   r"   Z_normcased_filesrp   dirpath_ZdirfilesfnameZfile_r)   r)   r*   compress_for_output_listing   s4    

rx   c                   @   sL   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	e
dd ZdS )StashedUninstallPathSetzWA set of file rename operations to stash files while
    tentatively uninstalling them.c                 C   s   i | _ g | _d S r,   )
_save_dirs_movesselfr)   r)   r*   __init__   s    z StashedUninstallPathSet.__init__c                 C   sB   zt |}W n ty(   tdd}Y n0 || jtj|< |jS )zStashes a directory.

        Directories are stashed adjacent to their original location if
        possible, or else moved/copied into the user's temp dir.	uninstallkind)r   OSErrorr   rz   r!   r"   rW   )r}   r"   save_dirr)   r)   r*   _get_directory_stash   s    z,StashedUninstallPathSet._get_directory_stashc                 C   s   t j|}t j|d }}d}||krdz| j| }W qW n tyN   Y n0 t j|| }}q"t j|}tdd}|| j|< t j||}|r|t jjkrt j	|j|S |jS )zStashes a file.

        If no root has been provided, one will be created for the directory
        in the user's temp directory.Nr   r   )
r!   r"   rW   ra   rz   KeyErrorr   relpathcurdirr#   )r}   r"   headZold_headr   r   r)   r)   r*   _get_file_stash   s"    


z'StashedUninstallPathSet._get_file_stashc                 C   sl   t j|ot j| }|r*| |}n
| |}| j||f |r^t j|r^t | t	|| |S )zStashes the directory or file and returns its new location.
        Handle symlinks as files to avoid modifying the symlink targets.
        )
r!   r"   isdirislinkr   r   r{   r$   rmdirr   )r}   r"   Zpath_is_dirnew_pathr)   r)   r*   stash  s    


zStashedUninstallPathSet.stashc                 C   s,   | j  D ]\}}|  q
g | _i | _ dS )z0Commits the uninstall by removing stashed files.N)rz   itemscleanupr{   )r}   rv   r   r)   r)   r*   commit'  s    
zStashedUninstallPathSet.commitc                 C   s   | j D ]}tjdg|R   q| j D ]\}}zTtd|| tj|sTtj|r`t| ntj	|rtt
| t|| W q$ ty } z$td| td| W Y d}~q$d}~0 0 q$|   dS )z2Undoes the uninstall by moving stashed files back.zMoving to %s
 from %szReplacing %s from %szFailed to restore %szException: %sN)r{   loggerinfodebugr!   r"   rr   r   unlinkr   r   r   r   errorr   )r}   rY   r   r"   exr)   r)   r*   rollback/  s    
$z StashedUninstallPathSet.rollbackc                 C   s
   t | jS r,   )boolr{   r|   r)   r)   r*   can_rollbackC  s    z$StashedUninstallPathSet.can_rollbackN)__name__
__module____qualname____doc__r~   r   r   r   r   r   propertyr   r)   r)   r)   r*   ry      s   	ry   c                   @   s^   e Zd ZdZdd Zdd Zdd Zdd	 ZdddZdd Z	dd Z
dd Zedd ZdS )UninstallPathSetzMA set of file paths to be removed in the uninstallation of a
    requirement.c                 C   s(   t  | _t  | _i | _|| _t | _d S r,   )r-   rU   _refusepthr%   ry   _moved_paths)r}   r%   r)   r)   r*   r~   L  s
    zUninstallPathSet.__init__c                 C   s   t |S )zs
        Return True if the given path is one we are permitted to
        remove/modify, False otherwise.

        )r   )r}   r"   r)   r)   r*   
_permittedT  s    zUninstallPathSet._permittedc                 C   s   t j|\}}t jt|t j|}t j|s:d S | |rR| j	| n| j
	| t j|d dkrtr| 	t| d S )N   r:   )r!   r"   rC   r#   r   rW   existsr   rU   r.   r   splitextr	   r   )r}   r"   r   tailr)   r)   r*   r.   ]  s    
zUninstallPathSet.addc                 C   sL   t |}| |r<|| jvr*t|| j|< | j| | n| j| d S r,   )r   r   r   UninstallPthEntriesr.   r   )r}   pth_fileentryr)   r)   r*   add_pthq  s    

zUninstallPathSet.add_pthFc                 C   s   | j std| jj dS | jjd | jj }td| t z |sP| |r| j}t	| j }t
t|D ]}|| td| ql| j D ]}|  qtd| W d   n1 s0    Y  dS )z[Remove paths in ``self.paths`` with confirmation (unless
        ``auto_confirm`` is True).z7Can't uninstall '%s'. No files were found to uninstall.N-zUninstalling %s:zRemoving file or directory %szSuccessfully uninstalled %s)rU   r   r   r%   project_nameversionr
   _allowed_to_proceedr   rn   rS   rV   r   r   r   rd   remove)r}   auto_confirmverboseZdist_name_versionmovedZ
for_renamer"   r   r)   r)   r*   r   {  s&    


zUninstallPathSet.removec                 C   sn   dd }|st | j\}}nt| j}t }|d| |d| |d| j |r`|dt| j tddd	kS )
zIDisplay which files would be deleted and prompt for confirmation
        c                 S   sX   |sd S t |  t , tt|D ]}t | q&W d    n1 sJ0    Y  d S r,   )r   r   r
   rS   rV   )msgrU   r"   r)   r)   r*   _display  s    
z6UninstallPathSet._allowed_to_proceed.<locals>._displayzWould remove:z+Would not remove (might be manually added):z%Would not remove (outside of prefix):zWill actually move:zProceed (y/n)? )ynr   )rx   rU   r-   r   rn   r   )r}   r   r   rs   rt   r)   r)   r*   r     s    



z$UninstallPathSet._allowed_to_proceedc                 C   sR   | j jstd| jj dS td| jj | j   | j	 D ]}|  q@dS )z1Rollback the changes previously made by remove().z'Can't roll back %s; was not uninstalledNzRolling back uninstall of %s)
r   r   r   r   r%   r   r   r   r   rd   )r}   r   r)   r)   r*   r     s    
zUninstallPathSet.rollbackc                 C   s   | j   dS )z?Remove temporary save dir: rollback will no longer be possible.N)r   r   r|   r)   r)   r*   r     s    zUninstallPathSet.commitc                    s  t |j}t|s.td|j|tj | |S |dd t	dt	dhD v rhtd|j| | |S | |}t
|}dt|j}|jotj|j}t|jdd }|r|jd	r|j|s||j |d
r|d
 D ]&}tjtj|j|}	||	 qn|dr|drB|d ng   fdd|d D D ]J}
tj|j|
}	||	 ||	d  ||	d  ||	d  qbnH|rtd|jn.|jdr"||j tj|jd }tjtj|jd}||d|  n|rR|jdrRt |D ]}	||	 q>n|rt!|d$}tj"|# $ }W d    n1 s0    Y  ||jksJ d||j|j|| tjtj|d}|||j nt%d||j |drj|&drj|'dD ]L}t(|r0t)}nt*}|tj|| t+r|tj||d  qg }|j,dd}|- D ]}|.t/||d q|j,d d}|- D ]}|.t/||d! q|D ]}|| q|S )"Nz1Not uninstalling %s at %s, outside environment %sc                 S   s   h | ]}|r|qS r)   r)   rX   r)   r)   r*   rq     s   z-UninstallPathSet.from_dist.<locals>.<setcomp>stdlib
platstdlibz<Not uninstalling %s at %s, as it is in the standard library.z{}.egg-infor"   z	.egg-infozinstalled-files.txtztop_level.txtznamespace_packages.txtc                    s   g | ]}|r| vr|qS r)   r)   rX   
namespacesr)   r*   
<listcomp>  s   z.UninstallPathSet.from_dist.<locals>.<listcomp>r:   r<   r=   zCannot uninstall {!r}. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.z.eggr   zeasy-install.pthz./ro   rD   z;Egg-link {} does not match installed location of {} (at {})z)Not sure how to uninstall: %s - Check: %sscriptsz.batconsole_scripts)groupFgui_scriptsT)0r   rA   r   r   r   rJ   sysprefix	sysconfigget_pathr   formatr   to_filenamer   egg_infor!   r"   r   getattr	_providerrB   r.   has_metadataget_metadata
splitlinesnormpathr#   r   rC   ra   r   rH   openrW   readlinestripr   metadata_isdirmetadata_listdirr   r   r   r   get_entry_mapkeysextendr+   )clsr%   Z	dist_pathr(   Zdevelop_egg_linkZdevelop_egg_link_egg_infoZegg_info_existsZdistutils_egg_infoZinstalled_filer"   Ztop_level_pkgZeasy_install_eggZeasy_install_pthfhZlink_pointerscriptr'   Z_scripts_to_remover   namer   sr)   r   r*   	from_dist  s    






4


zUninstallPathSet.from_distN)FF)r   r   r   r   r~   r   r.   r   r   r   r   r   classmethodr   r)   r)   r)   r*   r   I  s   	

 r   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c                 C   s   || _ t | _d | _d S r,   )filer-   entries_saved_lines)r}   r   r)   r)   r*   r~   S  s    zUninstallPthEntries.__init__c                 C   s<   t j|}tr,t j|d s,|dd}| j| d S )Nr   \/)r!   r"   rW   r   
splitdrivereplacer   r.   )r}   r   r)   r)   r*   r.   Y  s    
zUninstallPthEntries.addc              	   C   s2  t d| j tj| js.t d| j d S t| jd}| }|| _	W d    n1 s^0    Y  t
dd |D rd}nd}|r|d |d	s|d |d	 |d< | jD ]<}z$t d
| ||| d	 W q ty   Y q0 qt| jd}|| W d    n1 s$0    Y  d S )NzRemoving pth entries from %s:z.Cannot remove entries from nonexistent file %srbc                 s   s   | ]}d |v V  qdS )s   
Nr)   )rO   liner)   r)   r*   rR   w  rZ   z-UninstallPthEntries.remove.<locals>.<genexpr>z

zutf-8zRemoving entry: %swb)r   r   r   r!   r"   rr   warningr   	readlinesr   rT   rB   encoder   r   
ValueError
writelines)r}   r   linesZendliner   r)   r)   r*   r   i  s,    $
zUninstallPthEntries.removec                 C   sf   | j d u rtd| j dS td| j t| jd}|| j  W d    n1 sX0    Y  dS )Nz.Cannot roll back changes to %s, none were madeFz!Rolling %s back to previous stater   T)r   r   r   r   r   r   r   )r}   r   r)   r)   r*   r     s    
*zUninstallPthEntries.rollbackN)r   r   r   r~   r.   r   r   r)   r)   r)   r*   r   R  s   r   )=
__future__r   r>   r6   loggingr!   r   r   pip._vendorr   pip._internal.exceptionsr   pip._internal.locationsr   r   pip._internal.utils.compatr   r   r	   pip._internal.utils.loggingr
   pip._internal.utils.miscr   r   r   r   r   r   r   r   r   pip._internal.utils.temp_dirr   r   pip._internal.utils.typingr   typingr   r   r   r   r   r   r   r   r   pip._vendor.pkg_resourcesr    	getLoggerr   r   r+   r8   rH   rV   rn   rx   objectry   r   r   r)   r)   r)   r*   <module>   s<   ,,

(3o  