use warnings;
use strict;
+use Getopt::Std;
+use POSIX qw(strftime gmtime);
-my $filename = shift @ARGV;
+sub usage() {
+ print STDERR 'Usage: ${\basename $0} [-s] [-S revs-file] file
+
+ -l show long rev
+ -r follow renames
+ -S commit use revs from revs-file instead of calling git-rev-list
+';
+
+ exit(1);
+}
+our ($opt_h, $opt_l, $opt_r, $opt_S);
+getopts("hlrS:") or usage();
+$opt_h && usage();
+
+my $filename = shift @ARGV;
my @stack = (
{
my ($rev, @parents) = @$revinst;
$head ||= $rev;
+ if (!defined($rev)) {
+ $rev = "";
+ }
$revs{$rev}{'filename'} = $bound->{'filename'};
if (scalar @parents > 0) {
$revs{$rev}{'parents'} = \@parents;
next;
}
+ if (!$opt_r) {
+ next;
+ }
+
my $newbound = find_parent_renames($rev, $bound->{'filename'});
if ( exists $newbound->{'filename'} && $newbound->{'filename'} ne $bound->{'filename'}) {
push @stack, $newbound;
my ($output, $rev, $committer, $date);
if (ref $l eq 'ARRAY') {
($output, $rev, $committer, $date) = @$l;
- if (length($rev) > 8) {
+ if (!$opt_l && length($rev) > 8) {
$rev = substr($rev,0,8);
}
} else {
($rev, $committer, $date) = ('unknown', 'unknown', 'unknown');
}
- printf("(%8s %10s %10s %d)%s\n", $rev, $committer, $date, $i++, $output);
+ printf("%s\t(%10s\t%10s\t%d)%s\n", $rev, $committer,
+ format_date($date), $i++, $output);
}
sub init_claim {
sub git_rev_list {
my ($rev, $file) = @_;
- open(P,"-|","git-rev-list","--parents","--remove-empty",$rev,"--",$file)
- or die "Failed to exec git-rev-list: $!";
+ if ($opt_S) {
+ open(P, '<' . $opt_S);
+ } else {
+ open(P,"-|","git-rev-list","--parents","--remove-empty",$rev,"--",$file)
+ or die "Failed to exec git-rev-list: $!";
+ }
my @revs;
while(my $line = <P>) {
return %info;
}
+
+sub format_date {
+ my ($timestamp, $timezone) = split(' ', $_[0]);
+
+ return strftime("%Y-%m-%d %H:%M:%S " . $timezone, gmtime($timestamp));
+}
+