#!/usr/bin/perl -w

$dest = shift @ARGV || die "no dest";

sub gen_diff($)
{
    my $patch = lc ($a);
    $patch =~ s/\//-/g;
    $patch =~ s/\./-/g;
    $patch .= '.diff';
    print "regenerate $patch from $a\n";

    my $ppipe;
    my $output;

    local $SIG{PIPE} = sub { die "spooler pipe broke" };

    open ($ppipe, "diff --new-file -u /dev/null $a |") || die "Can't diff: $!";
    open ($output, ">$dest/$patch") || die "Can't create patch: $!";
    while (<$ppipe>) {
	s/^([\-\+]{3}\s+[\S\d_\-\.]+\s+).*/$1/;
	print $output $_;
    }
    close ($output) || die "Can't close diff: $!";
    close ($ppipe); # odd ... || die "Can't close patch pipe: $! $?";
}

sub filter_crud($)
{
    my $a = shift;

    $a =~ /~$/ && return;
    $a =~ /\#$/ && return;
    $a =~ /\.orig$/ && return;
    $a =~ /unxlng.*\.pro$/ && return;
    $a eq 'CVS' && return;
    $a eq '.' && return;
    $a eq '..' && return;

    return $a;
}

sub slurp_dir($);

sub slurp_dir($)
{
    my $dir = shift;
    my ($dirhandle, $fname);
    my @files = ();

    opendir ($dirhandle, $dir) || die "Can't open $dir";
    while ($fname = readdir ($dirhandle)) {
	$fname = filter_crud($fname);
	defined $fname || next;
	if (-d "$dir/$fname") {
	    push @files, slurp_dir("$dir/$fname");
	} else {
	    push @files, "$dir/$fname";
	}
    }
    closedir ($dirhandle);

    return @files;
}

my @files = ();
my $recurse = 0;

for $a (@ARGV) {
    if ($a eq '-R' || $a eq '-r') {
	$recurse = 1;

    } else {
	$a = filter_crud($a);
	defined $a || next;

	if (-d $a) {
	    if ($recurse) {
		push @files, slurp_dir($a);
	    } else {
		print "skipping dir '$a'\n";
	    }
	} else {
	    push @files, $a if defined $a;
	}
    }
}

for $a (@files) {
    print "Diffing '$a'\n";
    gen_diff ($a);
}
