From 03fd3cd2923e215b2bec37ea7126b50d83e367bb Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Sep 08 2017 20:51:36 +0000 Subject: PR#583: support rpm LONG*SIZE header fields Merges #583 https://pagure.io/koji/pull-request/583 Fixes #570 https://pagure.io/koji/issue/570 --- diff --git a/koji/__init__.py b/koji/__init__.py index 4d5ea76..e071a13 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -907,17 +907,8 @@ def get_header_field(hdr, name, src_arch=False): return "nosrc" return "src" - hdr_key = getattr(rpm, "RPMTAG_%s" % name, None) - if hdr_key is None: - # HACK: nosource and nopatch may not be in exported rpm tags - if name == "NOSOURCE": - hdr_key = 1051 - elif name == "NOPATCH": - hdr_key = 1052 - else: - raise GenericError("No such rpm header field: %s" % name) + result = _get_header_field(hdr, name) - result = hdr[hdr_key] if name in ("NOSOURCE", "NOPATCH"): # HACK: workaround for https://bugzilla.redhat.com/show_bug.cgi?id=991329 if result is None: @@ -931,12 +922,31 @@ def get_header_field(hdr, name, src_arch=False): # typically signatures pass - if name == 'SIZE' and result is None: - result = hdr[rpm.RPMTAG_LONGSIZE] + sizetags = ('SIZE', 'ARCHIVESIZE', 'FILESIZES', 'SIGSIZE') + if name in sizetags and (result is None or result == []): + try: + result = _get_header_field(hdr, 'LONG' + name) + except GenericError: + # no such header + pass return result +def _get_header_field(hdr, name): + '''Just get the header field''' + hdr_key = getattr(rpm, "RPMTAG_%s" % name, None) + if hdr_key is None: + # HACK: nosource and nopatch may not be in exported rpm tags + if name == "NOSOURCE": + hdr_key = 1051 + elif name == "NOPATCH": + hdr_key = 1052 + else: + raise GenericError("No such rpm header field: %s" % name) + return hdr[hdr_key] + + def get_header_fields(X, fields, src_arch=False): """Extract named fields from an rpm header and return as a dictionary diff --git a/tests/test_lib/test_parsers.py b/tests/test_lib/test_parsers.py index 9843dda..d8f8760 100644 --- a/tests/test_lib/test_parsers.py +++ b/tests/test_lib/test_parsers.py @@ -161,6 +161,12 @@ class HeaderTestCase(unittest.TestCase): hdr = FakeHeader(longsize=size,size=None) self.assertEqual({'SIZE': size}, koji.get_header_fields(hdr, ['SIZE'])) + @mock.patch('rpm.RPMTAG_LONGSIZE', new=None) + def test_get_header_fields_nosize(self): + # not sure if this is a sane header case, but let's make sure we don't + # error anyway + hdr = FakeHeader(size=None) + self.assertEqual({'SIZE': None}, koji.get_header_fields(hdr, ['SIZE'])) def test_get_header_field_src(self): srpm = os.path.join(self.rpmdir, 'test-src-1-1.fc24.src.rpm')