Blame | Letzte Änderung | Log anzeigen | RSS feed
#!/usr/bin/php -q<?php/* vim: set noai expandtab tabstop=4 softtabstop=4 shiftwidth=4: *//*** Script to generate changelog file** Relies on svn2cl* Echoes on STDOUT** PHP version 5** @category System* @package System_Daemon* @author Kevin <kevin@vanzonneveld.net>* @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.net)* @license http://www.opensource.org/licenses/bsd-license.php New BSD Licence* @version SVN: Release: $Id: changelog_gen.php 218 2009-04-25 10:29:41Z kevin $* @link http://trac.plutonia.nl/projects/system_daemon*/$workspace_dir = realpath(dirname(__FILE__)."/..");$cmd_reqs = array();$cmd_reqs["svn2cl"] = "subversion-tools";$map_authors = array();$map_authors["kevin"] = "Kevin van Zonneveld <kevin@vanzonneveld.net>";// check if commands are availableforeach ($cmd_reqs as $cmd=>$package) {exec("which ".$cmd, $o, $r);if ($r) {echo $cmd." is not available. ";echo "Please first install the ".$package;die("\n");}}if (isset($argv[1]) && is_numeric($argv[1])) {$rev = "--revision=HEAD:".$argv[1];}// collect data$cmd = "";$cmd .= "svn up ".$workspace_dir;exec($cmd, $o, $r);if ($r) {die("Executing: ".$cmd." failed miserably\n");}$cmd = "";$cmd .= "svn2cl -i --stdout --group-by-day ".$rev." --linelen=90000 ".$workspace_dir;exec($cmd, $o, $r);if ($r) {die("Executing: ".$cmd." failed miserably\n");}// divide blocks$blocks = array();$cur_block = false;foreach ($o as $i=>$line_raw) {if (preg_match('/^(\d{4}-\d{2}-\d{2})(\s*)(.*)/', $line_raw, $match)) {// prepare new block$date = trim($match[1]);$author = trim($match[3]);$author = str_replace(array_keys($map_authors),array_values($map_authors), $author);$cur_block = $date . " ". $author;// don't record the date header itsselfcontinue;}$line = trim($line_raw);// don't record empty linesif (!$line) continue;if (!$cur_block) continue;// extract comment + revisionpreg_match('/^[^\[]+(\[r\d+\])(.*)/', $line, $match);$revision = trim($match[1]);$comment = trim($match[2]);if (!$revision && $old_revision) {// fallback to old revision$revision = $old_revision;}if (!$comment) {$comment = $line;}// remove the file which the comment is about$comment = preg_replace('/^([^:])+:(\s+)/', '', $comment);$comment = trim($comment);// don't record empty linesif (!$comment) continue;if (!substr($comment, 0, 7) == "http://") {$comment = ucfirst($comment);}// record what's left$blocks[$cur_block][$comment][] = $revision;// nescesary for fallback in case newlines are used for commit comments$old_revision = $revision;}// simplify blocksforeach ($blocks as $date=>$block_arr) {if (isset($blocks[$date]) && is_array($blocks[$date])) {foreach ($blocks[$date] as $comm=>$revs) {$blocks[$date][$comm] = reset($revs);}}}// print blocks$cnt = 1;foreach ($blocks as $date=>$block_arr) {if ($cnt != 1) {echo "\n";}echo $date."\n\n";foreach ($blocks[$date] as $comm=>$rev) {echo " ".$rev." ".$comm."\n";}$cnt++;}echo "\n";?>