3 f|e4@sddlmZddlmZddlZddlZddlZddlZddlZddlZddl Z ddl m Z m Z ddl Z ddlZ dZejdjeZejdZdddd 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_groupscCstj|stjtd|S)zgroup id validatorzInvalid group id) RE_GROUP_IDmatchargparseArgumentTypeErrorr)valuer $/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)splitlenrr rRE_LANGr)r datalangtextr r r translation_type5s    rcCs:|j}tjdjtd|}|s6tjjtdj||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)GroupsManagerCommandgroups-managerz$create and edit groups metadata filecstt|j|tj|_dS)N)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|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 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.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 packagespackages*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 rtjjtddS)NTFrz;Can't edit group without specifying it (use --id or --name))rdemandsoptsr4Zsack_activationZavailable_reposZload_system_repomergeloadinsertsaver+ description display_ordertranslated_nametranslated_descriptionr2idnamerrr)r)r;r r r configures" zGroupsManagerCommand.configurecCs x|jjD] }tj}yp|jdr~tj|F}tjdd}z$t j |||j |j |j Wdtj|j XWdQRXn |j |Wn~tttjfk r}zXt}x2|jD]&}||krqtj|j|j|qWtjjtdj||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'endswithgzipopentempfileZNamedTemporaryFileshutilZ copyfileobjcloseZ fromxml_frFosunlinkIOErrorOSErrorZ ParserErrorsetZget_last_errorsrerrorstripaddr exceptionsErrorrrr()r) file_nameZ file_compsZgz_fileZ temp_fileerrseenrTr r r load_input_filess,    $z%GroupsManagerCommand.load_input_filescCsx|jjD]}y|jj|td}Wn*tjk rL}z |g}WYdd}~XnX|r x"|ddD]}tj|j q`Wt j j t dj||dj q WdS)N) xml_optionszCan't save file "{}": {}r_)r<r@r(Zxml_fCOMPS_XML_OPTIONSr&Z XMLGenErrorrrTrUrrWrXrr)r)rYerrorsrZr r r save_output_filessz&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 rFgroupZgrpr r r find_groups   zGroupsManagerCommand.find_groupc Csdd}|jjr|jj|_|jjr,|jj|_|jjr>|jj|_|jjdk rT|jj|_|jjrj||jj|_|jj r||jj |_ |jj rt }xZ|jj D]N}t jj|}|j|jjddddj}|stjtdj|q|j|qW|jjr2t }x|D]}|j|jqW|j|jjjj|dd d |D} |jjrx| D].} x&|j| tj d D]}|j j|qfWqPWnd|jj!rtj"} n|jj#rtj$} ntj%} x8t&| D],} |j| | d s|j j'tj(| | d qWdS) zE Set attributes and package lists for selected group cSs&tj}x|D]\}}|||<qW|S)N)r&ZStrDict)ZlstZstr_dictrrr r r langlist_to_strdicts z.langlist_to_strdictNTF)Z with_nevraZ with_providesZwith_filenameszNo match for argument: {})ZprovidescSsh|] }|jqSr )rF).0pkgr r r sz2GroupsManagerCommand.edit_group..)rFr1))r<rFrAZdescrBr2Z uservisiblerCZ name_by_langrDZ desc_by_langr4rSrZsubjectZSubjectZget_best_querybaseZsackZlatestrZwarningrrupdateZ dependenciesZrequiresZqueryZfiltermremoveZpackages_matchr&ZPACKAGE_TYPE_UNKNOWNZ mandatoryZPACKAGE_TYPE_MANDATORYZoptionalZPACKAGE_TYPE_OPTIONALZPACKAGE_TYPE_DEFAULTsortedr+ZPackage) r)rdrfr4Zpkg_specZsubjqZ requirementsrhZ pkg_namesZpkg_nameZpkg_typer r r edit_groupsT              zGroupsManagerCommand.edit_groupcCs|j|jjs|jjr|j|jj|jjd}|dkr|jjrNtjjt dt j }|jjrt|jj|_|jj|_nD|jjrt |jj}|j|ddrtj jt dj||jj||_|jjj||j||j|jjs|jj rt|jjtddS)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+rorbprintr@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.clircompilerrrr`r rr!ZpluginZregister_commandrZCommandr"r r r r s,