1
0
forked from vitrine/wmaker

Add script to update ChangeLog from git log.

This patch adds update-changelog.pl, a script which adds the subject line and
author of every commit since ChangeLog was last touched by git, in a style
consistent with the entries up to version 0.92.0.

Signed-off-by: Carlos R. Mafra <crmafra@gmail.com>
This commit is contained in:
Doug Torrance
2014-09-29 23:04:40 -05:00
committed by Carlos R. Mafra
parent 4546065276
commit d3f9c2cd75
2 changed files with 102 additions and 1 deletions

View File

@@ -36,7 +36,7 @@ EXTRA_DIST = TODO BUGS BUGFORM FAQ FAQ.I18N INSTALL \
INSTALL-WMAKER README.definable-cursor \
The-perfect-Window-Maker-patch.txt \
README COPYING.WTFPL autogen.sh \
email-clients.txt checkpatch.pl
email-clients.txt checkpatch.pl update-changelog.pl
if USE_LCOV
coverage-reset:

101
update-changelog.pl Executable file
View File

@@ -0,0 +1,101 @@
#!/usr/bin/perl
# Update Window Maker ChangeLog from git log
# Copyright (C) 2014 Window Maker Developers Team
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# DESCRIPTION
#
# This script adds the subject line and author of every commit since ChangeLog
# was last touched by git, in a style consistent with the entries up to version
# 0.92.0.
use warnings;
use strict;
use File::Slurp qw(read_file prepend_file edit_file);
use Git::Repository;
use Git::Repository::Log::Iterator;
use Text::Wrap;
$Text::Wrap::columns = 80;
my $text = read_file('ChangeLog');
my ($initial_entry) = $text =~ /(Changes.+?\n)\nChanges/s;
my $r = Git::Repository->new();
my $initial_commit = $r->run('log', '-n 1', '--pretty=%H', '--', 'ChangeLog');
my $initial_tag = $r->run('describe', '--abbrev=0', $initial_commit);
my $current_entry = '';
my $initial_author = '';
# start a new entry
if ($r->run('describe', $initial_commit) eq $initial_tag) {
my ($version) = $initial_tag =~ /wmaker-(.+)/;
$current_entry .= "Changes since version $version:\n";
for (my $i = 0; $i < 23 + length($version); $i++) {
$current_entry .= '.';
}
$current_entry .= "\n\n";
} else {
# append to an old entry
($initial_author) = $initial_entry =~ /\n (.+)\n$/;
edit_file {s/\Q$initial_entry//} 'ChangeLog';
$initial_entry =~ s/\n(.+)\n$/\n/;
$current_entry = $initial_entry;
}
my $iter = Git::Repository::Log::Iterator->new( $r, '--reverse', "$initial_commit..HEAD");
my $previous_author = '';
my $previous_tag = $initial_tag;
while ( my $log = $iter->next ) {
my $current_author = '(' . $log->author_name . ' <' . $log->author_email . '>)';
# print the author of previous commit if different from current commit
if ($initial_author) {
if ($initial_author ne $current_author) {
chomp $current_entry;
$current_entry .= " $initial_author\n";
}
$initial_author = '';
}
if ($previous_author ne $current_author) {
if ($previous_author) {
$current_entry .= " $previous_author\n";
}
$previous_author = $current_author;
}
$current_entry .= wrap('- ', ' ', $log->subject . "\n");
my $current_commit = $log->commit;
my $current_tag = $r->run('describe', '--abbrev=0', $current_commit);
# start a new entry if new tag
if ($current_tag ne $previous_tag) {
$current_entry .= " $previous_author\n\n";
$previous_author = '';
prepend_file('ChangeLog', $current_entry, binmode => ':raw' );
$current_entry = '';
my ($version) = $current_tag =~ /wmaker-(.+)/;
$current_entry .= "Changes since version $version:\n";
for (my $i = 0; $i < 23 + length($version); $i++) {
$current_entry .= '.';
}
$current_entry .= "\n\n";
$previous_tag = $current_tag;
}
}
$current_entry .= " $previous_author\n\n";
prepend_file('ChangeLog', $current_entry, binmode => ':raw' );