diff --git a/pungi/scripts/create_packages_json.py b/pungi/scripts/create_packages_json.py index 711a1f99..2a875640 100644 --- a/pungi/scripts/create_packages_json.py +++ b/pungi/scripts/create_packages_json.py @@ -19,7 +19,9 @@ import createrepo_c as cr import dnf.subject import hawkey import requests +import rpm import yaml +from createrepo_c import Package from dataclasses import dataclass @@ -235,6 +237,20 @@ class PackagesGenerator: os.remove(repomd_record_file_path) return list(modules_data) + @staticmethod + def compare_pkgs_version(package_1: Package, package_2: Package) -> int: + version_tuple_1 = ( + package_1.epoch, + package_1.version, + package_1.release, + ) + version_tuple_2 = ( + package_2.epoch, + package_2.version, + package_2.release, + ) + return rpm.labelCompare(version_tuple_1, version_tuple_2) + def generate_packages_json( self ) -> Dict[AnyStr, Dict[AnyStr, Dict[AnyStr, List[AnyStr]]]]: @@ -248,6 +264,7 @@ class PackagesGenerator: ) ) ) + all_packages = defaultdict(dict) for repo_info in self.repos: packages = {} # type: Dict[AnyStr, cr.Package] repomd_records = self._get_repomd_records( @@ -259,31 +276,50 @@ class PackagesGenerator: packages=packages, ) for package in packages.values(): - package_name = package.name - package_arch = package.arch + package_key = f'{package.name}.{package.arch}' if 'module' in package.release: continue - if any(re.search(excluded_package, package_name) - for excluded_package in self.excluded_packages): - continue - src_package_name = dnf.subject.Subject( - package.rpm_sourcerpm, - ).get_nevra_possibilities( - forms=hawkey.FORM_NEVRA, + if package_key not in all_packages: + all_packages[package_key]['variant'] = repo_info.name + all_packages[package_key]['arch'] = repo_info.arch + all_packages[package_key]['package'] = package + elif self.compare_pkgs_version( + package, + all_packages[package_key]['package'] + ) > 0: + all_packages[package_key]['variant'] = repo_info.name + all_packages[package_key]['arch'] = repo_info.arch + all_packages[package_key]['package'] = package + + for package_dict in all_packages.values(): + repo_name = package_dict['variant'] + repo_arch = package_dict['arch'] + package = package_dict['package'] + package_name = package.name + package_arch = package.arch + if 'module' in package.release: + continue + if any(re.search(excluded_package, package_name) + for excluded_package in self.excluded_packages): + continue + src_package_name = dnf.subject.Subject( + package.rpm_sourcerpm, + ).get_nevra_possibilities( + forms=hawkey.FORM_NEVRA, + ) + if len(src_package_name) > 1: + # We should stop utility if we can't get exact name of srpm + raise ValueError( + 'We can\'t get exact name of srpm ' + f'by its NEVRA "{package.rpm_sourcerpm}"' ) - if len(src_package_name) > 1: - # We should stop utility if we can't get exact name of srpm - raise ValueError( - 'We can\'t get exact name of srpm ' - f'by its NEVRA "{package.rpm_sourcerpm}"' - ) - else: - src_package_name = src_package_name[0].name - pkgs_list = packages_json[repo_info.name][ - repo_info.arch][src_package_name] - added_pkg = f'{package_name}.{package_arch}' - if added_pkg not in pkgs_list: - pkgs_list.append(added_pkg) + else: + src_package_name = src_package_name[0].name + pkgs_list = packages_json[repo_name][ + repo_arch][src_package_name] + added_pkg = f'{package_name}.{package_arch}' + if added_pkg not in pkgs_list: + pkgs_list.append(added_pkg) return packages_json diff --git a/tests/test_create_packages_json.py b/tests/test_create_packages_json.py index ac964e18..f5ffbcf4 100644 --- a/tests/test_create_packages_json.py +++ b/tests/test_create_packages_json.py @@ -21,6 +21,14 @@ test_repo_info = RepoInfo( is_remote=False, ) +test_repo_info_2 = RepoInfo( + path=FOLDER_WITH_TEST_DATA, + folder='test_repo_2', + name='TestRepo2', + arch='x86_64', + is_remote=False, +) + class TestPackagesJson(TestCase): def test_01__get_remote_file_content(self): @@ -53,6 +61,7 @@ class TestPackagesJson(TestCase): pg = PackagesGenerator( repos=[ test_repo_info, + test_repo_info_2, ], excluded_packages=['zziplib-utils'], ) @@ -65,9 +74,12 @@ class TestPackagesJson(TestCase): ) test_packages['TestRepo']['x86_64']['zziplib'] = \ [ - 'zziplib.i686', 'zziplib.x86_64', ] + test_packages['TestRepo2']['x86_64']['zziplib'] = \ + [ + 'zziplib.i686', + ] result = pg.generate_packages_json() self.assertEqual( test_packages,