#!/usr/bin/perl

# svn-clean - Wipes out unversioned files from SVN working copy.
# Copyright (C) 2004, 2005, 2006 Simon Perreault
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

use strict;
use Cwd;
use File::Path;
use Getopt::Long;
use Pod::Usage;

# Try to use SVN module if available.
my $use_svn_module = eval { require SVN::Client };

my $CWD = getcwd;

my @exclude      = ();
my $force        = 0;
my $quiet        = 0;
my $print        = 0;
my $help         = 0;
my $man          = 0;
my $nonrecursive = 0;
my @paths        = ($CWD);
GetOptions(
    "exclude=s"       => \@exclude,
    "force"           => \$force,
    "non-recursive|N" => \$nonrecursive,
    "quiet"           => \$quiet,
    "print"           => \$print,
    "help|?"          => \$help,
    "man"             => \$man
) or pod2usage(2);
pod2usage(1) if $help;
pod2usage( -exitstatus => 0, -verbose => 2 ) if $man;
@paths = map { Cwd::abs_path($_) } @ARGV if @ARGV;

# Precompile regexes.
$_ = qr/$_/ foreach @exclude;

if ($use_svn_module) {

    # Create SVN client object. No need for connection to remote server.
    my $ctx = new SVN::Client;

    # Call handler function with status info for each file.
    $ctx->status( $_, undef, \&clean, !$nonrecursive, 1, 0, 1 )
      for @paths;
}
else {
    warn "Warning: Not using SVN Perl modules, this might be slow.\n"
      unless $quiet;

    # Build svn client command
    my @command = qw(svn status --no-ignore -v);
    if ($nonrecursive) {
        push @command, '-N';
    }

    # Main file-wiping loop.
    if ( $^O eq 'MSWin32' ) {

        # Perl on Windows currently doesn't have list pipe opens.
        open SVN, join( ' ', @command, @paths ) . '|'
          or die "Can't call program \"svn\": $!\n";
    }
    else {
        open SVN, "-|", @command, @paths
          or die "Can't call program \"svn\": $!\n";
    }
  LINE: while (<SVN>) {
        if (/^([\?ID])/) {
            my $file = (split)[-1];
            foreach my $ex (@exclude) {
                if ( $file =~ $ex ) {
                    print "excluded $file\n" unless $quiet or $print;
                    next LINE;
                }
            }
            if ( $1 eq 'D' ) {
                next unless -f $file;
            }
            else {
                next unless -e $file;
            }
            if ($print) {
                print "$file\n";
            }
            else {
                rmtree( $file, !$quiet, !$force );
            }
        }
    }
}

# Main file-wiping function.
sub clean {
    my ( $path, $status ) = @_;

    # Use relative path for pretty-printing.
    if ( $path =~ s/^\Q$CWD\E\/?//o ) {

        # If the substitution succeeded, we should have a relative path. Make
        # sure we don't delete critical stuff.
        return if $path =~ /^\//;
    }

    # Find files needing to be removed.
    if (   $status->text_status == $SVN::Wc::Status::unversioned
        or $status->text_status == $SVN::Wc::Status::ignored
        or $status->text_status == $SVN::Wc::Status::deleted )
    {
        foreach my $ex (@exclude) {
            if ( $path =~ $ex ) {
                print "excluded $path\n" unless $quiet or $print;
                return;
            }
        }

        # Make sure the file exists before removing it. Do not remove deleted
        # directories as they are needed to remove the files they contain when
        # committing.
        lstat $path or stat $path;
        if (
            -e _
            and ( not -d _
                or $status->text_status != $SVN::Wc::Status::deleted )
          )
        {
            if ($print) {
                print "$path\n";
            }
            else {
                rmtree( $path, !$quiet, !$force );
            }
        }
    }
}

__END__

=head1 NAME

svn-clean - Wipes out unversioned files from Subversion working copy

=head1 SYNOPSIS

svn-clean [options] [directory or file ...]

=head1 DESCRIPTION

B<svn-clean> will scan the given files and directories recursively and find
unversioned files and directories (files and directories that are not present in
the Subversion repository). After the scan is done, these files and directories
will be deleted.

If no file or directory is given, B<svn-clean> defaults to the current directory
(".").

B<svn-clean> uses the SVN Perl modules if they are available. This is much
faster than parsing the output of the B<svn> command-line client.

=head1 OPTIONS

=over 8

=item B<-e>, B<--exclude>

A regular expression for filenames to be exluded. For example, the following
command will skip files ending in ".zip":

=over 8

svn-clean --exclude '\.zip$'

=back

Multiple exclude patterns can be specified. If at least one matches, then the
file is skipped. For example, the following command will skip files ending in
".jpg" or ".png":

=over 8

svn-clean --exclude '\.jpg$' --exclude '\.png$'

=back

The following command will skip the entire "build" subdirectory:

=over 8

svn-clean --exclude '^build(/|$)'

=back

=item B<-f>, B<--force>

Files to which you do not have delete access (if running under VMS) or write
access (if running under another OS) will not be deleted unless you use this
option.

=item B<-N>, B<--non-recursive>

Do not search recursively for unversioned files and directories. Unversioned
directories will still be deleted along with all their contents.

=item B<-q>, B<--quiet>

Do not print progress info. In particular, do not print a message each time a
file is examined, giving the name of the file, and indicating whether "rmdir" or
"unlink" is used to remove it, or that it's skipped.

=item B<-p>, B<--print>

Do not delete anything. Instead, print the name of every file and directory that
would have been deleted.

=item B<-?>, B<-h>, B<--help>

Prints a brief help message and exits.

=item B<--man>

Prints the manual page and exits.

=back

=head1 AUTHOR

Simon Perreault <nomis80@nomis80.org>

=cut
