B
    XM\                 @   s  d dl mZmZmZ d dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
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mZ ddlmZmZmZmZmZmZ ddlmZ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#m$Z$m%Z% ddlm&Z& d dl'm(Z( d dl)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3m4Z4m5Z5 d dl6m7Z7 dZ8dZ9dd Z:dd Z;dd Z<dd Z=dd Z>d d! Z?edad$d%Z@d&d' ZAd(d) ZBdbd+d,ZCd-d. ZDd/d0 ZEd1d2 ZFd3d4 ZGd5d6 ZHdcd7d8ZIed9d: ZJd;d< ZKd=d> ZLd?d@ ZMdAdB ZNedCdD ZOdEdF ZPdGdH ZQedIdJ ZRG dKdL dLeSZTdMdN ZUdOdP ZVG dQdR dReWZXi aYd aZdddUdVZ[dedWdXZ\dYdZ Z]d[d\ Z^d]d^ Z_d_d` Z`dS )f    )absolute_importdivisionprint_functionN)glob)joinnormpath   )	text_typePY3)
CondaError	LinkError	LockErrorNoPackagesFoundErrorPaddingErrorUnsatisfiableError)display_actionsexecute_actionsexecute_planinstall_actions)memoized)package_cacheTemporaryDirectory)	pkgs_dirsroot_dirsymlink_condacreate_default_packages)reset_context)utils)BuildLockErrorDependencyNeedsBuildingError)feature_list)get_build_index)external)ensure_listprepend_bin_pathenv_var)get_default_variant)PERLLUARZNUMPYPYTHON)zr-basezmro-basezr-implc             C   s*   d | jdt| d dd d S )N.perl   )r   variantgetr&   split)config r2   2lib/python3.7/site-packages/conda_build/environ.pyget_perl_ver)   s    r4   c             C   s*   d | jdt| d dd d S )Nr+   luar-   )r   r.   r/   r&   r0   )r1   r2   r2   r3   get_lua_ver-   s    r6   c             C   s@   | j dt| d }t|ds(|d }d|dd d S )Npythonr0   r   r+   r-   )r.   r/   r&   hasattrr   r0   )r1   pyr2   r2   r3   
get_py_ver1   s    
r:   c             C   s*   d | jdt| d dd d S )Nr+   Zr_base   )r   r.   r/   r&   r0   )r1   r2   r2   r3   	get_r_ver8   s    r<   c             C   s@   d t| jdpt| d d}|d d |dd   S )N numpyr+   r   r   )r   strr.   r/   r&   r0   )r1   Z	conda_npyr2   r2   r3   get_npy_ver=   s    r@   c             C   s   t | jdS )Ninclude)r   host_prefix)r1   r2   r2   r3   get_lua_include_dirF   s    rC   FHEADc          
   C   st  t j }tt}|rd }ntt jd}	|	}|s6dS d}
||d< zytj| ddddd	|  g||d
}|	d}tj| ddd|g||d
}|	d}||krdS tj| ddg||d
}|	d}|
dd 
 d }t|ts|t pd}ytj| d|ddg||d
}W nT tjk
rj   tjdkrL|drLt|}tj| d|ddg||d
}Y nX |	d}|
dd 
 d }tjdkr|drt|}t j|rt|}t j|s| | kr|d |d|   |d|   d}
W nB tjk
rZ } z |d |t| d}
W d d }~X Y nX W d |sn|	  X |
S )NwFTGIT_DIRlogz-n1z--format=%HrD   ^)envstderrzutf-8Zremotez-v
r   r   z	--git-dirwin32/zremote does not match git_urlzRemote: z	git_url: z@Error obtaining git information in verify_git_repo.  Error was: )osenvironcopyr   
get_logger__name__opendevnullcheck_output_envdecoder0   
isinstancer?   encodesysgetfilesystemencoding
subprocessCalledProcessErrorplatform
startswithconvert_unix_path_to_winpathexistsr   isdirlowerdebugclose)git_exegit_dirgit_urlgit_commits_since_tagrd   Zexpected_revrI   rG   rJ   FNULLZOKZcurrent_commitZexpected_tag_commitZcache_detailsZ	cache_dirZremote_detailsZ
remote_urlerrorr2   r2   r3   verify_git_repoJ   st    












 


rl   c          
   C   s  i }t t}|rd}nttjd}|}tj }||d< dddg}yft j| ddd	d
g|tj	
||d d }	|	d}	|	dd}
t|
dkr|tt||
 W n$ tjk
r   d}|| Y nX y>t j| dd
g|tj	
||d d }	|	d}	|	|d< W n> tjk
rL } z|d |t| W dd}~X Y nX d|krzd|krzd|d |d |d< tdd | D rt|S )z
    Given a repo to a git repo, return a dictionary of:
      GIT_DESCRIBE_TAG
      GIT_DESCRIBE_NUMBER
      GIT_DESCRIBE_HASH
      GIT_FULL_HASH
      GIT_BUILD_STR
    from the output of git describe.
    :return:
    NrE   rF   ZGIT_DESCRIBE_TAGZGIT_DESCRIBE_NUMBERZGIT_DESCRIBE_HASHZdescribez--tagsz--longrD   )rI   cwdrJ   r   zutf-8-r-   r;   zFailed to obtain git tag information.
Consider using annotated tags if you are not already as they are more reliable when used with git describe.z	rev-parseZGIT_FULL_HASHz4Error obtaining git commit information.  Error was: z{}_{}ZGIT_BUILD_STRc             s   s   | ]}d |kV  qdS )rK   Nr2   ).0valuer2   r2   r3   	<genexpr>   s    zget_git_info.<locals>.<genexpr>)r   rQ   rR   rS   rN   rT   rO   rP   rU   r`   dirname
splitlinesrV   rsplitlenupdatedictzipr[   r\   rd   r?   formatanyvaluesAssertionError)rf   repord   drG   rJ   rj   rI   keysoutputpartsmsgrk   r2   r2   r3   get_git_info   sD    





 
r   c       
      C   s   t j }| |d< dd | D }i }dddddd	g}tj||t j| d
}|d}|	d\}}}}}	|dkr~||d< |	dkrd}	|	|d< ||d< ||d< ||d< d
|d |d |d< |S )NZHG_DIRc             S   s   i | ]\}}t |t |qS r2   )r?   )ro   keyrp   r2   r2   r3   
<dictcomp>   s    z%get_hg_build_info.<locals>.<dictcomp>hgrG   z
--templatez;{rev}|{node|short}|{latesttag}|{latesttagdistance}|{branch}z--revr+   )rI   rm   zutf-8|ZnullZHG_LATEST_TAGr=   defaultZ	HG_BRANCHZ	HG_NUM_IDZHG_LATEST_TAG_DISTANCEZHG_SHORT_IDz{}_{}ZHG_BUILD_STR)rN   rO   rP   itemsr   rU   r`   rr   rV   r0   ry   )
r}   rI   r~   cmdr   ZrevZshort_idtagZdistancebranchr2   r2   r3   get_hg_build_info   s(    

r   Tc             C   s   |s| j j}| j| j _t|| j }|t| || |t| || |t| || |t	| || | r|t
| |d |t|| | |dd tD  x<| j j D ],\}}|r| |kr| tkr|||< qW |S )N)skip_build_idc             S   s"   i | ]\}}t t|| qS r2   )r?   intupper)ro   Zfeatrp   r2   r2   r3   r     s    zget_dict.<locals>.<dictcomp>)r1   rB   Zbuild_is_hostZ_merge_build_hostconda_build_varsrv   python_vars	perl_varslua_varsr_vars	meta_varssystem_varsr    r.   r   r   	LANGUAGES)mprefixZfor_envr   escape_backslashr~   kvr2   r2   r3   get_dict   s"    


r   c             C   sz   t j| d d dkr|jn|j}dd|jt|j| |jt	j
t	j|j|t ddt ddt dd|jrpdndtdS )	Nr-   Z_t1HTTPS_PROXYr=   
HTTP_PROXYREQUESTS_CA_BUNDLE)ZCONDA_BUILDZPYTHONNOUSERSITEZCONDA_DEFAULT_ENVZARCHPREFIXZBUILD_PREFIXZ
SYS_PREFIXZ
SYS_PYTHONZSUBDIRZSRC_DIRr   r   r   ZDIRTYZROOT)rN   r`   basenameZtest_dirwork_dirrB   r?   	host_archbuild_prefixrY   r   
executablehost_subdirgetenvZdirtyr   )r   r1   Zsrc_dirr2   r2   r3   r     s     $


r   c             C   sJ  t | j}t||}t||}tjrD|rD|dd}|dd}d|dd d t	t
t
|d dk|||d}| jrd	nd
}dd | |D }d|ks| jdddkr| j|| jj}	tjr|r|	dd}	|d|	i | jjdt| jd }
d|
dd d |d< d|
dd d |d< d|d< |S )N\z\\r=   r+   r-   r   r;   )ZCONDA_PYZPY3KZPY_VERZ
STDLIB_DIRZSP_DIRhostbuildc             S   s   g | ]}t |jqS r2   )r?   name)ro   msr2   r2   r3   
<listcomp>E  s    zpython_vars.<locals>.<listcomp>r7   T)fail_okr*   r>   ZNPY_VERZ	CONDA_NPYr   ZNPY_DISTUTILS_APPEND_FLAGS)r:   r1   r   Zget_stdlib_dirZget_site_packageson_winreplacer   r0   r?   r   is_cross
ms_dependsr   
python_binr   rv   r.   r/   r&   )metadatar   r   Zpy_verZ
stdlib_dirZsp_dirvars_build_or_hostdepsr   Znp_verr2   r2   r3   r   4  s0    



r   c             C   s   t | jt | jd}| jr dnd}dd | |D }d|ksP| jdddkr| j|| jj}tjrx|rx|	d	d
}|
d|i |S )N)ZPERL_VERZ
CONDA_PERLr   r   c             S   s   g | ]}t |jqS r2   )r?   r   )ro   r   r2   r2   r3   r   ^  s    zperl_vars.<locals>.<listcomp>r,   T)r   r   z\\r'   )r4   r1   r   r   r   perl_binr   r   r   r   rv   )r   r   r   r   r   r   r   r2   r2   r3   r   X  s    

r   c             C   s   t | jt | jd}| jr dnd}dd | |D }d|kr| j|| jj}t| j}tjr~|r~|	dd}|	dd}|
||d	 |S )
N)ZLUA_VERZ	CONDA_LUAr   r   c             S   s   g | ]}t |jqS r2   )r?   r   )ro   r   r2   r2   r3   r   r  s    zlua_vars.<locals>.<listcomp>r5   r   z\\)r(   ZLUA_INCLUDE_DIR)r6   r1   r   r   lua_binr   rC   r   r   r   rv   )r   r   r   r   r   r   r   Zlua_include_dirr2   r2   r3   r   l  s    


r   c                s   t | jt | jd}| jr dnd}dd | |D  t fddtD s^| jdd	tkr| j|| jj}t	j
r|r|d
d}|d|i |S )N)ZR_VERZCONDA_Rr   r   c             S   s   g | ]}t |jqS r2   )r?   r   )ro   r   r2   r2   r3   r     s    zr_vars.<locals>.<listcomp>c             3   s   | ]}| kV  qd S )Nr2   )ro   Zr_pkg)r   r2   r3   rq     s    zr_vars.<locals>.<genexpr>T)r   r   z\\r)   )r<   r1   r   r   rz   
R_PACKAGESr   r_binr   r   r   r   rv   )r   r   r   r   r   r   r2   )r   r3   r     s    

r   c          
   C   s  i }xXt | dg D ]D}t|}|d kr>td| t q|||< td||f t qW | dd}t| jj	|}t|d}t|d}t
|ts|t pd}td	| jj}	|	r^tj|r^| d
}
tj|
rtjdkrt|
}
tt| j|
}
d}|
r4t|	||
| jj| jj| dd}|sF| dr|t|	|| jj n.td| jjrtj|r|t| | d|d< |  |d< t|  pd|d< | j r|st| ! |d< | " |d< nd|d< d|d< | j|d< |S )Nzbuild/script_envz+The environment variable '%s' is undefined.zThe environment variable '%s' is being passed through with value %s.  If you are splitting build and test phases with --no-test, please ensure that this value is also set similarly at test time.zsource/0/folderr=   z.gitz.hgzutf-8Zgitzsource/0/git_urlrL   Fzsource/0/git_revrD   zsource/0/pathr   zpackage/nameZPKG_NAMEZPKG_VERSIONr   ZPKG_BUILDNUMZPKG_BUILD_STRINGZPKG_HASHZplaceholderZ1234567Z
RECIPE_DIR)#r#   Z	get_valuerN   r   warningswarnUserWarningr   r1   r   rW   r?   rX   rY   rZ   r"   Zfind_executabler   r`   ra   r]   r   r_   r   rl   ri   rd   rv   r   r   versionZbuild_numberfinalZbuild_idZhash_dependencies)metar   r~   Zvar_namerp   folderZrepo_dirrg   Zhg_dirrf   rh   Z_xr2   r2   r3   r     s^    







 
r   c              C   sX   t jdkr2tjddtjd \} }| d S ytt	
 S  tk
rR   dS X d S )Ndarwinzsysctl -n hw.logicalcpuT)shellstdoutzutf-8r   )rY   r]   r[   PopenPIPEZcommunicaterV   stripr?   multiprocessing	cpu_countNotImplementedError)out_r2   r2   r3   get_cpu_count  s    
r   c               C   s:   t jdkrdS t jdkrdS t jdr,dS tt jd S )NrL   z.dllr   z.dyliblinuxz.so)rY   r]   r^   r   r2   r2   r2   r3   get_shlib_ext  s    

r   c       	   
   C   s  t | jjdkrdnd}tr dnd}t|d}| jjd\}}|dt|d	 |d
| |dt|d |dt|d |dt|d |ddd| |ddf |d |d |d |d |d |d |d |d |d |d |d  |d! |d" |d# |d$ |d% |d& |d' |d( |d) |d* |d+ |d, |d- |d. |d/ |d0 |d1 |d2 |d3 |d4 |d5|d6 |  xBt	j
 D ]4}td7|r|| ntd8|r|| qW d9S ):zLThis is setting variables on a dict that is part of the get_default function32i386Zamd64z19.0.0z15.0.0Library:ZSCRIPTSZScriptsZLIBRARY_PREFIXZLIBRARY_BINbinZLIBRARY_INCrA   ZLIBRARY_LIBlibZCYGWIN_PREFIXr=   z
/cygdrive/r   rM   ZALLUSERSPROFILEAPPDATAZCommonProgramFileszCommonProgramFiles(x86)ZCommonProgramW6432ZCOMPUTERNAMEZComSpecZ	HOMEDRIVEZHOMEPATHZLOCALAPPDATAZLOGONSERVERZNUMBER_OF_PROCESSORSZPATHEXTZProgramDataZProgramFileszProgramFiles(x86)ZProgramW6432ZPROMPTZPSModulePathZPUBLICZSystemDriveZ
SystemRootZTEMPZTMPZ
USERDOMAINZUSERNAMEZUSERPROFILEZwindirZPROCESSOR_ARCHITEW6432ZPROCESSOR_ARCHITECTUREZPROCESSOR_IDENTIFIERBUILDz-pc-windows-zVS[0-9]{2,3}COMNTOOLSzVS[0-9]{4}INSTALLDIRN)r?   r1   r   r
   r   rB   r0   rc   r   rN   rO   r   rematch)	r   get_defaultr   Zwin_archZwin_msvcZlibrary_prefixZdrivetailr   r2   r2   r3   windows_vars  s^    

"
r   c             C   s2   |dd |dt |dd |dd |d d	S )
zLThis is setting variables on a dict that is part of the get_default functionHOMEZUNKNOWNZPKG_CONFIG_PATHr   Z	pkgconfigZCMAKE_GENERATORzUnix MakefilesZSSL_CERT_FILEN)r   )r   r   r   r2   r2   r3   	unix_vars,  s    

r   c             C   s>   t | jjdkrdnd}|d| |dd |d|d  d	S )
zLThis is setting variables on a dict that is part of the get_default functionr   r   x86_64OSX_ARCHZMACOSX_DEPLOYMENT_TARGETz10.9r   z-apple-darwin13.4.0N)r?   r1   r   )r   r   r   r   r2   r2   r3   osx_vars4  s    

r   c               C   s   t  t  fS )N)r]   machineZarchitecturer2   r2   r2   r3   _machine_and_architecture?  s    r   c             C   s   t  \}}|}|dkr>|d dkr>td td td d}|drT|dd	}|d	rdd
}nd}|d |d |d |d |d |d |d |d|d  |d|d | d  dS )zLThis is setting variables on a dict that is part of the get_default functionr   r   Z32bitzEWarning: You are running 32-bit Python on a 64-bit linux installationzE         but have not launched it via linux32. Various qeuries *will*zC         give unexpected results (uname -m, platform.machine() etc)Zi686ZppcZpowerpcZcos7Zcos6ZCFLAGSZCXXFLAGSZLDFLAGSZQEMU_LD_PREFIXZ
QEMU_UNAMEZDEJAGNUZDISPLAYZLD_RUN_PATHz/libr   z-conda_z
-linux-gnuN)r   printr^   r   )r   r   r   Zplatform_machineZplatform_architectureZ
build_archZbuild_distror2   r2   r3   
linux_varsD  s*    


r   c             C   s*   t |}|s|||}|r&|| |< d S )N)rN   r   r/   )Zout_dictr   r.   r   rp   r2   r2   r3   set_from_os_or_variante  s
    
r   c                s   t   d fdd	}|dt  |d |d |d t  d< tj d	  d	< jjslt jj	 t
jd
krt|| nt|| t
jdkrt|| nt
jdrt||  S )Nr=   c                s   t  | jj|S )N)r   r1   r.   )r   r   )r~   r   r2   r3   <lambda>q  s    zsystem_vars.<locals>.<lambda>Z	CPU_COUNTZLANGLC_ALLZ	MAKEFLAGSZ	SHLIB_EXTPATHrL   r   r   )r=   )rw   r   r   rN   rO   rP   r1   Zactivater$   rB   rY   r]   r   r   r   r^   r   )Zenv_dictr   r   r   r2   )r~   r   r3   r   m  s$    


r   c               @   s   e Zd ZdS )InvalidEnvironmentN)rR   
__module____qualname__r2   r2   r2   r3   r     s   r   c          	   C   s$   t | d}t|}W d Q R X |S )Nr)rS   jsonload)r`   Zfinxr2   r2   r3   
_load_json  s    r   c             C   sF   t t| \}}}i }x(|D ] }|drtt||||< qW |S )zp
    Load all json files in a directory.  Return dictionary with filenames mapped to json
    dictionaries.
    z.json)nextr   walkendswithr   r   )r`   rootr   filesresultfr2   r2   r3   _load_all_json  s    

r   c               @   s$   e Zd Zdd Zdd Zdd ZdS )Environmentc             C   sF   || _ t|d| _tj |r4tj | jr4i | _ntd|dS )z
        Initialize an Environment object.

        To reflect changes in the underlying environment, a new Environment object should be
        created.
        z
conda-metazUnable to load environment {}N)r`   r   _metarN   rb   	_packagesr   ry   )selfr`   r2   r2   r3   __init__  s
    zEnvironment.__init__c             C   s   | j st| j| _ d S )N)r   r   r   )r  r2   r2   r3   _read_package_json  s    zEnvironment._read_package_jsonc             C   sX   |    | j }g }x<|D ]4}|d |d |d   }}}|d||| qW |S )z<
        List all package specs in the environment.
        r   r   r   z{} {} {})r  r   r{   appendry   )r  Z	json_objsspecsipr   br2   r2   r3   package_specs  s    

zEnvironment.package_specsN)rR   r   r   r  r  r	  r2   r2   r2   r3   r     s   r     r;   c                sl  i }t t}tj}t|}|r*|t |r>t	dd }n |rXt	dd }tj
}nt j}x"tD ]\}}|rd|d|  qdW t|}t|t|d ||||||	d\}}}tdd |D }|||||
ftkrt|krt|||||
f  }d	|krh| |d	< n\|rht | |  yt| ||d
d}W n ttfk
rv } zt||dW d d }~X Y nr tttttttfk
r } zBdt|kr| dt| ndt|ksdt|kst!|trzt "|||	}t j#||	dx t|}d}x6t$j%&|t'kr@|dk r@t$j%&|}|d7 }qW | d| |t'krpt$j%(|rpt )| W d Q R X ||k r| dt| t*| t|||d ||||t||	|
||t|d}n|+d  W d d }~X Y nX W d Q R X W d Q R X |
rDx@dD ]8 t, fdd|D s fdd|d D |d< qW t -| | t|||||
f< |a|S )Nc               s   s   d V S )Nr2   r2   r2   r2   r3   r     s    z%get_install_actions.<locals>.<lambda>c               s   s   d V S )Nr2   r2   r2   r2   r3   r     s    z%s@r   )output_folderchannel_urlsrd   verboselockingtimeoutc             s   s&   | ]}t |d st|V  qdS )@N)r?   r   r   Zensure_valid_spec)ro   specr2   r2   r3   rq     s    z&get_install_actions.<locals>.<genexpr>r   T)Zforce)subdirlockz;failed to get install actions, retrying.  exception was: %sz requires a minimum conda versionzlink a source that does not)r     r   zYI think conda ended up with a partial extraction for %s. Removing the folder and retrying)retriesr  r  rd   r  bldpkgs_dirsr  disable_pipmax_env_retryr  r  z4Failed to get install actions, max retries exceeded.)ZpipZ
setuptoolsZwheelc             3   s"   | ]}t d   t|V  qdS )z^%s(?:$|[\s=].*)N)r   r   r?   )ro   Zdep)pkgr2   r3   rq     s    c                s   g | ]}|j  kr|qS r2   )r   )ro   r  )r  r2   r3   r     s    z'get_install_actions.<locals>.<listcomp>LINK).r   rQ   rR   loggingWARNlistextendr   
contextlibcontextmanagerDEBUGcapturer    r  r#   r!   tuplecached_actionslast_index_tsrP   LoggingContextr   r   r   r   
SystemExitr   r   r   r|   r   r?   r   rW   get_conda_operation_lockstry_acquire_locksrN   r`   rr   r   rb   rm_rfget_install_actionsrk   rz   trim_empty_keys)r   r  rI   r  r  r  rd   r  r  r  r  r  r  r  actionsrG   conda_log_levelr"  Zfeaturerp   indexZindex_tsr   exclockspkg_dirr   r2   )r  r3   r+    s    








(
 
r+  c
             C   s
  |j rttj}
nttj}
tj| rRx$t	tj
| dD ]}t| q@W |
 tt}|r| d|  | t| |st|}y<tj||jd t|dstt|}t| t||||j|j |jt|j|j|j|j|jt|jd}n|}t||j|j|j|j |j|j|jd\}}}t | |jrPt!|| tj"rx&tj#$ D ]\}}t|tj#|< qdW t%d|j t&, t%d|j t& t'|| W d	Q R X W d	Q R X W d	Q R X W n t(t)t*t+t,t-fk
r } z d
t|kst./dt|st0|t)r|j1dkr|j2r|3d|j1 |3d |3t| |3d |3d |3d d|_1d| k}|r|j4n|j5} | |d< t6| ||||||d n n2dt|kr||jk r|3dt| t6| ||||||d |d ndt|ks dt|krtj||jdn t|}d}x6tj7|t8krt|dk rttj7|}|d7 }q@W |3d| tj9|rt| W d	Q R X ||jk r|3dt| t6| ||||||d |d n|:d  n W d	d	}~X Y n t;t<t=t>t?fk
r } zt0|t;r~tj||jdB tj7tj7t|}|3d| tj9|rtt| W d	Q R X ||jk r|3dt| t6| ||||||d |d n|:d  W d	d	}~X Y nX W d	Q R X |	stj"rd}nd }t@| tAjB| d	S )!zD
    Create a conda envrionment for the given prefix and specs.
    *zCreating environment in %s)r  r   )
r  r  rd   r  r  r  r  r  r  r  )r  bldpkgs_dirr  r  rd   r  r  r  ZCONDA_QUIETZ
CONDA_JSONNztoo short inz-post-link failed for: (?:[a-zA-Z]*::)?opensslP   z)Build prefix failed with prefix length %dzError was: zYOne or more of your package dependencies needs to be rebuilt with a longer prefix length.z6Falling back to legacy prefix length of 80 characters.z<Your package will not install into prefixes > 80 characters.Z_h_envr   )r1   r  rI   clear_cacher   r  z2failed to create env, retrying.  exception was: %sr   )r1   r  rI   r6  retryr   z requires a minimum conda versionzlink a source that does notr   r  zZI think conda ended up with a partial extraction for %s.  Removing the folder and retryingz+Failed to create env, max retries exceeded.zcmd.exeZbash)Crd   r   r&  r  r!  r  rN   r`   ra   r   r   r*  rQ   rR   r?   r(  r)  r  r8   r  setr+  r#  r  r  r  r  r  r  r  r!   r4  r,  r   r   rO   r   r%   r   r   r'  r   r   r   r   r   r   searchrW   Zprefix_lengthZprefix_length_fallbackr   rB   r   
create_envrr   r   rb   rk   r|   IOError
ValueErrorRuntimeErrorr   r   rY   r   )r   Zspecs_or_actionsrI   r1   r  r6  r7  r1  r   Zis_condaZexternal_logger_contextentryrG   r  r-  r/  r   r   r   r0  r   r2  r   r   r2   r2   r3   r:  %  s    



.






r:  c                s    fdd| D S )Nc                s   g | ]}t j| jd qS ))r  )r   Zget_lockr  )ro   r   )r1   r2   r3   r     s    z&get_pkg_dirs_locks.<locals>.<listcomp>r2   )dirsr1   r2   )r1   r3   get_pkg_dirs_locks  s    r@  c          	   C   s   |j rt| |ng }tj||jdb xZ| D ]R}xL|D ]D}|g}tj|sbttj	||d }x|D ]}t
| qhW q6W q,W W d Q R X d S )N)r  r3  )r  r@  r   r)  r  rN   r`   isabsr   r   r*  )r?  Zfnsr1   r1  r   fnZ	all_filesr>  r2   r2   r3   remove_existing_packages  s    


rC  c       
   
      s:  g }t j}|jrt j}t| t|jgt |}tj	||j
d d d g}t| xtD ]}tjtj| stjtj| d stdd  d  gD rjtt}|d  |d	 t } fd
d| D }x|D ]}	|	|kr||	= qW qjW W d Q R X tt g| W d Q R X d S )N)r  zRM_EXTRACTED {0} local::{0}zRM_FETCHED {0} local::{0}z.tar.bz2c             s   s   | ]}|t  kV  qd S )N)r   )ro   pkg_idr2   r2   r3   rq     s    z"clean_pkg_cache.<locals>.<genexpr>zlocal::z>Conda caching error: %s package remains in cache after removalzmanually removing to compensatec                s   g | ]} |kr|qS r2   r2   )ro   r   )distr2   r3   r     s    z#clean_pkg_cache.<locals>.<listcomp>)r  r  rd   r!  r   r&  r@  r4  r   r)  r  ry   r   rN   r`   ra   r   rz   rQ   rR   r   r   rC  )
rE  r1   r1  r.  Zrmplanr   rG   cacher   rD  r2   )rE  r3   clean_pkg_cache  s0    



rG  c             C   s   t ddb}t|t| ||| jj| jj| jj| jjt| jj	| jj
| jj| jj| jjt| jjd}W d Q R X dd |dg D }|S )Nr   )r   )
r  rd   r  r  r  r  r  r  r  r  c             S   s    g | ]}d  |jddqS ) rn   r-   )r   Z	dist_namert   )ro   linkr2   r2   r3   r     s    z#get_pinned_deps.<locals>.<listcomp>r  )r   r+  r#  r   r1   Ztarget_subdirrd   r  r  r  r  r  r  r  r  r/   )r   ZsectionZtmpdirr-  Zruntime_depsr2   r2   r3   get_pinned_deps  s    
rJ  )FrD   )NTFF)F)r   NTFTNr
  Fr;   NN)Tr   NFF)aZ
__future__r   r   r   r  r   r  r   rN   r]   r   r[   rY   r   r   os.pathr   r   Zconda_interfacer	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zconda_buildr   Zconda_build.exceptionsr   r   Zconda_build.featuresr    Zconda_build.indexr!   Zconda_build.os_utilsr"   Zconda_build.utilsr#   r$   r%   Zconda_build.variantsr&   r   r   r4   r6   r:   r<   r@   rC   rl   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	Exceptionr   r   r   objectr   r$  r%  r+  r:  r@  rC  rG  rJ  r2   r2   r2   r3   <module>   s    	 S?
$
D6!    
[ 
 &