Files
pkgsrc-ng/pkgtools/pbulk/files/pbulk/scripts/create-report-txt.awk
2013-09-26 17:14:40 +02:00

196 lines
6.5 KiB
Awk
Executable File

#!@AWK@ -f
# $NetBSD: create-report-txt.awk,v 1.8 2008/03/01 19:04:37 rillig Exp $
#
# Copyright (c) 2007 Joerg Sonnenberger <joerg@NetBSD.org>.
# All rights reserved.
#
# This code was developed as part of Google's Summer of Code 2007 program.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in
# the documentation and/or other materials provided with the
# distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
# OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.
function sort(ARRAY, INDICES, OPTIONS, i, idx, sort_cmd) {
sort_cmd = "sort " OPTIONS " > " tmp_sort
for (idx in ARRAY)
print idx | sort_cmd
close(sort_cmd)
i = 0
while ((getline < tmp_sort) > 0) {
INDICES[i] = $0
++i
}
close(tmp_sort)
system("rm " tmp_sort)
}
BEGIN {
meta_dir = ARGV[1]
report_file = meta_dir "/report"
txt_report = meta_dir "/report.txt"
html_report = meta_dir "/report.html"
status_file = meta_dir "/status"
tmp_sort = meta_dir "/tmp_sort"
pkgs_done = 0
pkgs_failed = 0
pkgs_prefailed = 0
pkgs_indirect_failed = 0
pkgs_indirect_prefailed = 0
while ((getline < status_file) > 0) {
if ($0 ~ "^PLATFORM=")
pkgsrc_platform = substr($0, 10)
else if ($0 ~ "^COMPILER=")
pkgsrc_compiler = substr($0, 10)
else if ($0 ~ "^BUILD_START_ISO=")
pkgsrc_build_start_iso = substr($0, 17)
else if ($0 ~ "^BUILD_START_DIR=")
pkgsrc_build_start_dir = substr($0, 17)
else if ($0 ~ "^BUILD_END_ISO=")
pkgsrc_build_end_iso = substr($0, 15)
else if ($0 ~ "^BASE_URL=")
pkgsrc_base_url = substr($0, 10)
}
close(status_file)
while ((getline < report_file) > 0) {
if ($0 ~ "^PKGNAME=")
cur = substr($0, 9)
else if ($0 ~ "^MAINTAINER=")
maintainer[cur] = substr($0, 12)
else if ($0 ~ "^PKG_LOCATION=")
location[cur] = substr($0, 14)
else if ($0 ~ "^PKG_DEPTH=")
depth[cur] = substr($0, 11) - 1
else if ($0 ~ "^BUILD_STATUS=") {
status[cur] = substr($0, 14)
}
}
close(report_file)
for (pkg in status) {
loc = location[pkg]
if (status[pkg] == "failed") {
broken_location[loc] += depth[pkg]
pkg_location[loc] = pkg
if (location_status[loc] == "")
location_status[loc] = "failed"
else if (location_status[loc] == "ignore")
location_status[loc] = "mixed"
} else {
if (location_status[loc] == "failed")
location_status[loc] = "mixed"
else if (location_status[loc] == "")
location_status[loc] = "ignore"
}
if (status[pkg] == "done")
++pkgs_done
else if (status[pkg] == "failed")
++pkgs_failed
else if (status[pkg] == "prefailed")
++pkgs_prefailed
else if (status[pkg] == "indirect-failed")
++pkgs_indirect_failed
else if (status[pkg] == "indirect-prefailed")
++pkgs_indirect_prefailed
}
print "pkgsrc bulk build report" > txt_report
print "========================" > txt_report
print "" > txt_report
print pkgsrc_platform > txt_report
print "Compiler: " pkgsrc_compiler > txt_report
print "" > txt_report
print "Build start: " pkgsrc_build_start_iso > txt_report
print "Build end: " pkgsrc_build_end_iso > txt_report
print "" > txt_report
report_base_url = pkgsrc_base_url "/" pkgsrc_build_start_dir
print "Full report: " report_base_url "/meta/report.html" > txt_report
print "Machine readable version: " report_base_url "/meta/report.bz2" > txt_report
print "" > txt_report
all_pkgs = pkgs_done + pkgs_failed + pkgs_prefailed + pkgs_indirect_failed + pkgs_indirect_prefailed
printf "Total number of packages: %5d\n", all_pkgs > txt_report
printf " Successfully built: %5d\n", pkgs_done > txt_report
printf " Failed to build: %5d\n", pkgs_failed > txt_report
printf " Depending on failed package: %5d\n", pkgs_indirect_failed > txt_report
printf " Explicitly broken or masked: %5d\n", pkgs_prefailed > txt_report
printf " Depending on masked package: %5d\n", pkgs_indirect_prefailed > txt_report
print "" > txt_report
has_top_count = 0
for (loc in location_status) {
if (broken_location[loc] == "" || broken_location[loc] == 0)
continue
top_count[broken_location[loc] " " loc] = loc
has_top_count = 1
}
if (has_top_count) {
sort(top_count, sorted_top_count, "-rn")
print "Packages breaking the most other packages" > txt_report
print "" > txt_report
print "Package Breaks Maintainer" > txt_report
print "-------------------------------------------------------------------------" > txt_report
for (i = 0; i < 10 && sorted_top_count[i] != ""; ++i) {
loc = top_count[sorted_top_count[i]]
printf "%- 37s % 6d %s\n", loc, broken_location[loc],
maintainer[pkg_location[loc]] > txt_report
}
print "" > txt_report
}
print "Build failures" > txt_report
print "" > txt_report
print "Package Breaks Maintainer" > txt_report
print "-------------------------------------------------------------------------" > txt_report
sort(location_status, sorted_loc, "")
for (i = 0; sorted_loc[i] != ""; ++i) {
loc = sorted_loc[i]
if (location_status[loc] == "ignore")
continue
if (broken_location[loc] == 0)
printf "%- 44s %s\n", loc,
maintainer[pkg_location[loc]] > txt_report
else
printf "%- 37s % 6d %s\n", loc, broken_location[loc],
maintainer[pkg_location[loc]] > txt_report
if (location_status[loc] != "mixed")
continue
for (p in status) {
if (location[p] != loc || status[p] != "failed")
continue
if (depth[p] == 0)
printf " %- 40s %s\n", p, maintainer[p] > txt_report
else
printf " %- 33s % 6d %s\n", p, depth[p], maintainer[p] > txt_report
}
}
close(txt_report)
}