a &c4@sddlmZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl Z ddlZ dZedeZedZdddd Zd d Zd d ZddZe jjGddde jjZdS))absolute_import)unicode_literalsN)_loggerz -a-z0-9_.:z^[{}]+$z^[-a-zA-Z0-9_.@]+$T)Zdefault_explicitZuservisible_explicitZ empty_groupscCst|sttd|S)zgroup id validatorzInvalid group id) RE_GROUP_IDmatchargparseArgumentTypeErrorr)valuer >/usr/lib/python3.9/site-packages/dnf-plugins/groups_manager.py group_id_type.s r cCsN|dd}t|dkr&ttd|\}}t|sFttd||fS)ztranslated texts validator:z6Invalid translated data, should be in form 'lang:text'z*Invalid/empty language for translated data)splitlenrr rRE_LANGr)r datalangtextr r r translation_type5s   rcCs:|}tdtd|}|s6tjtd||S)z#generate group id based on its namez[^{}]zFCan't generate group id from '{}'. Please specify group id using --id.) lowerresubformatRE_GROUP_ID_VALIDdnfcliCliErrorr)rgroup_idr r r text_to_idAsr!csdeZdZdZedZfddZeddZddZ d d Z d d Z d dZ ddZ ddZZS)GroupsManagerCommand)zgroups-managerz$create and edit groups metadata filecstt||t|_dSN)superr"__init__libcompsCompscomps)selfr __class__r r r%QszGroupsManagerCommand.__init__cCs|jddgdtdd|jddgdtdd|jddtd d |jd d d tdd|jdttdd|jddtdd|jdtdd|jdttdd|jddgdttdd|jddgdttd d|}|jd!d"d dtd#d$|jd%d"d&dtd'd$|}|jd(d td)d*|jd+d td,d*|jd-d d td.d|jd/d td0d*|jd1d2d3td4d5dS)6Nz--loadappendz COMPS.XMLzload groups metadata from file)actiondefaultmetavarhelpz--savezsave groups metadata to filez--mergez%load and save groups metadata to file)r/r0z--print store_trueFz#print the result metadata to stdout)r-r.r0z--idzgroup id)typer0z-nz--namez group name)r0z --descriptionzgroup descriptionz--display-orderzgroup display orderz--translated-namez LANG:TEXTztranslated name for the group)r-r.r/r2r0z--translated-descriptionz$translated description for the groupz--user-visible user_visiblez%make the group user visible (default))destr-r.r0z--not-user-visible store_falsezmake the group user invisiblez --mandatoryz%add packages to the mandatory section)r-r0z --optionalz$add packages to the optional sectionz--removez5remove packages from the group instead of adding themz--dependenciesz-include also direct dependencies for packagespackages*ZPACKAGEzpackage specification)nargsr/r0) add_argumentrr intradd_mutually_exclusive_group)parserZvisiblesectionr r r set_argparserUsr         z"GroupsManagerCommand.set_argparsercCs|jj}|jjr"d|_d|_d|_|jjrP|jj d|jj|jj |jj|jj s|jj s|jjs|jjs|jjdus|jjr|jjs|jjstjtddS)NTFrz;Can't edit group without specifying it (use --id or --name))rdemandsoptsr6Zsack_activationZavailable_reposZload_system_repomergeloadinsertsaver, description display_ordertranslated_nametranslated_descriptionr3idnamerrr)r)r?r r r configures. zGroupsManagerCommand.configurec Cs8|jjD](}t}z|drt|\}tjdd}z0t ||| | |j Wt|j nt|j 0Wdq1s0Yn | |Wn|tttjfy"}zZt}|D]&}||vrqt|||qtjtd||WYd}~qd}~00|j|7_qdS)zm Loads all input xml files. Returns True if at least one file was successfuly loaded z.gzF)deleteNzCan't load file "{}": {})r@rBr&r'endswithgzipopentempfileZNamedTemporaryFileshutil copyfileobjcloseZ fromxml_frJosunlinkIOErrorOSErrorZ ParserErrorsetZget_last_errorsrerrorstripaddr exceptionsErrorrrr()r) file_nameZ file_compsZgz_fileZ temp_fileerrseenrYr r r load_input_filess.    <  z%GroupsManagerCommand.load_input_filesc Cs|jjD]}z|jj|td}Wn,tjyL}z|g}WYd}~n d}~00|r|ddD]}t| q^t j t d||d qdS)NZ xml_optionszCan't save file "{}": {})r@rDr(Zxml_fCOMPS_XML_OPTIONSr&Z XMLGenErrorrrYrZrr\r]rr)r)r^errorsr_r r r save_output_filess  z&GroupsManagerCommand.save_output_filescCsXd}|r(|jjD]}|j|kr|}q(q|durT|rT|jjD]}|j|kr<|}qTq<|S)zl Try to find group according to command line parameters - first by id then by name. N)r(groupsrIrJ)r)r rJgroupgrpr r r find_groups     zGroupsManagerCommand.find_groupc Csdd}|jjr|jj|_|jjr,|jj|_|jjr>|jj|_|jjdurT|jj|_|jjrj||jj|_|jj r||jj |_ |jj rt }|jj D]N}t j|}|j|jjdddd}|sttd|q||q|jjr(t }|D]}||jq||jjj|dd d |D} |jjrr| D]*} |j| tj d D]}|j |qXqDn`|jj!rtj"} n|jj#rtj$} ntj%} t&| D],} |j| | d s|j 'tj(| | d qdS) zE Set attributes and package lists for selected group cSs"t}|D]\}}|||<q |Sr#)r&ZStrDict)ZlstZstr_dictrrr r r langlist_to_strdicts  z.langlist_to_strdictNTF)Z with_nevraZ with_providesZwith_filenameszNo match for argument: {})ZprovidescSsh|] }|jqSr )rJ).0pkgr r r z2GroupsManagerCommand.edit_group..)rJr2))r@rJrEZdescrFr3Z uservisiblerGZ name_by_langrHZ desc_by_langr6rXrZsubjectZSubjectZget_best_querybaseZsackZlatestrZwarningrrupdateZ dependenciesZrequiresqueryZfiltermremoveZpackages_matchr&ZPACKAGE_TYPE_UNKNOWNZ mandatoryZPACKAGE_TYPE_MANDATORYZoptionalZPACKAGE_TYPE_OPTIONALZPACKAGE_TYPE_DEFAULTsortedr,ZPackage) r)rhrkr6Zpkg_specZsubjqZ requirementsrmZ pkg_namespkg_nameZpkg_typer r r edit_groupsX                 zGroupsManagerCommand.edit_groupcCs||jjs|jjr|j|jj|jjd}|dur|jjrNtjt dt }|jjrt|jj|_|jj|_nD|jjrt |jj}|j|ddrtj t d||jj||_|jj|||||jjs|jjst|jjtddS)N)r rJz-Can't remove packages from non-existent groupzRGroup id '{}' generated from '{}' is duplicit. Please specify group id using --id.rb)rar@rIrJrjrsrr\r]rr&ZGroupr!rrrr(rgr,rwrfprintrDZxml_strrd)r)rhr r r r run!s0    zGroupsManagerCommand.run)__name__ __module__ __qualname__aliasesrZsummaryr% staticmethodr>rKrarfrjrwry __classcell__r r r*r r"Ls  0$=r")Z __future__rrrrNr&rTrrQrPZdnfpluginscorerrrZdnf.clircompilerrrrdr rr!ZpluginZregister_commandrZCommandr"r r r r s.