1) return "s"; } /** * Return timestamp from package key * @param string $key package submission key * * @return integer */ function key2timestamp($key) { global $tz; $date = DateTime::createFromFormat("YmdHis", $key+0, $tz); if ($date <= 0) return null; return $date->getTimestamp(); } function timediff($start, $end) { /** * Return human-readable time difference * * @param integer $start timestamp * @param integer $end timestamp, defaults to now * * @return string */ if (is_null($end)) { $end = time(); } $diff = $end - $start; if ($diff<60) return $diff . " second" . plural($diff); $diff = round($diff/60); if ($diff<60) return $diff . " minute" . plural($diff); $diff = round($diff/60); if ($diff<24) return $diff . " hour" . plural($diff); $diff = round($diff/24); return $diff . " day" . plural($diff); } $g_user = isset($_GET['user']) ? htmlentities(strip_tags($_GET['user'])) : null; $upload_dir = '/home/schedbot/uploads'; $max_modified = 2; $title = 'Mageia build system status'; $robots = 'index,nofollow,nosnippet,noarchive'; if ($g_user) { $title .= ' for ' . $g_user . "'s packages"; $robots = 'no' . $robots; } $tz = new DateTimeZone('UTC'); $date_gen = date('c'); # Temporary until initial mirror is ready chdir("data"); $missing_deps = file("missing-deps.i586.txt"); ######################################### chdir($upload_dir); $all_files = shell_exec("find \( -name '*.rpm' -o -name '*.src.rpm.info' -o -name '*.youri' -o -name '*.lock' -o -name '*.done' \) -ctime -$max_modified -printf \"%p\t%T@\\n\""); $re = "!^\./(\w+)/((\w+)/(\w+)/(\w+)/(\d+)\.(\w+)\.(\w+)\.(\d+))_?(.*)(\.src\.rpm(?:\.info)?|\.youri|\.lock|\.done)\s+(\d+\.\d+)$!m"; $r = preg_match_all($re, $all_files, $matches, PREG_SET_ORDER); $pkgs = array(); foreach ($matches as $val) { if ($_GET['user'] && ($_GET['user'] != $val[7])) { continue; } $key = $val[6] . $val[7]; if (!is_array($pkgs[$key])) { $pkgs[$key] = array( 'status' => array(), 'path' => $val[2], 'version' => $val[3], 'media' => $val[4], 'section' => $val[5], 'user' => $val[7], 'host' => $val[8], 'job' => $val[9] ); } $status = $val[1]; $data = $val[10]; if (preg_match("/@(\d+):/", $data, $revision)) { $pkgs[$key]['revision'] = $revision[1]; } $pkgs[$key]['status'][$status] = 1; $ext = $val[11]; if ($ext == '.src.rpm.info') { preg_match("!^(?:@\d+:)?(.*)!", $data, $name); $pkgs[$key]['package'] = $name[1]; } else if ($ext == '.src') { $pkgs[$key]['status']['src'] = 1; } else if ($ext == '.youri') { $pkgs[$key]['status']['youri'] = 1; } else if ($ext == '.lock') { // parse build bot from $data $pkgs[$key]['status']['build'] = 1; } else if ($ext == '.done') { $pkgs[$key]['buildtime']['start'] = key2timestamp($val[6]); $pkgs[$key]['buildtime']['end'] = round($val[12]); $pkgs[$key]['buildtime']['diff'] = $pkgs[$key]['buildtime']['end'] - $pkgs[$key]['buildtime']['start']; } } // sort by key in reverse order to have more recent pkgs first krsort($pkgs); // count all packages statuses $stats = array( 'uploaded' => 0, 'failure' => 0, 'todo' => 0, 'building' => 0, 'partial' => 0, 'built' => 0, ); $total = count($pkgs); // count users' packages $users = array(); if ($total > 0) { foreach ($pkgs as $key => $p) { $pkgs[$key]['type'] = pkg_gettype($p); $stats[$pkgs[$key]['type']] += 1; if (!array_key_exists($p['user'], $users)) $users[$p['user']] = 1; else $users[$p['user']] += 1; } } // feedback labels $badges = array( 'uploaded' => 'Congrats %s! \o/', 'failure' => 'Booooo! /o\\', 'todo' => '', 'building' => '', 'partial' => '', 'built' => '' ); foreach ($stats as $k => $v) { Header("X-BS-Queue-$k: $v"); } $w = $stats['todo'] - 10; if($w < 0) $w = 0; $w = $w * 60; Header("X-BS-Throttle: $w"); ?> <?php echo strip_tags($title); ?>

« Back to full list'; # Temporary until initial mirror is ready echo sprintf( '

%d broken dependencies. You can help!

', 'data/missing-deps.i586.txt', count($missing_deps), 'http://www.mageia.org/wiki/doku.php?id=packaging#starting_package_import' ); ######################################### $buildtime_stats = array(); $s = ''; $tmpl = << %s %s %s %s %s/%s T; if ($total > 0) { foreach ($pkgs as $key => $p) { $s .= sprintf($tmpl, $p['type'], timediff(key2timestamp($key)) . ' ago', $p['user'], $p['user'], $p['revision'], addslashes($p['summary']), $p['package'], $p['version'], $p['media'], $p['section'] ); $typelink = ''; if ($p['type'] == 'failure') { $typelink = '/uploads/' . $p['type'] . '/' . $p['path']; } elseif ($p['type'] == 'rejected') { $typelink = '/uploads/' . $p['type'] . '/' . $p['path'] . '.youri'; } $s .= ''; $s .= ($typelink != '') ? sprintf('%s', $typelink, $p['type']) : $p['type']; $s .= ''; if ($p['type'] == 'uploaded') { $tdiff = timediff($p['buildtime']['start'], $p['buildtime']['end']); $s .= $tdiff; @$buildtime_stats[$tdiff] += 1; } $s .= ''; //$s .= '' . sprintf($badges[$p['type']], $p['user']) . ''; $s .= ''; } // Table echo '', '', '', $s, '
', $total, ' packages submitted in the past ', $max_modified * 24, ' hours.
SubmittedUser PackageTargetMedia StatusBuild time
'; // Stats $s = '
'; $score = round($stats['uploaded']/$total * 100); $s .= sprintf('

Score: %d/100

', $score, $score); $s .= ''; foreach ($stats as $k => $v) { $s .= sprintf('', $k, $k, $v, round($v/$total*100)); } $s .= '
Stats.
StatusCount%
%s%d%d%%


'; $s .= ''; foreach ($users as $k => $v) $s .= sprintf('', $k, $k, $v); $s .= '
Packagers
UserPackages
%s%d


'; /** */ function timesort($a, $b) { $a = explode(' ', trim($a)); $b = explode(' ', trim($b)); if ($a[1] == 'hour' || $a[1] == 'hours') $a[0] *= 3600; if ($b[1] == 'hour' || $a[1] == 'hours') $b[0] *= 3600; if ($a[0] > $b[0]) return 1; elseif ($a[0] < $b[0]) return -1; return 0; } uksort($buildtime_stats, "timesort"); $bts = ''; $buildtime_avg = 0; $buildtime_cnt = 0; foreach ($buildtime_stats as $time => $count) { $bts .= sprintf('%s%d', $time, $count); $tmp = explode(' ', $time); $buildtime_avg += $tmp[0] * $count; $buildtime_cnt += $count; } $s .= ''; $s .= sprintf('', $buildtime_avg, round($buildtime_avg / $buildtime_cnt, 1), $buildtime_cnt); $s .= $bts; $s .= '
Build time
DurationPack. nb.
Total time%s
Average%s
Builds count%s
Does not take
build failures
into account.
'; $s .= '
'; echo $s; } else { echo sprintf('

No package has been submitted in the past %d hours.

', $max_modified * 24); } ?>

Generated at .