B
    '\&                 @   s   d dl mZmZmZmZ d dlmZ d dlZd dlm	Z	 d dl
mZmZmZmZ d dlmZmZmZmZ d dlZddlmZ dd	lmZ dd
lmZ e	eZdd ZdddZdd ZdddZ dd Z!dd Z"d ddZ#dd Z$dd Z%dS )!    )absolute_importdivisionprint_functionunicode_literals)defaultdictN)	getLogger)listdirlstatwalkunlink)getsizeisdirjoinexists   )CONDA_TARBALL_EXTENSION)CONDA_TEMP_EXTENSION)contextc        
      C   s   ddl m}  tt}d}td }xx| tjD ]h}|j}t	|sBq.t
t|\}}}x@|D ]8}	|	tsr|	|rZ|| |	 |tt||	7 }qZW q.W ||fS )Nr   )PackageCacheDatar   z.part)core.package_cache_datar   r   listr   writable_cachesr   	pkgs_dirspkgs_dirr   nextr
   endswithappendr   r   )
r   r   	totalsizeZpart_extpackage_cacher   root_	filenamesfn r#   3lib/python3.7/site-packages/conda/cli/main_clean.pyfind_tarballs   s    
r%   Tc                s  ddl m} ddlm} ddlm} |rBx D ]}td|  q.W t fdd D sh|rdtd	 d S |rtd
 td xd D ]\}t| tdt|  d}x2 | D ]&}	t	t
||	}
t||	||
f  qW td qW td t|d||f  td tjrtjs|  tjr2| jr2d S x D ]}x | D ]}	y:|t
||	rp|rtd|	  n|rtd|	  W nL ttfk
r } z(|rtd|	|f  ntd| W d d }~X Y nX qFW q8W d S )N   )
confirm_ynr   )rm_rf)human_byteszCache location: %sc             3   s   | ]} | V  qd S )Nr#   ).0i)r   r#   r$   	<genexpr>/   s    zrm_tarballs.<locals>.<genexpr>zThere are no tarballs to removez#Will remove the following tarballs: -z
%-40s %10sz3---------------------------------------------------zTotal:z
Removed %sz,WARNING: cannot remove, file permissions: %sz/WARNING: cannot remove, file permissions: %s
%rz%r)commonr'   gateways.disk.deleter(   utilsr)   printanylenr   r   r   json
always_yesdry_runIOErrorOSErrorloginfo)argsr   r   verboser'   r(   r)   r   fmtr"   sizeer#   )r   r$   rm_tarballs&   sP    


rA   c                 s  g } ddl m} | }tt}xtjD ]މ t sHtjs&td	  q& fddt
 D }x|D ]}d}xtt |D ]r\}}}	x`|	D ]X}
y|t||
}W n2 tk
r } z| |
|f wW d d }~X Y nX |dkrd}P qW |r|P q|W |  | qdW q&W d	}tt}x|D ]| xt|  D ]h}d	}xNtt |D ]<\}}}	x.|	D ]&}
tt||
j}||7 }||7 }qPW q@W |  | q(W qW || ||fS )
Nr   )CrossPlatformStLinkzWARNING: {0} does not existc                s    g | ]}t t |d r|qS )r;   )r   r   )r*   r+   )r   r#   r$   
<listcomp>f   s    zfind_pkgs.<locals>.<listcomp>Fr&   Tr   )Zgateways.disk.linkrB   r   r   r   r   r   r5   r2   formatr   r
   r   r9   r   r	   st_size)warningsrB   Zcross_platform_st_nlinkr   ZpkgspkgZbreakitr   dirfilesr"   st_nlinkr@   r   pkgsizespkgsizer?   r#   )r   r$   	find_pkgsY   sJ    



rM   c                s  ddl m} ddlm} ddlm} |r\x2 D ]*}	td|	  x|D ]\}
}t| qDW q.W t fdd D s|r~td	 d S |r"td
 xl D ]d}	t|	 tdt|	  td d}x2t	 |	 ||	 D ]\}}t||||f  qW td qW td t|d||f  td t
jr2t
js8|  t
jrL| jrLd S xB D ]:}	x2 |	 D ]&}|rvtd|  |t|	| q`W qRW d S )Nr&   )r'   r   )r(   )r)   zCache location: %sc             3   s   | ]} | V  qd S )Nr#   )r*   r+   )r   r#   r$   r,      s    zrm_pkgs.<locals>.<genexpr>z&There are no unused packages to removez#Will remove the following packages:r.   r-   z
%-40s %10sz3---------------------------------------------------zTotal:zremoving %s)r/   r'   r0   r(   r1   r)   r2   r3   r4   zipr   r5   r6   r7   r   )r<   r   rF   r   rK   r=   r'   r(   r)   r   r"   Z	exceptionr>   rG   rL   r#   )r   r$   rm_pkgs   sD    


rO   c              C   s>   ddl m}  ddlm} x | D ]}| t|jd q"W d S )Nr   )r(   )r   cache)r0   r(   r   r   r   r   r   )r(   r   r   r#   r#   r$   rm_index_cache   s    rQ   c              C   s   ddl m}  ddlm} ddlm} ddlm} tdd |	 D }t
jrRt
jshtd	||  |   x|D ]}|| qnW |S )
Nr&   )r'   r   )dashlist)r(   )r   c             s   s   | ]}t |jr|jV  qd S )N)r   r   )r*   Zpcr#   r#   r$   r,      s    z"rm_rf_pkgs_dirs.<locals>.<genexpr>z8Remove all contents from the following package caches?%s)r/   r'   Z	common.iorR   r0   r(   r   r   tupler   r   r5   r6   r2   )r'   rR   r(   r   writable_pkgs_dirsr   r#   r#   r$   rm_rf_pkgs_dirs   s    
rU   c          
   C   s   | s
t j} x|t| D ]p\}}}xd|D ]\}t|dsDt|dt r$t||}yt| W q$ tk
r~   t	d
| Y q$X q$W qW d S )Nz*.trash*z@File at {} could not be cleaned up.  It's probably still in-use.)sysprefixr
   fnmatchr   r   r   EnvironmentErrorr:   warnrD   )pathr   dirsZfnsr"   Z	file_pathr#   r#   r$   clean_tmp_files   s    

r^   c       
         s  ddi}d}| j r tdtjd | jr8t }||d< |S | jsD| jrt \ } r^t	 d nd}|t
  | |d	|d
< t|  |tjptj d d}| js| jrdttjd dgi|d< t  d}| js| jrLt \ }} rt	 d nd}|t
  | || fdd D d|d< t|  ||tjp@tj d d}| jr`ttj n"| jrx| jD ]}t| qpW |sddlm}	 |	d|S )NZsuccessTFzrWARNING: 'conda clean --source-cache' is deprecated.
    Use 'conda build purge-all' to remove source cache files.)filer   r   r-   )r   r   rI   
total_sizetarballs)r=   rI   rP   index_cachec                s$   i | ]}t t | | |qS r#   )dictrN   )r*   r+   )r   rK   r#   r$   
<dictcomp>  s    z_execute.<locals>.<dictcomp>)r   r   rI   r`   rF   Z	pkg_sizespackagesr   )ArgumentErrorzDAt least one removal target must be given. See 'conda clean --help'.)Zsource_cacher2   rW   stderrZforce_pkgs_dirsrU   ra   allr%   sortedrc   rA   r   r5   quietrb   r   r   rQ   re   rM   rO   r^   rX   Z	tempfiles
exceptionsrf   )
r<   parserjson_resultZone_target_ranrT   r   firstrF   r\   rf   r#   )r   rK   r$   _execute   sV    

ro   c             C   s(   ddl m} t| |}tjr$|| d S )Nr&   )stdout_json)r/   rp   ro   r   r5   )r<   rl   rp   rm   r#   r#   r$   execute  s    
rq   )T)T)N)&Z
__future__r   r   r   r   collectionsr   rY   Zloggingr   osr   r	   r
   r   os.pathr   r   r   r   rW   Zbase.constantsr   Zcommon.constantsr   Zbase.contextr   __name__r:   r%   rA   rM   rO   rQ   rU   r^   ro   rq   r#   r#   r#   r$   <module>   s&   
32
)
B