Koha/misc/buildrelease

435 lines
12 KiB
Perl

#!/usr/bin/perl
sub guess_kohahtmldir ($;$);
#----------------------------------------------------------
# DIRECTORIES where source code is located
#----------------------------------------------------------
my $kohadir=`pwd`;
chomp $kohadir;
my $kohahtmldir=guess_kohahtmldir($kohadir, "/koha/koha/koha-html/");
my $kohatmpldir=guess_kohatmpldir($kohadir, "/koha/koha/koha-tmpl/");
my $roothomedir=(getpwuid(0))[7]; # ~root is traditionally just /
$roothomedir='/root' unless defined $roothomedir;
my $has_kohaautobuild_conf = 0;
if (-e "$roothomedir/.kohaautobuild.conf") {
open C, "<$roothomedir/.kohaautobuild.conf";
while (<C>) {
chomp;
if (/kohadir=(.*)/) {
$kohadir=$1;
}
if (/kohahtmldir=(.*)/) {
$kohahtmldir=$1;
}
if (/kohatmpldir=(.*)/) {
$kohatmpldir=$1;
}
}
$has_kohaautobuild_conf = 1;
}
my $input;
print qq |
***************************************
* Welcome to the Koha Release Builder *
***************************************
This script will automatically build a release tarball.
The script assumes that you already have the koha and koha-html modules checked
out for the release that you want to build, although it will update the modules
before building.
|;
print "\nWhere is the 'koha' cvs module located [$kohadir]: ";
chomp($input = <STDIN>);
if ($input) {
$kohadir=$input;
$kohahtmldir=guess_kohahtmldir($kohadir, $kohahtmldir) unless $has_kohaautobuild_conf;
}
print "\nWhere is the 'koha-html' cvs module located [$kohahtmldir]: ";
chomp($input = <STDIN>);
if ($input) {
$kohahtmldir=$input;
}
print "\nWhere is the 'koha-tmpl' cvs module located [$kohatmpldir]: ";
chomp($input = <STDIN>);
if ($input) {
$kohatmpldir=$input;
}
open (C, ">$roothomedir/.kohaautobuild.conf");
print C qq|
kohadir=$kohadir
kohahtmldir=$kohahtmldir
kohatmpldir=$kohatmpldir
|;
#----------------------------------------------------------
# which VERSION are we building ?
#----------------------------------------------------------
print "\n\nGuessing at next release version. You may need to enter your SourceForge password...\n";
open (CVSLOG, "cvs log misc/buildrelease|");
my $symbolicnamessection=0;
my $symbolicnames;
my $highestversion;
my $highestrc;
my $released;
my $majorversion;
my $majorversionrc;
while (<CVSLOG>) {
if (/^symbolic names:/) {
$symbolicnamessection=1;
}
if ($symbolicnamessection && (/^\s+([^:]*):/)) {
my $tag=$1;
if ($tag=~/R_(.*)/) {
my $version='';
my $rc=0;
my $id=$1;
$id=~s/-/\./g;
if ($id =~/(.*)RC(.*)/) {
$version=$1;
$rc=$2;
$version=~m#(\d+\.\d+)\.#;
if (versioncompare($version, $majorversion->{$1})) {
$majorversion->{$1}=$version;
$majorversionrc->{$1}=$rc;
}
if (versioncompare($version, $highestversion)) {
$highestversion=$version;
$released=0;
$highestrc=$rc;
}
} else {
$version=$id;
$version=~m#(\d+\.\d+)\.#;
if (versioncompare($version, $majorversion->{$1})) {
$majorversion->{$1}=$version;
$majorversionrc->{$1}=0;
}
if (versioncompare($version, $highestversion)) {
$highestversion=$version;
$released=1;
$highestrc=0;
}
}
$symbolicnames->{$version}->{$rc}=1;
}
}
}
my $releaseversion='';
my $currentversion='';
my $branchdata=`grep buildrelease CVS/Entries`;
chomp $branchdata;
my $branch=(split(m#/#, $branchdata))[5];
if ($branch eq 'Trel-1-2') {
$highestversion=$majorversion->{'1.2'};
$highestrc=$majorversionrc->{'1.2'};
($highestrc) ? ($released=0) : ($released=1);
}
if ($released) {
my @components=split(/\./, $highestversion);
$components[$#components]++;
$nexthighestversion=join '.', @components;
my $minornumber=(split(/\./, $highestversion))[1];
if ($minornumber/2 == int($minornumber/2)) {
$releaseversion=$nexthighestversion."RC1";
} else {
$releaseversion=$nexthighestversion;
}
$currentversion=$highestversion;
} else {
$releaseversion=$highestversion."RC".($highestrc+1);
$currentversion=$highestversion."RC$highestrc";
}
print "Current release tag is $currentversion.\n";
print "\nWould you like to bump that up to $releaseversion (or manually enter version)? [Y]/N: ";
chomp($input = <STDIN>);
my $tagging_needs_confirmation = 0;
if ($input =~ /^n/i) {
print "\nWould you like to rebuild the $currentversion tarball? Y/[N]: ";
chomp($input = <STDIN>);
print STDERR "releaseversion=($releaseversion), currentversion=($currentversion)\n";#XXXZZZ
if ($input =~ /^y/i) {
$releaseversion=$currentversion;
$tagging_needs_confirmation = 1;
} else {
print "What should the new version be? [$releaseversion]: ";
chomp ($input=<STDIN>);
if ($input) {
$releaseversion=$input;
}
}
} else {
print "What should the new version be? [$releaseversion]: ";
chomp ($input=<STDIN>);
if ($input) {
$releaseversion=$input;
}
}
print "\nWould you like to tag the CVS repository?\n(answer yes if releasing tarball) Y/[N]: ";
chomp ($input=<STDIN>);
my $cvstag=0;
# FIXME: This means anything other than n will tag; too dangerous?
if ($input=~/^y/i) {
$cvstag=1;
}
if ($cvstag && $tagging_needs_confirmation) {
print "\n\n";
print "Do not do this if you have released the tarball to anybody, as it will\n";
print "overwrite the tag marking the files that were in the tarball:\n\n";
print "Confirm that you want to overwrite the tag for $releaseversion? Y/[N]: ";
chomp($input = <STDIN>);
if ($input =~ /^n/i || $input !~ /\S/) {
print "\nStopping. Please re-run buildrelease now.\n";
exit;
}
}
my $sfuserid='';
if ($cvsroot=$ENV{'CVSROOT'}) {
$cvsroot=~m#(.*)\@cvs#;
$sfuserid=$1;
} else {
$ENV{'CVS_RSH'}='ssh';
print "\nWhat is your userid at SourceForge: ";
chomp($input = <STDIN>);
if ($input) {
$sfuserid=$input;
}
$ENV{'CVSROOT'}="$sfuserid\@cvs.koha.sourceforge.net:/cvsroot/koha";
}
my $tagname=$releaseversion;
$tagname=~s/\./-/g;
print qq|
Updating your checked-out copy of the 'koha' CVS files.
You may need to enter your SourceForge password.
Using $kohadir.
|;
chdir($kohadir) || die "$kohadir: $!\n";
system("cvs update");
if ($cvstag) {
print qq|
Tagging koha with tag R_$tagname
|;
system("cvs tag -F R_$tagname");
}
print qq|
Updating your checked-out copy of the 'koha-html' CVS files.
You may need to enter your SourceForge password.
Using $kohahtmldir.
|;
chdir($kohahtmldir) || die "$kohahtmldir: $!\n";
system("cvs update");
if ($cvstag) {
print qq|
Tagging koha-html with tag R_$tagname
|;
system("cvs tag -F R_$tagname");
}
#----------------------------------------------------------
# MOVE files to /tmp and build tar.gz
#----------------------------------------------------------
print qq|
Updating your checked-out copy of the 'koha-tmpl' CVS files.
You may need to enter your SourceForge password.
Using $kohatmpldir.
|;
chdir($kohatmpldir) || die "$kohatmpldir: $!\n";
system("cvs update");
if ($cvstag) {
print qq|
Tagging koha-tmpl with tag R_$tagname
|;
system("cvs tag -F R_$tagname");
}
my $rootdir="/tmp/koha-".$releaseversion;
system("rm -rf $rootdir");
mkdir ($rootdir, 0700);
chdir($rootdir) || die "$rootdir: $!\n";
mkdir("intranet-cgi", 0755);
mkdir("intranet-html", 0755);
mkdir("opac-cgi", 0755);
mkdir("opac-html", 0755);
mkdir("scripts", 0755);
mkdir("scripts/z3950daemon", 0755);
mkdir("modules", 0755);
mkdir("docs", 0755);
# Create koha.version file
open (KV, ">$rootdir/koha.version");
print KV "$releaseversion\n";
close KV;
# Copy all CVS files to intranet-cgi
system("cp -a $kohadir/* $rootdir/intranet-cgi");
# Move C4 to modules directory
system("mv $rootdir/intranet-cgi/C4 $rootdir/modules");
# Move files from intranet-cgi to root of tarball
system("mv $rootdir/intranet-cgi/misc/info/* $rootdir");
system("mv $rootdir/intranet-cgi/misc/installer.pl $rootdir");
system("mv $rootdir/intranet-cgi/misc/koha.upgrade $rootdir");
system("mv $rootdir/intranet-cgi/misc/Install.pm $rootdir");
#system("mv $rootdir/intranet-cgi/kohareporter $rootdir"); # does not exist ??
chmod 0770, "$rootdir/installer.pl";
chmod 0770, "$rootdir/koha.upgrade";
system("mv $rootdir/intranet-cgi/misc/koha.conf $rootdir");
system("mv $rootdir/intranet-cgi/misc/koha.mysql $rootdir");
system("mv $rootdir/intranet-cgi/misc/sampledata-1.2 $rootdir");
system("gzip -9 $rootdir/sampledata-1.2");
# Copy files from intranet-cgi to opac-cgi
system("cp $rootdir/intranet-cgi/detail.pl $rootdir/opac-cgi");
system("cp $rootdir/intranet-cgi/moredetail.pl $rootdir/opac-cgi");
system("cp $rootdir/intranet-cgi/search.pl $rootdir/opac-cgi");
system("cp $rootdir/intranet-cgi/subjectsearch.pl $rootdir/opac-cgi");
system("cp $rootdir/intranet-cgi/logout.pl $rootdir/opac-cgi");
system("mv $rootdir/intranet-cgi/opac/* $rootdir/opac-cgi");
system("rmdir $rootdir/intranet-cgi/opac");
# Move files from intranet-cgi to /scripts/ directory
system("mv $rootdir/intranet-cgi/telnet $rootdir/scripts");
system("mv $rootdir/intranet-cgi/tkperl $rootdir/scripts");
system("mv $rootdir/intranet-cgi/translator $rootdir/scripts");
system("mv $rootdir/intranet-cgi/updater $rootdir/scripts");
system("mv $rootdir/intranet-cgi/misc $rootdir/scripts");
system("mv $rootdir/intranet-cgi/marc $rootdir/scripts");
system("mv $rootdir/intranet-cgi/misc/bulkmarcimport.pl $rootdir/scripts/z3950daemon/");
system("mv $rootdir/intranet-cgi/z3950/* $rootdir/scripts/z3950daemon/");
# Remove extraneous files from intranet-cgi
system("rm -f $rootdir/intranet-cgi/ChangeLog.bak");
system("rm -f $rootdir/intranet-cgi/SendMessages");
system("rm -f $rootdir/intranet-cgi/buildrelease");
#system("rm -f $rootdir/intranet-cgi/database.mysql");
#system("rm -f $rootdir/intranet-cgi/installer-lite.pl");
# FIXME: The following two lines look suspicious
#system("rm -f $rootdir/intranet-cgi/koha-1.2.0.tar.gz");
#system("rm -f $rootdir/intranet-cgi/rel-1-2");
#system("rm -f $rootdir/intranet-cgi/testKoha.pl");
#system("rm -rf $rootdir/intranet-cgi/html-template");
system("rm -rf $rootdir/intranet-cgi/t");
# Set all .pl scripts executable
system("find $rootdir/intranet-cgi -name '*.pl' -exec chmod a+x \\{\\} \\;");
# Copy all CVS files to intranet-html and opac-html
system("cp -a $kohahtmldir/intranet-html/* $rootdir/intranet-html");
system("cp -a $kohahtmldir/opac-html/* $rootdir/opac-html");
# Copy koha-tmpl files
system('cp', '-a', "$kohatmpldir/opac-tmpl", "$rootdir/opac-html");
system('cp', '-a', "$kohatmpldir/intranet-tmpl", "$rootdir/intranet-html");
system('rm', '-rf', "$rootdir/intranet-cgi/koha-tmpl");
# Remove extraneous files from opac-html
system("rm -f $rootdir/opac-html/koha.mo");
system("rm -f $rootdir/opac-html/koha.pot");
system("rm -f $rootdir/opac-html/test");
# Remove extraneous files from intranet-html
system("rm -f $rootdir/intranet-html/koha.pot");
system("rm -f $rootdir/intranet-html/results.html");
system("rm -f $rootdir/intranet-html/test");
# Remove junk from directory
system("find $rootdir -name CVS -exec rm -rf \\{\\} \\; 2>/dev/null");
system("find $rootdir -name *~ -exec rm -rf \\{\\} \\; 2>/dev/null");
system("find $rootdir -name .#* -exec rm -rf \\{\\} \\; 2>/dev/null");
if (-e "$roothomedir/docs") {
print "Copying docs folder from $roothomedir/docs...";
system("cp -r $roothomedir/docs/* $rootdir/docs/");
} else {
print "I would have copied the docs from from $roothomedir/docs, but I couldn't find it.\n";
print "Press <ENTER> to continue...\n";
<STDIN>;
}
chdir("/tmp");
system("tar czf /tmp/koha-$releaseversion.tar.gz koha-".$releaseversion);
system("rm -rf $rootdir");
print qq|
============
= ALL DONE =
============
Your new tarball is located in /tmp/koha-$releaseversion.tar.gz
|;
sub versioncompare {
my $v1=shift;
my $v2=shift;
my @v1=split(/\./, $v1);
my @v2=split(/\./, $v2);
my $count=$#v1;
($#v2>$count) && ($count=$#v2);
for (my $index=0; $index<$count; $index++) {
if ($v1[$index]>$v2[$index]) {
return 1;
}
}
return 0;
}
sub guess_kohahtmldir ($;$) {
my($kohadir, $default) = @_;
my $kohahtmldir;
# It probably makes sense to assume that the 'koha' and 'koha-html'
# modules are checked out within the same parent directory
if (-d $kohadir && $kohadir =~ /^(.*)\/[^\/]+$/) {
$kohahtmldir = "$1/koha-html"
} else {
$kohahtmldir = $default;
}
return $kohahtmldir;
}
sub guess_kohatmpldir ($;$) {
my($kohadir, $default) = @_;
my $kohatmpldir;
# It probably makes sense to assume that the 'koha' and 'koha-tmpl'
# modules are checked out within the same parent directory
if (-d $kohadir && $kohadir =~ /^(.*)\/[^\/]+$/) {
$kohatmpldir = "$1/koha-tmpl"
} else {
$kohatmpldir = $default;
}
return $kohatmpldir;
}