3 ÅÀfÜ4ã@sÒddlmZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl Z ddlZ dZejdjeƒƒZejdƒ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_groupscCstj|ƒstjtdƒƒ‚|S)zgroup id validatorzInvalid group id)Ú RE_GROUP_IDÚmatchÚargparseÚArgumentTypeErrorr)Úvalue©r ú$/usr/lib/python3.6/groups_manager.pyÚ group_id_type.s r cCsN|jddƒ}t|ƒdkr&tjtdƒƒ‚|\}}tj|ƒsFtjtdƒƒ‚||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:|jƒ}tjdjtƒd|ƒ}|s6tjjtdƒj|ƒƒ‚|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_idAsr!csdeZdZdZedƒZ‡fdd„Zedd„ƒZdd„Z d d „Z d d „Z d d„Z dd„Z dd„Z‡ZS)ÚGroupsManagerCommandúgroups-managerz$create and edit groups metadata filecstt|ƒj|ƒtjƒ|_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�|jƒ}|jd!d"d dtd#ƒd$�|jd%d"d&dtd'ƒd$�|jƒ}|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.r/z--printÚ store_trueFz#print the result metadata to stdout)r,r-r/z--idzgroup id)Útyper/z-nz--namez group name)r/z --descriptionzgroup descriptionz--display-orderzgroup display orderz--translated-namez LANG:TEXTztranslated name for the group)r,r-r.r1r/z--translated-descriptionz$translated description for the groupz--user-visibleÚ user_visiblez%make the group user visible (default))Údestr,r-r/z--not-user-visibleZ store_falsezmake the group user invisiblez --mandatoryz%add packages to the mandatory section)r,r/z --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.r/)Ú add_argumentrr ÚintrZadd_mutually_exclusive_group)ÚparserZvisibleZsectionr r r Ú set_argparserUsR                        z"GroupsManagerCommand.set_argparsercCs¬|jj}|jjr"d|_d|_d|_|jjrP|jjj d|jjƒ|jj j |jjƒ|jj s„|jj s„|jjs„|jjs„|jjdk s„|jjr¨|jj r¨|jj r¨tjjtdƒƒ‚dS)NTFrz;Can't edit group without specifying it (use --id or --name))rÚdemandsÚoptsr4Zsack_activationZavailable_reposZload_system_repoÚmergeÚloadÚinsertÚsaver+Ú descriptionÚ display_orderÚtranslated_nameÚtranslated_descriptionr2ÚidÚnamerrr)r)r;r r r Ú configure†s" zGroupsManagerCommand.configurecCs �x|jjD�] }tjƒ}yp|jdƒr~tj|ƒ�F}tjdd�}z$t j ||ƒ|j ƒ|j |j ƒWdtj|j ƒXWdQRXn |j |ƒWn~tttjfk �r}zXtƒ}x2|jƒD]&}||krÄq¶tj|jƒƒ|j|ƒq¶Wtjjtdƒj||ƒƒ‚WYdd}~Xq X|j|7_q WdS)zm Loads all input xml files. Returns True if at least one file was successfuly loaded z.gzF)ÚdeleteNzCan't load file "{}": {})r<r>r&r'ÚendswithÚgzipÚopenÚtempfileZNamedTemporaryFileÚshutilZ copyfileobjÚcloseZ fromxml_frFÚosÚunlinkÚIOErrorÚOSErrorZ ParserErrorÚsetZget_last_errorsrÚerrorÚstripÚaddrÚ exceptionsÚErrorrrr()r)Ú file_nameZ file_compsZgz_fileZ temp_fileÚerrÚseenrTr r r Úload_input_filesžs,    $z%GroupsManagerCommand.load_input_filescCsžx˜|jjD]Œ}y|jj|td�}Wn*tjk rL}z |g}WYdd}~XnX|r x"|dd…D]}tj|j ƒƒq`Wt j j t dƒj||dj ƒƒƒ‚q WdS)N)Ú xml_optionsézCan't save file "{}": {}éÿÿÿÿr_)r<r@r(Zxml_fÚCOMPS_XML_OPTIONSr&Z XMLGenErrorrrTrUrrWrXrr)r)rYÚerrorsrZr r r Úsave_output_filesÂsz&GroupsManagerCommand.save_output_filescCs\d}|r*x |jjD]}|j|kr|}PqW|dkrX|rXx |jjD]}|j|kr@|}Pq@W|S)zl Try to find group according to command line parameters - first by id then by name. N)r(ÚgroupsrErF)r)r rFÚgroupZgrpr r r Ú find_groupÒs   zGroupsManagerCommand.find_groupc Csìdd„}|jjr|jj|_|jjr,|jj|_|jjr>|jj|_|jjdk rT|jj|_|jjrj||jjƒ|_|jj r€||jj ƒ|_ |jj �rèt ƒ}xZ|jj D]N}t jj|ƒ}|j|jjdddd�jƒ}|sÞtjtdƒj|ƒƒqš|j|ƒqšW|jj�r2t ƒ}x|D]}|j|jƒ�qW|j|jjjƒj|d�ƒd d „|Dƒ} |jj�r„xœ| D].} x&|j| tj d �D]}|j j|ƒ�qfW�qPWnd|jj!�r–tj"} n|jj#�r¨tj$} ntj%} x8t&| ƒD],} |j| | d ��s¸|j j'tj(| | d �ƒ�q¸WdS) zE Set attributes and package lists for selected group cSs&tjƒ}x|D]\}}|||<qW|S)N)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 )rF)Ú.0Úpkgr r r ú sz2GroupsManagerCommand.edit_group..)rFr1))r<rFrAZdescrBr2Z uservisiblerCZ name_by_langrDZ desc_by_langr4rSrZsubjectZSubjectZget_best_queryÚbaseZsackZlatestrZwarningrrÚupdateZ dependenciesZrequiresZqueryZfiltermÚremoveZpackages_matchr&ZPACKAGE_TYPE_UNKNOWNZ mandatoryZPACKAGE_TYPE_MANDATORYZoptionalZPACKAGE_TYPE_OPTIONALZPACKAGE_TYPE_DEFAULTÚsortedr+ZPackage) r)rdrfr4Zpkg_specZsubjÚqZ requirementsrhZ pkg_namesZpkg_nameZpkg_typer r r Ú edit_groupäsT              zGroupsManagerCommand.edit_groupcCs|jƒ|jjs|jjrÐ|j|jj|jjd�}|dkrÆ|jjrNtjjt dƒƒ‚t j ƒ}|jjrt|jj|_|jj|_nD|jjr¸t |jjƒ}|j|dd�r²tj jt dƒj||jjƒƒ‚||_|jjj|ƒ|j|ƒ|jƒ|jjsê|jj rüt|jjtd�ƒdS)N)r rFz-Can't remove packages from non-existent groupzRGroup id '{}' generated from '{}' is duplicit. Please specify group id using --id.)r])r\r<rErFrerlrrWrXrr&ZGroupr!rrrr(rcr+rorbÚprintr@Zxml_strr`)r)rdr r r r Úrun!s,    zGroupsManagerCommand.run)r#)Ú__name__Ú __module__Ú __qualname__ÚaliasesrZsummaryr%Ú staticmethodr:rGr\rbrerorqÚ __classcell__r r )r*r r"Ls  1$=r")Z __future__rrrrJr&rOrrMrLZdnfpluginscorerrrZdnf.clirÚcompilerrrr`r rr!ZpluginZregister_commandrZCommandr"r r r r Ús,