#!/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 () { 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 = ); 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 = ); #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"; chdir $kohadir; open (CVSLOG, "cvs log misc/buildrelease|"); my $symbolicnamessection=0; my $symbolicnames; my $highestversion; my $highestrc; my $released; my $majorversion; my $majorversionrc; while () { 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 = ); my $tagging_needs_confirmation = 0; if ($input =~ /^n/i) { print "\nWould you like to rebuild the $currentversion tarball? Y/[N]: "; chomp($input = ); 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=); if ($input) { $releaseversion=$input; } } } else { print "What should the new version be? [$releaseversion]: "; chomp ($input=); if ($input) { $releaseversion=$input; } } print "\nWould you like to tag the CVS repository?\n(answer yes if releasing tarball) Y/[N]: "; chomp ($input=); 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 = ); 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 = ); 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 -P"); if ($cvstag) { print qq| Tagging koha 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/updater $rootdir/scripts"); system("mv $rootdir/intranet-cgi/misc $rootdir/scripts"); system("mv $rootdir/intranet-cgi/marc $rootdir/scripts"); # move only batch & daemon. pl script stay here system("mv $rootdir/intranet-cgi/z3950/processz3950queue $rootdir/scripts/z3950daemon/"); system("mv $rootdir/intranet-cgi/z3950/*.sh $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 -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"); #copy index files (they are just redirections to main.pl) system("cp $rootdir/intranet-cgi/koha-tmpl/opac.html $rootdir/opac-html/index.html"); system("cp $rootdir/intranet-cgi/koha-tmpl/intranet.html $rootdir/intranet-html/index.html"); system('rm', '-rf', "$rootdir/intranet-cgi/koha-tmpl"); # 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"); 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; #}