B
    XM\.–  ã            	   @   sö  d dl mZmZmZ d dlmZmZ d dlmZ d dl	Z	d dl
Z
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mZmZmZmZ ddlmZ dd	lmZ dd
lmZ ddlm Z  ddlm!Z! d dl"m#Z#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. d dl/m0Z0 d dl1m2Z2 yd dl3m4Z4 W n( e5k
r„   d dl3m6Z6 e6fZ4Y nX dd„ Z7e 8e9ej:j;j<¡ e 8e=ej:j;j<¡ e 8ee7¡ dd„ Z>dd„ Z?dd„ Z@dSdd„ZAd d!„ ZBd"d#„ ZCd$d%„ ZDdTd&d'„ZEe!d(d)„ ƒZFdUd*d+„ZGd,d-„ ZHd.d/„ ZId0d1„ ZJd2d3„ ZKdVd4d5„ZLdWd6d7„ZMd8d9„ ZNdXd:d;„ZOd<d=„ ZPdYd>d?„ZQd@dAdBdCdDdEdFdGdHg	ZRG dIdJ„ dJeSƒZTdKdL„ ZUdMdN„ ZVG dOdP„ dPejWƒZXe 8eTeU¡ erÜe 8eYeV¡ dZZne 8eZeV¡ dZdQdR„Z[dS )[é    )Úabsolute_importÚdivisionÚprint_function)ÚOrderedDictÚdefaultdict)ÚgetpreferredencodingN)ÚisdirÚisfileÚabspathé   )ÚPY3ÚUnsatisfiableErrorÚProgressiveFetchExtractÚTemporaryDirectory)Úexecute_actions)Ú	pkgs_dirs)Úconda_43)Úspecs_from_url)Úmemoized)Ú
exceptionsÚutilsÚenviron)ÚMetaDataÚ&combine_top_level_metadata_with_output)Úget_package_variantsÚlist_of_dicts_to_dict_of_listsÚfilter_by_key_value)ÚDependencyNeedsBuildingError)Úget_build_index)ÚCONDA_TARBALL_EXTENSIONS)ÚCONDA_TARBALL_EXTENSIONc             C   s   |   | ¡ ¡S )N)Zrepresent_dictÚitems)ÚdumperÚdata© r$   ú1lib/python3.7/site-packages/conda_build/render.pyÚodict_representer1   s    r&   c             C   sx   | j s| jrdn| jj}t| dƒr,| jdkrRtj | jj	|d|  
¡ td f ¡}n"d | j|  ¡ tj | jj	|¡¡}|S )zI
    Returns path to built package's tarball given its ``Metadata``.
    ÚnoarchÚtypeZcondaz%s%sr   z{} file for {} in: {})r'   Únoarch_pythonÚconfigÚhost_subdirÚhasattrr(   ÚosÚpathÚjoinÚoutput_folderÚdistr   ÚformatÚname)ÚmÚsubdirr.   r$   r$   r%   Úbldpkg_path:   s
    &"r6   c                s<   g }t rdd„ ‰ ndd„ ‰ d| kr8‡ fdd„| d D ƒ}|S )Nc             S   s   | j S )N)Ú	dist_name)Úxr$   r$   r%   Ú<lambda>J   s    z!actions_to_pins.<locals>.<lambda>c             S   s   | S )Nr$   )r8   r$   r$   r%   r9   L   s    ÚLINKc                s*   g | ]"}d   ˆ |ƒ ¡ d  dd¡¡‘qS )ú r   ú-é   )r/   ÚsplitÚrsplit)Ú.0Úspec)Ú	spec_namer$   r%   ú
<listcomp>N   s    z#actions_to_pins.<locals>.<listcomp>)r   )ÚactionsÚspecsr$   )rB   r%   Úactions_to_pinsG   s    
rF   c          	   C   s  g }g }g }t  d¡}xâ|D ]Ú}|r.| |¡sâd}	| ¡ d }
x@|  d¡D ]2}| d¡}||
krJ| d ||  ¡ f¡¡ d}	qJW |	sŽ| |¡ xf| 	¡ D ]D\}}| 
d|¡| 
d|
¡kr˜t  d	|
 |¡s˜| d |
|f¡¡ q˜W q| |¡r| |¡ qW |||fS )
Nz[-_]Fr   Úoutputsr3   r;   TÚ z%s\s+[0-9a-zA-Z\_\.\<\>\=\*])ÚreÚcompileÚmatchr>   Zget_sectionÚgetÚappendr/   Úversionr!   ÚsubÚsearch)r4   rE   Úexclude_patternÚvariantÚsubpackagesÚdependenciesÚpass_through_depsZdash_or_underrA   Zis_subpackagerB   Úentryr3   ÚkeyÚvaluer$   r$   r%   Ú_categorize_depsR   s,    




rY   FTc             C   sª  |   |¡}|dkrdg }xH|D ]@}d|krR| ¡ d }	| d |	| |	d¡f¡¡ q| |¡ qW |}t| |||ƒ\}
}}t|ƒ}d }d dd„ tdƒD ƒ¡}td	|d
Ä}yft	j
|t|ƒ|t| jd |¡ƒ| jj| jj| jjt| jjƒ| jj| jj| jj| jjt| jjƒd}W nV ttfk
rf } z2t|dƒrBd |j¡}n|j}|rTi }n‚ W d d }~X Y nX W d Q R X t|ƒ}t ||
 | p | j  di ¡ |g ¡¡||fS )N)ÚbuildÚhostz x.xr   r;   rH   c             s   s    | ]}t  tjtj ¡V  qd S )N)ÚrandomZchoiceÚstringZascii_uppercaseZdigits)r@   Ú_r$   r$   r%   ú	<genexpr>   s   z'get_env_dependencies.<locals>.<genexpr>é
   r^   )ÚprefixÚsuffixz	{}_subdir)
r5   ÚdebugÚverboseÚlockingÚbldpkgs_dirsÚtimeoutÚdisable_pipÚmax_env_retryr0   Úchannel_urlsÚpackagesz, Úrequirements)!Zget_depends_top_and_outr>   rM   r/   rL   rY   ÚsetÚranger   r   Zget_install_actionsÚtupleÚgetattrr*   r2   rc   rd   re   rf   rg   rh   ri   r0   rj   r   r   r,   rk   ÚmessagerF   r   Úensure_listÚmeta)r4   ÚenvrR   rQ   Úpermit_unsatisfiable_variantsZ!merge_build_host_on_same_platformrE   Zno_xx_specsrA   Úpkg_namerS   rT   rU   ÚunsatZrandom_stringZtmpdirrD   Úer$   r$   r%   Úget_env_dependenciesn   sL    



ry   c             C   s,   t | dƒr|  ¡ } d| kr(|  d¡d } | S )NÚdecodeú:z::éÿÿÿÿ)r,   rz   r>   )Zspec_strr$   r$   r%   Ústrip_channel¡   s
    
r}   c       	      C   s  |  ¡ }|d }d}t|ƒdkr(|d }d }| |¡pB| jj |¡}|r¶|| jj di ¡kr¶|dkrp| js¶| js¶||kr¶| jjd | }t|tƒržt	||d}t
j|  ¡ d f|Ž}n<| d¡ròd	|krò| |¡sÚtd
ƒ‚t
j|  ¡ d d	d	d}|rd |||f¡ ¡ }|S )Nr   rH   é   r=   Úpin_run_as_buildÚpython)Úmin_pinÚmax_pinÚnumpyzx.xz9numpy x.x specified, but numpy not in build requirements.r;   )r>   ÚlenrL   r*   rR   r'   r)   Ú
isinstanceÚstrÚdictr   Zapply_pin_expressionsÚ
startswithÚ
ValueErrorr/   Ústrip)	r4   ÚdepZbuild_dep_versionsZ	dep_splitZdep_namerZ   ÚpinrN   Zpin_cfgr$   r$   r%   Úget_pin_from_build©   s*    

r   c                sj   i }x`|   ¡ D ]T\}}xJ|D ]B‰ tˆ dƒr2ˆ  ¡ ‰ t‡ fdd„|D ƒƒs| |g ¡ˆ g ||< qW qW |S )Nrz   c             3   s,   | ]$}|d kp"ˆ |kp"ˆ   |d ¡V  qdS )Ú*r;   N)rˆ   )r@   Zignore_spec)rA   r$   r%   r_   È   s   z&_filter_run_exports.<locals>.<genexpr>)r!   r,   rz   ÚanyrL   )rE   Úignore_listZfiltered_specsZagentZ
specs_listr$   )rA   r%   Ú_filter_run_exportsÂ   s    


r‘   c          
   C   s  t t|jjƒ }d }xì|D ]ä}tj || ¡}tj || td  ¡}|sZtj |¡rZ|}P qtj 	|¡rn|}P q|rtj |¡r|}t
 |d¡2}x*t |¡D ]}	|jtj ||	¡|	d qœW W d Q R X tj |jj|jj¡}
tj |
tj |¡¡}t ||¡ qW |S )Nr   zw:bz2)Zarcname)r   Úlistr*   rf   r-   r.   r/   r   r   r	   ÚtarfileÚopenÚlistdirÚaddZcrootr+   ÚbasenameÚshutilZmove)Úpkg_distr4   Ú
files_onlyZ
_pkgs_dirsÚpkg_locZpkgs_dirÚpkg_dirZpkg_fileÚarchiverV   Z
pkg_subdirr$   r$   r%   Ú!find_pkg_dir_or_file_in_pkgs_dirsÎ   s(    
&rž   c       
   	   C   s¸  i }| rÀt j | ¡rÀt j | d¡}t j |¡rZt|ƒ}ddd„ | ¡ D ƒi}W d Q R X nft j |d ¡rŽt|d ƒ}t |¡}W d Q R X n2t j |d ¡rÀt|d ƒ}t	 
|¡}W d Q R X |s´t j | ¡r´t | d¡}t | d¡}t|d	ƒr| d
¡}|rt	 |¡}n |r&t |¡}nŽt | d¡}|r´tƒ }t|d	ƒrT| d
¡}xN| ¡ D ]B}	t|	d	ƒrx|	 d
¡}	|	 | dd¡d ¡s^| |	 ¡ ¡ q^W dtt|ƒƒi}|S )Nzinfo/run_exportsÚweakc             S   s   g | ]}|  ¡ ‘qS r$   )Úrstrip)r@   rA   r$   r$   r%   rC   í   s    z,_read_specs_from_package.<locals>.<listcomp>z.yamlz.jsonzinfo/run_exports.yamlzinfo/run_exports.jsonrz   zutf-8r<   r=   r   )r-   r.   r   r/   r	   r”   Ú	readlinesÚyamlZ	safe_loadÚjsonÚloadr   Zpackage_has_filer,   rz   Úloadsrm   Ú
splitlinesrˆ   r?   r–   r    Úsortedr’   )
r›   r™   rE   Zdownstream_fileÚfZ
specs_yamlZ
specs_jsonZlegacy_specsZ
weak_specsrA   r$   r$   r%   Ú_read_specs_from_packageæ   sB    
"


r©   c          
      sö  t t| jd |¡ƒ| jj| jj| jj| jj| jj| jj	| jj
d\}}}d|ksXd|krjt||| jjd i }| dg ¡}t |¡}tƒ }	|rîxZ|D ]R}
t|
dƒr¶|
|kræ|	 |
¡ q”|
 ¡ d }x"|D ]}||jkrÈ|	 |¡ P qÈW q”W |	}x |D ]ø}
t|
d	ƒr|
j‰ nt|
ƒ}
|
 d
¡d ‰ tˆ | |d}|sâtrây*‡ fdd„|D ƒd }t|| fd}W n$ tk
rŒ   t|
g|d}Y nX t ¡  | ¡  W d Q R X x6tD ].}tj |||
 j ¡}tj !|¡r°|}P q°W |ˆ f||
< qöW |S )Nz	{}_subdir)Úbldpkgs_dirr0   rj   rc   rd   re   rg   ZFETCHZEXTRACT)rd   r:   r3   r   r7   r;   )rš   c                s   g | ]}|j ˆ kr|‘qS r$   )r7   )r@   r^   )r™   r$   r%   rC   ;  s    z,execute_download_actions.<locals>.<listcomp>)Z
link_prefs)Z
link_distsÚindex)"r   rp   r*   r2   rª   r0   rj   rc   rd   re   rg   r   rL   r   rr   rm   r,   r–   r>   r3   r7   r}   rž   r   r   Ú	TypeErrorZLoggingContextZexecuter   r-   r.   r/   Úfnr	   )r4   rD   rt   Úpackage_subsetZrequire_filesr«   r^   Z	pkg_filesrk   Zselected_packagesÚpkgrv   Zlink_pkgr›   Z
pkg_recordZpferœ   Z_locr$   )r™   r%   Úexecute_download_actions  sT    








r°   c                s¤   | j  di ¡ |g ¡}|r(dd„ |D ƒng ‰ | dg ¡}‡ fdd„|D ƒ}t| |||d}t |  d¡¡}i }x0| ¡ D ]$\}}	t||	ƒ}
t |t	|
|ƒ¡}qxW |S )z’Download packages from specs, then inspect each downloaded package for additional
    downstream dependency specs.  Return these additional specs.rl   c             S   s   g | ]}|  d ¡d ‘qS )r;   r   )r>   )r@   Zreqr$   r$   r%   rC   S  s    z%get_upstream_pins.<locals>.<listcomp>r:   c                s   g | ]}|j ˆ kr|‘qS r$   )r3   )r@   r¯   )Úexplicit_specsr$   r%   rC   U  s    )rt   r®   zbuild/ignore_run_exports)
rs   rL   r°   r   rr   Ú	get_valueÚvaluesr©   Zmerge_dicts_of_listsr‘   )r4   rD   rt   Z	env_specsZlinked_packagesZpkg_locs_and_distsr   Zadditional_specsZlocr1   rE   r$   )r±   r%   Úget_upstream_pinsN  s    
r´   c             C   sP   t | || jj||d\}}}t| ||ƒ}tt|ƒƒpH| j di ¡ |g ¡||fS )N)ru   rl   )ry   r*   rR   r´   r’   rm   rs   rL   )r4   rt   ru   rQ   ÚdepsrD   rw   Úextra_run_specsr$   r$   r%   Ú_read_upstream_pin_filesd  s
    r·   c                s²  ˆ j  di ¡}tˆ d||ƒ\}}}ˆ jrðt ˆ  d¡¡}ˆ j  di ¡}||d< |s ‡ fdd„ˆ j  dg ¡D ƒ}|r t |d  di ¡¡}||d d< | dg ¡}| 	| d	g ¡¡ tˆ d||ƒ\}	}
}t
| d	g ¡| d
g ¡ | d	g ¡ ƒ}n`g }	g }
t
| d	g ¡ƒ}ˆ jr@| | d
g ¡¡ t
|p,g ƒ | d
g ¡¡}nt
| d	g ¡ƒ}	|t
t | d¡¡ƒB }x6d|fd|	fd|ffD ]\}}|r€t|ƒ||< q€W |ˆ j d< ||
fS )z@Applies run_exports from any build deps to host and run sectionsrl   rZ   zrequirements/hostr[   c                s"   g | ]}|  d ¡ˆ  ¡ kr|‘qS )r3   )rL   r3   )r@   Úout)r4   r$   r%   rC     s    z%add_upstream_pins.<locals>.<listcomp>rG   r   ZstrongrŸ   Úrun)rs   rL   r·   Úis_crossr   rr   r²   Ú
setdefaultÚexpand_reqsÚextendrm   Zbuild_is_hostÚupdater’   )r4   ru   rQ   rl   Z
build_depsÚbuild_unsatZextra_run_specs_from_buildZ	host_reqsZmatching_outputZ	host_depsÚ
host_unsatZextra_run_specs_from_hostr¶   Úrun_depsÚsectionrµ   r$   )r4   r%   Úadd_upstream_pinsn  s@     
rÃ   c       
   	      s¨  | j  di ¡}xˆdD ]~}t | |g ¡¡}ttƒ}xT|D ]L}t |¡ ¡ }|d ‰t|ƒdkrz|ˆ  	|dd… ¡ q<|ˆ  	g ¡ q<W g }xð| 
¡ D ]ä\‰}g ‰ xP|D ]H}t|ƒdkr¬|dd… \‰}	t‡fdd„d	D ƒƒs¬d
|	ks¬ˆ  	|¡ q¬W t|ƒdkrt|ƒs| 	ˆ¡ qšˆ rft‡ fdd„ˆ D ƒƒsJtd ˆ ¡ƒ‚n| 	d ˆgˆ d  ¡¡ qš| ‡fdd„|D ƒ¡ qšW ||kr|r|||< qW || j d< dS )zr
    For metapackages that are pinned exactly, we want to bypass all dependencies that may
    be less exact.
    rl   )rZ   r[   r¹   r   r   Nr=   c             3   s   | ]}|ˆ kV  qd S )Nr$   )r@   Úc)rN   r$   r%   r_   ¹  s    z1_simplify_to_exact_constraints.<locals>.<genexpr>)ú>ú<rŽ   rŽ   c             3   s   | ]}|ˆ d  kV  qdS )r   Nr$   )r@   rŒ   )Ú
exact_pinsr$   r%   r_   ¾  s    zConflicting exact pins: {}r;   c             3   s"   | ]}|rd   ˆ g| ¡V  qdS )r;   N)r/   )r@   r‹   )r3   r$   r%   r_   Ã  s    )rs   rL   r   rr   r   r’   Úensure_valid_specr>   r„   rM   r!   r   Úallr‰   r2   r/   r½   )
Úmetadatarl   rÂ   rµ   Z	deps_dictr‹   Z
spec_partsZ	deps_listr³   rZ   r$   )rÇ   r3   rN   r%   Ú_simplify_to_exact_constraints¡  s8    

rË   c                sº  |sˆ}ˆ  ¡ r"ˆ ¡ }d|_n”d}tˆjj dg ¡ƒ}x.ˆjj di ¡ ¡ D ]}||krP| |¡ qPW tƒ }t	ˆdƒr’tdd„ ˆj
 ¡ D ƒƒ}|sš|r¸t d d	d„ ||B D ƒ¡¡}ˆj d
i ¡ di ¡}| ¡ }ˆjj|j_| ˆ ¡ ¡}	|	rTd|	ks
d|	krdˆ ¡ i}	|r.|d ˆ ¡ kr8tˆ|	ƒ t |	 di ¡¡}
|
ˆjd< ˆj d¡r’t ˆjd ˆjjd¡ t ˆjd ˆjjd¡ | ˆ ˆ ¡ ¡¡‰tˆ||ƒ\}}ˆj di ¡}
|rät d dd„ |D ƒ¡¡}ˆjrðdnd}|
 |g ¡}|r6d|kr6| d ˆjjd ¡¡ |ˆjd |< tˆ|ˆjj||d\}}}dd„ |D ƒ‰ tˆjƒr†|
 d¡s†tˆjƒ|
d< |
 dg ¡}‡ ‡fdd„|D ƒ}dd„ |D ƒ}||
|< ||
d< |
ˆjd< ˆ ¡  ˆjdkrøt  !ˆd¡ˆjd d< ˆ "d¡}|r<t#‡ ‡fdd„|D ƒƒ}dd„ |D ƒ}|ˆjd  d!< ˆj d
i ¡}ˆjj$|d"< |ˆjd
< ˆj d#¡r2d$ˆjd# kr2ˆjd# d$ }t%j& '|¡ t%j& (|¡sÊt%j& )t%j& ˆj&|¡¡ˆjd# d$< nhd%ˆjd# kr2t%j& (ˆjd# d% ¡s2d&ˆjd# d% ks2t%j& )t%j& ˆj&ˆjd# d% ¡¡ˆjd# d%< ˆj d¡sJi ˆjd< t*ˆƒ |s^|r°d'ˆ_t +t,¡}| -d( ˆ .¡ ¡¡ |r˜| -d) |¡¡ |r¶| -d* |¡¡ ndˆ_ˆS )+zEFully render a recipe.  Fill in versions for build/host dependencies.TNZignore_versionr   Úother_outputsc             s   s   | ]\}}|V  qd S )Nr$   )r@   r3   rR   r$   r$   r%   r_   Û  s    z$finalize_metadata.<locals>.<genexpr>ú|c             s   s   | ]}d   |¡V  qdS )z(?:^{}(?:\s|$|\Z))N)r2   )r@   Úexcr$   r$   r%   r_   Þ  s   ÚextraÚparent_recipeÚpackager3   rl   rZ   r[   c             s   s   | ]}d   |¡V  qdS )z(?:^{}(?:\s|$|\Z))N)r2   )r@   rÎ   r$   r$   r%   r_     s   r€   z	python {})rQ   ru   c             S   s,   i | ]$}d   | ¡ dd… ¡| ¡ d “qS )r;   r   Nr   )r/   r>   )r@   r‹   r$   r$   r%   ú
<dictcomp>  s   z%finalize_metadata.<locals>.<dictcomp>r¹   c                s   g | ]}t ˆ|ˆ ƒ‘qS r$   )r   )r@   r‹   )Úfull_build_dep_versionsr4   r$   r%   rC   %  s   z%finalize_metadata.<locals>.<listcomp>c             S   s   g | ]}t j|d d‘qS )T)Úwarn)r   rÈ   )r@   rA   r$   r$   r%   rC   '  s   Ústrictztest/requiresc                s   h | ]}t ˆ|ˆ ƒ’qS r$   )r   )r@   r‹   )rÓ   r4   r$   r%   ú	<setcomp>6  s   z$finalize_metadata.<locals>.<setcomp>c             S   s   g | ]}t j|d d‘qS )T)rÔ   )r   rÈ   )r@   rA   r$   r$   r%   rC   8  s   ÚtestZrequiresÚcopy_test_source_filesÚsourcer.   Zgit_urlr{   FzNReturning non-final recipe for {}; one or more dependencies was unsatisfiable:z	Build: {}zHost: {})/ÚskipÚcopyÚfinalrm   r*   rR   rL   ÚkeysÚremover,   rÌ   rI   rJ   r/   rs   Zget_rendered_outputr3   r   r   r¼   Zinsert_variant_versionsZget_output_metadatarÃ   rº   rM   r2   ry   r	   Zrequirements_pathr   Zappend_requirementsZpin_dependsr   Zget_pinned_depsr²   r’   rØ   r-   r.   Ú
expanduserÚisabsÚnormpathrË   Z
get_loggerÚ__name__rÔ   r1   )r4   Zparent_metadataru   Úrendered_metadatarQ   ZexcludesrW   Zoutput_excludesrÐ   Úoutputrl   r¿   rÀ   Zpinning_envZ
build_reqsZfull_build_depsr^   rÁ   Zversioned_run_depsZ	test_depsZversioned_test_depsrÏ   Úsource_pathÚlogr$   )rÓ   r4   r%   Úfinalize_metadataÉ  sÊ    








&

rç   c          
   C   sz   | j sV|sVyt | ¡ W n< tjk
rT } ztdƒ tdƒ t|ƒ W d d }~X Y nX | j sv|rjtdƒ‚n|rvtdƒ‚d S )NzgWarning: failed to download source.  If building, will try again after downloading recipe dependencies.zError was: zno_download_source specified, but can't fully render recipe without downloading source.  Please fix the recipe, or don't use no_download_source.zBFailed to download or patch source. Please see build log for info.)Úsource_providedrÙ   ÚprovideÚ
subprocessZCalledProcessErrorÚprintr‰   ÚRuntimeError)rÊ   Úno_download_sourceZraise_errorÚerrorr$   r$   r%   Útry_downloadd  s    

rï   c             C   sx   d| _ tj d| jj¡ tj d| jj¡ d | jjd  	d¡dd… ¡}tj dt
 | jj|¡¡ |  ¡  t| ƒ} | S )zcSome things need to be parsed again after the build environment has been created
    and activated.Fr   Ú.r€   Nr=   )rÜ   Úsysr.   Úinsertr*   Zbuild_prefixZhost_prefixr/   rR   r>   r   Zget_site_packagesÚparse_until_resolvedrç   )rÊ   Zpy_verr$   r$   r%   Úreparsey  s     rô   c          	      sn  i }d}| j s| jr*t|d|d d dƒ}|| j_|| j_|  ¡ }|  ¡ }|| }	trjt	|	dƒrj|	 
¡ }	nts€t	|	dƒr€|	 ¡ }	|d | j_| jdd}
|  |
¡}x¼|D ]²}|  ¡ ‰ |ˆ j_| d	i ¡}ˆ jrèd
|krèdddœ|d
< i }x|
D ]}|| ||< qòW x6| ¡ D ]*\}}tˆ jj||dƒp2ˆ jjˆ j_qW | d	i ¡}ˆ jrjd
|krjdddœ|d
< g }x$ˆ jjD ]}||d	< | |¡ qxW |ˆ j_tˆ jjƒˆ j_ˆ jräˆ jräˆ  ¡  t ˆ jj¡ t ˆ ¡ ˆ  ¡  yˆ j||d W n tk
r   Y nX ˆ j pˆ j  }ˆ |d f|ˆ  !¡ ˆ jj dˆ jj"¡t#‡ fdd„ˆ  $¡ D ƒƒf< qªW t%| &¡ ƒS )NTr€   r   Znoarch_reductionrz   ÚencodeF)Zforce_globalr   rƒ   zx.x)r   r‚   Zdistribute_variants_reduction)Úallow_no_other_outputsÚbypass_env_checkZtarget_platformc             3   s    | ]}|ˆ j j |¡fV  qd S )N)r*   rR   rL   )r@   Úvar)Úmvr$   r%   r_   Ñ  s   z&distribute_variants.<locals>.<genexpr>)'r'   r)   r   r*   ÚvariantsZinput_variantsZextract_requirements_textZextract_package_and_build_textr   r,   rz   rõ   rR   Zget_used_loop_varsZget_reduced_variant_setrÛ   rL   Znumpy_xxr!   rM   r   Zsquished_variantsÚneeds_source_for_renderZvariant_in_sourceZparse_againr   Úrm_rfZwork_dirrÙ   ré   ró   Ú
SystemExitrè   r1   r5   ro   Zget_used_varsr’   r³   )rÊ   rú   ru   rö   r÷   rã   Zneed_source_downloadZrecipe_requirementsZrecipe_package_and_build_textZrecipe_textZused_variablesZtop_looprR   r   Zconform_dictrW   r³   Znumpy_pinned_variantsZ_variantr$   )rù   r%   Údistribute_variants†  sh    



Brþ   c             C   sT   t ƒ }x@| D ]8\}}}x,| ¡ jddD ]\}}||f|| ¡ < q(W qW t| ¡ ƒS )zVObtain all metadata objects for all outputs from recipe.  Useful for outputting paths.F)ru   )r   rÛ   Zget_output_metadata_setr1   r’   r³   )Zmetadata_tuplesZexpanded_outputsÚ_mZdownloadrô   Zoutput_dictr4   r$   r$   r%   Úexpand_outputsÚ  s
    r   c          
   C   sì  | }t s| tƒ pd¡}t|ƒr†| d¡rXt ¡ }t |d¡}	|	j	|d |	 
¡  d}
q’| d¡rttj |¡}d}
q’td| ƒ d	S nt|ƒ}d}
t|ƒs¨t d
| ¡ yt||d}W n> tjk
rö } ztj | ¡ ¡ t d¡ W dd}~X Y nX i }|jr|jj| ¡ |d |jr4|js4t||d |j rºt!|jdƒrT|jj"s¬d|j_#tj tj $|jd¡¡rŒtj $|jd¡g|j_%t&||d|j_'|jj'd |j_"|ddfg}nt&||d}t(|||d|d}|
rèt) *|¡ |S )zïReturns a list of tuples, each consisting of

    (metadata-object, needs_download, needs_render_in_env)

    You get one tuple per variant.  Outputs are not factored in here (subpackages won't affect these
    results returned here.)
    zutf-8)z.tarz.tar.gzz.tgzz.tar.bz2zr:*)r.   Tz.yamlFzIgnoring non-recipe: %s)NNzError: no such directory: %s)r*   r   N)Úreset)rí   rú   zconda_build_config.yaml)rú   r   )ru   rö   r÷   )+r   rz   r   r	   ÚendswithÚtempfileZmkdtempr“   r”   Z
extractallÚcloser-   r.   Údirnamerë   r
   r   rñ   Úexitr   r   ZYamlParsingErrorÚstderrÚwriteZ	error_msgZset_build_idr*   Zcompute_build_idr3   rû   rè   rï   rÜ   r,   rR   Zignore_system_variantsr/   Zvariant_config_filesr   rú   rþ   r   rü   )Zrecipe_pathr*   rí   rú   ru   Zreset_build_idr÷   ÚargZ
recipe_dirÚtZneed_cleanupr4   rx   rã   r$   r$   r%   Úrender_recipeä  sX    	



r  rÑ   rÙ   rZ   rl   r×   ZapprG   ZaboutrÏ   c               @   s   e Zd ZeZdd„ ZdS )Ú	_MetaYamlc                s   ‡ fdd„t jD ƒS )Nc                s    g | ]}|ˆ kr|ˆ | f‘qS r$   r$   )r@   Zfield)Úselfr$   r%   rC   9  s    z%_MetaYaml.to_omap.<locals>.<listcomp>)r  Úfields)r  r$   )r  r%   Úto_omap8  s    z_MetaYaml.to_omapN)râ   Ú
__module__Ú__qualname__ÚFIELDSr  r  r$   r$   r$   r%   r  5  s   r  c             C   s   |   d| ¡ ¡S )Nztag:yaml.org,2002:map)Zrepresent_mappingr  )r"   r#   r$   r$   r%   Ú_represent_omap<  s    r  c             C   s   t jd|d}|S )Nztag:yaml.org,2002:str)ÚtagrX   )r¢   Z
ScalarNode)r"   ZuniZnoder$   r$   r%   Ú_unicode_representer@  s    r  c                   s&   e Zd Zd‡ fdd„	Zdd„ Z‡  ZS )Ú_IndentDumperFc                s   t t| ƒ |d¡S )NF)Úsuperr  Úincrease_indent)r  ZflowZ
indentless)Ú	__class__r$   r%   r  F  s    z_IndentDumper.increase_indentc             C   s   dS )NTr$   )r  r#   r$   r$   r%   Úignore_aliasesI  s    z_IndentDumper.ignore_aliases)FF)râ   r  r  r  r  Ú__classcell__r$   r$   )r  r%   r  E  s   r  c          	      s¾   |   ¡ }t |j¡ |r0|jr0d|jkr0|jd= tjt|jƒtddd}ˆ r¶t	‡ fdd„dD ƒƒrŽyt
 t
j ˆ ¡¡ W n tk
rŒ   Y nX tˆ dƒ}| |¡ W d Q R X d	ˆ  S |S d S )
NrG   Fé   )ÚDumperZdefault_flow_styleÚindentc             3   s   | ]}|ˆ kV  qd S )Nr$   )r@   Úsep)Úfilenamer$   r%   r_   ]  s    zoutput_yaml.<locals>.<genexpr>)ú\ú/ÚwzWrote yaml to %s)rÛ   r   Ztrim_empty_keysrs   Z	is_outputr¢   Údumpr  r  r   r-   Úmakedirsr.   r  ÚOSErrorr”   r  )rÊ   r   Zsuppress_outputsZlocal_metadatarä   r¨   r$   )r   r%   Úoutput_yamlU  s     
r'  )NFT)F)NF)NF)F)FFF)FNTTF)NF)\Z
__future__r   r   r   Úcollectionsr   r   Zlocaler   r£   r-   Úos.pathr   r	   r
   r\   rI   r˜   r]   rê   rñ   r“   r  r¢   Zconda_interfacer   r   r   r   r   r   r   r   r   Zconda_buildr   r   r   Zconda_build.metadatar   r   Zconda_build.sourcerÙ   Zconda_build.variantsr   r   r   Zconda_build.exceptionsr   Zconda_build.indexr   Zconda.base.constantsr   Ú	Exceptionr    r&   Zadd_representerrm   ZrepresenterZSafeRepresenterZrepresent_listro   r6   rF   rY   ry   r}   r   r‘   rž   r©   r°   r´   r·   rÃ   rË   rç   rï   rô   rþ   r   r  r  r‡   r  r  r  r  r  r†   Zunicoder'  r$   r$   r$   r%   Ú<module>   sŽ     
1
*
>
3(
 
 
S
 
K