a &c,@sjddlmZddlmZddlZddlmZddlZddlm Z Gdddej Z Gdd d ej j ZdS) )absolute_import)unicode_literalsN) OptionParser)_cs eZdZdZfddZZS)RepoDiffrepodiffcs,tt||||durdS|tdSN)superr__init__Zregister_commandRepoDiffCommand)selfbasecli __class__8/usr/lib/python3.9/site-packages/dnf-plugins/repodiff.pyr $szRepoDiff.__init__)__name__ __module__ __qualname__namer __classcell__rrrrr src@sLeZdZdZedZeddZddZddZ d d Z d d Z d dZ dS)r )rz1List differences between two sets of repositoriesc Cs|jddgddtdd|jddgdd td d|jd d d gtjdtdd|jdddtdd|jddtdd|jddtdd|jddtdddS)Nz --repo-oldz-oappendoldz2Specify old repository, can be used multiple times)defaultactiondesthelpz --repo-newz-nnewz2Specify new repository, can be used multiple timesz--archz --archlistz-aarcheszhSpecify architectures to compare, can be used multiple times. By default, only source rpms are compared.z--sizez-s store_truez5Output additional data about the size of the changes.)rrz--compare-archzMCompare packages also by arch. By default packages are compared just by name.z--simplez7Output a simple one line message for modified packages.z --downgradezNSplit the data for modified packages between upgraded and downgraded packages.) add_argumentrrZ_SplitCallback)parserrrr set_argparser/s,   zRepoDiffCommand.set_argparsercCs|jj}d|_d|_d|_dg|jj_|jj r6|jj sJt d}t j ||jjD],}|j|jj |jj vrz|qV|qV|jjsdg|j_dS)NTallz*Both old and new repositories must be set.src)rdemandsZsack_activationZavailable_repos changelogsr ZconfZdisable_excludesoptsrrrdnf exceptionsErrorZreposr$idenabledisabler)r r&msgZreporrr configureMs    zRepoDiffCommand.configurecCs|jjr|j|jfS|jSr)r( compare_archrarch)r pkgrrr_pkgkey`s zRepoDiffCommand._pkgkeyc s*tfdd|Dt}tfdd|Dt}t}|j|dD]&}|j|jdD]}|||<qhqVjjj}tfdd||Dfdd||D|ggd} | |D]\} | } | } | j | j krq|| j | j d kr| d  | | fq| d  | | fq| S) aNcompares packagesets old and new, returns dictionary with packages: added: only in new set removed: only in old set upgraded: in both old and new, new has bigger evr downgraded: in both old and new, new has lower evr obsoletes: dictionary of which old package is obsoleted by which new csg|]}||fqSrr4.0pr rr mz-RepoDiffCommand._repodiff..csg|]}||fqSrr5r6r9rrr:or;) obsoletes)Zprovidescsg|] }|qSrrr7k)new_drrr:zr;csg|] }|qSrrr=)old_drrr:{r;)addedremovedr<upgraded downgradedrrDrC) dictsetkeysfilterr<r4r sackevr_cmp intersectionevrr) r rrZold_keysZnew_keysr<Z obsoleterZ obsoletedrJrr>pkg_oldpkg_newr)r?r@r r _repodiffes2    zRepoDiffCommand._repodiffc sTfdddd}fdd}tddddd}t|d D],}ttd ||d |j7<q>t|d D]Z}ttd ||d |}|rttd||d |j7<qxjj r|dr.ttdt|dD],\}}|d|j|j7<|||q|drttdt|dD],\}}|d|j|j7<|||qPnX|d|d} | rttdt| D],\}}|d|j|j7<|||qttdttdt |d ttdt |d jj rXttdt |dttdt |dn&ttdt |dt |djjrPttd||d ttd||d jj sttd||d|dn4ttd||dttd||dttd||d |d|d|d dS) Ncs jjrt|Sd|j|jfS)Nz%s-%s)r(r1strrrL)r3r9rrpkgstrsz'RepoDiffCommand._report..pkgstrcSsXt|}|dkr.|dtjj|7}n&|dkrT|dtjj| 7}|S)Nrz ({})z (-{}))rPformatr)rZ format_numberstrip)Znumr/rrrsizestrs z(RepoDiffCommand._report..sizestrc sFg}jjr*|d||fn |d|d||f|dt|d|jrv|jd}nd}|jD]}|r|d|dkrqn6|d|dkr|d|dkr|d|dkrq|d |dd tj|dtj|dfqjj r4|t d  |j |j t d |dS) Nz%s -> %s-rZ timestampZauthortextz * %s %s %sz %a %b %d %YzSize change: {} bytes )r(simplerlenr'strftimer)Zi18nZucdsizerrRprintjoin)rMrNZmsgsZ old_chlogZchlogrQr rrreport_modifieds:        z0RepoDiffCommand._report..report_modifiedr)rArBrCrDrAzAdded package : {}rBzRemoved package: {}r<zObsoleted by : {}rCz Upgraded packagesrDz Downgraded packagesz Modified packagesz SummaryzAdded packages: {}zRemoved packages: {}zUpgraded packages: {}zDowngraded packages: {}zModified packages: {}zSize of added packages: {}zSize of removed packages: {}zSize of modified packages: {}zSize of upgraded packages: {}zSize of downgraded packages: {}zSize change: {}) rEsortedr^rrRr]getr4r(Z downgrader[) r rrTraZsizesr3Z obsoletedbyrMrNZmodifiedrr`r_reportsr                  zRepoDiffCommand._reportcCs|jjtjj|jjd}|jjtjj|jjd}|jj rld|jj vrl|j |jj d|j |jj d|jj r|j dd|j ddn|j dd|j dd| | | |||dS)N)Zreponame*)r2)Zlatest_per_arch)Zlatest)r rIqueryhawkeyZIGNORE_EXCLUDESrHr(rrrZfiltermr1ZapplyrdrO)r Zq_newZq_oldrrrruns"   zRepoDiffCommand.runN) rrraliasesrZsummary staticmethodr#r0r4rOrdrirrrrr +s &ar )Z __future__rrZdnf.clir)Zdnf.cli.option_parserrrhZdnfpluginscorerZPluginrrZCommandr rrrrs