releasing/cbrtools/perl/EnvInfoTk
changeset 602 3145852acc89
equal deleted inserted replaced
600:6d08f4a05d93 602:3145852acc89
       
     1 #!perl
       
     2 # Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     3 # All rights reserved.
       
     4 # This component and the accompanying materials are made available
       
     5 # under the terms of the License "Eclipse Public License v1.0"
       
     6 # which accompanies this distribution, and is available
       
     7 # at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 # 
       
     9 # Initial Contributors:
       
    10 # Nokia Corporation - initial contribution.
       
    11 # 
       
    12 # Contributors:
       
    13 # 
       
    14 # Description:
       
    15 # 
       
    16 #
       
    17 
       
    18 use strict;
       
    19 use FindBin;
       
    20 use lib "$FindBin::Bin";
       
    21 use Tk; 
       
    22 use Tk::Table; 
       
    23 use Getopt::Long;
       
    24 use IniData;
       
    25 use EnvDb;
       
    26 
       
    27 
       
    28 #
       
    29 # Constants.
       
    30 #
       
    31 
       
    32 my $margin = 2;
       
    33 
       
    34 
       
    35 #
       
    36 # Globals.
       
    37 #
       
    38 
       
    39 my $verbose = 0;
       
    40 my $full = 0;
       
    41 my $component;
       
    42 my $iniData = IniData->New();
       
    43 my $envDb;
       
    44 my $overallStatus;
       
    45 my $displayClean = 0;
       
    46 my $displayDirty = 0;
       
    47 my $displayPendingRelease = 0;
       
    48 my $noScan = 0;
       
    49 
       
    50 
       
    51 #
       
    52 # Main.
       
    53 #
       
    54 
       
    55 ProcessCommandLine();
       
    56 CheckEnv();
       
    57 DisplayInfo();
       
    58 
       
    59 
       
    60 #
       
    61 # Subs.
       
    62 #
       
    63 
       
    64 sub ProcessCommandLine {
       
    65   Getopt::Long::Configure ("bundling");
       
    66   my $help;
       
    67   GetOptions("h" => \$help, "f" => \$full, "c" => \$displayClean, "d" => \$displayDirty, "p" => \$displayPendingRelease, "n" => \$noScan, "v+" => \$verbose);
       
    68   if ($help) {
       
    69     Usage(0);
       
    70   }
       
    71 
       
    72   if (not $full and ($displayClean or $displayDirty or $displayPendingRelease)) {
       
    73     print "Warning: Inappropriate option(s)\n";
       
    74   }
       
    75 
       
    76   if (not $displayClean and not $displayDirty and not $displayPendingRelease) {
       
    77     $displayClean = 1;
       
    78     $displayDirty = 1;
       
    79     $displayPendingRelease = 1;
       
    80   }
       
    81 
       
    82   $component = $ARGV[0];
       
    83   $envDb = EnvDb->Open($iniData, $verbose);
       
    84 }
       
    85 
       
    86 sub Usage {
       
    87   my $exitCode = shift;
       
    88 
       
    89   Utils::PrintDeathMessage($exitCode, "\nUsage: envinfo [options] [<component>]
       
    90 
       
    91 options:
       
    92 
       
    93 -h  help
       
    94 -v  verbose output (-vv very verbose)
       
    95 -f  display full information (the remaining switches only apply when this is used)
       
    96 -c  display the components with status \"clean\"
       
    97 -d  display the components with status \"dirty\"
       
    98 -p  display the components with status \"pending release\"
       
    99 -n  no scan");
       
   100 }
       
   101 
       
   102 sub CheckEnv {
       
   103   unless ($noScan or not $full) {
       
   104     if (defined $component) {
       
   105       $envDb->CheckComp($component);
       
   106     }
       
   107     else {
       
   108       ($overallStatus) = $envDb->CheckEnv();
       
   109     }
       
   110   }
       
   111 }
       
   112 
       
   113 sub DisplayInfo {
       
   114   # Create a list of the components to be displayed.
       
   115   my @comps;
       
   116   if (defined $component) {
       
   117     my $ver = $envDb->Version($component);
       
   118     unless (defined $ver) {
       
   119       die "Error: $component not found\n";
       
   120     }
       
   121     push @comps, $component;
       
   122   }
       
   123   else {
       
   124     my $versionInfo = $envDb->VersionInfo();
       
   125     foreach my $comp (sort keys %{$versionInfo}) {
       
   126       push @comps, $comp;
       
   127     }
       
   128   }
       
   129 
       
   130   my $tableData;
       
   131   if ($full) {
       
   132     $tableData = GenFullInfoTable(\@comps);
       
   133   }
       
   134   else {
       
   135     $tableData = GenMinimalInfoTable(\@comps);
       
   136   }
       
   137 
       
   138   # Only print the table if there's something in it.
       
   139   if (scalar(@$tableData) > 1) {
       
   140     print "\n";
       
   141     DisplayTable($tableData, 1);
       
   142   }
       
   143 
       
   144   # Only display the overall status if a full check was done.
       
   145   if (defined $overallStatus) {
       
   146     print "\nOverall status: ", EnvDb::StatusString($overallStatus), "\n";
       
   147   }
       
   148 }
       
   149 
       
   150 sub GenMinimalInfoTable {
       
   151   my $comps = shift;
       
   152 
       
   153   # Create a two dimentional array of the data to be printed.
       
   154   my $tableData = [["Component", "Version"]];
       
   155   my $row = 1;
       
   156   foreach my $comp (@$comps) {
       
   157     my $ver = $envDb->Version($comp);
       
   158     $tableData->[$row++] = [$comp, $ver];
       
   159   }
       
   160   return $tableData;
       
   161 }
       
   162 
       
   163 sub GenFullInfoTable {
       
   164   my $comps = shift;
       
   165 
       
   166   # Create a two dimentional array of the data to be printed.
       
   167   my $tableData = [["Component", "Version", "Internal version", "Status", "Mrp"]];
       
   168   my $row = 1;
       
   169   foreach my $comp (@$comps) {
       
   170     my $ver = $envDb->Version($comp);
       
   171     my $status = $envDb->Status($comp);
       
   172     if (not $displayClean and $status == EnvDb::STATUS_CLEAN) {
       
   173       next;
       
   174     }
       
   175     elsif (not $displayDirty and ($status == EnvDb::STATUS_DIRTY or $status == EnvDb::STATUS_DIRTY_SOURCE)) {
       
   176       next;
       
   177     }
       
   178     elsif (not $displayPendingRelease and $status == EnvDb::STATUS_PENDING_RELEASE) {
       
   179       next;
       
   180     }
       
   181 
       
   182     my $mrpName = $envDb->MrpName($comp);
       
   183     unless (defined $mrpName) {
       
   184       $mrpName = "-";
       
   185     }
       
   186     my $intVer = $envDb->InternalVersion($comp);
       
   187     unless (defined $intVer) {
       
   188       $intVer = "-";
       
   189     }
       
   190     $tableData->[$row++] = [$comp, $ver, $intVer, EnvDb::StatusString($status), $mrpName];
       
   191   }
       
   192   return $tableData;
       
   193 }
       
   194 
       
   195 sub DisplayTable {
       
   196   my $tableData = shift;
       
   197   my $numRows = scalar(@{$tableData});
       
   198   die unless $numRows and defined $tableData->[0]; # There must be at least one column and row.
       
   199   my $numCols = scalar(@{$tableData->[0]});
       
   200 
       
   201   my $mw = MainWindow->new();
       
   202   CreateGrid($mw, $tableData);
       
   203   MainLoop();
       
   204 }
       
   205 
       
   206 sub CreateGrid() {
       
   207   my $mw = shift;
       
   208   my $data = shift;
       
   209   my $numRows = scalar(@{$data});
       
   210   die unless $numRows and defined $data->[0]; # There must be at least one column and row.
       
   211   my $numCols = scalar(@{$data->[0]});
       
   212 
       
   213   foreach my $row (0 ... $numRows - 1) {
       
   214     my @row;
       
   215     foreach my $col (1 ... $numCols - 1) {
       
   216       $row[$col - 1] = $mw->Label(-text => $data->[$row][$col],
       
   217 				  -justify => 'left',
       
   218 				  -background => 'blue');
       
   219     }
       
   220     $mw->Label(-text => $data->[$row][0],
       
   221 	       -justify => 'left')->grid(@row,
       
   222 					 -sticky => 'nsew');
       
   223   }
       
   224 }
       
   225 
       
   226 =head1 NAME
       
   227 
       
   228 EnvInfoTk - Displays information about the installed components in the current environment.
       
   229 
       
   230 =head1 SYNOPSIS
       
   231 
       
   232   envinfo [options] [<component>]
       
   233 
       
   234 options:
       
   235 
       
   236   -h  help
       
   237   -v  verbose output (-vv very verbose)
       
   238   -f  display full information (the remaining switches only apply when this is used)
       
   239   -c  display the components with status "clean"
       
   240   -d  display the components with status "dirty"
       
   241   -p  display the components with status "pending release"
       
   242   -n  no scan
       
   243 
       
   244 =head1 DESCRIPTION
       
   245 
       
   246 By default displays a brief summary table of the information contained in the current drive's environment database. For example:
       
   247 
       
   248  Component   Version
       
   249 
       
   250  mycomp1     026
       
   251  mycomp2     057
       
   252 
       
   253 If envoked with the C<-f> switch a full table is displayed:
       
   254 
       
   255  Component   Version   Internal version                       Status   Mrp
       
   256 
       
   257  mycomp1     026       //myproject/latest/mycomp1/...@10106   clean    \mycomp1\mycomp1.mrp
       
   258  mycomp2     057       //myproject/latest/mycomp1/...@10157   clean    \mycomp2\mycomp2.mrp
       
   259 
       
   260  Overall status: clean
       
   261 
       
   262 The C<Component> and C<Version> fields are self explanatory. The C<Internal version> field is a label used by the site that owns the component, to store an internal reference (normally generated by their source control system). This is likely to be of use only to the owning site. The C<Status> field may have the following values:
       
   263 
       
   264 =over 4
       
   265 
       
   266 =item *
       
   267 
       
   268 B<clean> - The component's binaries all match the time stamp information that was stored when they were installed.
       
   269 
       
   270 =item *
       
   271 
       
   272 B<dirty> - One or more of the component's binaries doesn't match the time stamp information that was stored when they were installed. This may be because the source has been re-built but not changed (see the commands C<ValidateRel> and C<ValidateEnv> for details of how to check if a re-built set of binaries are identical to an already released set), or because changes have been made.
       
   273 
       
   274 =item *
       
   275 
       
   276 B<pending release> - The component is waiting to be released (see the commands C<PrepEnv> and C<MakeEnv> for details of how to make releases).
       
   277 
       
   278 =back
       
   279 
       
   280 The C<Mrp> field contains the name of the F<mrp> file that was used when the release was made. The overall status of the environment is displayed last. This may have the following values:
       
   281 
       
   282 =over 4
       
   283 
       
   284 =item *
       
   285 
       
   286 B<clean> - All the installed components have a status of C<clean> and there are no files in the F<\epoc32> tree that have unkown origins (i.e. they are all known to belong to a component).
       
   287 
       
   288 =item *
       
   289 
       
   290 B<dirty> - One or more of the installed components has a status of C<dirty>, or there is one or more files in the F<\epoc32> tree that has unknown origins.
       
   291 
       
   292 =item *
       
   293 
       
   294 B<pending release> - All components have a status of either C<clean> or C<pending release> and there are no files in the F<\epoc32> with unknown origins.
       
   295 
       
   296 =back
       
   297 
       
   298 
       
   299 By default C<EnvInfoTk> will perform a scan of the F<\epoc32> tree checking all the time stamps. To avoid this processing, use the C<-n> switch. This will cause the status of each component when the last scan was performed to be displayed (which may now be out of date). The output of C<EnvInfoTk> can be filtered according to status using the switches C<-c>, C<-d> and C<-p>. For example, if you wanted to view all the components that are either C<dirty> or C<pending release>, type:
       
   300 
       
   301   envinfo -dp
       
   302 
       
   303 If envoked with a C<component> argument, then only the details of the specified component will be displayed and a scan of the F<\epoc32> tree will not be performed.
       
   304 
       
   305 =head1 KNOWN BUGS
       
   306 
       
   307 None.
       
   308 
       
   309 =head1 COPYRIGHT
       
   310 
       
   311  Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
       
   312  All rights reserved.
       
   313  This component and the accompanying materials are made available
       
   314  under the terms of the License "Eclipse Public License v1.0"
       
   315  which accompanies this distribution, and is available
       
   316  at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
   317  
       
   318  Initial Contributors:
       
   319  Nokia Corporation - initial contribution.
       
   320  
       
   321  Contributors:
       
   322  
       
   323  Description:
       
   324  
       
   325 
       
   326 =cut