#!/usr/bin/perl # Copyright (C) 2006 Eric L. Wilhelm use warnings; use strict; =head1 NAME svn_message - format a commit message =cut package bin::svn_message; use Cwd; sub main { my (@args) = @_; (-t STDIN) and die "need a pipe"; my $fh = \*STDIN; my @lines = map({ chomp; ($_ ? $_ : ())} <$fh>); my $type = ($lines[0] =~ m/--This line,/) ? 'svn' : 'svk'; if($lines[0] =~ m/^# Please enter the commit/) { # git shift(@lines) until($lines[0] =~ m/^# Changes to be committed/); @lines or die "fail"; shift(@lines) for(1..3); my @message; while($lines[0] =~ m/^#\s+(?:modified|new file):\s+(.*)$/) { push(@message, $1); shift(@lines); } print join("\n", justify(@message), ''); exit; } my $cwd = Cwd::cwd; my @message = @lines[1..$#lines]; if($type eq 'svn') { @lines = (); } s/.* // for @message; @message = justify(@message); if($type eq 'svk') { for(my $i = 0; $i < @message; $i++) { if(-d $message[$i]) { splice(@message, $i, 1); $i--; next; } $message[$i] =~ s/$cwd\/?//; } } print join("\n", @message, @lines, ''); } =head2 justify @message = justify(@message); =cut sub justify { my @m = @_; my @l = map({length($m[$_])} 0..$#m); my $longest = (sort({$l[$b] <=> $l[$a]} 0..$#m))[0]; my $max = $l[$longest]; for(my $i = 0; $i < @m; $i++) { my $pad = ' 'x($max - $l[$i]) . ' - '; $m[$i] .= $pad; } return(@m); } # end subroutine justify definition ######################################################################## package main; if($0 eq __FILE__) { bin::svn_message::main(@ARGV); } # vi:ts=2:sw=2:et:sta my $package = 'bin::svn_message';