mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-03 14:33:32 +03:00 
			
		
		
		
	
		
			
				
	
	
		
			373 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			373 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable File
		
	
	
	
	
#!/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);
 | 
						|
}
 |