a º&c‚$ã@s ddlmZddlmZddlmZmZddlZddlZddlZddl Zddl Zddl Zddl Z ddlZddlZddlZddlZejjGdd„dejjƒƒZdS)é)Úabsolute_import)Úunicode_literals)Ú_ÚloggerNcs”eZdZdZdZeeƒZedƒZ‡fdd„Zdd„Z dd „Z e d d „ƒZ d d „Z dd„Zdd„Ze dd„ƒZdd„Zdd„Zdd„Zdd„Z‡ZS)ÚBuildDepCommand)Zbuilddepz build-depz3Install build dependencies for package or spec filez[PACKAGE|PACKAGE.spec]cs(tt|ƒ |¡tjj ¡|_g|_dS©N) ÚsuperrÚ__init__ÚdnfÚrpmZ transactionZinitReadOnlyTransactionÚ_rpm_tsÚtempdirs)ÚselfÚcli©Ú __class__©ú8/usr/lib/python3.9/site-packages/dnf-plugins/builddep.pyr /szBuildDepCommand.__init__cCs|jD]}t |¡qdSr)r ÚshutilÚrmtree)rÚtemp_dirrrrÚ__del__4s zBuildDepCommand.__del__c CsÂtjj |¡}|ddvr |jStj ¡}tjdd}t j  |t j  |¡¡}|j   |¡t|dƒ}zPz| |jjj|| ¡¡Wn&ty¦}z‚WYd}~n d}~00W| ¡n | ¡0|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)r ZpycompÚurlparseÚ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| ¡}|jddtdƒd|jddtdƒddS)NcSs:|r| dd¡ng}t|ƒdkr6tdƒ|}t |¡‚|S)Nééz&'%s' is not of the format 'MACRO EXPR')ÚsplitÚlenrÚargparseÚArgumentTypeError)Ú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Údefaultr9Útyper:z--skip-unavailableÚ store_trueFz5skip build dependencies not available in repositories)r;r<r:z--specz)treat commandline arguments as spec files)r;r:z--srpmz)treat commandline arguments as source rpm)Ú add_argumentrÚadd_mutually_exclusive_group)Úparserr4ZptyperrrÚ set_argparserPs$ ÿ þ ÿÿÿzBuildDepCommand.set_argparsercCs|jjsd|j_dS)NÚerror)ÚoptsZ rpmverbosity)rrrrÚ pre_configurefszBuildDepCommand.pre_configurecCsp|jj}d|_d|_d|_d|_|jjsl|jjsl|jj D]2}|  d¡s8|  d¡s8|  d¡s8|j j   ¡qlq8dS)NTú.src.rpmz .nosrc.rpmú.spec)rÚdemandsZavailable_reposZ resolvingZ root_userZsack_activationrDÚspecÚsrpmr5Úendswithr$ZreposZenable_source_repos)rrHr(rrrÚ configurejs  ÿþ zBuildDepCommand.configurec CsNtjj |j¡}|jjD]}t |d|d¡qd}|jj D]Ö}|  |¡}zl|jj rb|  |¡nT|jj rv| |¡n@| d¡sŠ| d¡r–|  |¡n | d¡r¬| |¡n | |¡Wq>tjjy}z<| ¡D]}t tdƒ |¡¡qÖt |¡d}WYd}~q>d}~00q>|jjD]}t |d¡q|rJtj td ƒ¡‚dS) Nrr,FrFz nosrc.rpmrGzRPM: {}Tz!Some packages could not be found.)r ZyumZrpmtransZRPMTransactionr$rDÚdefiner ZaddMacror5r+rJÚ _src_depsrIÚ _spec_depsrKÚ _remote_depsÚ exceptionsÚErrorÚmessagesrrCrÚformatZdelMacro)rZrpmlogZmacroZ pkg_errorsr(ÚeÚlinerrrÚrunzs2           zBuildDepCommand.runcCs| ¡dd…S)Nr-)ZDNEVR)Zrpm_deprrrÚ_rpm_dep2reldep_str›sz#BuildDepCommand._rpm_dep2reldep_strcCsÄtj |jj¡}|j|d| ¡}|sV| d¡rVtj |jj¡}|j|d| ¡}|s„| d¡s„tdƒ}t   ||¡|j j duS|r®|j  |¡}|r®|D]}tj |¡qœ|jjj|dddS) N)Zprovidesú/)rú(z$No matching package to install: '%s'TF)ZselectZoptional)r ÚselectorZSelectorr$ÚsackÚsetÚmatchesÚ startswithrrÚwarningrDZskip_unavailableZ_sltr_matches_installedZ_msg_installedZ_goalÚinstall)rÚ reldep_strZsltrÚfoundr3Z already_instr7rrrÚ_installŸs$     zBuildDepCommand._installc Csìt |tj¡}z|j |¡}WnTtjyr}z:t|ƒdkrHtdƒ|}t  |¡t j   |¡‚WYd}~n d}~00t  |¡|  d¡}d}|D](}| |¡}| d¡rªq|| |¡M}q|sÒtdƒ} t j   | ¡‚|jjrèt tdƒ¡dS)Nzerror reading package headerz2Failed to open: '%s', not a valid source rpm file.Z requirenameTzrpmlib(úNot all dependencies satisfiedzJWarning: -D or --define arguments have no meaning for source rpm packages.)rr#ÚO_RDONLYr Z hdrFromFdnor rCÚstrrr'r rQrRZ dsFromHeaderrXr_rdrDrMrr`) rZsrc_fnÚfdÚhrUÚdsÚdoneÚdeprbÚerrrrrrN¹s*   "     zBuildDepCommand._src_depsc Csœzt |¡}Wn@tyN}z(tdƒ||f}tj |¡‚WYd}~n d}~00d}t |jd¡D]}|  |¡}||  |¡M}qb|s˜tdƒ}tj |¡‚dS)Nz/Failed to open: '%s', not a valid spec file: %sTÚrequiresre) r rIÚ ValueErrorrr rQrRrjZ sourceHeaderrXrd) rZspec_fnrIr*r3rkrlrbrmrrrrOÓsÿ" zBuildDepCommand._spec_depsc Cs¸tj |¡ |jj¡jdd}tdd„|Dƒƒ}|jj ¡  ¡j||gdd  ¡  ¡}|sptj   tdƒ|¡‚d}|D]"}|jD]}|| t|ƒ¡M}q‚qx|s´tdƒ}tj   |¡‚dS) NÚsrc)Z arch__neqcSsh|] }|j’qSr)Z source_name)Ú.0ÚpkgrrrÚ æóz/BuildDepCommand._remote_deps..)ÚnameZarchzno package matched: %sTre)r ZsubjectZSubjectZget_best_queryr$r\ÚfilterÚlistÚqueryÚ availableZlatestrWrQrRrrnrdrg) rr7ryZ sourcenamesZpkgsrkrrZreqrmrrrrPãs$ ÿÿ ÿ zBuildDepCommand._remote_deps)Ú__name__Ú __module__Ú __qualname__Úaliasesr3rZsummaryÚusager rr+Ú staticmethodrBrErLrWrXrdrNrOrPÚ __classcell__rrrrr's$  ! r)Z __future__rrZdnfpluginscorerrr0r Zdnf.cliZdnf.exceptionsZdnf.rpm.transactionZdnf.yum.rpmtransZ libdnf.reporrr rrZpluginZregister_commandrZCommandrrrrrÚs