123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- #!/usr/bin/perl
- $commitrange = shift @ARGV;
- if (!$commitrange) {
- print STDERR "Enter commitrange: ";
- $commitrange = <>;
- $commitrange =~ s/\s*(.*?)\s+/$1/;
- }
- $syncdate = shift @ARGV;
- if (!$syncdate) {
- print STDERR "Enter syncdate YYYY-MM-DD: ";
- $syncdate = <>;
- $syncdate =~ s/\s*(.*?)\s+/$1/;
- }
- $kind = shift @ARGV;
- if (!$kind) {
- print STDERR 'Enter kind ("lisp" or "texi" or "card" or press RET): ';
- $kind = <>;
- $kind =~ s/\s*(.*?)\s+/$1/;
- $kind =~ s/"(.*?)"/$1/;
- }
- if ($kind ne "lisp" and $kind ne "texi" and $kind ne "card"
- and $kind ne "") {
- die "Invalid Changelog kind";
- }
- # Run git log to get the commits the messages
- open IN,"git log $commitrange|";
- undef $/;
- $log = <IN>;
- @commits = split(/^(?=commit)/m,$log);
- for $i (0..$#commits) {
- $entry = ""; $tiny = "";
- $commit = $commits[$i];
- $author = $1 if $commit=~/^Author: ([^\n]+)/m;
- $date = $1 if $commit=~/^Date: ([^\n]+)/m;
- $entry = $1 if $commit=~/^([ \t]*\* [^\f]*?)(\n[ \t]*\n([^*]|\Z)|\Z)/m;
- $tiny = " (tiny change)" if $commit =~ /TINYCHANGE/;
- # split author into name and address
- if ($author =~ /(.*?)\s+(<.*?>)/) {
- $name = $1;
- $address = $2;
- } else {
- warn "No name/address";
- next;
- }
- if ($entry) {
- # Fix the path when directories have been omitted
- $entry =~ s/^([ \t]*\* )([-a-zA-Z]+\.el)/$1lisp\/$2/mg;
- $entry =~ s/^([ \t]*\* )(org[a-z]*\.texi?)/$1doc\/$2/mg;
-
- # remove stuff which is not for this output
- if ($kind =~ /\S/) {
- remove_parts("contrib/","testing/","xemacs/");
- remove_parts("Makefile","README");
- }
- if ($kind eq "lisp") { remove_parts("doc/") }
- if ($kind eq "texi") { remove_parts("lisp/","doc/orgcard","doc/orgguide") }
- if ($kind eq "card") { remove_parts("lisp/","doc/org\\.","doc/orgguide") }
- # indent each line by 1 TAB
- $entry =~ s/^[ \t]*/\t/gm;
- # Add empty lines if there are several files in there
- $entry =~ s/(\n[ \t]+\* )/\n$1/g;
- # remove blocks of more than one empty line
- while ($entry =~s/\n[ \t]*\n[ \t]*\n/\n/g) {};
- # remove/replace parts of the path
- $entry =~ s/^([ \t]+\* )lisp\//$1/mg;
- $entry =~ s/^([ \t]+\* )doc\/orgcard/$1 refcards\/orgcard/mg;
- $entry =~ s/^([ \t]+\* )doc\//$1misc\//mg;
- # remove empty space at beginning and end
- $entry =~ s/\A\s*/\t/;
- $entry =~ s/\s*\Z/\n/;
- # If there is anything left in the entry, print it
- if ($entry =~ /\S/) {
- print "$syncdate $name $address$tiny\n\n$entry\n";
- }
- }
- }
-
- sub remove_parts {
- foreach $path (@_) {
- $re = "^[ \t]*\\*\\s+" . $path . "[^\\000]*?(?=^[ \\t]*\\*|\\Z)";
- $entry =~ s/$re/\n$1/mg;
- }
- }
|