diff options
Diffstat (limited to 'meta/classes/report-error.bbclass')
| -rw-r--r-- | meta/classes/report-error.bbclass | 56 |
1 files changed, 42 insertions, 14 deletions
diff --git a/meta/classes/report-error.bbclass b/meta/classes/report-error.bbclass index 9edf2ceb31..d6fdd364ad 100644 --- a/meta/classes/report-error.bbclass +++ b/meta/classes/report-error.bbclass @@ -9,59 +9,87 @@ ERR_REPORT_DIR ?= "${LOG_DIR}/error-report" def errorreport_getdata(e): - logpath = e.data.getVar('ERR_REPORT_DIR', True) + import codecs + logpath = e.data.getVar('ERR_REPORT_DIR') datafile = os.path.join(logpath, "error-report.txt") - with open(datafile) as f: + with codecs.open(datafile, 'r', 'utf-8') as f: data = f.read() return data def errorreport_savedata(e, newdata, file): import json - logpath = e.data.getVar('ERR_REPORT_DIR', True) - bb.utils.mkdirhier(logpath) + import codecs + logpath = e.data.getVar('ERR_REPORT_DIR') datafile = os.path.join(logpath, file) - with open(datafile, "w") as f: + with codecs.open(datafile, 'w', 'utf-8') as f: json.dump(newdata, f, indent=4, sort_keys=True) return datafile python errorreport_handler () { import json + import codecs + + logpath = e.data.getVar('ERR_REPORT_DIR') + datafile = os.path.join(logpath, "error-report.txt") if isinstance(e, bb.event.BuildStarted): + bb.utils.mkdirhier(logpath) data = {} machine = e.data.getVar("MACHINE") data['machine'] = machine - data['build_sys'] = e.data.getVar("BUILD_SYS", True) + data['build_sys'] = e.data.getVar("BUILD_SYS") data['nativelsb'] = e.data.getVar("NATIVELSBSTRING") data['distro'] = e.data.getVar("DISTRO") - data['target_sys'] = e.data.getVar("TARGET_SYS", True) + data['target_sys'] = e.data.getVar("TARGET_SYS") data['failures'] = [] - data['component'] = e.getPkgs()[0] - data['branch_commit'] = base_detect_branch(e.data) + ": " + base_detect_revision(e.data) + data['component'] = " ".join(e.getPkgs()) + data['branch_commit'] = str(base_detect_branch(e.data)) + ": " + str(base_detect_revision(e.data)) + lock = bb.utils.lockfile(datafile + '.lock') errorreport_savedata(e, data, "error-report.txt") + bb.utils.unlockfile(lock) elif isinstance(e, bb.build.TaskFailed): task = e.task taskdata={} - log = e.data.getVar('BB_LOGFILE', True) + log = e.data.getVar('BB_LOGFILE') taskdata['package'] = e.data.expand("${PF}") taskdata['task'] = task if log: try: - logFile = open(log, 'r') - taskdata['log'] = logFile.read().decode('utf-8') + logFile = codecs.open(log, 'r', 'utf-8') + logdata = logFile.read() + + # Replace host-specific paths so the logs are cleaner + for d in ("TOPDIR", "TMPDIR"): + s = e.data.getVar(d) + if s: + logdata = logdata.replace(s, d) + logFile.close() except: - taskdata['log'] = "Unable to read log file" + logdata = "Unable to read log file" else: - taskdata['log'] = "No Log" + logdata = "No Log" + + # server will refuse failures longer than param specified in project.settings.py + # MAX_UPLOAD_SIZE = "5242880" + # use lower value, because 650 chars can be spent in task, package, version + max_logdata_size = 5242000 + # upload last max_logdata_size characters + if len(logdata) > max_logdata_size: + logdata = "..." + logdata[-max_logdata_size:] + taskdata['log'] = logdata + lock = bb.utils.lockfile(datafile + '.lock') jsondata = json.loads(errorreport_getdata(e)) jsondata['failures'].append(taskdata) errorreport_savedata(e, jsondata, "error-report.txt") + bb.utils.unlockfile(lock) elif isinstance(e, bb.event.BuildCompleted): + lock = bb.utils.lockfile(datafile + '.lock') jsondata = json.loads(errorreport_getdata(e)) + bb.utils.unlockfile(lock) failures = jsondata['failures'] if(len(failures) > 0): filename = "error_report_" + e.data.getVar("BUILDNAME")+".txt" |
