gcc/libjava/classpath/scripts/patches.pl

165 lines
5.0 KiB
Perl
Executable File

#!/usr/bin/perl -w
# Purpose is to move patches from upload directory to
# public patches directory. Any file not matching the correct
# pattern is deleted. Any patch file without a README and the
# file was last modified more than 120 minutes ago is deleted.
# Any README file without a patch file which was last modified
# more than 120 minutes ago is deleted.
#
# notes to self: as long as this runs as root do not worry
# about quota problems or disk space
use strict;
my ($upload_dir) = "/home/ftp/classpath/incoming";
my ($public_dir) = "/home/ftp/classpath/pub/patches";
my ($user) = "classpath";
my ($group) = "classpath";
my ($mode_dir) = "775";
my ($mode_file) = "664";
my (@patches) = ();
use vars qw($upload_dir $public_dir @patches $user $group
$mode_dir $mode_file);
# main
{
@patches = &getPatches();
&movePatches(@patches);
}
#---------------------------------------------------------------
# Purpose: To remove files not matching the correct pattern.
# To remove README files without patches (last modified greater
# than 2 hours). To remove patches without README files (last
# modified greater than 2 hours).
#---------------------------------------------------------------
sub getPatches
{
my (@patches) = ();
my (@entries) = ();
my (%maybe) = ();
my ($entry, $debug, $prefix, $junk, $file, $patch, $readme) = "";
my ($dev, $ino, $mode, $nlink, $uid, $gid, $rdev, $size, $atime,
$mtime, $ctime, $blksize, $blocks) = "";
$debug = 1;
opendir(INCOMING, "$upload_dir") || die "could not open $upload_dir\n";
@entries = grep( !/^\.\S+/, readdir(INCOMING)); # no .*
closedir(INCOMING);
foreach $entry (sort @entries)
{
if (($entry eq ".") || ($entry eq "..")) { next; }
if (-d "$upload_dir/$entry")
{
print "Directory: $upload_dir/$entry/\n";
}
elsif (-e "$upload_dir/$entry")
{
if ($entry eq ".message") { next; }
if ($entry eq "README") { next; }
if ($entry !~ /^\w+-\d\d\d\d\d\d-\d+\.patch\.(gz|README)$/)
{
print "REGEX FAILED: $entry\n";
unlink("$upload_dir/$entry");
}
else
{
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,
$ctime,$blksize,$blocks) = stat("$upload_dir/$entry");
if ($size > 512000)
{
print "LARGE PATCH: $entry\n";
unlink("$upload_dir/$entry");
}
else
{
($prefix,$junk) = split(/(\.gz|\.README)/, $entry, 2);
$maybe{$prefix} += 1;
}
}
}
}
foreach $entry (keys(%maybe))
{
if ($maybe{$entry} == 2)
{
$patch = "$entry.gz";
$readme = "$entry.README";
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,
$ctime,$blksize,$blocks) = stat($patch);
if (time-$mtime > 900)
{
($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size,$atime,$mtime,
$ctime,$blksize,$blocks) = stat($readme);
if (time-$mtime > 900)
{
$patches[$#patches+1] = $entry;
}
}
}
else
{
if (-e "$upload_dir/$entry.gz")
{
unlink("$upload_dir/$entry.gz");
print "STALE PATCH: $entry.gz\n";
}
elsif (-e "$upload_dir/$entry.README")
{
unlink("$upload_dir/$entry.README");
print "STALE README: $entry.README\n";
}
}
}
return (@patches);
}
#---------------------------------------------------------------
# Purpose: To move the patches to the proper directory and set
# the permissions correctly.
#---------------------------------------------------------------
sub movePatches
{
my (@patches) = @_;
my ($patch) = "";
my ($fail) = 0;
if (!(-d "$public_dir"))
{
system("mkdir -p $public_dir");
system("chown $user.$group $public_dir");
system("chmod $mode_dir $public_dir");
}
foreach $patch (@patches)
{
if (-e "$public_dir/$patch.gz")
{
print "Patch exists: $public_dir/$patch.gz\n";
$fail = 1;
}
if (-e "$public_dir/$patch.README")
{
print "README exists: $public_dir/$patch.README\n";
$fail = 1;
}
if ($fail == 0)
{
system("mv $upload_dir/$patch.gz $public_dir/$patch.gz");
system("mv $upload_dir/$patch.README $public_dir/$patch.README");
system("chown $user.$group $public_dir/*");
system("chmod $mode_file $public_dir/*");
open(MAIL, "|mail -s \"Classpath: $patch uploaded\" core\@classpath.org") || die "could not open mail\n";
print MAIL "GNU Classpath FTP Maintenance\n";
print MAIL "\n";
print MAIL "Added Files:\n";
print MAIL "ftp://ftp.classpath.org/pub/patches/$patch.gz\n";
print MAIL "ftp://ftp.classpath.org/pub/patches/$patch.README\n\n";
close(MAIL);
}
}
}