a
    !cS                     @   s   d dl mZ d dl mZ d dlZd dlmZ d dlZd dlZd dl	m
Z
 d dlmZ d dlmZ edZG d	d
 d
e
jZdS )    )absolute_import)unicode_literalsN)chain)commands)OptionParser)_dnfc                   @   s   e Zd ZdZejejejdZdZ	de
e  ZedZedd Zdd	 Zd
d Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )InstallCommandzUA class containing methods needed by the cli to execute the
    install command.
    )z	install-nz
install-nazinstall-nevrazalternative-for({}))installlocalinstallinz,install a package or packages on your systemc                 C   s"   | j ddtdtjtdd d S )Npackage+ZPACKAGEzPackage to install)nargsmetavaractionhelp)add_argumentr   r   ZParseSpecGroupFileCallback)parser r   </usr/lib/python3.9/site-packages/dnf/cli/commands/install.pyset_argparser1   s    zInstallCommand.set_argparserc                 C   sH   | j j}d|_d|_d|_d|_t| j| j  | j	j
sDt| j dS )zVerify that conditions are met so that this command can run.
        That there are enabled repositories with gpg keys, and that
        this command is called with appropriate arguments.
        TN)clidemandsZsack_activationZavailable_reposZ	resolvingZ	root_userr   Z_checkGPGKeybaseopts	filenamesZ_checkEnabledRepo)selfr   r   r   r   	configure7   s    zInstallCommand.configurec           
   
   C   sL  g }g }g }|   }| j| j | jjdkrf| jjs>| jjrf| | jj | jj	j
rftjtdg }| jjrP| jjdkrPtjjrHz,tjj| j}|j| jj| jj	j
d W n tjjyD } zn|jr|jD ]}|| q|jr|jD ]}|d|  q|j}	|	r0ttjj|	d  W Y d }~n
d }~0 0 n| jj}| jjr|r| | jj | jj	j
rtjtdn|  }|r|r| | | jj	j
rtjtdn|r| jjdkr| | | jjdkr|  |}t!|dks t!|dks |rH| jj	j
rHtjj"tdd#||dd S )	Nr   zNothing to do.strict@r   zUnable to find a match )pkg_specZpackages)$_get_nevra_forms_from_commandr   Z _populate_update_security_filterr   command	grp_specs	pkg_specs_log_not_valid_rpm_file_pathsr   confr    r   
exceptionsErrorr   ZWITH_MODULESmodulemodule_baseZ
ModuleBaser
   ZMarkingErrorsZno_match_group_specsappendZerror_group_specsmodule_depsolv_errorsloggererrorZformat_modular_solver_errorsr   _inform_not_a_valid_combination_install_files_install_groups_install_packageslenZPackagesNotAvailableErrorjoin)
r   err_pkgserrsZerror_module_specsnevra_formsZskipped_grp_specsr-   eZe_specr/   r   r   r   runE   s\    






.zInstallCommand.runc                 C   s&   | j j| jv r| j| j j gS g S d S )N)r   r%   r:   )r   r   r   r   r$   z   s    z,InstallCommand._get_nevra_forms_from_commandc                 C   sF   t dd |}t| jj|D ]$}td}t|| jjj	
| qd S )Nc                 S   s   d|  S )Nr!   r   )gr   r   r   <lambda>       z>InstallCommand._log_not_valid_rpm_file_paths.<locals>.<lambda>zNot a valid rpm file path: %s)mapr   r   r'   r   r0   infor   outputtermbold)r   r&   Zgroup_namespkgmsgr   r   r   r(      s    z,InstallCommand._log_not_valid_rpm_file_pathsc                 C   s.   |D ]$}t d}t|| jjj| qd S )NzNot a valid form: %s)r   r0   Zwarningr   rB   rC   rD   )r   formsZformrF   r   r   r   r2      s    z.InstallCommand._inform_not_a_valid_combinationc              
   C   s   g }| j jj}| j j| jj|| j jjdD ]\}z| j j||d W q* t	j
jy   td}t|| j jj|j || Y q*0 q*|S )N)r    progressr   zNo match for argument: %s)r   r)   r    Zadd_remote_rpmsr   r   rB   rH   Zpackage_installr   r*   MarkingErrorr   r0   rA   rC   rD   locationr.   )r   r8   r    rE   rF   r   r   r   r3      s    

zInstallCommand._install_filesc                 C   sN   z&| j j|t| j jj| j jjd W n" tjjyH   | j jjrD Y n0 d S )Nr   )	r   Zenv_group_installtupler)   Zgroup_package_typesr    r   r*   r+   )r   r&   r   r   r   r4      s    

zInstallCommand._install_groupsc                 C   sV   | j j j| j|d}|rRtd}t||d	t
tdd |D  d S )N)Zprovidesz/There are following alternatives for "{0}": {1}z, c                 S   s   g | ]
}|j qS r   )name).0Zaltr   r   r   
<listcomp>   r?   z7InstallCommand._report_alternatives.<locals>.<listcomp>)r   ZsackqueryZfiltermalternatives_provideformatr   r0   rA   r7   sortedset)r   r#   rO   rF   r   r   r   _report_alternatives   s    
z#InstallCommand._report_alternativesc                 C   s   g }| j jj}| jjD ]}z| j j|||d W q tjjy } zPd	|j
| j jj|}t| | j | | | || W Y d }~qd }~0 0 q|S )N)r    rG   z{}: {})r   r)   r    r   r'   r
   r   r*   rI   rQ   valuerB   rC   rD   r0   rA   Z_report_icase_hintrT   r.   )r   r:   r9   r    r#   r;   rF   r   r   r   r5      s    


"z InstallCommand._install_packagesN)__name__
__module____qualname____doc__hawkeyZ	FORM_NAMEZFORM_NAZ
FORM_NEVRAr:   rP   rK   keysaliasesr   Zsummarystaticmethodr   r   r<   r$   r(   r2   r3   r4   rT   r5   r   r   r   r   r	   %   s&   
5		r	   )Z
__future__r   r   Zlogging	itertoolsr   rZ   Zdnf.exceptionsr   Zdnf.clir   Zdnf.cli.option_parserr   Zdnf.i18nr   Z	getLoggerr0   ZCommandr	   r   r   r   r   <module>   s   
