[build] Add automatic ChangeLog generation on dist
authorEmmanuele Bassi <ebassi@linux.intel.com>
Thu, 29 Jan 2009 15:38:28 +0000 (15:38 +0000)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Thu, 29 Jan 2009 15:38:28 +0000 (15:38 +0000)
Since we moved to Git from Subversion we've abandoned the ChangeLog
file in favour of a more detailed commit log.

In order to maintain a ChangeLog for users of the tarballs, we need
to generate a ChangeLog file out of the commit log when distchecking
a Clutter release.

For this reason, we use a simple Perl script that is invoked by the
dist-hook and generates a ChangeLog file starting from the previous
stable release.

Makefile.am
build/gen-changelog.pl [new file with mode: 0755]

index bed5547..19125bd 100644 (file)
@@ -39,6 +39,8 @@ EXTRA_DIST =                  \
 
 CLEANFILES = $(pcfiles)
 
+DISTCLEANFILES =
+
 DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc --enable-maintainer-flags
 
 # Extra clean files so that maintainer-clean removes *everything*
@@ -56,3 +58,32 @@ MAINTAINERCLEANFILES = \
        Makefile.in \
        missing \
        $(NULL)
+
+PREV_RELEASE=$(CLUTTER_MAJOR_VERSION).$$(echo "$(CLUTTER_MINOR_VERSION)-1" | bc)
+
+CHANGELOGS = ChangeLog
+
+changelogs:
+       @$(MAKE) $(AM_MAKEFLAGS) $(CHANGELOGS)
+
+dist-hook: changelogs
+       changelogs="$(CHANGELOGS)"; \
+       for changelog in $$changelogs; \
+       do \
+               cp $(srcdir)/$$changelog $(distdir)/ 2>/dev/null || \
+               cp $$changelog $(distdir)/; \
+       done
+
+$(srcdir)/ChangeLog:
+       @if test -d "$(top_srcdir)/.git"; \
+       then \
+               to=""; \
+               from="$(PREV_RELEASE)"; \
+               echo Creating $@ && \
+               ( echo '# Generated by configure.  Do no edit.'; echo; \
+               $(top_srcdir)/missing --run perl $(top_srcdir)/build/gen-changelog.pl $$from.0..$$to ) > $@ ; \
+       else \
+               echo A git checkout is required to generate $@; \
+       fi
+
+.PHONY: changelogs ChangeLog $(srcdir)/ChangeLog
diff --git a/build/gen-changelog.pl b/build/gen-changelog.pl
new file mode 100755 (executable)
index 0000000..e0fc8d9
--- /dev/null
@@ -0,0 +1,148 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings;
+
+use Text::Wrap;
+use Pod::Usage;
+use Getopt::Long;
+use POSIX qw( strftime );
+
+$Text::Wrap::columns = 74;
+
+# git commands
+our $GIT_LOG       = 'git log --pretty=format:"%at|%an|<%ae>|%h|%s"';
+our $GIT_DIFF_TREE = 'git diff-tree --name-only -r';
+
+my $help;
+my $result = GetOptions(
+    "h|help"    => \$help,
+);
+
+pod2usage(1) if $help;
+
+our $revs = $ARGV[0] or undef;
+
+my $log_cmd = $GIT_LOG;
+$log_cmd .= ' ' . $revs if defined $revs;
+
+open my $git_log, '-|', $log_cmd
+    or die("Unable to invoke git-log: $!\n");
+
+while (<$git_log>) {
+    my $log_line = $_;
+
+    chomp($log_line);
+
+    my ($timestamp, $committer, $email, $commit_hash, $subject) =
+        split /\|/, $log_line, 5;
+
+    # use a shorter date line
+    my $date = strftime("%Y-%m-%d", localtime($timestamp));
+
+    print STDOUT $date, "  ", $committer, "  ", $email, "\n\n";
+
+    # list the file changes
+    if ($commit_hash) {
+        my $diff_cmd = $GIT_DIFF_TREE . " " . $commit_hash;
+
+        open my $git_diff, '-|', $diff_cmd
+            or die("Unable to invoke git-diff-tree: $!\n");
+
+        while (<$git_diff>) {
+            my $diff_line = $_;
+
+            chomp($diff_line);
+
+            next if $diff_line =~ /^$commit_hash/;
+            print STDOUT "\t* ", $diff_line, ":\n";
+        }
+
+        close($git_diff);
+    }
+    else {
+        print STDOUT "\t* *:\n";
+    }
+
+    print STDOUT "\n";
+
+    # no need to use the full body, the subject will do
+    if (defined $subject) {
+        $subject =~ s/\t//g;
+
+        print STDOUT wrap("\t", "\t", $subject), "\n";
+    }
+
+    print STDOUT "\n";
+}
+
+close($git_log);
+
+0;
+__END__
+
+=pod
+
+=head1 NAME
+
+gen-changelog - Creates a ChangeLog from a git log
+
+=head1 SYNOPSIS
+
+  gen-changelog <options>
+
+=head1 DESCRIPTION
+
+B<gen-changelog> is a small Perl script that reads the output of git log
+and creates a file using the GNU ChangeLog format. It should be used when
+creating a tarball of a project, to provide a full log of the changes to
+the users.
+
+=head1 OPTIONS
+
+=over 4
+
+=item -h, --help
+
+Prints a brief help message
+
+=item E<lt>sinceE<gt>..E<lt>untilE<gt>
+
+Show only commits between the named two commits. When either E<lt>sinceE<gt>
+or E<lt>untilE<gt> is omitted, it defaults to `HEAD`, i.e. the tip of the
+current branch. For a more complete list of ways to spell E<lt>sinceE<gt>
+and E<lt>untilE<gt>, see "SPECIFYING REVISIONS" section in git rev-parse.
+
+=back
+
+=head1 CAVEATS
+
+B<gen-changelog> is very simple and should be tweaked to fit your use case.
+It does fit the author's, but he'll gladly accept patches and requests.
+
+=head1 EXAMPLES
+
+=over 4
+
+=item Print the full log and redirect it to a file
+
+  gen-changelog > ChangeLog
+
+=item Print the changelog of the local changes
+
+  gen-changelog origin..HEAD
+
+=back
+
+=head1 AUTHOR
+
+Emmanuele Bassi  E<lt>ebassi (at) gnome.orgE<gt>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (C) 2009  Emmanuele Bassi
+
+This program is free software. It can be distributed and/or modified under
+the terms of Perl itself. See L<perlartistic> for further details.
+
+=cut