B
    lz]<&                 @   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	m
Z
mZmZmZmZmZ d dlZd dlZd dlZddl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 dd
lm Z  ddl!m"Z"m#Z# ddl$m%Z%m&Z& ddl'm(Z( ddl)m*Z*m+Z+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 d%ddZ:e;dZ<d&ddZ=d'ddZ>d(ddZ?d)dd Z@d!d" ZAd*d#d$ZBdS )+    )absolute_importdivisionprint_functionunicode_literals)defaultdictN)abspathdirnameexistsisdirisfilejoinrelpath   )context)
itervalueson_winopen)expand)is_urljoin_urlpath_to_url)	get_index)PrefixSetupUnlinkLinkTransaction)PackageCacheDataProgressiveFetchExtract)
PrefixData)DisallowedPackageError
DryRunExitPackagesNotFoundError
ParseError)rm_rf)islinkreadlinksymlink)	MatchSpec)PrefixGraph)_get_best_prec_matchFc             C   sD   t  }x8t|  D ](}|r&d|kr&q|t |dd qW |S )zb
    Return the set of files which have been installed (using conda) into
    a given prefix.
    Z	file_hashfiles )setr   iter_recordsupdateget)prefixexclude_self_buildresmetar)   r)   )lib/python3.7/site-packages/conda/misc.pyconda_installed_files!   s    r3   z](?:(?P<url_p>.+)(?:[/\\]))?(?P<fn>[^/\\#]+(?:\.tar\.bz2|\.conda))(:?#(?P<md5>[0-9a-f]{32}))?$Tc             C   s  t t}||d< g }x| D ]}|dkr(qt|s<tt|}t|}	|	d krZtd| |	d|	d|	d  }
}}t	|
|}|
|rt||dnt| qW tjrt t|}|  tdd	 |D }td
d	 |D rtg }t|}xRt|D ]F\}\}}t||jd}||| d< ||jd }|r|
| qW t||tdd	 |D dtdd	 |D d}t|}|  d S )NZPREFIXz	@EXPLICITz Could not parse explicit URL: %surl_pfnmd5)r6   c             s   s"   | ]}|t t|d gV  qd S )N)nextr   Z	query_all).0specr)   r)   r2   	<genexpr>X   s   zexplicit.<locals>.<genexpr>c             s   s   | ]}|d  dkV  qdS )r   Nr)   )r8   Z
spec_pcrecr)   r)   r2   r:   Z   s    )namer   c             s   s   | ]}|d  V  qdS )r   Nr)   )r8   spr)   r)   r2   r:   f   s    r)   c             s   s   | ]}|d  V  qdS )r   Nr)   )r8   r<   r)   r)   r2   r:   g   s    )r   listr   r   r   url_patmatchr    groupr   appendr%   r   dry_runr   r   ZexecutetupleanyAssertionErrorr   	enumerater;   r-   r   r   )Zspecsr.   verboseforce_extract
index_argsindexactionsZfetch_specsr9   mr4   r5   Zmd5sumurlZpfeZspecs_pcrecsZprecs_to_removeZprefix_dataqZpcrecZnew_specprecZstpZtxnr)   r)   r2   explicit1   sB    


"
"
rP   c             C   s,   |t | d d  }tr(|r(|dd}|S )Nr   \/)lenr   replace)r.   pathwindows_forward_slashesr0   r)   r)   r2   rel_pathm   s    rW   c             C   s>  t  }t| } ddddddddd	d
ddh}dddh}tjdkrL|ddh xt| D ]}|rj||krjqXtt| |r|	| qXxt
t| |D ]~\}}}	|o|t| dk}
x0|	D ](}|
r||krq|	tt|||  qW x.|D ]&}t||}t|r|	t||  qW qW qXW tr6|r6dd |D S |S dS )zB
    Return the set of all files in a given prefix directory.
    ZpkgsZenvsz	conda-bldz
conda-metaz.conda_lockZuserszLICENSE.txtinfozconda-recipesz.indexz.unionfsz	.nonadmincondaZactivateZ
deactivatedarwinz
python.appzLauncher.appbinc             S   s   h | ]}| d dqS )rQ   rR   )rT   )r8   rU   r)   r)   r2   	<setcomp>   s    zwalk_prefix.<locals>.<setcomp>N)r*   r   sysplatformr,   oslistdirr   r   addwalkr   r"   r   )r.   Zignore_predefined_filesrV   r0   ignoreZ	binignorer5   rootdirsr(   Zshould_ignoreZfn2ZdnrU   r)   r)   r2   walk_prefixt   s6    







rf   c                s$   t | |  fddt|   D S )zE
    Return (the set) of all untracked files for a given prefix.
    c                sH   h | ]@}| d stjdkr&| ds| dr@|dd  ks|qS )~rZ   z	.DS_Storez.pycN)endswithr]   r^   )r8   rU   )conda_filesr)   r2   r\      s   
zuntracked.<locals>.<setcomp>)r3   rf   )r.   r/   r)   )rj   r2   	untracked   s    

rk   c          	   C   sP   t rLtttjdrLt| s&t|  tt| dd}|	d W dQ R X dS )zO
    Creates $PREFIX/.nonadmin if sys.prefix/.nonadmin exists (on Windows)
    z	.nonadminw N)
r   r	   r   r   Zroot_prefixr
   r_   makedirsr   write)r.   for)   r)   r2   touch_nonadmin   s
    
rq   c          
      s  t | }i  d}x|rd}x|t|  D ]ld }| kr>q(|dkrT d< d}P |dkrj d< d}P x(jD ]}t|j krr |< d}qrW q(W qW  r|stjrtj	ntj
}	td|	d x$t D ]td  |	d qW  fd	d
t|  D }
ndd
 t|  D }
i }dd |
D }g }|r|p@i }tf |}x|D ]tjjjdtfddt|D }|s| n@t|dkr|
 |
t| n|
 |
|d  qRW |rt|i x|
D ]d < qW ttj}fdd|D tdd tjD }x.|D ]&tfdd|D rDtqDW |rtdt|  tdt|  tjrt x|D ]}t| |}t||}t |}t!|st"|rt#| t$|st%&| t!|rt't(|| qy"t)|d}|* }W dQ R X W n t+k
rT   wY nX y$|,d}|-| |}|.d}W n t/k
r   Y nX t)|d}|0| W dQ R X t12|| qW t3|| |d|d}||fS )z1
    clone existing prefix1 into new prefix2
    TFr;   rY   z	conda-envzDThe following packages cannot be cloned out of the root environment:)filez - c                s   h | ]}|d   kr|qS )r;   r)   )r8   rO   )filterr)   r2   r\      s    zclone_env.<locals>.<setcomp>c             S   s   h | ]}|qS r)   r)   )r8   rO   r)   r)   r2   r\      s    c             S   s   g | ]}| d s|qS )rM   )r-   )r8   rO   r)   r)   r2   
<listcomp>   s    zclone_env.<locals>.<listcomp>)r;   versionbuildc             3   s   | ]}  |r|V  qd S )N)r?   )r8   rO   )r9   r)   r2   r:      s    zclone_env.<locals>.<genexpr>r   r   rM   c                s   g | ]} | qS r)   r)   )r8   rO   )urlsr)   r2   rt      s    c             s   s   | ]}t |V  qd S )N)r%   )r8   sr)   r)   r2   r:      s    c             3   s   | ]}|  V  qd S )N)r?   )r8   d)rO   r)   r2   r:      s    zPackages: %dz	Files: %drbNzutf-8wb)rG   rJ   rH   rI   )4rk   r   r+   Zcombined_dependsr%   r;   r   Zjsonr]   stderrstdoutprintr   Zdist_strr   ru   rv   rC   rA   rS   removera   r'   r   r&   ZgraphZdisallowed_packagesrD   r   rB   r   r   r   r"   r   r!   r
   r_   rn   r$   r#   r   readIOErrordecoderT   encodeUnicodeDecodeErrorro   shutilZcopystatrP   )prefix1Zprefix2rG   quietrI   Zuntracked_filesfoundr;   ZdepZfhZdrecsrJ   ZunknownsZnotfoundZprecsZ
disallowedfsrcdstZdst_dirZfidatarx   rp   rK   r)   )rs   rO   r9   rw   r2   	clone_env   s    














r   )F)FTNN)T)TT)F)TFN)CZ
__future__r   r   r   r   collectionsr   r_   os.pathr   r   r	   r
   r   r   r   rer   r]   Zbase.contextr   Zcommon.compatr   r   r   Zcommon.pathr   Z
common.urlr   r   r   Z
core.indexr   Z	core.linkr   r   Zcore.package_cache_datar   r   Zcore.prefix_datar   
exceptionsr   r   r   r    Zgateways.disk.deleter!   Zgateways.disk.linkr"   r#   r$   Zmodels.match_specr%   Zmodels.prefix_graphr&   Zplanr'   r3   compiler>   rP   rW   rf   rk   rq   r   r)   r)   r)   r2   <module>   s8   $


<

#
