| 1 | #! /usr/bin/perl |
| 2 | |
| 3 | # |
| 4 | # This script recursively (beginning with the current directory) |
| 5 | # wipes out everything not registered in CVS. |
| 6 | # |
| 7 | # written by Oswald Buddenhagen <ossi@kde.org> |
| 8 | # inspired by the "old" cvs-clean target from Makefile.common |
| 9 | # |
| 10 | # This file is free software in terms of the BSD licence. That means |
| 11 | # that you can do anything with it except removing this license or |
| 12 | # the above copyright notice. There is NO WARRANTY of any kind. |
| 13 | # |
| 14 | |
| 15 | sub rmrf() |
| 16 | { |
| 17 | my $fn = shift; |
| 18 | lstat ($fn); |
| 19 | if (-d _) { |
| 20 | if (opendir (DIR, $fn)) { |
| 21 | for my $efn (grep (!/^\.\.?$/, readdir (DIR))) { |
| 22 | &rmrf ($fn."/".$efn); |
| 23 | } |
| 24 | closedir (DIR); |
| 25 | rmdir ($fn); |
| 26 | } |
| 27 | } else { |
| 28 | unlink ($fn); |
| 29 | } |
| 30 | } |
| 31 | |
| 32 | sub newfiles() |
| 33 | { |
| 34 | my ($indir, $incvs) = @_; |
| 35 | for my $n (keys (%$incvs)) { delete $$indir{$n} } |
| 36 | return sort (keys (%$indir)); |
| 37 | } |
| 38 | |
| 39 | sub cvsclean() |
| 40 | { |
| 41 | my $dir = shift; |
| 42 | my (%dirsdir, %filesdir, %dirscvs, %filescvs); |
| 43 | my $dnam = $dir ? $dir : "."; |
| 44 | if (!opendir (DIR, $dnam)) { |
| 45 | print STDERR "Cannot enter \"".$dnam."\".\n"; |
| 46 | return; |
| 47 | } |
| 48 | for my $fn (grep (!/^\.\.?$/, readdir (DIR))) { |
| 49 | if (-d $dir.$fn) { |
| 50 | $fn eq "CVS" or $dirsdir{$fn} = 1; |
| 51 | } else { |
| 52 | $filesdir{$fn} = 1; |
| 53 | } |
| 54 | } |
| 55 | closedir (DIR); |
| 56 | if (!open (FILE, "<".$dir."CVS/Entries")) { |
| 57 | print STDERR "No CVS information in \"".$dnam."\".\n"; |
| 58 | return; |
| 59 | } |
| 60 | while (<FILE>) { |
| 61 | m%^D/([^/]+)/.*$% and $dirscvs{$1} = 1; |
| 62 | m%^/([^/]+)/.*$% and $filescvs{$1} = 1; |
| 63 | } |
| 64 | close (FILE); |
| 65 | if (open (FILE, "<".$dir."CVS/Entries.Log")) { |
| 66 | while (<FILE>) { |
| 67 | m%^A D/([^/]+)/.*$% and $dirscvs{$1} = 1; |
| 68 | m%^A /([^/]+)/.*$% and $filescvs{$1} = 1; |
| 69 | m%^R D/([^/]+)/.*$% and delete $dirscvs{$1}; |
| 70 | m%^R /([^/]+)/.*$% and delete $filescvs{$1}; |
| 71 | } |
| 72 | close (FILE); |
| 73 | } |
| 74 | for my $fn (&newfiles (\%filesdir, \%filescvs)) { |
| 75 | print ("F ".$dir.$fn."\n"); |
| 76 | &rmrf ($dir.$fn); |
| 77 | } |
| 78 | for my $fn (&newfiles (\%dirsdir, \%dirscvs)) { |
| 79 | print ("D ".$dir.$fn."\n"); |
| 80 | &rmrf ($dir.$fn); |
| 81 | } |
| 82 | for my $fn (sort (keys (%dirscvs))) { |
| 83 | &cvsclean ($dir.$fn."/"); |
| 84 | } |
| 85 | } |
| 86 | |
| 87 | &cvsclean (""); |