From 20b5789664c378c9f4f408f3851ae814fcbcd8e4 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Nov 09 2022 09:36:45 +0000 Subject: [PATCH 1/5] rpmdiff: replace deprecated rpm call Related: https://pagure.io/koji/issue/3561 --- diff --git a/koji/rpmdiff.py b/koji/rpmdiff.py index fdd34af..213d454 100644 --- a/koji/rpmdiff.py +++ b/koji/rpmdiff.py @@ -117,8 +117,13 @@ class Rpmdiff: # compare the files - old_files_dict = self.__fileIteratorToDict(old.fiFromHeader()) - new_files_dict = self.__fileIteratorToDict(new.fiFromHeader()) + try: + old_files_dict = self.__fileIteratorToDict(rpm.files(old)) + new_files_dict = self.__fileIteratorToDict(rpm.files(new)) + except AttributeError: + old_files_dict = self.__fileIteratorToDict(old.fiFromHeader()) + new_files_dict = self.__fileIteratorToDict(new.fiFromHeader()) + files = sorted(set(itertools.chain(six.iterkeys(old_files_dict), six.iterkeys(new_files_dict)))) self.old_data['files'] = old_files_dict @@ -227,7 +232,12 @@ class Rpmdiff: def __fileIteratorToDict(self, fi): result = {} for filedata in fi: - result[filedata[0]] = list(filedata[1:]) + if isinstance(filedata, (list, tuple)): + # old interface (fiFromHeader) + result[filedata[0]] = list(filedata[1:]) + else: + # new (rpm.files) + result[filedata.name] = filedata return result def kojihash(self, new=False): From 99d8496ffee6ee54d54623fe89391c5e9e84e5bb Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Nov 09 2022 09:36:45 +0000 Subject: [PATCH 2/5] alternate approach --- diff --git a/koji/rpmdiff.py b/koji/rpmdiff.py index 213d454..96b7b09 100644 --- a/koji/rpmdiff.py +++ b/koji/rpmdiff.py @@ -117,12 +117,8 @@ class Rpmdiff: # compare the files - try: - old_files_dict = self.__fileIteratorToDict(rpm.files(old)) - new_files_dict = self.__fileIteratorToDict(rpm.files(new)) - except AttributeError: - old_files_dict = self.__fileIteratorToDict(old.fiFromHeader()) - new_files_dict = self.__fileIteratorToDict(new.fiFromHeader()) + old_files_dict = self.__getFilesDict(old) + new_files_dict = self.__getFilesDict(new) files = sorted(set(itertools.chain(six.iterkeys(old_files_dict), six.iterkeys(new_files_dict)))) @@ -229,15 +225,19 @@ class Rpmdiff: (self.ADDED, tagname, newentry[0], self.sense2str(newentry[1]), newentry[2])) + def __getFilesDict(self, hdr): + if not hasattr(rpm, 'files'): + # fall back to file iterator + return self.__fileIteratorToDict(hdr.fiFromHeader()) + result = {} + for file in rpm.files(hdr): + result[file.name] = file + return result + def __fileIteratorToDict(self, fi): result = {} for filedata in fi: - if isinstance(filedata, (list, tuple)): - # old interface (fiFromHeader) - result[filedata[0]] = list(filedata[1:]) - else: - # new (rpm.files) - result[filedata.name] = filedata + result[filedata[0]] = list(filedata[1:]) return result def kojihash(self, new=False): From 81d77dc5b180546b7debc3be2835aa055bfbcaaf Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Nov 09 2022 09:36:45 +0000 Subject: [PATCH 3/5] Emulate old list data --- diff --git a/koji/rpmdiff.py b/koji/rpmdiff.py index 96b7b09..e8b386b 100644 --- a/koji/rpmdiff.py +++ b/koji/rpmdiff.py @@ -231,12 +231,30 @@ class Rpmdiff: return self.__fileIteratorToDict(hdr.fiFromHeader()) result = {} for file in rpm.files(hdr): - result[file.name] = file + # mimic old fi order because comparison and kojihash relies on it + # (FN, FSize, FMode, FMtime, FFlags, FRdev, FInode, FNlink, FState, VFlags, FUser, FGroup, Digest) + filedata = [ + # name omitted + file.size, + file.mode, + file.mtime, + file.fflags, + file.rdev, + file.inode, + file.nlink, + file.state, + file.vflags, + file.user, + file.group, + file.digest, + ] + result[file.name] = filedata return result def __fileIteratorToDict(self, fi): result = {} for filedata in fi: + # index by name result[filedata[0]] = list(filedata[1:]) return result From 350cec9c0c1689bcf4747c5942d7372b3764839a Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Nov 09 2022 10:00:21 +0000 Subject: [PATCH 4/5] kojihash test --- diff --git a/tests/test_hub/test_rpmdiff.py b/tests/test_hub/test_rpmdiff.py index 1fee906..89b32cc 100644 --- a/tests/test_hub/test_rpmdiff.py +++ b/tests/test_hub/test_rpmdiff.py @@ -81,6 +81,21 @@ class TestRPMDiff(unittest.TestCase): d = koji.rpmdiff.Rpmdiff(rpm1, rpm2, ignore='S5TN') self.assertEqual(d.textdiff(), '') + def test_rpmdiff_kojihash(self): + data_path = os.path.abspath("tests/test_hub/data/rpms") + + # the only differences between rpm1 and rpm2 are 1) create time 2) file name + rpm1 = os.path.join(data_path, 'different_size_a.noarch.rpm') + rpm2 = os.path.join(data_path, 'different_size_b.noarch.rpm') + + hash1 = 'ed0bae957653692a7d2ff9d90dbc3eaf08486994af315e11a9e80929092f6d0e' + hash2 = '8cdd40b738ac156af09f31445831f324cedacd028bf1dc3e12cc48b2137ed190' + for _ in range(2): + # double check that kojihash is deterministic + d = koji.rpmdiff.Rpmdiff(rpm1, rpm2) + self.assertEqual(d.kojihash(), hash1) + self.assertEqual(d.kojihash(new=True), hash2) + def test_rpmdiff_ignore_test(self): data_path = os.path.abspath("tests/test_hub/data/rpms") @@ -101,8 +116,8 @@ class TestRPMDiff(unittest.TestCase): attr[idx] = value rpm_dict_new = {'a_file': attr} - args[0]._Rpmdiff__fileIteratorToDict = mock.MagicMock() - args[0]._Rpmdiff__fileIteratorToDict.side_effect = [rpm_dict_old, rpm_dict_new] + args[0]._Rpmdiff__getFilesDict = mock.MagicMock() + args[0]._Rpmdiff__getFilesDict.side_effect = [rpm_dict_old, rpm_dict_new] orig_init(*args, **kwargs) # compare with every option From 3b0a5fd842741ffe6da4ddf391b7751b2a19c4ef Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Nov 10 2022 08:42:46 +0000 Subject: [PATCH 5/5] fix flake8 --- diff --git a/koji/rpmdiff.py b/koji/rpmdiff.py index e8b386b..d20cd37 100644 --- a/koji/rpmdiff.py +++ b/koji/rpmdiff.py @@ -232,22 +232,23 @@ class Rpmdiff: result = {} for file in rpm.files(hdr): # mimic old fi order because comparison and kojihash relies on it - # (FN, FSize, FMode, FMtime, FFlags, FRdev, FInode, FNlink, FState, VFlags, FUser, FGroup, Digest) + # (FN, FSize, FMode, FMtime, FFlags, FRdev, FInode, FNlink, FState, VFlags, FUser, + # FGroup, Digest) filedata = [ - # name omitted - file.size, - file.mode, - file.mtime, - file.fflags, - file.rdev, - file.inode, - file.nlink, - file.state, - file.vflags, - file.user, - file.group, - file.digest, - ] + # name omitted + file.size, + file.mode, + file.mtime, + file.fflags, + file.rdev, + file.inode, + file.nlink, + file.state, + file.vflags, + file.user, + file.group, + file.digest, + ] result[file.name] = filedata return result