
}_                 @   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 Gd d   d e  Z Gd	 d
   d
 e  Z d S)    )absolute_importN)uses_pycacheWINDOWScache_from_source)UninstallationError)rmtreeaskis_localrenamesnormalize_path)
indent_logc               @   s   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   4/tmp/pip-build-3_sjtvrs/pip/pip/req/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 |  sU d  S|  j |  rw |  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   sh   t  |  } |  j |  rT | |  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                sV   t    } xF t | d t D]2   t   f d d   | D  s | j    q W| 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                sJ   g  |  ]@ }   j  |  oC   t | j t j j   t j j k  q Sr   )
startswithlenrstripr   r   sep).0	shortpath)r   r   r   
<listcomp>G   s   	z,UninstallPathSet.compact.<locals>.<listcomp>)r   sortedr+   anyr!   )r   r   short_pathsr   )r   r   compact?   s    	zUninstallPathSet.compactc             C   s5   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 St j d |  j j |  j j  t   Pt |  j |  j    } | rs d } n- x | D] } t j |  qz Wt	 d d  } |  j
 r t j d  x' |  j |  j
  D] } t j |  q W| d k rt j d d	 d
 d  |  _ xJ | D]B } |  j |  } t j d |  |  j j |  t | |  qWx! |  j j   D] } | j   qdWt j d |  j j |  j j  Wd QRXd 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):suffixz
-uninstallprefixzpip-zRemoving file or directory %szSuccessfully uninstalled %s-%s)r8   r9   )r   loggerinfor   project_nameversionr   r1   r4   r   r   tempfilemkdtempr   r7   debugr   appendr
   r   valuesremove)r   auto_confirmr   responser   new_pathr   r   r   r   rE   Q   s@    	
		zUninstallPathSet.removec             C   s   |  j  d k r) t j d |  j j  d St j d |  j j  x= |  j D]2 } |  j |  } t j d |  t	 | |  qI Wx! |  j
 j   D] } | j   q Wd 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   r7   rB   r
   r   rD   rollback)r   r   tmp_pathr   r   r   r   rJ   {   s    zUninstallPathSet.rollbackc             C   s2   |  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)__name__
__module____qualname____doc__r   r   r!   r(   r4   r7   rE   rJ   rL   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   sD   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   sU   t  j j |  } t rA t  j j |  d rA | j d d  } |  j j |  d  S)Nr   \/)r   r   r   r   r5   replacerS   r!   )r   r'   r   r   r   r!      s    zUninstallPthEntries.addc             C   s   t  j d |  j  t |  j d   } | j   } | |  _ Wd  QRXt d d   | D  rf d } n d } xT |  j D]I } y. t  j d |  | j | | j	 d   Wqv t
 k
 r Yqv Xqv Wt |  j d	   } | j |  Wd  QRXd  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<   rB   rR   open	readlinesrT   r2   rS   rE   encode
ValueError
writelines)r   fhlinesendliner'   r   r   r   rE      s    		zUninstallPthEntries.removec          	   C   si   |  j  d  k r& t j d |  j  d St j d |  j  t |  j d   } | j |  j   Wd  QRXd S)Nz.Cannot roll back changes to %s, none were madeFz!Rolling %s back to previous stater\   T)rT   r<   rI   rR   rB   r]   ra   )r   rb   r   r   r   rJ      s    zUninstallPthEntries.rollbackN)rM   rN   rO   r   r!   rE   rJ   r   r   r   r   r%      s   	
r%   )
__future__r   loggingr   r@   
pip.compatr   r   r   pip.exceptionsr   	pip.utilsr   r   r	   r
   r   pip.utils.loggingr   	getLoggerrM   r<   objectr   r%   r   r   r   r   <module>   s   (