a ¨2Ñh ‡ã @sddlmZddlmZddlmZddlmZddlmZddlm Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZe  d¡Zd Ze  d ¡Zd Zd d ddddddddœ Zdd„ZGdd„de jƒZGdd„dejƒZGdd„de ƒZ!dS)é)Úabsolute_import)Úprint_function)Úunicode_literals)Ú_)Úcommands)Ú OptionParserNÚdnfz.%{name}-%{epoch}:%{version}-%{release}.%{arch}z%(-?\d*?){([:.\w]+?)}a name, arch, epoch, version, release, reponame (repoid), from_repo, evr, debug_name, source_name, source_debug_name, installtime, buildtime, size, downloadsize, installsize, provides, requires, obsoletes, conflicts, sourcerpm, description, summary, license, url, reasonÚ conflictsÚenhancesÚ obsoletesÚprovidesÚ recommendsÚrequiresZ requires_preÚsuggestsÚ supplements) r r r r r rú requires-prerrcCsždd„}dd„}| dd¡ dd¡}t ¡D]\}}| ||¡}q,d }d }t |¡D]0}||||| ¡…ƒ7}|||ƒ7}| ¡}qT||||d …ƒ7}|S) z:Convert a rpm like QUERYFMT to an python .format() string.cSs^| ¡d}| ¡d}|rJ|ddkr:d|dd…}nd|}d|}d| ¡|dS) Nréú-ú>ú<ú:z{0.Ú})ÚgroupsÚlower)ZmatchobjÚfillÚkey©rú>/usr/lib/python3.9/site-packages/dnf/cli/commands/repoquery.pyÚfmt_replDs   zrpm2py_format..fmt_replcSs| dd¡ dd¡S)NÚ{z{{rz}})Úreplace)ZtxtrrrÚbracketsOszrpm2py_format..bracketsz\nÚ z\tú ÚrN)r Ú OPTS_MAPPINGÚitemsÚ QFORMAT_MATCHÚfinditerÚstartÚend)Ú queryformatrr!rÚvalueÚfmtÚsposÚitemrrrÚ rpm2py_formatBs   r0c@seZdZdZdS)Ú_CommaSplitCallbackz\s*,\s*N)Ú__name__Ú __module__Ú __qualname__ZSPLITTERrrrrr1_sr1c@sºeZdZdZejejejdœZde e  ¡ƒZ e dƒZ edd„ƒZedd„ƒZd d „Zd d „Zd d„Zdd„Zd$dd„Zd%dd„Zd&dd„Zdd„Zdd„Zdd„Zdd „Zd'd"d#„ZdS)(ÚRepoQueryCommandzSA class containing methods needed by the cli to execute the repoquery command. )z repoquery-nz repoquery-nazrepoquery-nevra)Z repoqueryZrqz$search for packages matching keywordcCs,|jr|j|jd|jr(|j|jd|S)z'Filter query by repoid and arch options)Zreponame)Úarch)ZrepoÚfiltermÚarches)ÚoptsÚqueryrrrÚfilter_repo_archms z!RepoQueryCommand.filter_repo_archc Csš|jddddtdƒd|jddtdƒd |jd d d gtd tdƒd|jddddtdƒd|jdgtdtdƒd|jdgtdtdƒd|jdgtdtdƒd|jdgtdtdƒd|jd gtdtd!ƒd|jd"gtdtd#ƒd|jd$gtdtd%ƒd|jd&gtdtd'ƒd|jd(gtdtd)ƒd| ¡}|jd*dtd+ƒd |jd,dtd-ƒd |jd.dtd/ƒd |jd0dtd1ƒd |jd2dtd3ƒd |jd4dtd5ƒd |jd6dtd7ƒd |jd8d9ttd:ƒd;|jdd?d@dAdtdBƒdC|jdDdEdFdAdtdGƒdC|jdHdIdJdAdtdKƒdC|jdLdMdAdtdNƒdC|jdOdPdQttdRƒdS|jdTdtdUƒd |jdVdQtdWtdXƒdY|jdZdQd[dWtd\ƒdY|jd]dQd^dWtd_ƒdY|jd`dtdaƒd | ¡}|jdbdcdddWtdeƒdY|jdfdcdddWtjdY|jdgdcdhdWtdiƒdY|jdjdcdkdWtdlƒdY|jdmdtdnƒd | ¡}tdoƒtdpƒtdqƒtdrƒtdsƒtdtƒtduƒtdvƒtdwƒdxœ }| ¡D]&\}}dy|}|j|dzdW||d{q²|jd|dtd}ƒd td~ƒtdƒtd€ƒtdƒj t j j d‚tdƒƒd„œ} | ¡} |  ¡D]&\} } dy| } | j| d…dW| | d{q.| jd†d…dWd‡tjd{|jdˆdtd‰ƒd |jdŠd‹dŒtdƒdŽdS)Nz-az--allZqueryallÚ store_truezNQuery all packages (shorthand for repoquery '*' or repoquery without argument))ÚdestÚactionÚhelpz--show-duplicatesz(Query all versions of packages (default))r>r?z--archz --archlistr8ZARCHz show only results from this ARCH)r=Údefaultr>Úmetavarr?z-fz--fileÚFILEú+z show only results that owns FILE)rAÚnargsr?z--whatconflictsZREQz#show only results that conflict REQ)r@r>rAr?z --whatdependszjshows results that requires, suggests, supplements, enhances, or recommends package provides and files REQz--whatobsoletesz#show only results that obsolete REQz--whatprovidesz"show only results that provide REQz--whatrequiresz:shows results that requires package provides and files REQz--whatrecommendsz$show only results that recommend REQz--whatenhancesz"show only results that enhance REQz--whatsuggestsz"show only results that suggest REQz--whatsupplementsz%show only results that supplement REQú --alldepsz=check non-explicit dependencies (files and Provides); defaultú --exactdepsz:check dependencies exactly as given, opposite of --alldepsú --recursivezOused with --whatrequires, and --requires --resolve, query packages recursively.z --deplistz>show a list of all dependencies and what packages provide themz --resolvez.resolve capabilities to originating package(s)z--treez"show recursive tree for package(s)z--srpmz#operate on corresponding source RPMz--latest-limitÚ latest_limitzOshow N latest packages for a given name.arch (or latest but N if N is negative))r=Útyper?z--disable-modular-filteringz-list also packages of inactive module streamsz-iz--infoÚ queryinfoFz+show detailed information about the package)r=r@r>r?z-lz--listÚ queryfilelistz!show list of files in the packagez-sz--sourceÚquerysourcerpmzshow package source RPM namez --changelogsÚquerychangelogszshow changelogs of the packagez--qfz --queryformatr+zfdisplay format for listing packages: "%%{name} %%{version} ...", use --querytags to view full tag list)r=r@r?z --querytagsz-show available tags to use with --queryformatz--nevraÚ store_constzZuse name-epoch:version-release.architecture format for displaying found packages (default))r=Úconstr>r?z--nvrz%{name}-%{version}-%{release}zQuse name-version-release format for displaying found packages (rpm query default)z--envraz.%{epoch}:%{name}-%{version}-%{release}.%{arch}zPuse epoch:name-version-release.architecture format for displaying found packagesz --groupmemberz=Display in which comps groups are presented selected packagesz --duplicatesÚ pkgfilterÚ duplicatedz/limit the query to installed duplicate packagesz --duplicatedz --installonlyÚ installonlyz1limit the query to installed installonly packagesz --unsatisfiedÚ unsatisfiedzClimit the query to installed packages with unsatisfied dependenciesz --locationz5show a location from where packages can be downloadedz5Display capabilities that the package conflicts with.zaDisplay capabilities that the package can depend on, enhance, recommend, suggest, and supplement.z2Display capabilities that the package can enhance.z-Display capabilities provided by the package.z1Display capabilities that the package recommends.z1Display capabilities that the package depends on.zÚIf the package is not installed display capabilities that it depends on for running %%pre and %%post scriptlets. If the package is installed display capabilities that is depends for %%pre, %%post, %%preun and %%postun.z/Display capabilities that the package suggests.z5Display capabilities that the package can supplement.) r Údependsr r r rrrrz--%sÚ packageatr)r=r>rOr?ú --availablez Display only available packages.z Display only installed packages.zLDisplay only packages that are not present in any of available repositories.zQDisplay only packages that provide an upgrade for some already installed package.zIDisplay only packages that can be removed by "{prog} autoremove" command.©Úprogz2Display only packages that were installed by user.)Ú installedÚextrasZupgradesÚunneededÚ userinstalledÚlistz --autoremover[z--recentz%Display only recently edited packagesrÚ*ZKEYzthe key to search for)rDrAr?) Ú add_argumentrr1Úadd_mutually_exclusive_groupÚintÚQFORMAT_DEFAULTÚargparseÚSUPPRESSr&ÚformatrÚutilÚ MAIN_PROG)ÚparserZwhatrequiresformZoutformrPZpackage_attributeZ help_msgsÚargZhelp_msgÚnameZ help_listZ list_groupZlist_argZhelp_argZswitchrrrÚ set_argparservs^ ÿÿ þ ÿ þ þ þ þ þ þ þ þ þÿÿ ÿ ÿÿÿÿ ÿÿ þ þ þþ þÿ þ ÿý ÿþþþþÿô ÿ ÿú ÿ þ ÿzRepoQueryCommand.set_argparsercCs |jjs|jjtjtjddS)N)ÚstdoutÚstderr)r9ÚquietÚcliZredirect_loggerÚloggingZWARNINGÚINFO©ÚselfrrrÚ pre_configureszRepoQueryCommand.pre_configurecCsj|jjs|j ¡|jj}|jjrJ|jjrB|j dd|jj¡nd|j_|jjrVdS|jj rv|jjsvt j  t dƒ¡‚|jj rÄ|jjr”|j dd¡t|jj|jjdko®|jj gƒsÄt j  t dƒ¡‚|jjsÖ|jjr|jjs|jjst j  t d  |jjrd nd¡ƒ¡‚|jjr$|jj ¡|jjd vr@|jjd ksJ|jjrPd |_d |_|jjrfd |_dS)Nz --obsoletesú--r zÊOption '--resolve' has to be used together with one of the '--conflicts', '--depends', '--enhances', '--provides', '--recommends', '--requires', '--requires-pre', '--suggests' or '--supplements' optionsrGrFrzŸOption '--recursive' has to be used with '--whatrequires ' (optionally with '--alldeps', but not with '--exactdeps'), or with '--requires --resolve'z;argument {} requires --whatrequires or --whatdepends optionrE)rYr\rRT)r9rnroZredirect_repo_progressÚdemandsr rUZ_option_conflictÚ querytagsÚresolverZCliErrorrÚ recursiveÚ exactdepsÚanyÚ whatrequiresÚalldepsÚ whatdependsreÚsrpmÚbaseZreposZenable_source_reposr]rPÚ availableZavailable_reposZsack_activationrMÚ changelogs)rsrvrrrÚ configuresP ÿÿÿÿÿ   ÿÿ zRepoQueryCommand.configurec Cs|jrlg}| dt|ƒ¡|jD]>}|d}| d| d¡tj |d¡tj |d¡f¡q"d |¡Szpt |ƒ}|j rŒ|j j   |¡WS|jrº|j}|s´ttdƒ |¡tjd |WS|jrÈ|jWSt|jƒ |¡WSWn6ty}ztj t|ƒ¡‚WYd}~n d}~00dS) NzChangelog for %sÚ timestampz * %s %s %s z %a %b %d %YZauthorÚtextr"zPackage {} contains no files)Úfile)rMÚappendÚstrr‚ÚstrftimerÚi18nÚucdÚjoinÚPackageWrapperrJr€ÚoutputZ infoOutputrKÚfilesÚprintrreÚsysrmrLZ sourcerpmr0r+ÚAttributeErrorÚ exceptionsÚError) rsr9ÚpkgÚoutZchlogÚdtZpoZfilelistÚerrrÚbuild_format_fnGs0 þ  z RepoQueryCommand.build_format_fnc CsJ|jj ¡jdd}|D],}| | tj |¡j |jjddd¡¡}q|S)NT©ÚemptyF)Ú with_providesÚwith_filenames) r€Úsackr:r7ÚunionÚ intersectionrÚsubjectÚSubjectÚget_best_query)rsZnevrasZ base_queryÚresolved_nevras_queryZnevrarrrÚ_resolve_nevrascs ýÿz RepoQueryCommand._resolve_nevrasNcCsD|r|n|}|j|d}| |¡}| |¡}|r@|j|||d}|S)N©r©Údone)ÚfilterÚ differencerŸÚ_do_recursive_deps)rsÚquery_inÚ query_selectr¨Zquery_requiredrrrr«ps    z#RepoQueryCommand._do_recursive_depsFcCsÖ| ||¡}|j|d}| |j|d¡}|r¾| |j|d¡}| |j|d¡}| |j|d¡}| |j|d¡}| |j|d¡}| |j|d¡}| |j|d ¡}| |j|d ¡}|jjrÒ| ||¡}|S) N©Zrequires__globr¦©Zrecommends__glob©Zenhances__glob©Zsupplements__glob©Zsuggests__glob©r ©r ©r©r)r¥r©rŸr9ryr«)rsÚnamesr:Z all_dep_typesr¤ZdepqueryrrrÚ by_all_deps}s   zRepoQueryCommand.by_all_depscCs€|r|n|jj ¡jdd}|jj ¡jdd}| ¡D]}| |j|jd¡}q8| |¡}|rv|j ||| |¡d}| |¡S)NTrš©r r§) r€ržr:r7ÚrunrŸr©rrªÚ_get_recursive_providers_query)rsr¬Ú providersr¨Útr•r­rrrr»›s  z/RepoQueryCommand._get_recursive_providers_querycCstg}g}|jjD]B}tjj |¡d}| d¡r<| |¡q|r|dvr| |¡q|rp|jj|d|jj j d}|S)Nrz.rpm)ÚhttpÚftpr†ÚhttpsF)ÚstrictÚprogress) r9rrZpycompÚurlparseÚendswithr‡r€Zadd_remote_rpmsrŽrÂ)rsZrpmnamesÚremote_packagesrZschemesrrrÚ_add_add_remote_packages¥s      ÿz)RepoQueryCommand._add_add_remote_packagescCsÊ|jjrttƒdS|j |j¡|jjj|jj r8t j nt j d}|jj rð| ¡}ddi}|jj|jvr„|j|jjg|d<d|d<g}|jdd}|r²| |jj ¡j|d¡}|jj D]0}| tjj|dd j|jjfd |i|¤Ž¡}qº|}|jjr | |jjj¡}|jjr^|jjr¦|jjd kr¦t|jj ¡ƒtj  t!d  "d d|jj¡ƒ¡‚nH|jjdkr~| #|jj$j%¡}n(|jjr¦|jjdkr¦t&||jjƒƒ}|jj'dkrÐ|j (|¡}| )|¡ *¡}nž|jj'dkrì|j (|¡}n‚|jj'dkr\tj +|j¡}| ,|jjj-|jjj.¡tj/ 0|¡} d| _1| j2dd} | sXttj3 4|  5¡¡ƒdS|jjsn| ¡}| 6|j|¡}|} |jj7rš|j|jj7d|jj8rÒ|j|jj8d} |  |j| 9|jj8|¡d¡}|jj:rì|j|jj:d|jj;r"|j|jj;d} | r| }n|j|jj;d|jj<rX|jj=rH|j|jj|jj<|¡}|jj?rè|jj=rÖ|j|jj?d}| |j|jj?d¡}| |j|jj?d¡}| |j|jj?d¡}| |j|jj?d¡}n| >|jj?|d¡}|jj@r |j|jj@d} |  |j| 9|jj@|¡d¡}|jjArX|j|jjAd} |  |j| 9|jjA|¡d ¡}|jjBr|j|jjBd} |  |j| 9|jjB|¡d!¡}|jjCrÈ|j|jjCd} |  |j| 9|jjC|¡d"¡}|jjDrà| E|jjD¡}|jjF|dd#}|jjGrTg}|D]<}|jH}|dur|jj ¡j||jId$d%}|| 2¡7}q|jj ¡j|d}|jjJr¦|jj<s’|jjKd&vr’tj  t!d'ƒj"tj3jLd(¡‚| M|| |j¡dStNƒ}|jjKrðtNƒ} | 2¡D]p}|jjdksæ|jj$ O|¡rÄ|jjKd)kr|  P|jQ|jR|jS|jT|jU¡n|  Pt&|tV|jjKƒ¡qÄ|jjWrØ|jjd krf| 6|j|jj ¡¡}n| 6|j|jj ¡ ¡¡}|j| d*}|jjXr¨| | Y||¡¡}tNƒ}| E¡ 2¡D]}| Z| [|j|¡¡qºn| Pd+d,„| Dƒ¡n |jj\r*| 2¡D]"}| ]¡}|dur| Z|¡qnf|jj^r6g}t_tN| 2¡ƒƒD]Ô}|jjdksj|jj$ O|¡rHg}| `d-ta|ƒ¡t_d.d/„|jQDƒƒD]t}| `d0|¡tj |¡}| |jj¡}| 6|j| ¡¡}|jjbsä| E¡}| 2¡D]}| `d1ta|ƒ¡qìq”| `d2 c|¡¡qH|r2td3 c|¡ƒdS|jjdrN| e|¡dS| 2¡D]8}|jjdksx|jj$ O|¡rV| Z| [|j|¡¡qV|rÆ|jjfr´td3 ct_|ƒ¡ƒntd2 ct_|ƒ¡ƒdS)4N)ÚflagsrœFZformsrTrš©r•)Z ignore_caser:rYz)argument {}: not allowed with argument {}rVrur[r\rQrRrS)Zverify)Z file__glob)Zconflicts__glob)r )r )Zprovides__globr®r¯r°r±r²r³r´rµr¶)ZwarningÚsrc)rjÚevrr6)r r r r r rrrzôNo valid switch specified usage: {prog} repoquery [--conflicts|--enhances|--obsoletes|--provides|--recommends|--requires|--suggest|--supplements|--whatrequires] [key] [--tree] description: For the given packages print a tree of the packages.rWrTr¹css|]}t|ƒVqdS©N©rˆ)Ú.0ÚrelrrrÚ Róz'RepoQueryCommand.run..z package: cSsg|] }t|ƒ‘qSrrÌ)rÍÚreqrrrÚ ^rÐz(RepoQueryCommand.run..z dependency: z provider: r"z )gr9rwrÚ QUERY_TAGSroZ _populate_update_security_filterr€ržr:Zdisable_modular_filteringÚhawkeyZIGNORE_MODULAR_EXCLUDESZAPPLY_EXCLUDESrrÆZcommandÚ nevra_formsr©rŸr7rr¡r¢r£ZrecentZ_recentZconfrr]Z optparserÚ print_usager“r”rreZ _unneededÚhistoryZswdbÚgetattrrPZ_get_installonly_queryrªrQZ rpmdb_sackZ _configureZinstallonlypkgsZinstallonly_limitÚgoalZGoalZprotect_running_kernelrºrfZ_format_resolve_problemsZ problem_rulesr;r†Z whatconflictsr¥Z whatobsoletesZ whatprovidesr|rzr¸r~ZwhatrecommendsZ whatenhancesZwhatsupplementsZ whatsuggestsrHZlatestZ_merge_update_filtersrZ source_namerÊZtreerUrgÚ tree_seedÚsetZuser_installedÚupdaterr rrr r%rxryr»Úaddr™ÚlocationZremote_locationZdeplistÚsortedr‡rˆÚverboserŒZ groupmemberÚ_group_member_reportrJ)rsÚqrÅZkwarkZpkgsZ query_resultsrrRZrpmdbrÙZsolvedZorqueryZrelsZquery_for_provideZ dependsqueryZpkg_listr•ÚsrcnameZ tmp_queryr:r¼rÞZdeplist_outputrÑr¡Zproviderrrrrº³sjÿý ÿ ÿÿÿÿ    ÿ                    ÿ üÿ  ÿÿ    ÿ      ÿ      zRepoQueryCommand.runc Csi}|jjjD] }tdd„| ¡Dƒƒ||j<qi}g}| ¡D]b}g}| ¡D]\}} |j| vrP|  |¡qP|r”|  d  t |ƒ¡g¡  t |ƒ¡q@|  t |ƒ¡q@g} t | ¡ƒD]4\} } |   d  t | ƒt dd„|  d¡Dƒƒ¡¡q´|   d  t |ƒ¡¡| rtd  | ¡ƒdS)NcSsg|] }|j‘qSr©rj)rÍr•rrrrÒ~rÐz9RepoQueryCommand._group_member_report..ú$r"cSsg|] }d|‘qS)z @r)rÍÚidrrrrÒŽrÐ)r€ÚcompsrrÛZ packages_iterrærºr&rjr‡Ú setdefaultrŒrßrˆÚsplitr) rsr:Zpackage_conf_dictÚgroupZgroup_package_dictZpkg_not_in_groupr•Z group_id_listZgroup_idZpackage_name_setrŽrZ package_listrrrrá{s2   ÿÿ$ÿz%RepoQueryCommand._group_member_reportc Cs˜| ||¡}|dkr t|ƒdSd}td|ƒD] }|d7}q.g}|jD]}| t|ƒ¡qFdtt|ƒƒdd |¡d} t|d |d| ƒdS) Néÿÿÿÿú rz| ú[z: z, ú]z\_ )r™rÚrangerr‡rˆÚlenrŒ) rsÚlevelr•r9Z pkg_stringZspacingÚxrZ requirepkgZreqstrrrrÚ grow_tree“s   "zRepoQueryCommand.grow_treerëc Cs,tt| ¡ƒdd„dD] }|dus.|dkr4tƒn|}|j d¡sP|j d¡rVdS| |||¡||vr| |¡|jrêt||jƒ}i}t|ƒD]6} |j j   ¡j | d} | D]} | || jd| j <q°q”|j j   ¡j t| ¡ƒd } n&|jr| |jf|¡n |j|jd } | | |||d |¡qdS) NcSs|jSrËrä)ÚprrrÚ¢rÐz,RepoQueryCommand.tree_seed..)rrëZrpmlibZsolvabler¹Ú.rÈr®r)rßrÛrºrjÚ startswithrórÝrUrØr€ržr:r7r6r]Úvaluesr}r¸r©rÚ) rsr:Zaqueryr9rñZusedpkgsr•ZstrpkgÚarrjZpkgqueryZquerypkgrrrrÚ¡s&    ÿzRepoQueryCommand.tree_seed)N)F)N)rëN)r2r3r4Ú__doc__rÔZ FORM_NAMEZFORM_NAZ FORM_NEVRArÕÚtupleÚkeysÚaliasesrZsummaryÚ staticmethodr;rkrtrƒr™r¥r«r¸r»rÆrºrárórÚrrrrr5cs2þ  0  Ir5c@sDeZdZdZdd„Zdd„Zedd„ƒZedd „ƒZ ed d „ƒZ d S) rz>Wrapper for dnf.package.Package, so we can control formatting.cCs ||_dSrË)Ú_pkg)rsr•rrrÚ__init__»szPackageWrapper.__init__cCsFt|j|ƒ}|durdSt|tƒr:d tdd„|Dƒƒ¡Stj |¡S)Nz(none)r"cSsh|]}tj |¡’qSr)rrŠr‹)rÍZreldeprrrÚ ÃrÐz-PackageWrapper.__getattr__..) rØrÿÚ isinstancer]rŒrßrrŠr‹)rsÚattrZatrrrrÚ __getattr__¾s   zPackageWrapper.__getattr__cCs&|dkrtj |¡}| d¡SdSdS)Nrz%Y-%m-%d %H:%Mr$)ÚdatetimeZutcfromtimestampr‰)r„r—rrrÚ_get_timestampÆs  zPackageWrapper._get_timestampcCs| |jj¡SrË)rrÿÚ buildtimerrrrrrÎszPackageWrapper.buildtimecCs| |jj¡SrË)rrÿÚ installtimerrrrrrÒszPackageWrapper.installtimeN) r2r3r4rúrrrþrÚpropertyrrrrrrr·s  r)"Z __future__rrrZdnf.i18nrZdnf.clirZdnf.cli.option_parserrrcrrpÚrer‘rZdnf.exceptionsZ dnf.subjectZdnf.utilrÔZ getLoggerÚloggerrbÚcompiler'rÓr%r0Z_SplitCallbackr1ZCommandr5ÚobjectrrrrrÚsL        ÷ X