#!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; }