#!/usr/bin/env perl # # Make a fetchmail release. # Dumps a release notice and diffs as a MIME multipart message # in RELEASE_NOTES # use POSIX qw(strftime); $timezone = strftime('%z', localtime) || "-0500"; $tmp = $ENV{TMPDIR} || $ENV{TMP} || $ENV{TEMP} || "/tmp"; $project = "fetchmail"; $svnrepos = "https://decoy.wox.org/svn/$project"; $website = "http://developer.berlios.de/projects/$project"; $mailfrom = "<$project-devel-owner\@lists.berlios.de> (Fetchmail Development Team)"; # parse options $diffs = 0; $verbose = 0; $null = ">/dev/null"; $errnull = "2>/dev/null"; while ($i = shift @ARGV) { if ($i =~ /^(--diffs|-d)$/i) { $diffs = 1; next; } if ($i =~ /^(--verbose|-v)$/i) { $verbose = 1; $null = ""; next; } die "Error: Unknown option: $i\n"; } # extract version from source $version=`grep 'AC_INIT' configure.ac`; $version =~ /AC_INIT\([^,]*,\[?([0-9.rc-]+)\]?\)/; $version = $1; die "cannot determine version" unless defined $1; $tag = "RELEASE_$version"; $tag =~ tr/./-/; # extract existing tags open(ID, "-|", "svn", "ls", $svnrepos . "/tags") || die "cannot run svn ls: $!\naborting"; while () { if (m{^(RELEASE_.*)/}) { unshift(@versions, $1); } } close ID || die "svn ls failed, aborting"; if ($versions[0] eq $tag) { $tag = $versions[0]; $oldtag = $versions[1]; } else { $tag = ''; $oldtag = $versions[0]; } $ENV{PATH} .= ":./dist-tools:./dist-tools/shipper:."; print "Building $version release, tag $tag, previous tag $oldtag\n"; if (-d autom4te.cache) { system("rm -rf autom4te.cache") and die "Failure in removing autom4te.cache"; } if (system("autoreconf -isv")) { die("Failure in regenerating autoconf files\n"); } if (system("./configure && make clean && make -C po update-po && make clean")) { die("Failure in translation-file rebuild\n"); } print "### Test-building the software...\n"; if (system("./configure && make clean && make distcheck")) { die("Compilation failure\n"); } print "### Building the distribution...\n"; if (system("make dist $null")) { die("Distribution-build failure\n"); } print "### Building the RPMs...\n"; if (system("buildrpms $project-${version}.tar.gz $null")) { die("RPM-build failure\n"); } open(REPORT, ">$tmp/$project.PREAMBLE.$$"); print REPORT <. The source archive is available at: Here are the release notes: EOF # Extract the current notes open(NEWS, "NEWS"); while () { if (/^$project/) { print REPORT $_; last; } } while () { if (/^$project/) { last; } print REPORT $_; } $oldver = $oldtag; $oldver =~ tr/-/./; $oldver =~ s/^RELEASE_//; if ($diffs) { print REPORT "Diffs from the previous ($oldver) release follow as a MIME attachment." } else { print REPORT "By popular demand, diffs from the previous release have been omitted." } close(NEWS); close(REPORT); if ($tag eq '') { system("svn diff -r$oldtag $errnull >$tmp/$project.DIFFS.$$"); } else { system("svn diff -r$oldtag -r$tag $errnull >$tmp/$project.DIFFS.$$"); } print "Diff size:"; system("wc <$tmp/$project.DIFFS.$$"); if ($diffs) { system "metasend -b" ." -D '$project-$tag announcement' -m 'text/plain' -e 7bit -f $tmp/$project.PREAMBLE.$$" ." -n -D 'diff between $oldver and $version' -m 'text/plain' -e 7bit -f $tmp/$project.DIFFS.$$" ." -o ANNOUNCE.EMAIL"; } else { rename("$tmp/$project.PREAMBLE.$$", "ANNOUNCE.EMAIL"); } #system("chown esr ANNOUNCE.EMAIL"); #chmod(0700, "ANNOUNCE.EMAIL"); #unlink("$tmp/$project.PREAMBLE.$$"); unlink("$tmp/$project.DIFFS.$$"); print "Building index page...\n"; system("rm -f index.html; indexgen.sh"); if (-r "testsites") { print "Building test server list...\n"; system("rm -f testservers.html; testservers-gen.sh >testservers.html"); } print "Making activity graph..."; system "growthplot"; print "Done\n"; # makerelease ends here