diff --git a/koji/__init__.py b/koji/__init__.py index 4508b79e..113dd856 100644 --- a/koji/__init__.py +++ b/koji/__init__.py @@ -297,8 +297,8 @@ DEFAULT_REQUEST_TIMEOUT = 60 * 60 * 12 DEFAULT_AUTH_TIMEOUT = 60 # draft release constants -DRAFT_RELEASE_FORMAT = '{release},draft_{id}' -DRAFT_RELEASE_PARSING_REGEX = r'^(?P.+),draft_(?P[0-9]+)$' +DRAFT_RELEASE_DELIMITER = ',' +DRAFT_RELEASE_FORMAT = '{release}' + DRAFT_RELEASE_DELIMITER + 'draft_{id}' # BEGIN kojikamid dup # @@ -3930,50 +3930,33 @@ def fixEncodingRecurse(value, fallback='iso8859-15', remove_nonprintable=False): return walker.walk() -def gen_draft_release(buildinfo): +def gen_draft_release(release, id): """Generate draft_release based on input build information Currently, it's generated as {target_release},draft_{build_id} - :param buildinfo: buildinfo with target "release", used to generate draft_release - :type buildinfo: dict + :param str release: target "release", which is the release part of rpms' nvra, + and will be the release of the build the draft build is going to be + promoted to. + :param int id: the build "id" part in draft_release (it's unchanged so it can be used to + keep the uniqueness of build NVR) :return: draft release :rtype: str - :raises GenericError: if missing any required field """ - for k in ('id', 'release'): - if not buildinfo.get(k): - raise GenericError("key: '%s' not found in %s" % (k, buildinfo)) - return DRAFT_RELEASE_FORMAT.format(**buildinfo) + return DRAFT_RELEASE_FORMAT.format(**locals()) -def parse_target_release(buildinfo): - """Generate target_release from a draft buildinfo reversely +def parse_target_release(draft_release): + """Generate target_release from a draft release reversely - :param buildinfo: buildinfo of a draft build - :type buildinfo: dict + :param str draft_release: release of a draft build :rtype: str - :raises GenericError: if missing draft field in buildinfo :raises GenericError: if cannot get a valid target_release """ - draft_release = buildinfo.get('release') - if not draft_release: - raise GenericError("'release' not found in %s" % buildinfo) - build_id = buildinfo.get('id') - if build_id: - build_id = str(build_id) - else: - raise GenericError("'id' not found in %s" % buildinfo) - match = re.match(DRAFT_RELEASE_PARSING_REGEX, draft_release) - if match: - if build_id != match.group('id'): - raise GenericError( - "buildinfo.id: %s doesn't match build id part: %s in buildinfo.release: %s" % - (build_id, match.group('id'), draft_release) - ) - return match.group('release') - else: + parts = draft_release.split(DRAFT_RELEASE_DELIMITER, 1) + if len(parts) != 2 or not parts[-1].startswith('draft_'): raise GenericError("draft release: %s is not in valid format" % draft_release) + return parts[0] def add_file_logger(logger, fn): diff --git a/kojihub/kojihub.py b/kojihub/kojihub.py index b66e820c..8687e707 100644 --- a/kojihub/kojihub.py +++ b/kojihub/kojihub.py @@ -6118,7 +6118,9 @@ def new_build(data, strict=False): # handle draft suffix in release if data.get('draft'): target_release = data['release'] - data['release'] = insert_data['release'] = koji.gen_draft_release(data) + data['release'] = insert_data['release'] = koji.gen_draft_release( + data['release'], data['id'] + ) # it's still possible to already have a build with the same nvr draft_nvr = dslice(data, ['name', 'version', 'release']) if find_build_id(draft_nvr): @@ -6428,7 +6430,7 @@ def import_rpm(fn, buildinfo=None, brootid=None, wrapper=False, fileinfo=None, d nvrinfo = buildinfo.copy() if draft: # for draft build, change release to target_release - nvrinfo['release'] = koji.parse_target_release(buildinfo) + nvrinfo['release'] = koji.parse_target_release(buildinfo['release']) srpmname = "%(name)s-%(version)s-%(release)s.src.rpm" % nvrinfo # either the sourcerpm field should match the build, or the filename # itself (for the srpm) @@ -7660,6 +7662,7 @@ def new_image_build(build_info): def new_typed_build(build_info, btype): """Mark build as a given btype""" # add here in case disabling draft build for non-rpm is missing before calling this + # TODO: remove it once draft build is expended to all types if btype != 'rpm': reject_draft(build_info) btype_id = lookup_name('btype', btype, strict=True)['id'] @@ -16024,7 +16027,7 @@ def _promote_build(build, user=None, strict=True, force=False): # get target release target_release = None try: - target_release = koji.parse_target_release(binfo) + target_release = koji.parse_target_release(old_release) except Exception: if strict: raise diff --git a/tests/test_cli/test_list_tagged.py b/tests/test_cli/test_list_tagged.py index a009fbd0..7eea2902 100644 --- a/tests/test_cli/test_list_tagged.py +++ b/tests/test_cli/test_list_tagged.py @@ -63,7 +63,7 @@ class TestCliListTagged(utils.CliTestCase): {'id': 2, 'name': 'packagename', 'version': 'version', - 'release': '2.el6#draft_2', + 'release': '2.el6,draft_2', 'nvr': 'n-v-r', 'draft': True, 'tag_name': 'tag', @@ -129,7 +129,7 @@ n-v-r tag owner def test_list_tagged_rpms(self, event_from_opts_mock, stdout): expected = """sigkey rpmA-0.0.1-1.el6.noarch sigkey rpmA-0.0.1-1.el6.x86_64 -sigkey rpmA-0.0.1-2.el6.x86_64 (#draft_2) +sigkey rpmA-0.0.1-2.el6.x86_64 (,draft_2) """ args = [self.tag, self.pkg, '--latest-n=3', '--rpms', '--sigs', '--arch=x86_64', '--arch=noarch'] @@ -150,7 +150,7 @@ sigkey rpmA-0.0.1-2.el6.x86_64 (#draft_2) def test_list_tagged_rpms_paths(self, event_from_opts_mock, stdout, os_path_exists, isdir): expected = """/mnt/koji/packages/packagename/version/1.el6/noarch/rpmA-0.0.1-1.el6.noarch.rpm /mnt/koji/packages/packagename/version/1.el6/x86_64/rpmA-0.0.1-1.el6.x86_64.rpm -/mnt/koji/packages/packagename/version/2.el6#draft_2/x86_64/rpmA-0.0.1-2.el6.x86_64.rpm +/mnt/koji/packages/packagename/version/2.el6,draft_2/x86_64/rpmA-0.0.1-2.el6.x86_64.rpm """ args = [self.tag, self.pkg, '--latest-n=3', '--rpms', '--arch=x86_64', '--paths'] diff --git a/tests/test_hub/test_import_rpm.py b/tests/test_hub/test_import_rpm.py index bd8acb0f..314dc62b 100644 --- a/tests/test_hub/test_import_rpm.py +++ b/tests/test_hub/test_import_rpm.py @@ -257,7 +257,7 @@ class TestImportRPM(unittest.TestCase): 'state': koji.BUILD_STATES['COMPLETE'], 'name': 'name', 'version': 'version', - 'release': 'release#draft_12345', + 'release': 'release,draft_12345', 'id': 12345, 'draft': True, 'extra': { @@ -303,7 +303,7 @@ class TestImportRPM(unittest.TestCase): 'state': koji.BUILD_STATES['COMPLETE'], 'name': 'name', 'version': 'version', - 'release': 'release#draft_12345', + 'release': 'release,draft_12345', 'id': 12345, 'draft': True } diff --git a/tests/test_hub/test_new_build.py b/tests/test_hub/test_new_build.py index 758da47e..9e7bd74c 100644 --- a/tests/test_hub/test_new_build.py +++ b/tests/test_hub/test_new_build.py @@ -176,7 +176,7 @@ class TestNewBuild(unittest.TestCase): 'id': 108, 'owner': 123, 'pkg_id': 54, - 'release': 'test_release#draft_108', + 'release': 'test_release,draft_108', 'source': None, 'start_time': 'NOW', 'state': 1, @@ -202,5 +202,5 @@ class TestNewBuild(unittest.TestCase): { 'name': 'test_name', 'version': 'test_version', - 'release': 'test_release#draft_108' + 'release': 'test_release,draft_108' }) diff --git a/tests/test_hub/test_promote_build.py b/tests/test_hub/test_promote_build.py index 1653269c..b3236396 100644 --- a/tests/test_hub/test_promote_build.py +++ b/tests/test_hub/test_promote_build.py @@ -47,7 +47,7 @@ class TestPromoteBuild(unittest.TestCase): 'id': 1, 'name': 'foo', 'version': 'bar', - 'release': 'tgtrel#draft_1', + 'release': 'tgtrel,draft_1', 'nvr': 'testnvr', 'extra': { 'draft': { @@ -85,7 +85,7 @@ class TestPromoteBuild(unittest.TestCase): 'draft': { 'promoted': True, 'target_release': 'tgtrel', - 'old_release': 'tgtrel#draft_1', + 'old_release': 'tgtrel,draft_1', 'promotion_time': 'NOW', 'promotion_ts': self._now.timestamp(), 'promoter': self.user['name'] @@ -120,12 +120,13 @@ class TestPromoteBuild(unittest.TestCase): self.assertIsNone(ret) self.assertEqual(len(self.updates), 0) - def test_promote_build__target_release(self): + def test_promote_build_target_release(self): draft = { 'id': 1, 'name': 'foo', 'version': 'bar', - 'release': 'tgtrel#draft_2', + # bad delimiter + 'release': 'tgtrel@draft_1', 'extra': { 'draft': { 'promoted': False, @@ -145,7 +146,7 @@ class TestPromoteBuild(unittest.TestCase): self.exports.promoteBuild('a-regular-build', strict=True) self.assertEqual( str(cm.exception), - "buildinfo.id: 1 doesn't match build id part: 2 in buildinfo.release: tgtrel#draft_2" + "draft release: tgtrel@draft_1 is not in valid format" ) self.assertEqual(len(self.updates), 0)