U
    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	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 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,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)on_winopen)expand)is_urljoin_urlpath_to_url)	get_index)PrefixSetupUnlinkLinkTransaction)PackageCacheDataProgressiveFetchExtract)
PrefixData)DisallowedPackageError
DryRunExitPackagesNotFoundError
ParseErrorCondaExitZero)rm_rf)islinkreadlinksymlink	MatchSpec)PrefixGraph)_get_best_prec_matchFc                 C   s@   t  }t|  D ](}|r$d|kr$q|t |dd q|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.8/site-packages/conda/misc.pyconda_installed_files$   s    r4   z](?:(?P<url_p>.+)(?:[/\\]))?(?P<fn>[^/\\#]+(?:\.tar\.bz2|\.conda))(:?#(?P<md5>[0-9a-f]{32}))?$Tc                 C   s  t t}||d< g }| D ]}|dkr&qt|s:tt|}t|}	|	d krXtd| |	d|	d|	d  }
}}t	|
|}|
|rt||dnt| qtjrt t|}|  tjrtdtd	d
 |D }tdd
 |D rtg }t|}t|D ]f\}\}}t||jd}||| d< ||jd }|r
t||d rdd || d< n
|
| q
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)r7   zUPackage caches prepared. UnlinkLinkTransaction cancelled with --download-only option.c                 s   s"   | ]}|t t|d gV  qd S N)nextr   Z	query_all).0specr*   r*   r3   	<genexpr>_   s   zexplicit.<locals>.<genexpr>c                 s   s   | ]}|d  dkV  qdS )r   Nr*   )r:   Z
spec_pcrecr*   r*   r3   r<   a   s     namer   c                 s   s   | ]}|d  r|d V  qdS )r   r   Nr*   r:   Zspr*   r*   r3   r<   q   s      r*   c                 s   s   | ]}|d  r|d  V  qdS )r   Nr*   r?   r*   r*   r3   r<   r   s      )r   listr   r   r   url_patmatchr   groupr   appendr&   r   dry_runr   r   ZexecuteZdownload_onlyr    tupleanyAssertionErrorr   	enumerater>   r.   r9   Zqueryr   r   )Zspecsr/   verboseforce_extract
index_argsindexactionsZfetch_specsr;   mr5   r6   Zmd5sumurlZpfeZspecs_pcrecsZprecs_to_removeZprefix_dataqZpcrecZnew_specprecZstpZtxnr*   r*   r3   explicit4   sR    

"
   rS   c                 C   s,   |t | d d  }tr(|r(|dd}|S )Nr   \/)lenr   replace)r/   pathwindows_forward_slashesr1   r*   r*   r3   rel_pathx   s    rZ   c                 C   s8  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 dd t| D D ]}|rr||krrq`tt| |r|	| q`t
t| |D ]v\}}}	|o|t| dk}
|	D ](}|
r||krq|	tt|||  q|D ]&}t||}t|r|	t||  qqq`tr0|r0d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.unionfs	.nonadmincondaZactivateZ
deactivatedarwinz
python.appzLauncher.appc                 s   s   | ]}|j V  qd S r8   r=   )r:   entryr*   r*   r3   r<      s     zwalk_prefix.<locals>.<genexpr>binc                 S   s   h | ]}| d dqS )rT   rU   )rW   r:   rX   r*   r*   r3   	<setcomp>   s     zwalk_prefix.<locals>.<setcomp>N)r+   r   sysplatformr-   osscandirr   r   addwalkr   r"   r   )r/   Zignore_predefined_filesrY   r1   ignoreZ	binignorer6   rootdirsr)   Zshould_ignoreZfn2ZdnrX   r*   r*   r3   walk_prefix   sB    
     



rl   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 )~r^   z	.DS_Storez.pycN)endswithrc   rd   ra   Zconda_filesr*   r3   rb      s   

 

 zuntracked.<locals>.<setcomp>)r4   rl   )r/   r0   r*   rp   r3   	untracked   s    


rq   c              	   C   sP   t rLtttjdrLt| s&t|  tt| dd}|	d W 5 Q R X dS )zO
    Creates $PREFIX/.nonadmin if sys.prefix/.nonadmin exists (on Windows)
    r\   w N)
r   r	   r   r   Zroot_prefixr
   re   makedirsr   write)r/   for*   r*   r3   touch_nonadmin   s
    
rw   c              
      s  t | }i  d}|rd}t|  D ]ld }| kr:q$|dkrR d< d} q|dkrj d< d} qjD ]}t|j krp |< d}qpq$q r|stjrtj	ntj
}	td|	d   D ]td  |	d q fd	d
t|  D }
ndd
 t|  D }
i }dd |
D }g }|r|p2i }tf |}|D ]tjjjdtfdd| D }|s| n@t|dkr|
 |
t| n|
 |
|d  qB|rt|i |
D ]d < qttj}fdd|D tdd tjD }|D ]&tfdd|D r,tq,|rztdt|  tdt|  tjrt |D ]}t| |}t||}t |}t!|st"|rt#| t$|st%&| t!|rt't(|| qz"t)|d}|* }W 5 Q R X W n t+k
r8   Y qY nX z$|,d}|-| |}|.d}W n t/k
rt   Y nX t)|d}|0| W 5 Q R X t12|| qt3|| |d|d}||fS )z1
    clone existing prefix1 into new prefix2
    TFr>   r]   z	conda-envzDThe following packages cannot be cloned out of the root environment:)filez - c                    s   h | ]}|d   kr|qS r=   r*   r:   rR   )filterr*   r3   rb      s      zclone_env.<locals>.<setcomp>c                 S   s   h | ]}|qS r*   r*   ry   r*   r*   r3   rb      s     c                 S   s   g | ]}| d s|qS )rP   )r.   ry   r*   r*   r3   
<listcomp>   s     
 zclone_env.<locals>.<listcomp>)r>   versionbuildc                 3   s   | ]}  |r|V  qd S r8   rB   ry   )r;   r*   r3   r<      s     
 zclone_env.<locals>.<genexpr>r   r   rP   c                    s   g | ]} | qS r*   r*   ry   )urlsr*   r3   r{      s     c                 s   s   | ]}t |V  qd S r8   r%   )r:   sr*   r*   r3   r<      s     c                 3   s   | ]}|  V  qd S r8   r~   )r:   d)rR   r*   r3   r<     s     zPackages: %dz	Files: %drbzutf-8wb)rJ   rM   rK   rL   )4rq   r   r,   Zcombined_dependsr&   r>   r   Zjsonrc   stderrstdoutprintvaluesZdist_strr   r|   r}   rF   rD   rV   removerg   r(   r   r'   ZgraphZdisallowed_packagesrG   r   rE   r   r   r   r"   r   r!   r
   re   rt   r$   r#   r   readIOErrordecoderW   encodeUnicodeDecodeErrorru   shutilZcopystatrS   )prefix1Zprefix2rJ   quietrL   Zuntracked_filesfoundr>   ZdepZfhZdrecsrM   ZunknownsZnotfoundZprecsZ
disallowedfsrcZdstZdst_dirZfidatar   rv   rN   r*   )rz   rR   r;   r   r3   	clone_env   s    












 r   )F)FTNN)T)TT)F)TFN)CZ
__future__r   r   r   r   collectionsr   re   os.pathr   r   r	   r
   r   r   r   rer   rc   Zbase.contextr   Zcommon.compatr   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   r    Zgateways.disk.deleter!   Zgateways.disk.linkr"   r#   r$   Zmodels.match_specr&   Zmodels.prefix_graphr'   Zplanr(   r4   compilerA   rS   rZ   rl   rq   rw   r   r*   r*   r*   r3   <module>   s8   $


D

#
