#!/usr/bin/perl

# Cleans a directory so that it only contains files in the CVS repository.
# Use with caution!

sub cvsclean {
    my ($dir) = @_;
    my (%files);
    my (@subdirs);

    if (!-e "$dir/CVS/Entries") {
	return;
    }
    open ENTRIES, "$dir/CVS/Entries";
    while (<ENTRIES>) {
	if (/^\/([^\/]+)\//) {
#	    print "File $dir/$1\n";
	    $files{$1} = 1;
	} elsif (/^D\/([^\/]+)\//) {
#	    print "Dir $dir/$1\n";
	    $files{$1} = 1;
	    push @subdirs, $1;
	}
    }
    close ENTRIES;
    opendir DIR, $dir;
    foreach $f (readdir DIR) {
	if ($f eq 'CVS' || $f eq '.' || $f eq '..') {
	    # skip
	} elsif ($files{$f}) {
#	    print "File $dir/$f in repo\n";
	} else {
	    print "Deleting $dir/$f\n";
	    if (-d "$dir/$f") {
		system "rm -rf $dir/$f";
	    } else {
		unlink "$dir/$f";
	    }
	}
    }
    closedir DIR;
    foreach $subdir (@subdirs) {
	cvsclean ("$dir/$subdir");
    }
}

if (@ARGV) {
    foreach $dir (@ARGV) {
	cvsclean ($dir);
    }
} else {
    cvsclean (".");
}
