releasing/cbrtools/perl/CleanEnv.pm
changeset 607 378360dbbdba
parent 602 3145852acc89
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CleanEnv.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,179 @@
+#!perl
+# Copyright (c) 2003-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:
+# 
+#
+
+package CleanEnv;
+
+use strict;
+
+#
+# Globals.
+#
+
+my $reallyClean = 0;
+my $force = 0;
+my $verbose = 0;
+
+
+#
+# Public.
+#
+
+sub CleanEnv {
+  my $iniData = shift;
+  $reallyClean = shift;
+  $force = shift;
+  $verbose = shift;
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  (my $overallStatus, undef, my $dirtyComps, my $unaccountedItems, my $duplicates) = $envDb->CheckEnv(1, $reallyClean, 1);
+
+  if ($overallStatus == EnvDb::STATUS_CLEAN) {
+    print "Environment already clean\n";
+    return 1;
+  }
+  else {
+    my $cleaned = 1;
+    if (scalar(@$unaccountedItems) > 0) {
+      if (not $force or $verbose) {
+        foreach my $line (@$unaccountedItems) {
+          print "$line has unknown origin\n"; 
+        }
+      }
+      if (Query("\nDelete above file(s)? [y/n] ")) {
+        foreach my $file (@$unaccountedItems) {
+          if ($verbose) { print "Deleting $file...\n"; }
+          unlink $file or print "Warning: Couldn't delete $file: $!\n" if (-f $file);
+          RemoveDirIfEmpty($file) if (-d $file);
+
+          (my $dir) = Utils::SplitFileName($file);
+          RemoveDirIfEmpty($dir) if (-d $dir);
+        }
+      }
+      else {
+        $cleaned = 0;
+      }
+    }
+    if (scalar(@$dirtyComps) > 0) {
+      print "\n";
+      if (not $force or $verbose) {
+        foreach my $comp (@$dirtyComps) {
+          print "$comp->{comp} $comp->{ver} is dirty\n";
+        }
+      }
+      if (Query("\nRe-install the above component(s)? [y/n] ")) {
+        foreach my $comp (@$dirtyComps) {
+          $envDb->RefreshComponent($comp->{comp});
+        }
+      }
+      else {
+        $cleaned = 0;
+      }
+    }
+    if (scalar(@$duplicates) > 0) {
+       print "\nThe following components are claiming the ownership of the same file:\n";
+
+       # Compile a hash of conflicting components indexed by file
+       my %duplicateFiles;
+       foreach my $dup (@$duplicates) {
+         # Each list item contains the filename, plus only two conflicting components.
+         my $file = shift @$dup;
+         $duplicateFiles{$file} = [] if !exists $duplicateFiles{$file};
+         foreach my $comp (@$dup) {
+           my $found = 0;
+           foreach my $existingComp (@{$duplicateFiles{$file}}) {
+             if ($existingComp eq $comp) {
+               $found = 1;
+               last;
+             }
+           }
+           push @{$duplicateFiles{$file}}, $comp if !$found;
+         }
+       }
+
+       foreach my $file (keys(%duplicateFiles)) {
+         print join(", ", sort(@{$duplicateFiles{$file}})).": $file\n";
+       }
+       print "\nCleanEnv cannot resolve these duplicates.  To fix this, please remove one or\nmore of the conflicting components\n";
+    }
+    return $cleaned;
+  }
+}
+
+
+#
+# Private.
+#
+
+sub RemoveDirIfEmpty {
+  my $dir = shift;
+  if (DirEmpty($dir)) {
+    rmdir $dir or print "Warning: Couldn't delete \"$dir\": $!\n";
+    $dir =~ s/\\$//; # Remove trailing backslash.
+    (my $parentDir) = Utils::SplitFileName($dir);
+    RemoveDirIfEmpty($parentDir);
+  }
+}
+
+sub DirEmpty {
+  my $dir = shift;
+  return (scalar @{Utils::ReadDir($dir)} == 0);
+}
+
+sub Query {
+  my $question = shift;
+  return 1 if $force;
+  print $question;
+  my $response = lc <STDIN>;
+  chomp $response;
+  return ($response eq 'y')?1:0;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+CleanEnv.pm - Provides an interface for cleaning environments.
+
+=head1 INTERFACE
+
+=head2 CleanEnv
+
+Expects to be passed an C<IniData> reference, a flag indicating if a 'really clean' should be done, a flag indiacting of no user interaction (force) should be done, and a verbosity level. Cleans the environment accordingly. Returns true if the environment was cleaned (i.e. the user replied 'y' to all questions), false otherwise.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ Copyright (c) 2003-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