+ // highlight errors
+ if (preg_match("/(?:fail|error(s|\sCS\d+)?):/i", $s)) {
+ $first_cut = true;
+ $err_count++;
+ $toc_elem = "error $err_count";
+ $err_elem = $s;
+ $s = "<span class=error id=error-$err_count>$s</span>";
+ } elseif (preg_match("/(?:undefined reference to|recipe for target '.*?' failed|compilation terminated|make\[.*:.* (Stop\.$|Error))/i", $s)) {
+ $first_cut = true;
+ $err_count++;
+ $toc_elem = "error $err_count";
+ $err_elem = $s;
+ $s = "<span class=error id=error-$err_count>$s</span>";
+ } elseif (preg_match("#^\+ /usr/bin/make\b.*\b(?P<target>check)\b#", $s, $m)) {
+ // rpm build section
+ $toc_elem = "make {$m['target']}";
+ $err_elem = $s;
+ $s = "<span class=line id=make-{$m['target']}>$s</span>";
+ } elseif (preg_match('/^(?P<line>- For complete changelog see:) (?P<link>.+)$/', $s, $m)) {
+ // rpm changelog link
+ $link = "<a href=\"{$m['link']}\">{$m['link']}</a>";
+ $s = "<span class=changelog>{$m['line']} $link<br/></span>";
+ } elseif (preg_match('/^(?P<line>\* \w{3} \w{3} [ \d]{2} \d{4} .*?) (?P<hash>[a-z0-9]{7})$/', $s, $m)) {
+ // rpm changelogs
+ $url = "http://git.pld-linux.org/?p=packages/{$name_url}.git;a=commitdiff;h={$m['hash']}";
+ $link = "<a href=\"$url\">{$m['hash']}</a>";
+ $s = "<span class=changelog>{$m['line']} $link<br/></span>";
+ } elseif (substr($s, 0, 2) == "+ ") {
+ // shell verbose
+ $s = "<span class=verbose>$s</span>";
+ } elseif (preg_match("/^Executing\(%(?P<section>\w+)\)/", $s, $m)) {
+ // rpm build section
+ $toc_elem = $m['section'];
+ $err_elem = $s;
+ $s = "<span class=section id={$m['section']}>$s</span>";
+ } elseif (preg_match("/^Processing files: (?P<pkg>(?P<name>.+)-[^-]+-[^-]+)/", $s, $m)) {
+ $first_cut = true;
+ // processing files
+ $toc_elem = "files ".$m['name'];
+ $err_elem = $s;
+ $s = "<span class=section id=files-{$m['name']}>$s</span>";
+ } elseif (preg_match("/^ended at: (?P<date>.+), done in (?P<time>[\d:.]+)/", $s, $m)) {
+ $time = $m['time'];
+ }
+
+ $out_buf[] = $s;
+ $out_buf_size++;
+
+ // if error/processing found truncate early but keep last 100 lines before error
+ if ($tail && $first_cut && !$first_cut_done && $out_buf_size > 100) {
+ array_splice($out_buf, 0, $out_buf_size - 100);
+ $out_buf_size = 100;
+ $first_cut_done = true;
+ }
+
+ // if (not in tail mode) or (in tail mode but we have an error)
+ if (!$tail || $first_cut) {
+ if ($toc_elem)
+ $toc[] = $toc_elem;
+ if ($err_elem)
+ $err[] = $err_elem;
+ }