releasing/cbrtools/perl/DiffEnv
changeset 602 3145852acc89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/DiffEnv	Fri Jun 25 18:37:20 2010 +0800
@@ -0,0 +1,195 @@
+#!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 CommandController;
+use EnvDifferencer;
+
+
+#
+# Constants.
+#
+
+my $margin = 2;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'DiffEnv');
+my $comp1;
+my $ver1;
+my $comp2;
+my $ver2;
+my $doDateComparison = 0;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+DiffEnv();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'd' => \$doDateComparison, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp1 = shift @ARGV;
+  $ver1 = shift @ARGV;
+  $comp2 = shift @ARGV;
+  $ver2 = shift @ARGV;
+
+  unless (defined $comp1 and defined $ver1 and $#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+  if (defined $comp2) {
+    unless (defined $ver2) {
+      print "Error: Invalid number of arguments\n";
+      Usage(1);
+    }
+  }
+  if ($verbose && $doDateComparison) {
+    print "Warning: -v disables -d\n";
+    $doDateComparison = 0;
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: diffenv [options] <component_1> <version_1> [<component_2> <version_2>]
+
+options:
+
+-h  help
+-d  ignore differences when components in the first environment are younger than the second
+-v  verbose output\n");
+}
+
+sub DiffEnv {
+  my $env1Name;
+  my $env2Name;
+  my $envDifferencer = EnvDifferencer->New($iniData, $verbose);
+  if (defined $comp2 and $ver2) {
+    $envDifferencer->SetStartCompVer($comp1, $ver1);
+    $envDifferencer->SetEndCompVer($comp2, $ver2);
+    $env1Name = "$comp1 $ver1";
+    $env2Name = "$comp2 $ver2";
+  }
+  else {
+    $env1Name = "current";
+    $env2Name = "$comp1 $ver1";
+    $envDifferencer->SetEndCompVer($comp1, $ver1);
+    # no need to specify the other environment since the default
+    # is to use the current environment
+  }
+
+  my @tableData;
+  foreach my $comp (@{$envDifferencer->OnlyEnd()}) {
+    push @tableData, [ $comp, '-', $envDifferencer->EndVersion($comp) ];
+  }
+  foreach my $comp (@{$envDifferencer->OnlyStart()}) {
+    push @tableData, [ $comp, $envDifferencer->StartVersion($comp), '-'  ];
+  }
+  if ($verbose) {
+    foreach my $comp (@{$envDifferencer->UnchangedComps()}) {
+      my $ver = $envDifferencer->StartVersion($comp);
+      push @tableData, [ $comp, $ver, $ver  ];
+    }
+  }
+  if ($doDateComparison) {
+    foreach my $comp (@{$envDifferencer->NewerComps()}) {
+      push @tableData, [ $comp, $envDifferencer->StartVersion($comp), $envDifferencer->EndVersion($comp)  ];
+    }
+  } else {
+    foreach my $comp (@{$envDifferencer->ChangedComps()}) {
+      push @tableData, [ $comp, $envDifferencer->StartVersion($comp), $envDifferencer->EndVersion($comp)  ];
+    }
+  }
+
+  if (@tableData) {
+    my @sortedTableData = sort { $a->[0] cmp $b->[0] } @tableData;
+    unshift @sortedTableData, ['', $env1Name, $env2Name]; # Heading.
+    $iniData->TableFormatter->PrintTable(\@sortedTableData, 1);
+  }
+  else {
+    print "Environments identical\n";
+  }
+}
+
+__END__
+
+=head1 NAME
+
+DiffEnv - Compare the component versions of a pair of environments.
+
+=head1 SYNOPSIS
+
+  diffenv [options] <component_1> <version_1> [<component_2> <version_2>]
+
+options:
+
+  -h  help
+  -d  ignore differences when components in the first environment are younger than the second
+  -v  verbose output
+
+=head1 DESCRIPTION
+
+Displays a table of component version differences. If the second component / version pair is ommitted, the comparison is made against the current environment. If the C<-v> switch is specified, all versions will be displayed, even those that are identical. The results will be displayed in a table. The C<-d> option may be useful when newer version of a component are known to be backwards compatible with older versions.
+
+=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