#!perl -w
use strict;
use IO::File;
$|=1;
# this script recursively lists all files in the svn repository 
# from the current or specified dir.

sub readentries {
    my ($dir)=@_;
    my @dirs;
    my @files;
    my $fn= "$dir/.svn/entries";
    my $fh= IO::File->new($fn, "r") or die "$fn: $!\n";
    my $n=<$fh>;

    local $/="\x0c\x0a";

    while (my $rec= <$fh>) {
        my @fields=split /\n/, $rec;
        if (@fields<2) {
            die "too few fields: $rec\n";
        }
        if ($fields[1] eq "dir") {
            push @dirs, \@fields;
        }
        elsif ($fields[1] eq "file") {
            push @files, \@fields;
        }
        else {
            die "unknown type: $fields[1]\n";
        }
    }
    return (\@dirs, \@files);
}

sub processdir {
    my ($dir)= @_;
    my ($dirs, $files)= readentries($dir);

    for my $f (@$files) {
        my $fn= "$dir/$f->[0]";
#       if ($f->[0x16] eq "deleted") {
#           printf("%-27s %-10s %8s %s\n", "", "", "-", $fn);
#       }
#       else {
            printf("%-27s %-10s %s %s\n", $f->[6] eq "" ? "?" : $f->[6], $f->[10] || "?", -e $fn?sprintf("%8d", -s $fn):sprintf("%8s", $f->[5] || $f->[0x16]), $fn);
#       }
    }
    for my $d (@$dirs) {
        processdir("$dir/$d->[0]" ) if ($d->[0] ne "");
    }
}

if (@ARGV==0) {
    processdir(".");
}
else {
    processdir($_) for @ARGV;
}
