#!/usr/bin/perl -wi # Untar a MySQL distribution, change the copyright texts, # pack it up again to a given directory $VER="1.5"; use Cwd; use File::Basename; use File::Copy; use Getopt::Long; $opt_help = 0; $opt_version = 0; $opt_verbose = 0; $opt_target = "mysql-copyright-target-"; $opt_target .= `date +%d%m%y-%H%M%S`; chop $opt_target; GetOptions("help","version","target=s", "verbose") || error(); # fix the directory prefix for target dir $WD= cwd(); my $win_flag = 0; $opt_target= $WD . '/' . $opt_target; &main(); #### #### main #### sub main { my $REG_BASENAME = '[a-z0-9A-Z\-\_\+]+'; my $REG_VERSION = '[0-9\.\-]+[a-z]?[0-9\.\-]+?(.alpha|.beta|.gamma|pre\d|[0-9\.\-a-z])?'; my $target; if ($opt_version) { print "$0 version $VER by Jani Tolonen\n"; exit(0); } usage() if ($opt_help); print error() if ($#ARGV == -1); `mkdir -p $opt_target`; $pec= $? >> 8; die "Couldn't make the target directory!\n" if ($pec); for ($i=0; $ARGV[$i]; $i++) { my $distfile= $ARGV[$i]; $win_flag = ($distfile =~ /win-src/) ? 1 : 0; my $dir; $dir= "mysql-copyright-"; $dir.= `date +%d%m%y-%H%M%S`; chop $dir; if (!(mkdir "$dir", 0700)) { die "Couldn't make directory $dir!"; } if (!(chdir "$dir")) { abort($dir, "Couldn't cd to $dir!"); } # if the distfile is mysql-3.22.22-alpha.tar.gz, then # distname is 'mysql-3.22.22-alpha' and suffix '.tar.gz' if ($distfile =~ m/^($REG_BASENAME)([\-\_])($REG_VERSION){1}([\.\-\+]\w+\-\w+)?[\.\-\+](.*)?$/xo) { $distname= $1.$2.$3; $suffix= $5; $fileext = $6; $newdistname= $1."com".$2.$3; $newdistname .= $suffix if $win_flag; } # find out the extract path (should be same as distname!) chomp($destdir= `tar ztf ../$distfile | head -1`); # remove slash from the end $destdir= substr($destdir, 0, -1); if ("$destdir" ne "$distname") { print "Destination directory (the directory that will be extracted\n"; print "from the original distribution file) differs from the\n"; print "distribution name! Are you sure you want to continue? (Y/N) [N]:"; $ans= my_read(1); abort($dir, "Aborted!") if ("$ans" ne "Y" && "$ans" ne "y"); } # everything should be ok, continue with extracting.. `tar xfz ../$distfile`; $pec= $? >> 8; abort($dir, "Extracting from tar failed!\n") if ($pec); # remove the 'PUBLIC' file from distribution and copy MySQLEULA.txt # on the toplevel of the directory instead. file 'PUBLIC' shouldn't # exist in the new mysql distributions, but let's be sure.. unlink("$destdir/PUBLIC", "$destdir/README"); unlink("$destdir/COPYING", "$destdir/EXCEPTIONS-CLIENT"); copy("$WD/Docs/MySQLEULA.txt", "$destdir"); # remove subdirectories 'bdb', 'cmd-line-utils/readline' my @extra_fat= ('bdb', 'cmd-line-utils/readline'); foreach my $fat (@extra_fat) { &trim_the_fat($fat); } # fix file copyrights &fix_usage_copyright(); &add_copyright(); # fix LICENSE tag in include/mysql_version.h &fix_mysql_version(); # apply "autotools" - must be last to ensure proper timestamps &run_autotools(); # rename the directory with new distribution name chdir("$WD/$dir"); print "renaming $destdir $newdistname\n" if $opt_verbose; rename($destdir, $newdistname); # tar the new distribution `tar cz -f $WD/$newdistname.tar.gz $newdistname`; $pec= $? >> 8; abort($dir, "Making new tar archive failed!\n") if ($pec); # remove temporary directory chdir($WD) or print "$! Unable to move up one dir\n"; my $cwd = getcwd(); print "current dir is $cwd\n" if $opt_verbose ; if (-e $dir) { print "Trying to delete $dir\n" if $opt_verbose; if ( system("rm -rf $dir")){ print "$! Unable to delete $dir!\n"; } } } exit(0); } #### #### This function will s/GPL/Commercial/ in include/mysql_version.h for the #### LICENSE tag. #### sub fix_mysql_version { my $cwd= getcwd(); chdir("$destdir"); my $header_file= (-f 'include/mysql_version.h.in')? 'include/mysql_version.h.in' : 'include/mysql_version.h'; open(MYSQL_VERSION,"<$header_file") or die "Unable to open $header_file for read: $!\n"; undef $/; my $mysql_version= <MYSQL_VERSION>; close(MYSQL_VERSION); $mysql_version=~ s/\#define LICENSE[\s\t]+GPL/#define LICENSE Commercial/; open(MYSQL_VERSION,">$header_file") or die "Unable to open $header_file for write: $!\n"; print MYSQL_VERSION $mysql_version; close(MYSQL_VERSION); chdir("$cwd"); } #### #### This function will remove unwanted parts of a src tree for the mysqlcom #### distributions. #### sub trim_the_fat { my $the_fat= shift; my $cwd= getcwd(); chdir("$destdir"); if ( -d "${the_fat}" ) { system("rm -rf ${the_fat}"); if (!$win_flag) { open(CONFIG_IN,"<configure.in") or die "Unable to open configure.in for read: $!\n"; undef $/; my $config_in= <CONFIG_IN>; close(CONFIG_IN); # # If $the_fat Makefile line closes the parenthesis, then # replace that line with just the closing parenthesis. # if ($config_in=~ m|${the_fat}/Makefile\)\n?|) { $config_in=~ s|${the_fat}/Makefile(\)\n?)|$1|; } # # Else just delete the line # else { $config_in=~ s|${the_fat}/Makefile dnl\n?||; } open(CONFIG_IN,">configure.in") or die "Unable to open configure.in for write: $!\n"; print CONFIG_IN $config_in; close(CONFIG_IN); } } chdir("$cwd"); } #### #### This function will run the autotools on the reduced source tree. #### sub run_autotools { my $cwd= getcwd(); if (!$win_flag) { chdir("$destdir"); unlink ("configure") or die "Can't delete $destdir/configure: $!\n"; # File "configure.in" has already been modified by "trim_the_fat()" # It must be ensured that the timestamps of the relevant files are really # ascending, for otherwise the Makefile may cause a re-run of these # autotools. Experience shows that deletion is the only safe way. unlink ("config.h.in") or die "Can't delete $destdir/config.h.in: $!\n"; unlink ("aclocal.m4") or die "Can't delete $destdir/aclocal.m4: $!\n"; # These sleep commands also ensure the ascending order. `aclocal && sleep 2 && autoheader && sleep 2 && automake && sleep 2 && autoconf`; die "'./configure' was not produced!" unless (-f "configure"); if (-d "autom4te.cache") { print "Trying to delete autom4te.cache dir\n" if $opt_verbose; system("rm -rf autom4te.cache") or print "Unable to delete autom4te.cache dir: $!\n"; } chdir("$cwd"); } } #### #### mysqld and MySQL client programs have a usage printed with --help. #### This usage includes a copyright, which needs to be modified #### sub fix_usage_copyright { my $findlist = `find . -type f -name \"*.c*\"`; my @files = split("\n", $findlist); my $cwd = getcwd(); foreach my $file (@files) { next if ! -f $file; print "processing file $file in cwd $cwd\n" if $opt_verbose; `replace "This is free software," "This is commercial software," "and you are welcome to modify and redistribute it under the GPL license" "please see the file MySQLEULA.txt for details" -- "$file"` ; } } #### #### change the copyright text in the beginning of the files #### sub add_copyright { my $findlist = `find . -type f -name "*"`; my @files = split("\n", $findlist); my $cwd = getcwd(); foreach my $file (@files) { next if ! -f $file; next if -B $file; print "processing file $file in cwd $cwd\n" if $opt_verbose; `$WD/Build-tools/mysql-copyright-2 "$file"`; } } #### #### read stdin #### sub my_read { ($length)= @_; # Max allowed length for the string. $input= getc(STDIN); if($input eq "\n") { return "\n"; } for($new_input= getc(STDIN); $new_input ne "\n" ;) { if(length($input) < $length) { $input.= $new_input; } $new_input= getc(STDIN); } return $input; } #### #### abort #### sub abort { my ($dir, $errstr)= @_; # remove newly made directory and it's contents print "$errstr\n"; chdir ".."; print "Removing directory $dir...\n"; `rm -rf $dir`; exit(0); } #### #### usage #### sub usage { print <<EOF; $0 version $VER by Jani Tolonen Description: The program takes one or more MySQL distributions as an argument(s), extracts them, changes the copyright text in the distribution files and makes a new distribution with suffix "com" in the basename to directory mysql-copyright-target-DATE, where the command was issued. For example: mysql-3.23.18-beta.tar.gz -> mysqlcom-3.23.18-beta.tar.gz. DATE is of form DDMMYY-HHMMSS. The target directory can be changed with option --target=... mysql-copyright consists of two perl programs, this one and another, mysql-copyright-2. Make sure the second part of the script is available to the main script. Usage: $0 [options] file1 [file2 file3...] Options: --help Show this help and exit. --target Target directory for new distribution files. '.' can be used for the current directory. (Default: $opt_target) EOF exit(0); } #### #### error #### sub error { if ($#ARGV == -1) { print "Too few arguments to $0!\n"; } exit(1); }