| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 | #!/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/;}# Run git log to get the commits the messagesopen 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)/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) {    # 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 the lisp part of the path    $entry =~ s/^([ \t]+\* )lisp\//$1/mg;    print "$syncdate  $name  $address$tiny\n\n$entry\n\n";  }} 
 |