summaryrefslogtreecommitdiff
path: root/tools/git2cl
diff options
context:
space:
mode:
Diffstat (limited to 'tools/git2cl')
-rwxr-xr-xtools/git2cl372
1 files changed, 0 insertions, 372 deletions
diff --git a/tools/git2cl b/tools/git2cl
deleted file mode 100755
index 1c2ab3f..0000000
--- a/tools/git2cl
+++ /dev/null
@@ -1,372 +0,0 @@
-#!/usr/bin/perl
-
-# Copyright (C) 2007, 2008 Simon Josefsson <simon@josefsson.org>
-# Copyright (C) 2007 Luis Mondesi <lemsx1@gmail.com>
-# * calls git directly. To use it just:
-# cd ~/Project/my_git_repo; git2cl > ChangeLog
-# * implements strptime()
-# * fixes bugs in $comment parsing
-# - copy input before we remove leading spaces
-# - skip "merge branch" statements as they don't
-# have information about files (i.e. we never
-# go into $state 2)
-# - behaves like a pipe/filter if input is given from the CLI
-# else it calls git log by itself
-#
-# The functions mywrap, last_line_len, wrap_log_entry are derived from
-# the cvs2cl tool, see <http://www.red-bean.com/cvs2cl/>:
-# Copyright (C) 2001,2002,2003,2004 Martyn J. Pearce <fluffy@cpan.org>
-# Copyright (C) 1999 Karl Fogel <kfogel@red-bean.com>
-#
-# git2cl 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, or (at your option)
-# any later version.
-#
-# git2cl 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 git2cl; see the file COPYING. If not, write to the Free
-# Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
-# 02111-1307, USA.
-
-use strict;
-use POSIX qw(strftime);
-use Text::Wrap qw(wrap);
-use FileHandle;
-
-use constant EMPTY_LOG_MESSAGE => '*** empty log message ***';
-
-# this is a helper hash for stptime.
-# Assumes you are calling 'git log ...' with LC_ALL=C
-my %month = (
- 'Jan'=>0,
- 'Feb'=>1,
- 'Mar'=>2,
- 'Apr'=>3,
- 'May'=>4,
- 'Jun'=>5,
- 'Jul'=>6,
- 'Aug'=>7,
- 'Sep'=>8,
- 'Oct'=>9,
- 'Nov'=>10,
- 'Dec'=>11,
-);
-
-my $fh = new FileHandle;
-
-sub key_ready
-{
- my ($rin, $nfd);
- vec($rin, fileno(STDIN), 1) = 1;
- return $nfd = select($rin, undef, undef, 0);
-}
-
-sub strptime {
- my $str = shift;
- return undef if not defined $str;
-
- # we are parsing this format
- # Fri Oct 26 00:42:56 2007 -0400
- # to these fields
- # sec, min, hour, mday, mon, year, wday = -1, yday = -1, isdst = -1
- # Luis Mondesi <lemsx1@gmail.com>
- my @date;
- if ($str =~ /([[:alpha:]]{3})\s+([[:alpha:]]{3})\s+([[:digit:]]{1,2})\s+([[:digit:]]{1,2}):([[:digit:]]{1,2}):([[:digit:]]{1,2})\s+([[:digit:]]{4})/){
- push(@date,$6,$5,$4,$3,$month{$2},($7 - 1900),-1,-1,-1);
- } else {
- die ("Cannot parse date '$str'\n'");
- }
- return @date;
-}
-
-sub mywrap {
- my ($indent1, $indent2, @text) = @_;
- # If incoming text looks preformatted, don't get clever
- my $text = Text::Wrap::wrap($indent1, $indent2, @text);
- if ( grep /^\s+/m, @text ) {
- return $text;
- }
- my @lines = split /\n/, $text;
- $indent2 =~ s!^((?: {8})+)!"\t" x (length($1)/8)!e;
- $lines[0] =~ s/^$indent1\s+/$indent1/;
- s/^$indent2\s+/$indent2/
- for @lines[1..$#lines];
- my $newtext = join "\n", @lines;
- $newtext .= "\n"
- if substr($text, -1) eq "\n";
- return $newtext;
-}
-
-sub last_line_len {
- my $files_list = shift;
- my @lines = split (/\n/, $files_list);
- my $last_line = pop (@lines);
- return length ($last_line);
-}
-
-# A custom wrap function, sensitive to some common constructs used in
-# log entries.
-sub wrap_log_entry {
- my $text = shift; # The text to wrap.
- my $left_pad_str = shift; # String to pad with on the left.
-
- # These do NOT take left_pad_str into account:
- my $length_remaining = shift; # Amount left on current line.
- my $max_line_length = shift; # Amount left for a blank line.
-
- my $wrapped_text = ''; # The accumulating wrapped entry.
- my $user_indent = ''; # Inherited user_indent from prev line.
-
- my $first_time = 1; # First iteration of the loop?
- my $suppress_line_start_match = 0; # Set to disable line start checks.
-
- my @lines = split (/\n/, $text);
- while (@lines) # Don't use `foreach' here, it won't work.
- {
- my $this_line = shift (@lines);
- chomp $this_line;
-
- if ($this_line =~ /^(\s+)/) {
- $user_indent = $1;
- }
- else {
- $user_indent = '';
- }
-
- # If it matches any of the line-start regexps, print a newline now...
- if ($suppress_line_start_match)
- {
- $suppress_line_start_match = 0;
- }
- elsif (($this_line =~ /^(\s*)\*\s+[a-zA-Z0-9]/)
- || ($this_line =~ /^(\s*)\* [a-zA-Z0-9_\.\/\+-]+/)
- || ($this_line =~ /^(\s*)\([a-zA-Z0-9_\.\/\+-]+(\)|,\s*)/)
- || ($this_line =~ /^(\s+)(\S+)/)
- || ($this_line =~ /^(\s*)- +/)
- || ($this_line =~ /^()\s*$/)
- || ($this_line =~ /^(\s*)\*\) +/)
- || ($this_line =~ /^(\s*)[a-zA-Z0-9](\)|\.|\:) +/))
- {
- $length_remaining = $max_line_length - (length ($user_indent));
- }
-
- # Now that any user_indent has been preserved, strip off leading
- # whitespace, so up-folding has no ugly side-effects.
- $this_line =~ s/^\s*//;
-
- # Accumulate the line, and adjust parameters for next line.
- my $this_len = length ($this_line);
- if ($this_len == 0)
- {
- # Blank lines should cancel any user_indent level.
- $user_indent = '';
- $length_remaining = $max_line_length;
- }
- elsif ($this_len >= $length_remaining) # Line too long, try breaking it.
- {
- # Walk backwards from the end. At first acceptable spot, break
- # a new line.
- my $idx = $length_remaining - 1;
- if ($idx < 0) { $idx = 0 };
- while ($idx > 0)
- {
- if (substr ($this_line, $idx, 1) =~ /\s/)
- {
- my $line_now = substr ($this_line, 0, $idx);
- my $next_line = substr ($this_line, $idx);
- $this_line = $line_now;
-
- # Clean whitespace off the end.
- chomp $this_line;
-
- # The current line is ready to be printed.
- $this_line .= "\n${left_pad_str}";
-
- # Make sure the next line is allowed full room.
- $length_remaining = $max_line_length - (length ($user_indent));
-
- # Strip next_line, but then preserve any user_indent.
- $next_line =~ s/^\s*//;
-
- # Sneak a peek at the user_indent of the upcoming line, so
- # $next_line (which will now precede it) can inherit that
- # indent level. Otherwise, use whatever user_indent level
- # we currently have, which might be none.
- my $next_next_line = shift (@lines);
- if ((defined ($next_next_line)) && ($next_next_line =~ /^(\s+)/)) {
- $next_line = $1 . $next_line if (defined ($1));
- # $length_remaining = $max_line_length - (length ($1));
- $next_next_line =~ s/^\s*//;
- }
- else {
- $next_line = $user_indent . $next_line;
- }
- if (defined ($next_next_line)) {
- unshift (@lines, $next_next_line);
- }
- unshift (@lines, $next_line);
-
- # Our new next line might, coincidentally, begin with one of
- # the line-start regexps, so we temporarily turn off
- # sensitivity to that until we're past the line.
- $suppress_line_start_match = 1;
-
- last;
- }
- else
- {
- $idx--;
- }
- }
-
- if ($idx == 0)
- {
- # We bottomed out because the line is longer than the
- # available space. But that could be because the space is
- # small, or because the line is longer than even the maximum
- # possible space. Handle both cases below.
-
- if ($length_remaining == ($max_line_length - (length ($user_indent))))
- {
- # The line is simply too long -- there is no hope of ever
- # breaking it nicely, so just insert it verbatim, with
- # appropriate padding.
- $this_line = "\n${left_pad_str}${this_line}";
- }
- else
- {
- # Can't break it here, but may be able to on the next round...
- unshift (@lines, $this_line);
- $length_remaining = $max_line_length - (length ($user_indent));
- $this_line = "\n${left_pad_str}";
- }
- }
- }
- else # $this_len < $length_remaining, so tack on what we can.
- {
- # Leave a note for the next iteration.
- $length_remaining = $length_remaining - $this_len;
-
- if ($this_line =~ /\.$/)
- {
- $this_line .= " ";
- $length_remaining -= 2;
- }
- else # not a sentence end
- {
- $this_line .= " ";
- $length_remaining -= 1;
- }
- }
-
- # Unconditionally indicate that loop has run at least once.
- $first_time = 0;
-
- $wrapped_text .= "${user_indent}${this_line}";
- }
-
- # One last bit of padding.
- $wrapped_text .= "\n";
-
- return $wrapped_text;
-}
-
-# main
-
-my @date;
-my $author;
-my @files;
-my $comment;
-
-my $state; # 0-header 1-comment 2-files
-my $done = 0;
-
-$state = 0;
-
-# if reading from STDIN, we assume that we are
-# getting git log as input
-if (key_ready())
-{
-
- #my $dummyfh; # don't care about writing
- #($fh,$dummyfh) = FileHandle::pipe;
- $fh->fdopen(*STDIN, 'r');
-}
-else
-{
- $fh->open("LC_ALL=C git log --pretty --numstat --summary|")
- or die("Cannot execute git log...$!\n");
-}
-
-while (my $_l = <$fh>) {
- #print STDERR "debug ($state, " . (@date ? (strftime "%Y-%m-%d", @date) : "") . "): `$_'\n";
- if ($state == 0) {
- if ($_l =~ m,^Author: (.*),) {
- $author = $1;
- }
- if ($_l =~ m,^Date: (.*),) {
- @date = strptime($1);
- }
- $state = 1 if ($_l =~ m,^$, and $author and (@date+0>0));
- } elsif ($state == 1) {
- # * modifying our input text is a bad choice
- # let's make a copy of it first, then we remove spaces
- # * if we meet a "merge branch" statement, we need to start
- # over and find a real entry
- # Luis Mondesi <lemsx1@gmail.com>
- my $_s = $_l;
- $_s =~ s/^ //g;
- if ($_s =~ m/^Merge branch/)
- {
- $state=0;
- next;
- }
- $comment = $comment . $_s;
- $state = 2 if ($_l =~ m,^$,);
- } elsif ($state == 2) {
- if ($_l =~ m,^([0-9]+)\t([0-9]+)\t(.*)$,) {
- push @files, $3;
- }
- $done = 1 if ($_l =~ m,^$,);
- }
-
- if ($done) {
- print (strftime "%Y-%m-%d $author\n\n", @date);
-
- my $files = join (", ", @files);
- $files = mywrap ("\t", "\t", "* $files"), ": ";
-
- if (index($comment, EMPTY_LOG_MESSAGE) > -1 ) {
- $comment = "[no log message]\n";
- }
-
- my $files_last_line_len = 0;
- $files_last_line_len = last_line_len($files) + 1;
- my $msg = wrap_log_entry($comment, "\t", 69-$files_last_line_len, 69);
-
- $msg =~ s/[ \t]+\n/\n/g;
-
- print "$files: $msg\n";
-
- @date = ();
- $author = "";
- @files = ();
- $comment = "";
-
- $state = 0;
- $done = 0;
- }
-}
-
-if (@date + 0)
-{
- print (strftime "%Y-%m-%d $author\n\n", @date);
- my $msg = wrap_log_entry($comment, "\t", 69, 69);
- $msg =~ s/[ \t]+\n/\n/g;
- print "\t* $msg\n";
-}