a º&cÜ4ã@sÒddlmZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl Z ddlZ dZe d e¡¡Ze d¡Zdddd œZd d „Zd d „Zdd„Ze jjGdd„de jjƒƒZdS)é)Úabsolute_import)Úunicode_literalsN)Ú_Úloggerz -a-z0-9_.:z^[{}]+$z^[-a-zA-Z0-9_.@]+$T)Zdefault_explicitZuservisible_explicitZ empty_groupscCst |¡st tdƒ¡‚|S)zgroup id validatorzInvalid group id)Ú RE_GROUP_IDÚmatchÚargparseÚArgumentTypeErrorr)Úvalue©r ú>/usr/lib/python3.9/site-packages/dnf-plugins/groups_manager.pyÚ group_id_type.s r cCsN| dd¡}t|ƒdkr&t tdƒ¡‚|\}}t |¡sFt tdƒ¡‚||fS)ztranslated texts validatorú:éz6Invalid translated data, should be in form 'lang:text'z*Invalid/empty language for translated data)ÚsplitÚlenrr rÚRE_LANGr)r ÚdataÚlangÚtextr r r Útranslation_type5s  ÿ rcCs:| ¡}t d t¡d|¡}|s6tj tdƒ |¡¡‚|S)z#generate group id based on its namez[^{}]ÚzFCan't generate group id from '{}'. Please specify group id using --id.) ÚlowerÚreÚsubÚformatÚRE_GROUP_ID_VALIDÚdnfÚcliÚCliErrorr)rÚgroup_idr r r Ú text_to_idAsÿÿr!csdeZdZdZedƒZ‡fdd„Zedd„ƒZdd„Z d d „Z d d „Z d d„Z dd„Z dd„Z‡ZS)ÚGroupsManagerCommand)zgroups-managerz$create and edit groups metadata filecstt|ƒ |¡t ¡|_dS©N)Úsuperr"Ú__init__ÚlibcompsÚCompsÚcomps)Úselfr©Ú __class__r r r%QszGroupsManagerCommand.__init__cCsˆ|jddgdtdƒd�|jddgdtdƒd�|jddtd ƒd �|jd d d tdƒd�|jdttdƒd�|jddtdƒd�|jdtdƒd�|jdttdƒd�|jddgdttdƒd�|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 td0ƒd*�|jd1d2d3td4ƒd5�dS)6Nz--loadÚappendz COMPS.XMLzload groups metadata from file)ÚactionÚdefaultÚmetavarÚhelpz--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 packagesÚpackagesÚ*ZPACKAGEzpackage specification)Únargsr/r0)Ú add_argumentrr ÚintrÚadd_mutually_exclusive_group)ÚparserZvisibleÚsectionr 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¤|jjs¤tj tdƒ¡‚dS)NTFrz;Can't edit group without specifying it (use --id or --name))rÚdemandsÚoptsr6Zsack_activationZavailable_reposZload_system_repoÚmergeÚloadÚinsertÚsaver,Ú descriptionÚ display_orderÚtranslated_nameÚtranslated_descriptionr3ÚidÚnamerrr)r)r?r r r Ú configure†s.ÿþý üûÿzGroupsManagerCommand.configurec Cs8|jjD�](}t ¡}z�| d¡ršt |¡�\}tjdd�}z0t   ||¡|  ¡|  |j ¡Wt |j ¡nt |j ¡0Wdƒq¤1sŽ0Yn |  |¡Wn|tttjf�y"}zZtƒ}| ¡D]&}||vrÜqÎt | ¡¡| |¡qÎtj tdƒ ||¡¡‚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'ÚendswithÚgzipÚopenÚtempfileZNamedTemporaryFileÚshutilÚ copyfileobjÚcloseZ fromxml_frJÚosÚunlinkÚIOErrorÚOSErrorZ ParserErrorÚsetZget_last_errorsrÚerrorÚstripÚaddrÚ exceptionsÚErrorrrr()r)Ú file_nameZ file_compsZgz_fileZ temp_fileÚerrÚseenrYr r r Úload_input_filesžs.    <  ÿz%GroupsManagerCommand.load_input_filesc Cs˜|jjD]Š}z|jj|td�}Wn,tjyL}z|g}WYd}~n d}~00|r|dd…D]}t |  ¡¡q^t j   t dƒ ||d  ¡¡¡‚qdS)N©Z xml_optionséÿÿÿÿzCan't save file "{}": {})r@rDr(Zxml_fÚCOMPS_XML_OPTIONSr&Z XMLGenErrorrrYrZrr\r]rr)r)r^Úerrorsr_r r r Úsave_output_filesÂs  ÿ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 rJÚgroupÚgrpr r r Ú find_groupÒs     zGroupsManagerCommand.find_groupc CsÖdd„}|jjr|jj|_|jjr,|jj|_|jjr>|jj|_|jjdurT|jj|_|jjrj||jjƒ|_|jj r€||jj ƒ|_ |jj �rÒt ƒ}|jj D]N}t j |¡}|j|jjdddd� ¡}|sÜt tdƒ |¡¡q˜| |¡q˜|jj�r(t ƒ}|D]}| |j¡qü| |jj ¡j|d�¡d d „|Dƒ} |jj�rr| D]*} |j| tj d �D]}|j  |¡�qX�qDn`|jj!�r„tj"} n|jj#�r–tj$} ntj%} t&| ƒD],} |j| | d ��s¤|j  'tj(| | d �¡�q¤dS) zE Set attributes and package lists for selected group cSs"t ¡}|D]\}}|||<q |Sr#)r&ZStrDict)ZlstZstr_dictrrr r r Úlanglist_to_strdictès  z.langlist_to_strdictNTF)Z with_nevraZ with_providesZwith_filenameszNo match for argument: {})ZprovidescSsh|] }|j’qSr )rJ)Ú.0Úpkgr r r Ú óz2GroupsManagerCommand.edit_group..)rJr2))r@rJrEZdescrFr3Z uservisiblerGZ name_by_langrHZ desc_by_langr6rXrZsubjectZSubjectZget_best_queryÚbaseZsackZlatestrZwarningrrÚupdateZ dependenciesZrequiresÚqueryZfiltermÚremoveZpackages_matchr&ZPACKAGE_TYPE_UNKNOWNZ mandatoryZPACKAGE_TYPE_MANDATORYZoptionalZPACKAGE_TYPE_OPTIONALZPACKAGE_TYPE_DEFAULTÚsortedr,ZPackage) r)rhrkr6Zpkg_specZsubjÚqZ requirementsrmZ pkg_namesÚpkg_nameZpkg_typer r r Ú edit_groupäsX         ÿ    ÿ    zGroupsManagerCommand.edit_groupcCsþ| ¡|jjs|jjrÐ|j|jj|jjd�}|durÆ|jjrNtj t dƒ¡‚t   ¡}|jjrt|jj|_|jj|_nD|jjr¸t |jjƒ}|j|dd�r²tj  t dƒ ||jj¡¡‚||_|jj |¡| |¡| ¡|jjsè|jjsút|jjtd�ƒdS)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,rwrfÚprintrDZxml_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.clirÚcompilerrrrdr rr!ZpluginZregister_commandrZCommandr"r r r r Ús.   ý