diff options
author | Helmut Grohne <helmut@subdivi.de> | 2019-02-03 12:42:23 +0100 |
---|---|---|
committer | Helmut Grohne <helmut@subdivi.de> | 2019-02-03 12:42:23 +0100 |
commit | a3cc49725febb2cca1c915ef768604831563954f (patch) | |
tree | 5249650a54703ef9a10ffb808ec7f64007c616c9 /build.py | |
download | crossqa-a3cc49725febb2cca1c915ef768604831563954f.tar.gz |
initial checkin
Diffstat (limited to 'build.py')
-rwxr-xr-x | build.py | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/build.py b/build.py new file mode 100755 index 0000000..c0def3b --- /dev/null +++ b/build.py @@ -0,0 +1,62 @@ +#!/usr/bin/python3 + +import collections +import contextlib +import datetime +import lzma +import os.path +import sqlite3 +import subprocess + +from common import decompress_stream, yield_lines + +def yield_chunks(filelike, chunksize=65536): + while True: + data = filelike.read(chunksize) + if not data: + break + yield data + +def scan_log_status(filelike): + it = yield_chunks(filelike) + it = decompress_stream(it, lzma.LZMADecompressor()) + it = yield_lines(it) + last_lines = collections.deque(it, 25) + status = [l.split(b':', 1)[1].strip() + for l in last_lines if l.startswith(b"Status:")] + if status: + return status[0].decode("ascii") + return "unknown" + +def do_build(source, version, architecture): + now = datetime.datetime.utcnow() + logtarget = "%s_%s_%s_%s.log.xz" % (source, version, architecture, + now.strftime("%Y%m%d%H%M%S")) + cmdline = ["ssh", "gcc131", "sh", "/dev/stdin", architecture, + "%s_%s" % (source, version)] + with open(os.path.join("logs", logtarget), "w+b") as output: + with open("build.sh", "rb") as instructions: + code = subprocess.call(cmdline, stdin=instructions, stdout=output) + output.seek(0) + status = scan_log_status(output) + print("status %s code %d" % (status, code)) + return (now, code == 0, logtarget, status == "given-back") + +def main(): + db = sqlite3.connect("db", detect_types=sqlite3.PARSE_DECLTYPES) + with contextlib.closing(db.cursor()) as cur: + cur.execute("SELECT source, version, depstate.architecture FROM depstate JOIN depcheck ON depstate.architecture = depcheck.architecture WHERE satisfiable = 1 AND giveback = 0 ORDER BY random() LIMIT 1;") + source, version, architecture = cur.fetchone() + print("building %s_%s for %s" % (source, version, architecture)) + timestamp, success, filename, giveback = do_build(source, version, architecture) + with contextlib.closing(db.cursor()) as cur: + cur.execute("INSERT INTO builds (source, version, architecture, success, starttime, filename) VALUES (?, ?, ?, ?, ?, ?);", + (source, version, architecture, success, timestamp, + filename)) + if giveback: + cur.execute("UPDATE depcheck SET giveback = 1 WHERE architecture = ?;", + (architecture,)) + db.commit() + +if __name__ == "__main__": + main() |