
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ÝPfñ  ã               @   sš   d dl mZ d dlZd dlZd dl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 d dlmZ ejeƒZG dd„ deƒZG d	d
„ d
eƒZdS )é    )Úabsolute_importN)Úuses_pycacheÚWINDOWSÚcache_from_source)ÚUninstallationError)ÚrmtreeÚaskÚis_localÚrenamesÚnormalize_path)Ú
indent_logc               @   sZ   e Zd ZdZdd„ Zd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S )ÚUninstallPathSetzMA set of file paths to be removed in the uninstallation of a
    requirement.c             C   s,   t ƒ | _t ƒ | _i | _|| _d | _g | _d S )N)ÚsetÚpathsÚ_refuseÚpthÚdistÚsave_dirÚ_moved_paths)Úselfr   © r   ú#/usr/lib/python3.6/req_uninstall.pyÚ__init__   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   Úpathr   r   r   Ú
_permitted   s    zUninstallPathSet._permittedc             C   sˆ   t jj|ƒ\}}t jjt|ƒt jj|ƒƒ}t jj|ƒs:d S | j|ƒrR| jj	|ƒ n| j
j	|ƒ t jj|ƒd dkr„tr„| j	t|ƒƒ d S )Né   z.py)Úosr   ÚsplitÚjoinr   ÚnormcaseÚexistsr   r   Úaddr   Úsplitextr   r   )r   r   ÚheadÚtailr   r   r   r!   #   s    
zUninstallPathSet.addc             C   sL   t |ƒ}| j|ƒr<|| jkr*t|ƒ| j|< | j| j|ƒ n| jj|ƒ d S )N)r   r   r   ÚUninstallPthEntriesr!   r   )r   Úpth_fileÚentryr   r   r   Úadd_pth6   s    

zUninstallPathSet.add_pthc                s@   t ƒ }x4t|td�D ]$‰ t‡ fdd„|D ƒƒs|jˆ ƒ qW |S )zÔCompact 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                s4   g | ],}ˆ j |ƒo.ˆ t|jtjjƒƒ tjjk‘qS r   )Ú
startswithÚlenÚrstripr   r   Úsep)Ú.0Z	shortpath)r   r   r   ú
<listcomp>G   s   z,UninstallPathSet.compact.<locals>.<listcomp>)r   Úsortedr+   Úanyr!   )r   r   Zshort_pathsr   )r   r   Úcompact?   s    

zUninstallPathSet.compactc             C   s&   t jj| jt jj|ƒd jt jjƒƒS )Nr   )r   r   r   r   Ú
splitdriveÚlstripr-   )r   r   r   r   r   Ú_stashM   s    zUninstallPathSet._stashFc             C   s:  | j stjd| jjƒ dS tjd| jj| jjƒ tƒ �ú t| j| j ƒƒ}|rRd}n"x|D ]}tj|ƒ qXW t	ddƒ}| j
r¤tjdƒ x| j| j
ƒD ]}tj|ƒ q’W |dk�r,tjdd	d
�| _x8|D ]0}| j|ƒ}tjd|ƒ | jj|ƒ t||ƒ qÄW x| jjƒ D ]}|jƒ  �qW tjd| jj| jjƒ W dQ R X 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.NzUninstalling %s-%s:ÚyzProceed (y/n)? Únz.Not removing or modifying (outside of prefix):z
-uninstallzpip-)ÚsuffixÚprefixzRemoving file or directory %szSuccessfully uninstalled %s-%s)r6   r7   )r   ÚloggerÚinfor   Úproject_nameÚversionr   r0   r2   r   r   ÚtempfileZmkdtempr   r5   Údebugr   Úappendr
   r   ÚvaluesÚremove)r   Zauto_confirmr   Zresponser   Únew_pathr   r   r   r   rB   Q   s@    







zUninstallPathSet.removec             C   s~   | j dkrtjd| jjƒ dS tjd| jjƒ x.| jD ]$}| j|ƒ}tjd|ƒ t	||ƒ q6W x| j
jƒ D ]}|jƒ  qjW dS )z1Rollback the changes previously made by remove().Nz'Can't roll back %s; was not uninstalledFzRolling back uninstall of %szReplacing %s)r   r:   Úerrorr   r<   r;   r   r5   r?   r
   r   rA   Úrollback)r   r   Ztmp_pathr   r   r   r   rE   {   s    


zUninstallPathSet.rollbackc             C   s$   | j dk	r t| j ƒ d| _ g | _dS )z?Remove temporary save dir: rollback will no longer be possible.N)r   r   r   )r   r   r   r   Úcommit‹   s    

zUninstallPathSet.commitN)F)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r!   r(   r2   r5   rB   rE   rF   r   r   r   r   r      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   s0   t jj|ƒstd| ƒ‚|| _tƒ | _d | _d S )Nz.Cannot remove entries from nonexistent file %s)r   r   Úisfiler   Úfiler   ÚentriesÚ_saved_lines)r   r&   r   r   r   r   ”   s    
zUninstallPthEntries.__init__c             C   s>   t jj|ƒ}tr.t jj|ƒd  r.|jddƒ}| jj|ƒ d S )Nr   ú\ú/)r   r   r   r   r3   ÚreplacerM   r!   )r   r'   r   r   r   r!   �   s    zUninstallPthEntries.addc             C   sÀ   t jd| jƒ t| jdƒ�}|jƒ }|| _W d Q R X tdd„ |D ƒƒrLd}nd}xH| jD ]>}y$t jd|ƒ |j|| j	dƒƒ W qX t
k
r”   Y qXX qXW t| jd	ƒ�}|j|ƒ W d Q R X d S )
NzRemoving pth entries from %s:Úrbc             s   s   | ]}d |kV  qdS )s   
Nr   )r.   Úliner   r   r   ú	<genexpr>­   s    z-UninstallPthEntries.remove.<locals>.<genexpr>z
Ú
zRemoving entry: %szutf-8Úwb)r:   r?   rL   ÚopenÚ	readlinesrN   r1   rM   rB   ÚencodeÚ
ValueErrorÚ
writelines)r   ÚfhÚlinesZendliner'   r   r   r   rB   §   s    
zUninstallPthEntries.removec          	   C   sR   | j d krtjd| jƒ dS tjd| jƒ t| jdƒ�}|j| j ƒ W d Q R X dS )Nz.Cannot roll back changes to %s, none were madeFz!Rolling %s back to previous staterV   T)rN   r:   rD   rL   r?   rW   r[   )r   r\   r   r   r   rE   º   s    

zUninstallPthEntries.rollbackN)rG   rH   rI   r   r!   rB   rE   r   r   r   r   r%   “   s   	
r%   )Z
__future__r   Zloggingr   r>   Z
pip.compatr   r   r   Zpip.exceptionsr   Z	pip.utilsr   r   r	   r
   r   Zpip.utils.loggingr   Z	getLoggerrG   r:   Úobjectr   r%   r   r   r   r   Ú<module>   s   
 