yocto-autobuilder-helper/scripts/utils.py
Richard Purdie 376ad36d4d Move buildhistory init to run-config (and factor common functionality to utils)
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
2018-01-23 13:49:38 +00:00

142 lines
5.3 KiB
Python

import subprocess
import copy
import os
import json
import errno
#
# Check if config contains all the listed params
#
def contains(params, config):
for p in params:
if p not in config:
return False
return True
# Check if a config boolean is set
def configtrue(name, config):
if name in config and config[name]:
return True
return False
# Get a configuration variable, check overrides, first, the defaults
def getconfigvar(name, config, target, stepnum):
step = "step" + str(stepnum)
if target in config['overrides']:
if step in config['overrides'][target] and name in config['overrides'][target][step]:
return config['overrides'][target][step][name]
if name in config['overrides'][target]:
return config['overrides'][target][name]
if name in config['defaults']:
return config['defaults'][name]
return False
def getconfiglist(name, config, target, stepnum):
ret = []
step = "step" + str(stepnum)
if target in config['overrides']:
if step in config['overrides'][target] and name in config['overrides'][target][step]:
ret.extend(config['overrides'][target][step][name])
if name in config['overrides'][target]:
ret.extend(config['overrides'][target][name])
if name in config['defaults']:
ret.extend(config['defaults'][name])
return ret
#
# Expand 'templates' with the configuration
#
# This allows values to be imported from a template if they're not already set
#
def expandtemplates(ourconfig):
orig = copy.deepcopy(ourconfig)
for t in orig['overrides']:
if "TEMPLATE" in orig['overrides'][t]:
template = orig['overrides'][t]["TEMPLATE"]
if template not in orig['templates']:
print("Error, template %s not defined" % template)
sys.exit(1)
for v in orig['templates'][template]:
val = orig['templates'][template][v]
if v not in ourconfig['overrides'][t]:
ourconfig['overrides'][t][v] = copy.deepcopy(orig['templates'][template][v])
elif not isinstance(val, str) and not isinstance(val, bool) and not isinstance(val, int):
for w in val:
if w not in ourconfig['overrides'][t][v]:
ourconfig['overrides'][t][v][w] = copy.deepcopy(orig['templates'][template][v][w])
return ourconfig
#
# Helper to load the config.json file for scripts in the scripts directory (pass in __file__)
#
def loadconfig(f):
scriptsdir = os.path.dirname(os.path.realpath(f))
with open(os.path.join(scriptsdir, '..', 'config.json')) as f:
ourconfig = json.load(f)
# Expand templates in the configuration
ourconfig = expandtemplates(ourconfig)
return ourconfig
#
# Common function to determine if buildhistory is enabled and what the parameters are
#
def getbuildhistoryconfig(ourconfig, target, reponame, branchname):
if contains(["BUILD_HISTORY_DIR", "build-history-targets", "BUILD_HISTORY_REPO"], ourconfig):
if target in ourconfig["build-history-targets"]:
base = None
if (reponame + ":" + branchname) in ourconfig["BUILD_HISTORY_DIRECTPUSH"]:
base = reponame + ":" + branchname
if (reponame + ":" + branchname) in ourconfig["BUILD_HISTORY_FORKPUSH"]:
base = ourconfig["BUILD_HISTORY_FORKPUSH"][reponame + ":" + branchname]
if base:
baserepo, basebranch = base.split(":")
bh_path = os.path.join(ourconfig["BUILD_HISTORY_DIR"], reponame, branchname, target)
remoterepo = ourconfig["BUILD_HISTORY_REPO"]
remotebranch = reponame + "/" + branchname + "/" + target
baseremotebranch = baserepo + "/" + basebranch + "/" + target
return bh_path, remoterepo, remotebranch, baseremotebranch
return None, None, None, None
#
# Run a command, trigger a traceback with command output if it fails
#
def runcmd(cmd):
return subprocess.check_output(cmd, stderr=subprocess.STDOUT)
def fetchgitrepo(clonedir, repo, params, stashdir):
sharedrepo = "%s/%s" % (clonedir, repo)
branch = params["branch"]
revision = params["revision"]
if os.path.exists(stashdir + "/" + repo):
subprocess.check_call(["git", "clone", "file://%s/%s" % (stashdir, repo), "%s/%s" % (clonedir, repo)])
subprocess.check_call(["git", "remote", "rm", "origin"], cwd=sharedrepo)
subprocess.check_call(["git", "remote", "add", "origin", params["url"]], cwd=sharedrepo)
subprocess.check_call(["git", "fetch", "origin", "-t"], cwd=sharedrepo)
else:
subprocess.check_call(["git", "clone", params["url"], sharedrepo])
subprocess.check_call(["git", "checkout", branch], cwd=sharedrepo)
subprocess.check_call(["git", "reset", revision, "--hard"], cwd=sharedrepo)
def mkdir(path):
try:
os.makedirs(path)
except OSError as e:
if e.errno != errno.EEXIST:
# Do not complain if the directory exists
raise e
def printheader(msg):
print("")
print("====================================================================================================")
print(msg)
print("====================================================================================================")
print("")