releasing/cbrtools/perl/MakeRel
changeset 602 3145852acc89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakeRel	Fri Jun 25 18:37:20 2010 +0800
@@ -0,0 +1,251 @@
+#!perl
+# Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of the License "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use MrpData;
+use MakeRel;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $fixLibs = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'MakeRel');
+my $envDb;
+my $makeRel;
+my $notesSrc;
+my $project;
+my $reallyrun;
+my @mrpData;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PrintHeinousWarning();
+MakeRel::MakeReleases($iniData, $envDb, \@mrpData, $notesSrc, 'MakeRel', $verbose, $project);
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  my $stdin;
+  GetOptions("h" => \$help, "v+" => \$verbose, "n=s" => \$notesSrc, "p" => \$stdin, "l" => \$fixLibs, "w=s" => \$project, "f" => \$reallyrun);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  # Create the MrpData objects. These will not write any files to disk, and so if any of
+  # them die, there is no need to perform any file system cleanup.
+  if ($#ARGV == -1 and $stdin) {
+    # Read input from STDIN.
+    MakeMrpData(\@mrpData, *STDIN);
+  }
+  elsif ($#ARGV == 0) {
+    # Read input from a file.
+    if (-f $ARGV[0]) {
+      open (IN, $ARGV[0]) or die "Error: Couldn't open $ARGV[0] for reading: $!\n";
+      MakeMrpData(\@mrpData, *IN);
+      close (IN);
+    }
+    else {
+      print "Error: $ARGV[0] is not a file\n";
+      Usage(1);
+    }
+  }
+  elsif ($#ARGV == 1) {
+    # Read input from a single set of command line arguments.
+    if ($iniData->RequireInternalVersions()) {
+      die "Error: Internal version number not specified\n";
+    }
+    else {
+      push (@mrpData, MrpData->New(shift @ARGV, shift @ARGV, '', $iniData, $verbose, $fixLibs));
+    }
+  }
+  elsif ($#ARGV == 2) {
+    # Read input from a single set of command line arguments.
+    push (@mrpData, MrpData->New(shift @ARGV, shift @ARGV, shift @ARGV, $iniData, $verbose, $fixLibs));
+  }
+  else {
+    print "Error: invalid number of arguments\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: makerel [options] [[<mrp_file> <version> [<internal_version>]] | [mrp_list_file]]
+
+options:
+
+-h                    help
+-v                    verbose output (-vv very verbose)
+-n <notes_src_file>   compile all release notes using a single source file
+-p                    read a piped mrp list from STDIN
+-l                    copy missing ARMI lib files from THUMB is possible
+-f                    force (no prompting)
+-w <project name>     make the release in this \"project\"
+
+Unsupported tool.\n");
+}
+
+sub PrintHeinousWarning {
+  Utils::QueryUnsupportedTool(<<GUILTY, $reallyrun);
+############################ WARNING ################################
+# Do not use MakeRel  under normal circumstances.   If you  wish to #
+# make a component release,   use the PrepRel and MakeEnv commands. #
+# ( PrepRel to specify the version numbers,  etc.,  then MakeEnv to #
+# actually make the release(s). )                                   #
+#####################################################################
+
+The problem with MakeRel is that it doesn't ensure your environment
+is clean before making the releases. Hence, component releases made
+using MakeRel are not subject to the normal guarantees, that ensure
+users of your release can precisely reproduce what you have on your
+development drive.
+
+Usually, releases made using MakeRel are unacceptable to licensee
+integration teams. Use with caution.
+
+GUILTY
+}
+
+sub MakeMrpData {
+  my $mrpData = shift;
+  local *IN = shift;
+  print "Gathering release info...\n";
+  my @failedReleases;
+  my @lines;
+  while (my $line = <IN>) {
+    # Remove line feed, white space and comments.
+    chomp $line;
+    $line =~ s/^\s*$//;
+    $line =~ s/#.*//;
+    if ($line eq '') {
+      # Nothing left.
+      next;
+    }
+    push @lines, $line;
+  }
+
+  # Reading in a separate loop due to Perl 5.8.0 defect # 21217, due to be fixed in 5.8.1.
+
+  my $lineNum = -1;
+  foreach my $line (@lines) {
+    $lineNum++;
+    eval {
+      (my $mrpName, my $extVer, my $intVer) = split (/\s+/, $line, 4);
+      unless (defined $mrpName and defined $extVer) {
+        die "Error: Invalid arguments at line $lineNum\n";
+      }
+      if (not defined $intVer) {
+        if ($iniData->RequireInternalVersions()) {
+          die "Error: Internal version number not specified\n";
+        }
+        else {
+          $intVer = '';
+        }
+      }
+      my $thisMrpData = MrpData->New($mrpName, $extVer, $intVer, $iniData, $verbose, $fixLibs);
+      push (@$mrpData, $thisMrpData);
+    };
+    if ($@) {
+      print $@;
+      push (@failedReleases, "$line - $@");
+    }
+  }
+
+  if ($#failedReleases >= 0) {
+    print "\nThere was an error making the following release(s):\n\n";
+    foreach my $rel (@failedReleases) {
+      print "$rel";
+    }
+    die "\n";
+  }
+}
+
+__END__
+
+=head1 NAME
+
+MakeRel - Make a single, or set of component releases.
+
+=head1 SYNOPSIS
+
+  makerel [options] [[<mrp_file> <version> [<internal_version>]] | [mrp_list_file]]
+
+options:
+
+  -h                    help
+  -v                    verbose output (-vv  very verbose)
+  -n <notes_src_file>   compile all release notes using a single source file
+  -p                    read a piped mrp list from STDIN
+  -l                    copy missing ARMI lib files from THUMB is possible
+  -f                    force (no prompting)
+  -w <project>          make the releases in this "project"
+
+=head1 DESCRIPTION
+
+C<MakeRel> is a tool that can generate one or more component releases. Where ever possible the tool C<MakeEnv> should be used instead of C<MakeRel> because this guarantees the ability to reproduce the entire environment from which a release was made, rather than just packaging up a particular set of source and binaries.
+
+See the document I<Making Releases> for more complete coverage of the process of making releases in general.
+
+=head1 STATUS
+
+Unsupported/experimental. If you find a problem, please send us a patch.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+ All rights reserved.
+ This component and the accompanying materials are made available
+ under the terms of the License "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut