#!/usr/bin/env python3 # Copyright (C) 2018 Lars Wirzenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . import json import re import sys def getint(m, i): return int(m.group(i)) def parse_ts(ts): m = re.match(r'(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)', ts) assert m is not None year = getint(m, 1) month = getint(m, 2) day = getint(m, 3) hour = getint(m, 4) minute = getint(m, 5) second = getint(m, 6) return hour * 3600 + minute * 60 + second def step_summary(step): if 'action' in step: return step['action'] if 'shell' in step: return 'shell' if 'python' in step: return 'python' if 'debootstrap' in step: return 'debootstrap' if 'archive' in step: return 'archive' return str(step) build_starts = re.compile(r'^Build starts at (?P.*)$') build_ends = re.compile(r'^Build ends at (?P.*),') action_starts = re.compile(r'^Action starts at (?P.*):$') action_ends = re.compile(r'^Action ends at (?P.*),') patterns = [ build_starts, build_ends, action_starts, action_ends, ] pairs = { build_starts: build_ends, build_ends: build_starts, action_starts: action_ends, action_ends: action_starts, } started = { build_starts: None, action_starts: None, } names = { build_starts: 'Build', action_starts: 'Action', } step = '' read_action = False action = '' for line in sys.stdin: if read_action: action += line if line.rstrip() == '}': action_obj = json.loads(action) step = action_obj.get('step') read_action = False action = '' for pat in patterns: m = pat.match(line) if m is None: continue ts = m.group('ts') read_action = pat == action_starts if pat in started: started[pat] = parse_ts(ts) else: ended = parse_ts(ts) start_pat = pairs[pat] print( names[start_pat], ended - started[start_pat], step_summary(step)) step = '' break