diff options
Diffstat (limited to 'dist-tools/makerelease.pl')
-rwxr-xr-x | dist-tools/makerelease.pl | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/dist-tools/makerelease.pl b/dist-tools/makerelease.pl new file mode 100755 index 00000000..9578eb52 --- /dev/null +++ b/dist-tools/makerelease.pl @@ -0,0 +1,159 @@ +#!/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); +$tmp = $ENV{TMPDIR} || $ENV{TMP} || $ENV{TEMP} || "/tmp"; + +die "This script ($0) needs to be updated for the Git-orious repo."; + +$project = "fetchmail"; +$svnrepos = "http://mknod.org/svn/$project"; +$website = "http://developer.berlios.de/projects/$project"; +$mailfrom = "<$project-devel-owner\@lists.berlios.de> (Fetchmail Development Team)"; + +die "Need GNU sort!" unless `sort --version | head -n1` =~ /GNU/; + +# 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\" | sort -t- -k1,1 -k2,2n -k3,3n |") || die "cannot run svn ls: $!\naborting"; +while (<ID>) { + 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 = '<workfile>'; + $oldtag = $versions[0]; +} + +$pwd = `pwd`; chomp $pwd; + +$ENV{PATH} .= ":$pwd/dist-tools:$pwd/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"); +} + +print "### Test-building the software...\n"; +if (system("mkdir -p autobuild && cd autobuild && ../configure -C --silent && make -s clean && make check distcheck")) { + die("Compilation failure\n"); +} + +# print "### Building the RPMs...\n"; +# if (system("cd autobuild && cp ../fetchmail.xpm . && buildrpms $project-${version}.tar.bz2 $null")) { +# die("RPM-build failure\n"); +# } + +open(REPORT, ">$tmp/$project.PREAMBLE.$$"); + +print REPORT <<EOF; +From: $mailfrom +Subject: The $version release of $project is available + +The $version release of $project is now available at the usual locations, +including <$website>. + +The source archive is available at: +<$website/$project-${version}.tar.gz> + +Here are the release notes: + +EOF + +# Extract the current notes +open(NEWS, "NEWS"); +while (<NEWS>) { + if (/^$project/) { + print REPORT $_; + last; + } +} +while (<NEWS>) { + 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 '<workfile>') { + 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 { + system("mv", "$tmp/$project.PREAMBLE.$$", "ANNOUNCE.EMAIL"); +} + +#unlink("$tmp/$project.PREAMBLE.$$"); +unlink("$tmp/$project.DIFFS.$$"); + +print "Done\n"; + +# makerelease ends here |