diff --git a/module_build_service/utils.py b/module_build_service/utils.py index e16e4e97..53ac897f 100644 --- a/module_build_service/utils.py +++ b/module_build_service/utils.py @@ -506,23 +506,23 @@ def format_mmd(mmd, scmurl): # them because of dep-chain. from module_build_service.scm import SCM - mmd.xmd['mbs'] = {'scmurl': scmurl} + mmd.xmd['mbs'] = {'scmurl': scmurl, 'commit': None} - scm = SCM(scmurl) - # If a commit hash is provided, add that information to the modulemd - if scm.commit: - # We want to make sure we have the full commit hash for consistency - if SCM.is_full_commit_hash(scm.scheme, scm.commit): - full_scm_hash = scm.commit - else: - full_scm_hash = scm.get_full_commit_hash() - - mmd.xmd['mbs']['commit'] = full_scm_hash - # If a commit hash wasn't provided then just get the latest from master - else: + # If module build was submitted via yaml file, there is no scmurl + if scmurl: scm = SCM(scmurl) - mmd.xmd['mbs']['commit'] = scm.get_latest() + # If a commit hash is provided, add that information to the modulemd + if scm.commit: + # We want to make sure we have the full commit hash for consistency + if SCM.is_full_commit_hash(scm.scheme, scm.commit): + full_scm_hash = scm.commit + else: + full_scm_hash = scm.get_full_commit_hash() + mmd.xmd['mbs']['commit'] = full_scm_hash + # If a commit hash wasn't provided then just get the latest from master + else: + mmd.xmd['mbs']['commit'] = scm.get_latest() # If the modulemd yaml specifies module buildrequires, replace the streams # with commit hashes @@ -537,7 +537,7 @@ def format_mmd(mmd, scmurl): 'version': module_stream} commit_hash, version = get_module_commit_hash_and_version( pdc, module_info) - if commit_hash and version: + if version and (commit_hash or not scmurl): mmd.xmd['mbs']['buildrequires'][module_name] = { 'ref': commit_hash, 'stream': mmd.buildrequires[module_name], @@ -793,6 +793,7 @@ def get_reusable_component(session, module, component_name): previous_module_build = session.query(models.ModuleBuild)\ .filter_by(name=mmd.name)\ .filter(models.ModuleBuild.state.in_([3, 5]))\ + .filter(models.ModuleBuild.scmurl.isnot(None))\ .order_by(models.ModuleBuild.time_completed.desc())\ .first() # The component can't be reused if there isn't a previous build in the done @@ -831,8 +832,9 @@ def get_reusable_component(session, module, component_name): # Assumes that the streams have been replaced with commit hashes, so we # can compare to see if they have changed. Since a build is unique to # a commit hash, this is a safe test. - if br_module['ref'] != \ - old_mmd.xmd['mbs']['buildrequires'][br_module_name]['ref']: + ref1 = br_module.get('ref') + ref2 = old_mmd.xmd['mbs']['buildrequires'][br_module_name].get('ref') + if not (ref1 and ref2) or ref1 != ref2: return None # At this point we've determined that both module builds depend(ed) on the diff --git a/tests/test_utils/test_utils.py b/tests/test_utils/test_utils.py index c5cee88f..631132f4 100644 --- a/tests/test_utils/test_utils.py +++ b/tests/test_utils/test_utils.py @@ -115,6 +115,35 @@ class TestUtils(unittest.TestCase): } self.assertEqual(mmd.xmd, xmd) + @vcr.use_cassette( + path.join(CASSETTES_DIR, 'tests.test_utils.TestUtils.test_format_mmd')) + @patch('module_build_service.scm.SCM') + def test_format_mmd_empty_scmurl(self, mocked_scm): + # For all the RPMs in testmodule, get_latest is called + mocked_scm.return_value.get_latest.side_effect = [ + '4ceea43add2366d8b8c5a622a2fb563b625b9abf', + 'fbed359411a1baa08d4a88e0d12d426fbf8f602c', + '76f9d8c8e87eed0aab91034b01d3d5ff6bd5b4cb'] + + mmd = modulemd.ModuleMetadata() + with open(path.join(BASE_DIR, '..', 'staged_data', 'testmodule.yaml')) \ + as mmd_file: + mmd.loads(mmd_file) + + module_build_service.utils.format_mmd(mmd, scmurl=None) + xmd = { + 'mbs': { + 'commit': None, + 'buildrequires': { + 'base-runtime': { + 'ref': 'abffed45ca33d7fe94fff8253b5bfe1d87e786b2', + 'stream': 'master', + 'version': '20170315134803'}}, + 'scmurl': None, + } + } + self.assertEqual(mmd.xmd, xmd) + def test_get_reusable_component_same(self): test_reuse_component_init_data() new_module = models.ModuleBuild.query.filter_by(id=2).one() @@ -122,6 +151,19 @@ class TestUtils(unittest.TestCase): db.session, new_module, 'tangerine') self.assertEqual(rv.package, 'tangerine') + def test_get_reusable_component_empty_scmurl(self): + test_reuse_component_init_data() + + new_module = models.ModuleBuild.query.filter_by(id=2).one() + mmd = new_module.mmd() + mmd.xmd['mbs']['buildrequires'] = {'base-runtime': {}} + new_module.modulemd = mmd.dumps() + db.session.commit() + + rv = module_build_service.utils.get_reusable_component( + db.session, new_module, 'tangerine') + self.assertEqual(rv, None) + def test_get_reusable_component_different_perl_tangerine(self): test_reuse_component_init_data() second_module_build = models.ModuleBuild.query.filter_by(id=2).one()