11 from common import decompress_stream, yield_lines, yield_chunks
13 def scan_log_status(filelike):
14 it = yield_chunks(filelike)
15 it = decompress_stream(it, lzma.LZMADecompressor())
17 last_lines = collections.deque(it, 25)
18 status = [l.split(b':', 1)[1].strip()
19 for l in last_lines if l.startswith(b"Status:")]
21 return status[0].decode("ascii")
24 def do_build(source, version, architecture):
25 now = datetime.datetime.utcnow()
26 logtarget = "%s_%s_%s_%s.log.xz" % (source, version, architecture,
27 now.strftime("%Y%m%d%H%M%S"))
28 cmdline = ["ssh", "gcc131", "sh", "/dev/stdin", architecture,
29 "%s_%s" % (source, version)]
30 with open(os.path.join("logs", logtarget), "w+b") as output:
31 with open("build.sh", "rb") as instructions:
32 code = subprocess.call(cmdline, stdin=instructions, stdout=output)
34 status = scan_log_status(output)
35 print("status %s code %d" % (status, code))
36 return (now, code == 0, logtarget, status == "given-back")
39 db = sqlite3.connect("db", detect_types=sqlite3.PARSE_DECLTYPES)
40 with contextlib.closing(db.cursor()) as cur:
41 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;")
42 source, version, architecture = cur.fetchone()
43 print("building %s_%s for %s" % (source, version, architecture))
44 timestamp, success, filename, giveback = do_build(source, version, architecture)
45 with contextlib.closing(db.cursor()) as cur:
46 cur.execute("INSERT INTO builds (source, version, architecture, success, starttime, filename) VALUES (?, ?, ?, ?, ?, ?);",
47 (source, version, architecture, success, timestamp,
50 cur.execute("UPDATE depcheck SET giveback = 1 WHERE architecture = ?;",
54 if __name__ == "__main__":