From 91e08d723f0472ef6ae31c26a4dbb4f53a77714a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jakub=20Kadl=C4=8D=C3=ADk?= Date: Mon, 29 May 2017 23:32:51 +0200 Subject: [PATCH] Allow build_from_scm to build even from custom distgits --- module_build_service/builder/utils.py | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/module_build_service/builder/utils.py b/module_build_service/builder/utils.py index c9ec9a81..bd0b8bbc 100644 --- a/module_build_service/builder/utils.py +++ b/module_build_service/builder/utils.py @@ -37,14 +37,19 @@ def build_from_scm(artifact_name, source, config, build_srpm, try: log.debug('Cloning source URL: %s' % source) + url, commit = source.split("?#") # Create temp dir and clone the repo there. td = tempfile.mkdtemp() - scm = module_build_service.scm.SCM(source) + scm = module_build_service.scm.SCM(url) cod = scm.checkout(td) + branch = git_branch_contains(cod, commit) + git_checkout(cod, branch) + # Use configured command to create SRPM out of the SCM repo. log.debug("Creating SRPM in %s" % cod) - execute_cmd(config.mock_build_srpm_cmd.split(" "), + distgit_cmds = get_distgit_commands(source, config) + execute_cmd(distgit_cmds[1].split(" "), stdout=stdout, stderr=stderr, cwd=cod) # Find out the built SRPM and build it normally. @@ -70,6 +75,17 @@ def build_from_scm(artifact_name, source, config, build_srpm, return ret +def git_branch_contains(cod, commit): + cmd = ["git", "branch", "-r", "--contains", commit] + out, err = execute_cmd(cmd, cwd=cod, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + return out.strip().split("/")[1] + + +def git_checkout(cod, branch): + cmd = ["git", "checkout", branch] + execute_cmd(cmd, cwd=cod) + + def find_srpm(cod): for f in os.listdir(cod): if f.endswith(".src.rpm"): @@ -105,6 +121,13 @@ def execute_cmd(args, stdout=None, stderr=None, cwd=None): return out, err +def get_distgit_commands(source, conf): + for host, cmds in conf.distgits.items(): + if source.startswith(host): + return cmds + raise KeyError("No defined commands for {}".format(source)) + + def fake_repo_done_message(tag_name): msg = module_build_service.messaging.KojiRepoChange( msg_id='a faked internal message',