3 ÅÀf‚$ã@s ddlmZddlmZddlmZmZddlZddlZddlZddl Zddl Zddl Zddl Z ddlZddlZddlZddlZejjGdd„dejjƒƒZdS)é)Úabsolute_import)Úunicode_literals)Ú_ÚloggerNcs”eZdZdZdZeeƒZedƒZ‡fdd„Zdd„Z d d „Z e d d „ƒZ d d„Z dd„Zdd„Ze dd„ƒZdd„Zdd„Zdd„Zdd„Z‡ZS)ÚBuildDepCommandÚbuilddepú build-depz3Install build dependencies for package or spec filez[PACKAGE|PACKAGE.spec]cs(tt|ƒj|ƒtjjjƒ|_g|_dS)N) ÚsuperrÚ__init__ÚdnfÚrpmZ transactionZinitReadOnlyTransactionÚ_rpm_tsÚtempdirs)ÚselfÚcli)Ú __class__©ú/usr/lib/python3.6/builddep.pyr /szBuildDepCommand.__init__cCsx|jD]}tj|ƒqWdS)N)rÚshutilZrmtree)rÚtemp_dirrrrÚ__del__4s zBuildDepCommand.__del__cCs¸tjjj|ƒ}|ddkr |jStjjƒ}tjdd�}t jj |t jj |ƒƒ}|j j |ƒt|dƒ}zFy|j|jjj||jƒƒWn$tk r¤}z‚WYdd}~XnXWd|jƒX|S) z‚ In case pkgspec is a remote URL, download it to a temporary location and use the temporary file instead. rÚfileÚZ dnf_builddep_)Úprefixzwb+N)rr)r ZpycompZurlparseÚpathÚlibdnfZrepoZ DownloaderÚtempfileZmkdtempÚosÚjoinÚbasenamerÚappendÚopenZ downloadURLÚbaseZconfZ_configÚfilenoÚ RuntimeErrorÚclose)rÚpkgspecÚlocationZ downloaderrZ temp_fileZtemp_foÚexrrrÚ_download_remote_file8s      z%BuildDepCommand._download_remote_filec Cs„dd„}|jdddtdƒd�|jdd d gd |td ƒd �|jdddtdƒd�|jƒ}|jddtdƒd�|jddtdƒd�dS)NcSs:|r|jddƒng}t|ƒdkr6tdƒ|}tj|ƒ‚|S)Nééz&'%s' is not of the format 'MACRO EXPR')ÚsplitÚlenrÚargparseZArgumentTypeError)ÚargZarglistÚmsgrrrÚ macro_defRs    z0BuildDepCommand.set_argparser..macro_defÚpackagesú+Úpackagez"packages with builddeps to install)ÚnargsÚmetavarÚhelpz-Dz--definer z 'MACRO EXPR'z$define a macro for spec file parsing)ÚactionÚdefaultr6Útyper7z--skip-unavailableÚ store_trueFz5skip build dependencies not available in repositories)r8r9r7z--specz)treat commandline arguments as spec files)r8r7z--srpmz)treat commandline arguments as source rpm)Ú add_argumentrZadd_mutually_exclusive_group)Úparserr1ZptyperrrÚ set_argparserPs       zBuildDepCommand.set_argparsercCs|jjsd|j_dS)NÚerror)ÚoptsZ rpmverbosity)rrrrÚ pre_configurefszBuildDepCommand.pre_configurecCsr|jj}d|_d|_d|_d|_|jjp.|jjsnx<|jj D]0}|j dƒpZ|j dƒpZ|j dƒs:|j j j ƒPq:WdS)NTz.src.rpmz .nosrc.rpmz.spec)rÚdemandsZavailable_reposZ resolvingZ root_userZsack_activationr@ÚspecÚsrpmr2Úendswithr"ZreposZenable_source_repos)rrBr&rrrÚ configurejs    zBuildDepCommand.configurecCs\tjjj|jƒ}x$|jjD]}tj|d|dƒqWd}xä|jj D]Ø}|j |ƒ}yl|jj rh|j |ƒnT|jj r||j|ƒn@|jdƒs�|jdƒrœ|j |ƒn |jdƒr²|j|ƒn |j|ƒWqDtjjk �r}z:x$|jƒD]}tjtdƒj|ƒƒqàWtj|ƒd}WYdd}~XqDXqDWx |jjD]}tj|dƒ�q*W|�rXtjjtd ƒƒ‚dS) Nrr*Fz.src.rpmz nosrc.rpmz.speczRPM: {}Tz!Some packages could not be found.)r ZyumZrpmtransZRPMTransactionr"r@Údefiner ZaddMacror2r)rDÚ _src_depsrCÚ _spec_depsrEÚ _remote_depsÚ exceptionsÚErrorZmessagesrr?rÚformatZdelMacro)rZrpmlogZmacroZ pkg_errorsr&ÚeÚlinerrrÚrunzs2       zBuildDepCommand.runcCs|jƒdd…S)Nr+)ZDNEVR)Zrpm_deprrrÚ_rpm_dep2reldep_str›sz#BuildDepCommand._rpm_dep2reldep_strcCsÎtjj|jjƒ}|j|d�|jƒ}| rX|jdƒrXtjj|jjƒ}|j|d�|jƒ}| rŠ|jdƒ rŠtdƒ}t j ||ƒ|j j dkS|r¸|jj |ƒ}|r¸x|D]}tjj|ƒq¤W|jjj|dd�dS) N)Zprovidesú/)rú(z$No matching package to install: '%s'TF)ZselectZoptional)r ZselectorZSelectorr"ÚsackÚsetZmatchesÚ startswithrrÚwarningr@Zskip_unavailableZ_sltr_matches_installedZ_msg_installedZ_goalZinstall)rÚ reldep_strZsltrÚfoundr0Z already_instr4rrrÚ_installŸs$      zBuildDepCommand._installc Csîtj|tjƒ}y|jj|ƒ}WnRtjk rp}z4t|ƒdkrJtdƒ|}tj |ƒt j j |ƒ‚WYdd}~XnXtj |ƒ|j dƒ}d}x0|D](}|j|ƒ}|jdƒrªq�||j|ƒM}q�W|sÔtdƒ} t j j | ƒ‚|jjrêtjtdƒƒdS)Nzerror reading package headerz2Failed to open: '%s', not a valid source rpm file.Z requirenameTzrpmlib(zNot all dependencies satisfiedzJWarning: -D or --define arguments have no meaning for source rpm packages.)rr!ÚO_RDONLYr Z hdrFromFdnor r?Ústrrr%r rKrLZ dsFromHeaderrQrVrZr@rGrrW) rZsrc_fnÚfdÚhrNÚdsÚdoneÚdeprXÚerrrrrrH¹s*         zBuildDepCommand._src_depsc Csžytj|ƒ}Wn>tk rL}z"tdƒ||f}tjj|ƒ‚WYdd}~XnXd}x.tj|jdƒD]}|j |ƒ}||j |ƒM}qbW|sštdƒ}tjj|ƒ‚dS)Nz/Failed to open: '%s', not a valid spec file: %sTÚrequireszNot all dependencies satisfied) r rCÚ ValueErrorrr rKrLr_Z sourceHeaderrQrZ) rZspec_fnrCr(r0r`rarXrbrrrrIÓs  zBuildDepCommand._spec_depsc CsÀtjj|ƒj|jjƒjdd�}tdd„|Dƒƒ}|jjjƒj ƒj||gdd�j ƒj ƒ}|sptj j tdƒ|ƒ‚d}x.|D]&}x |jD]}||jt|ƒƒM}q†WqzW|s¼tdƒ}tj j |ƒ‚dS) NÚsrc)Z arch__neqcSsh|] }|j’qSr)Z source_name)Ú.0Úpkgrrrú æsz/BuildDepCommand._remote_deps..)ÚnameZarchzno package matched: %sTzNot all dependencies satisfied)r ZsubjectZSubjectZget_best_queryr"rTÚfilterÚlistZqueryÚ availableZlatestrPrKrLrrcrZr\) rr4rlZ sourcenamesZpkgsr`rgZreqrbrrrrJãs   zBuildDepCommand._remote_deps)rr)Ú__name__Ú __module__Ú __qualname__Úaliasesr0rZsummaryZusager rr)Ú staticmethodr>rArFrPrQrZrHrIrJÚ __classcell__rr)rrr's   ! r)Z __future__rrZdnfpluginscorerrr.r Zdnf.cliZdnf.exceptionsZdnf.rpm.transactionZdnf.yum.rpmtransZ libdnf.reporrr rrZpluginZregister_commandrZCommandrrrrrÚs