#!/usr/bin/perl -w

use File::Temp qw/ tempfile /;

sub syntax($)
{
    print <<"EOF"
svn-pack: <svn checkout path> [dest-archive]
    --help - show this help
EOF
;
    exit shift;
}

sub slurp_dir($)
{
    my $path = shift;
    my @paths = ();
    my $dirh;

    opendir ($dirh, $path) || die "Can't open $path: $!";
    while (my $line = readdir ($dirh)) {
	($line =~ m/^\.$/ || $line =~ m/^\.\.$/) && next;
	push @paths, $line;
    }
    close ($dirh);

    return @paths;
}

sub dump_svn_directory ($$);
sub dump_svn_directory ($$)
{
    my $path = shift;
    my $toplevel = shift;
    my @paths = ();

    for my $line (slurp_dir ($path)) {
	if ($toplevel) {
	    $line eq 'text-base' && next;
	    $line eq 'tmp' && next; # hopefully can re-create
	}
	my $subpath = "$path/$line";
	push @paths, $subpath;
	-d $subpath && push @paths, dump_svn_directory ("$path/$line", 0);
    }
    
    return @paths;
}

sub find_svn($);
sub find_svn($)
{
    my $path = shift;
    my @paths = ();

    for my $line (slurp_dir ($path)) {
	my $subpath = "$path/$line";

	if ($line eq '.svn') {
	    push @paths, dump_svn_directory ($subpath, 1);

	} elsif (-d $subpath) {
	    push @paths, find_svn ($subpath);
	}
    }

    return @paths;
}

my $src;
my $dest;

for my $arg (@ARGV) {
    if ($arg eq '--help' || $arg eq '-h') {
	syntax (0);

    } elsif (!defined $src) {
	$src = $arg;
	$src =~ s/\/$//;
	$dest = $arg;
	$dest =~ s/^.*\/([^\/*])/$1/;
	$dest .= ".tar.gz";
    } elsif (!defined $dest) {
	$dest = $arg;
    } else {
	print "Too many arguments $arg\n";
	syntax (1);
    }
}

if (!defined $src || !defined $dest) {
    syntax(1);
}

print "Pack $src to $dest\n";

my @files = find_svn ($src);

my ($fh, $filename) = tempfile( "svnpackXXXXXX" );
for my $file (@files) {
    print $fh "$file\n";
}
close ($fh);

print "Written file list to $filename\n";
`tar czf $dest -T $filename`;
