koha-tmpl directory in the koha module. buildrelease also now uses an absolute path to find the buildrelease script for guessing the current version number.
403 lines
12 KiB
Perl
403 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 $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;
|
|
}
|
|
}
|
|
$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;
|
|
unless ($has_kohaautobuild_conf) {
|
|
$kohahtmldir=guess_kohahtmldir($kohadir, $kohahtmldir);
|
|
}
|
|
}
|
|
|
|
|
|
print "\nWhere is the 'koha-html' cvs module located [$kohahtmldir]: ";
|
|
chomp($input = <STDIN>);
|
|
if ($input) {
|
|
$kohahtmldir=$input;
|
|
}
|
|
|
|
open (C, ">$roothomedir/.kohaautobuild.conf");
|
|
print C qq|
|
|
kohadir=$kohadir
|
|
kohahtmldir=$kohahtmldir
|
|
|;
|
|
|
|
#----------------------------------------------------------
|
|
# 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 $kohadir/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
|
|
#----------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
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
|
|
# FIXME: "cp -a" is GNU-ism. It is not portable.
|
|
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
|
|
# FIXME: "cp -a" is GNU-ism. It is not portable.
|
|
system("cp -a $kohahtmldir/intranet-html/* $rootdir/intranet-html");
|
|
system("cp -a $kohahtmldir/opac-html/* $rootdir/opac-html");
|
|
|
|
# Copy koha-tmpl files
|
|
# FIXME: "cp -a" is GNU-ism. It is not portable.
|
|
system('cp', '-a', "$rootdir/intranet-cgi/koha-tmpl/opac-tmpl", "$rootdir/opac-html");
|
|
system('cp', '-a', "$rootdir/intranet-cgi/koha-tmpl/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");
|
|
|
|
|
|
# FIXME: Why do we copy from $roothomedir? What is supposed to be there?
|
|
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;
|
|
}
|
|
|