B
    lz]U              
   @   sF  d 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
Z
ddl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mZ ddlmZ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% ddl&m'Z' ddl(m)Z)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 ddl6m7Z7 ddl8m9Z9 ddl:m;Z; ddl<m=Z=m>Z> ddl?m@Z@ e	eAZBdd ZCd@dd ZDd!d" ZEdAd$d%ZFd&d' ZGdBd)d*ZHed+dCd,d+ZId-d. ZJd/d0 ZKd1d2 ZLed3dDd5d3ZMd6d7 ZNed8dEd9d8ZOdFd:d;ZPd<d= ZQeAd>krBdd?lRmRZR eReSeHe
jTeUe
jVd  dS )Ga,  
Handle the planning of installs and their execution.

NOTE:
    conda.install uses canonical package names in its interface functions,
    whereas conda.resolve uses package filenames, as those are used as index
    keys.  We try to keep fixes to this "impedance mismatch" local to this
    module.
    )absolute_importdivisionprint_functionunicode_literals)defaultdict)	getLoggerN   )
IndexedSet)concatv)DEFAULTS_CHANNEL_NAMEUNKNOWN_CHANNEL)contextstack_context_default)
itervalues	text_type)env_varstime_recorder)LAST_CHANNEL_URLS_supplement_index_with_prefix)PrefixSetupUnlinkLinkTransaction)diff_for_unlink_link_precs)CondaIndexErrorPackagesNotFoundError)History)FETCHLINKSYMLINK_CONDAUNLINK)Channelprioritize_channels)Dist)LinkType)ChannelMatch)PrefixGraph)PackageRecord)normalized_version)	MatchSpecdashlist)human_bytesc             C   s`   d}t |d  t |d  x>| D ]6\}}||jd |j |jf }|rP||7 }t | q"W d S )Nz    %-27s|%17s)packagebuild)z---------------------------z------------------)printnameversionr+   )Zdists_extrasZfmtprecextraline r3   )lib/python3.7/site-packages/conda/plan.pyprint_dists-   s    r5   r3   c       -   	      s  |  d}ddg}|r.|d|  |d |r`|dttdd |D dd	  |d |r|d
ttdd |D dd	  |d td| d krtjdd }fdd |  trtd g }xZ| t D ]N}	t	|	t
stdt|	d  }
 |	jj}|r$|
d| 7 }
||	|
f qW t| |rt| t dkrtdd | t D }td tddt|   tdd tdd tdd tdd }i }x|  tg D ]~}	t	|	t
st|	d }||	| d< |	d  d! |	d"  | d< |	|| d< tj||< d#|	 d$p:d%| d< qW x|  tg D ]t}	t	|	t
snt|	d }||	| d&< |	d  d! |	d"  | d&< |	|| d&< d#|	 d$pd%| d&< qZW fd'd(D }fd)d(D }x<|D ]4}x,|fD ]}|| d d d* ||< qW qW t }t }t }i }i }d+}r~d,}td-d D d }td.d  D }td/d  D }td0d  D }td1d  D }t fd2d D }t fd3d D }x|D ]r}d4||f ||< |r6||  d5| 7  < | d& rX||  d6| 7  < t| |tj} | tjkrzdnd7|  } ||ks||kr||  | 7  < qd8| ||< |r||  d9| 7  < | d r||  d:| 7  < ||  | 7  < || d& }!|| d }"|! d;}#|" d;}$|#d ksB|$d krJd }#}$yNt|"jd<krrt|!jd<k}%|% }&n$t|!j}'t|"j}(|'|(k }%|'|(k}&W n. tk
r   |!j|"jk }%|!j|"jk}&Y nX |!j|"jk})|!j|"jk }*tjr|$|#k r|&s|%s|*s| | nh|%r"| | nV|$|#k rJ|&s>|%sJ|)rJ| | n.|&r\| | n|)sn| | n
| | qW d=}+d> fd?d@},|rtdA x$t|D ]}t|,|| | qW |rtdB x$t|D ]}t|,|| | qW |rBtdC x0t|D ]$}t|,|| |+ ||  | qW |rtdD x0t|D ]$}t|,|| |+ ||  | qZW |rtdE x0t|D ]$}t|,|| |+ ||  | qW |r|  t!rtdF t| d  td d S )GNPREFIX z## Package Plan ##
z  environment location: %sz  removed specs: %sc             s   s   | ]}t |V  qd S )N)r   ).0sr3   r3   r4   	<genexpr>@   s    z"display_actions.<locals>.<genexpr>   )indentz  added / updated specs: %sc             s   s   | ]}t |V  qd S )N)r   )r8   r9   r3   r3   r4   r:   D   s    
c             S   sF   |  dr| d S |  dr*t| d jS |  drBt| d jS tS )Nschannelurlchannel)getr   canonical_namer   )Zrecr3   r3   r4   channel_strK   s    


z$display_actions.<locals>.channel_strc                s$    dkrdS  d kr | t kr dS | S )NFr7   )r   )r9   )show_channel_urlsr3   r4   channel_filtT   s
    z%display_actions.<locals>.channel_filtz,
The following packages will be downloaded:
z%15ssizez  r   c             s   s   | ]}|d  V  qdS )rF   Nr3   )r8   r0   r3   r3   r4   r:   i   s    z@    ------------------------------------------------------------z+                                           zTotal: %14sc               S   s   t dS )N)r7   r7   )listr3   r3   r3   r4   <lambda>n       z!display_actions.<locals>.<lambda>c               S   s   t dS )N)r7   r7   )rG   r3   r3   r3   r4   rH   o   rI   c               S   s   t dS )N)r7   r7   )rG   r3   r3   r3   r4   rH   p   rI   c               S   s   t dS )N)NN)rG   r3   r3   r3   r4   rH   q   rI   r.   r/   r,   r+   ,featuresr3   r   c                s   h | ]} | d  s|qS )r   r3   )r8   p)packagesr3   r4   	<setcomp>   s    z"display_actions.<locals>.<setcomp>c                s   h | ]} | d  s|qS )r   r3   )r8   rL   )rM   r3   r4   rN      s    TFc             s   s   | ]}t |V  qd S )N)len)r8   rL   r3   r3   r4   r:      s    c             s   s   | ]}t |d  V  qdS )r   N)rP   )r8   rL   r3   r3   r4   r:      s    c             s   s   | ]}t |d  V  qdS )r   N)rP   )r8   rL   r3   r3   r4   r:      s    c             s   s   | ]}t |d  V  qdS )r   N)rP   )r8   rL   r3   r3   r4   r:      s    c             s   s   | ]}t |d  V  qdS )r   N)rP   )r8   rL   r3   r3   r4   r:      s    c             3   s   | ]}t  |d  V  qdS )r   N)rP   )r8   rL   )rE   r3   r4   r:      s    c             3   s   | ]}t  |d  V  qdS )r   N)rP   )r8   rL   )rE   r3   r4   r:      s    z{pkg:<%s} {vers[0]:<%s}z {channels[0]:<%s}z [{features[0]:<%s}]z (%s)z{vers[1]:<%s}z {channels[1]:<%s}z [{features[1]:<%s}]ZpriorityZcustomz --> z    c                s8    fdd| D }| j |d | || d S )Nc                s   g | ]} |qS r3   r3   )r8   c)rE   r3   r4   
<listcomp>   s    z3display_actions.<locals>.format.<locals>.<listcomp>:)pkgZverschannelsrK   )format)r9   rT   Zchans)rE   rU   rK   leadrM   r3   r4   rV      s    zdisplay_actions.<locals>.formatz/
The following NEW packages will be INSTALLED:
z)
The following packages will be REMOVED:
z)
The following packages will be UPDATED:
zI
The following packages will be SUPERSEDED by a higher-priority channel:
z,
The following packages will be DOWNGRADED:
z3
The following empty environments will be CREATED:
)"rA   appendr(   sortedr-   joinr   rD   r   
isinstancer%   AssertionErrorr)   r@   rB   r5   rP   sumr   r   r"   Zhardlinkr   setmaxvaluesstrr/   r&   	TypeErrorZbuild_numberZchannel_priorityaddr   )-actionsindexrD   Zspecs_to_removespecs_to_addprefixZbuilderrC   Zdisp_lstr0   r1   r>   Z	num_bytesZrecordsZ	linktypesrT   newZremovedvarupdatedZ
downgradedZ	channeledZoldfmtZnewfmtemptyZmaxpkgZ	maxoldverZ	maxnewverZmaxoldfeaturesZmaxnewfeaturesZmaxoldchannelsZmaxnewchannelsltZP0ZP1Zpri0Zpri1ZnewverZoldverZN0ZN1ZoldbldZnewbldZarrowrV   r3   )rE   rU   rK   rW   rM   rD   r4   display_actions8   s&   



	
$$
"



$$$$rm   c             C   s0   t |tstt| krg | t< | t | d S )N)r[   r!   r\   r   rX   )rd   Zdistr3   r3   r4   
add_unlink   s    rn   Fc             C   s   d S )Nr3   )rZlinkedspecsupdaterg   r3   r3   r4   add_defaults_to_specs  s    rr   c                sX   | st x6tjD ](}t| t fdd| D }|rP qW | }tdt| |d S )Nc             3   s    | ]}  |jjr|V  qd S )N)matchr@   r.   )r8   r0   )channel_matcherr3   r4   r:     s    z'_get_best_prec_match.<locals>.<genexpr>zMultiple packages found:%sr   )r\   r   rU   r#   tuplelogwarnr(   )precsZchnZprec_matchesr3   )rt   r4   _get_best_prec_match
  s    ry   rO   c                s  t | }t| }ydd ||D }W n  tk
rL   td| Y nX t||  t }t }x`|D ]X t fddt|D }|s|	  qjt
|dkr|	t| qj|	|d  qjW |rt|tt|j}	t| |	\}
}t| |
|d|d}t|}|S )	Nc             S   s   h | ]}t |qS r3   )r'   Zfrom_dist_str)r8   Zdist_strr3   r3   r4   rN   !  s    z!revert_actions.<locals>.<setcomp>zno such revision: %dc             3   s   | ]}  |r|V  qd S )N)rs   )r8   r0   )specr3   r4   r:   *  s    z!revert_actions.<locals>.<genexpr>r   r   r3   )r   r   Zget_requested_specs_mapZ	get_state
IndexErrorr   r   r^   ru   rc   rP   ry   r   r	   r$   Zgraphr   r   r   )rg   Zrevisionre   hZuser_requested_specsZtarget_stateZnot_found_in_index_specs
link_precsrx   Zfinal_precsunlink_precsstptxnr3   )rz   r4   revert_actions  s.    

r   execute_actionsc             C   s   t | |}t||| d S )N)_plan_from_actionsexecute_instructions)rd   re   verboseplanr3   r3   r4   r   >  s    
c             C   s  ddl m}m}m}m}m} d| kr6| d r6| d }n|}|| krJ| | sNt| | }dd| fg}	| d}
|
rxt | dpd }| dg }t	
d	| x|D ]}|| krt	d
| q| | st	d| qd|kr|	|d|  f n*|dr,|	|d|dd    f ||krP|	|dt| |  f x2| | D ]&}t	
d|| |	||f qZW qW t|	||||}	|	S )Nr   )ACTION_CODESr6   PRINTPROGRESSPROGRESS_COMMANDSop_orderr6   z%sUNLINKLINKTRANSACTIONZACTIONZSPECSz Adding plans for operations: {0}zaction {0} not in actionszaction {0} has None value_z%sing packages ...ZRM_z&Pruning %s packages from the cache ...   z%dz"appending value {0} for action {1})instructionsr   r6   r   r   r   r\   rA   RuntimeErrorrv   debugrV   ZtracerX   
capitalize
startswithlowerrP   _inject_UNLINKLINKTRANSACTION)rd   re   r   r6   r   r   r   r   rg   r   Zunlink_link_transactionaxnrp   opargr3   r3   r4   r   D  s>    




r   c          	      s  ddl m} ddlm  ddlm} ddlmm}m	m
} ddlm}	 ddlm}
m} tfd	d
t| D d}|dkrZ|dd | }t fdd
|dD }t fdd
|dD }t||\}}||rtfdd
|D }nd}tfdd
|D }|	|}|  |
|||d|d}| ||||f | |||f n$|dkr~| d||ddd|ff | S )Nr   )isdirr   )r!   )groupby)r   PROGRESSIVEFETCHEXTRACTr   r   )ProgressiveFetchExtract)r   r   c             3   s&   | ]\}}|d   fkr|V  qdS )r   Nr3   )r8   qrL   )r   r   r3   r4   r:   {  s    z0_inject_UNLINKLINKTRANSACTION.<locals>.<genexpr>rO   c             S   s   | d S )Nr   r3   )xr3   r3   r4   rH   }  rI   z/_inject_UNLINKLINKTRANSACTION.<locals>.<lambda>c             3   s   | ]} |d  V  qdS )r   Nr3   )r8   d)r!   r3   r4   r:   ~  s    r3   c             3   s   | ]} |d  V  qdS )r   Nr3   )r8   r   )r!   r3   r4   r:     s    c             3   s   | ]} | V  qd S )Nr3   )r8   r   )re   r3   r4   r:     s    c             3   s   | ]} | V  qd S )Nr3   )r8   r   )re   r3   r4   r:     s    )ZINSTALLZCREATE)os.pathr   models.distr!   Z_vendor.toolz.itertoolzr   r   r   r   r   r   Zcore.package_cache_datar   	core.linkr   r   next	enumerateru   rA   _handle_menuinstZprepareinsert)r   re   rg   r   rp   r   r   r   r   r   r   r   Zfirst_unlink_link_idxZgrouped_instructionsunlink_dists
link_distsr~   r}   Zpfer   r3   )r!   r   r   re   r4   r   s  s0    

r   c             C   s   ddl m} |s| |fS tdd t| D d }|d k	rhtt| d | | |d d  | ||d  } tdd t|D d }|d k	rtt|||d  |d | ||d d  }| |fS )Nr   )on_winc             s   s    | ]\}}|j d kr|V  qdS )menuinstN)r.   )r8   r   r   r3   r3   r4   r:     s    z#_handle_menuinst.<locals>.<genexpr>c             s   s    | ]\}}|j d kr|V  qdS )r   N)r.   )r8   r   r   r3   r3   r4   r:     s    )common.compatr   r   r   ru   r
   )r   r   r   Zmenuinst_idxr3   r3   r4   r     s     

r   install_actionsTc          	      s  t dddtd ddlm ddlm} dd	lm} dd
lm	  ddl
m |	r| fdd|	D }| fdd|D }|fdd|	D }nNtrtt}	| fdd|	D }|dd dd |D D ptj}nd  }}tdd |D }ddlm} |j  || |||d}|r:dd t|D |_|j|| d}|j|  }t| }|d fdd|jD  |d fdd|jD  |S Q R X d S )NtrueZfalse)ZCONDA_ALLOW_NON_CHANNEL_URLSZCONDA_SOLVER_IGNORE_TIMESTAMPS)Zstack_callbackr   )basenamer   )r	   )Solver)r   )r!   c             3   s   | ]} |j V  qd S )N)rB   )r8   r?   )r   r3   r4   r:     s    z"install_actions.<locals>.<genexpr>c             3   s   | ]} |V  qd S )Nr3   )r8   Zcn)r   r3   r4   r:     s    c             3   s   | ]} |V  qd S )Nr3   )r8   r?   )r   r3   r4   r:     s    c             3   s   | ]} |V  qd S )Nr3   )r8   r?   )r   r3   r4   r:     s    c             s   s   | ]}|r|V  qd S )Nr3   )r8   subdirr3   r3   r4   r:     s    c             s   s   | ]}|j V  qd S )N)r   )r8   rQ   r3   r3   r4   r:     s    c             s   s   | ]}t |V  qd S )N)r'   )r8   rz   r3   r3   r4   r:     s    )
PrefixData)rf   c             S   s   i | ]
}||qS r3   r3   )r8   r0   r3   r3   r4   
<dictcomp>  s    z#install_actions.<locals>.<dictcomp>)pruneZignore_pinnedr   c             3   s   | ]} |V  qd S )Nr3   )r8   r0   )r!   r3   r4   r:     s    r   c             3   s   | ]} |V  qd S )Nr3   )r8   r0   )r!   r3   r4   r:     s    )r   r   r   r   _vendor.boltons.setutilsr	   
core.solver   models.channelr   r   r!   r   r    r   subdirsru   Zcore.prefix_datar   Z_cache_clearr   Z_indexZsolve_for_transactionZprefix_setupsget_blank_actionsextendr~   r}   )rg   re   rp   ZforceZ
only_namesZalways_copyZpinnedZupdate_depsr   Zchannel_priority_mapZ	is_updateZminimal_hintr	   r   Zchannel_namesrU   r   r   Zsolverr   Zprefix_setuprd   r3   )r   r!   r   r4   r     s@    

c          	   C   sj   ddl m} ddlm}m}m}m}m}m}m	}m
}	m}
m} |t}| ||< ||	|||||||
f	|d< |S )Nr   )r   r   )
CHECK_EXTRACTCHECK_FETCHEXTRACTr   r   r6   RM_EXTRACTED
RM_FETCHEDr   r   r   )collectionsr   r   r   r   r   r   r   r6   r   r   r   r   rG   )rg   r   r   r   r   r   r   r6   r   r   r   r   rd   r3   r3   r4   r     s    0r   execute_planc             C   s   t | }t||| dS )zS
    Deprecated: This should `conda.instructions.execute_instructions` instead
    N)_update_old_planr   )old_planre   r   r   r3   r3   r4   r     s    c             C   s
  ddl m}m} ddlm} ddlm} |dkr4|}td|  d|j	|d}x| D ]\}	}
td|	|
 |d	 dk	r|	|kr|d	  d7  < t
d
||
j|d	 d f ||	 }t|r|||
 |d	 dk	rT|	|krT|d |d	 krTd|d	< t
dd qTW dS )a.  Execute the instructions in the plan

    :param plan: A list of (instruction, arg) tuples
    :param index: The meta-data index
    :param verbose: verbose output
    :param _commands: (For testing only) dict mapping an instruction to executable if None
    then the default commands will be used
    r   )commandsr   )r   )r!   Nzexecuting plan %s)irg   re   z %s(%r)r   zprogress.updateZmaxvalzprogress.stop)r   r   r   base.contextr   r   r!   rv   r   Zroot_prefixr   infoZ	dist_namecallable)r   re   r   Z	_commandsr   r   r   r!   stateinstructionr   cmdr3   r3   r4   r     s(    	
r   c             C   s`   g }xV| D ]N}| drq
d|kr:ddlm} |d| |dd\}}|||f q
W |S )z^
    Update an old plan object to work with
    `conda.instructions.execute_instructions`
    # r   )ArgumentErrorz0The instruction '%s' takes at least one argument)r   
exceptionsr   splitrX   )r   r   r2   r   r   r   r3   r3   r4   r     s    

r   __main__)pprint)Nr3   r3   )FN)rO   N)F)	FNFTTFNFF)NF)NFN)W__doc__Z
__future__r   r   r   r   r   r   Zloggingr   sysr   r	   Z_vendor.toolzr
   Zbase.constantsr   r   r   r   r   r   r   r   Z	common.ior   r   Z
core.indexr   r   r   r   r   r   r   r   r   r   historyr   r   r   r   r   r   r   r   r    r   r!   Zmodels.enumsr"   Zmodels.match_specr#   Zmodels.prefix_graphr$   Zmodels.recordsr%   Zmodels.versionr&   Zresolver'   r(   Zutilsr)   __name__rv   r5   rm   rn   rr   ry   r   r   r   r   r   r   r   r   r   r   r   dictrg   intargvr3   r3   r3   r4   <module>   sf   
 E


'/$   *
'
