filebrowser/helpertools/snapshot_compare_dirs.pl
branchRCL_3
changeset 20 fad26422216a
parent 0 d6fe6244b863
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/filebrowser/helpertools/snapshot_compare_dirs.pl	Wed Sep 01 12:30:35 2010 +0100
@@ -0,0 +1,202 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "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 Getopt::Std;
+use Digest::MD5 qw( md5 );
+use File::Basename;
+use File::Copy;
+use File::Find;
+use File::Path;
+
+my @changed_files=();
+my $dir_1_length;
+my $dir_2_length;
+my $directory1;
+my $directory2;
+my %list1=();
+my %list2=();
+my %opts=();
+my $switch= 0;
+my $result_dir;
+
+###################################################
+##  usage()                                      ##
+##  Prints the usage                             ##
+###################################################
+sub usage
+{
+  print "\nUsage\n\tsnapshot_compare_dirs.pl -1 <original dir> -2 <updated dir>  -r <result dir>\n";
+  print "\nWhere\n\t-1  Original directory\n\t-2  Updated directory\n\t-r  Result directory\n";
+  exit;
+}
+
+###################################################
+##  get_param()                                  ##
+##  Gets command line parameters                 ##
+###################################################
+sub get_param
+{
+  getopts('h1:2:r:', \%opts);
+
+  if ( $opts{'h'} ) {
+    usage();
+  }
+
+  if ( $opts{'1'} ) {
+    $directory1 = $opts{'1'};
+    if ( ! -d $directory1 ) {
+      print "\nError:\t Directory \"$directory1\" doesn't exist\n";
+      exit;
+    }
+  } else {
+    usage();
+  }
+
+  if ( $opts{'2'} ) {
+    $directory2 = $opts{'2'};
+    if ( ! -d $directory2 ) {
+      print "\nError:\t Directory \"$directory2\" doesn't exist\n";
+      exit;
+    }
+  } else {
+    usage();
+  }
+
+  if ( $opts{'r'} ) {
+    $result_dir = $opts{'r'};
+    if ( ! -d $result_dir ) {
+        mkdir $result_dir;
+    }
+  } else {
+    usage();
+  }
+
+}
+
+###################################################
+##  calculate_hash()  Reads file content and     ##
+##                    calculates MD5 hash        ##
+###################################################
+sub calculate_hash
+{
+  my ( $file_name ) = @_;
+
+  open( FILE, $file_name ) or die "Error: Cannot open $file_name\n";
+  my @file_stat = stat FILE;
+  binmode( FILE );
+
+  my ( $buffer, $hash_value );
+  read( FILE, $buffer, $file_stat[7] );
+
+  close FILE;
+
+  $hash_value = md5( $buffer );
+
+  return $hash_value;
+}
+
+###################################################
+##  copy_file()                                  ##
+##  Copies files with same directory structure   ##
+###################################################
+sub copy_file
+{
+    my ( $file1, $file2 ) = @_;
+    my $dir_name = dirname( $file2 );
+
+    mkpath( $dir_name, 0, 0777 );
+
+    copy( $file1, $file2 );
+}
+
+###################################################
+##  process_files()                              ##
+##  Indexes files                                ##
+###################################################
+sub process_files
+{
+  my $file = $File::Find::name;
+
+  if ( -f $file ) {
+    if ($switch eq 0 ) {
+      $file = substr( $file, $dir_1_length );
+      $list1{$file} = 1;;
+    } else {
+      $file = substr( $file, $dir_2_length );
+      $list2{$file} = 1;
+    }
+  }
+}
+
+###################################################
+##  main()                                       ##
+##  Main function                                ##
+###################################################
+sub main
+{
+  get_param();
+
+  $dir_1_length = length( $directory1 );
+  $dir_2_length = length( $directory2 );
+
+  print "Info:\tProcessing files. This may take some time\n";
+
+  $switch = 0;
+  find( \&process_files, $directory1 );
+
+  $switch = 1;
+  find( \&process_files, $directory2 );
+
+  print "Info:\tFiles only exist in \"$directory2\" :\n\n";
+  my $counter = 0;
+  my $file;
+  my $key;
+  my $hash1;
+  my $hash2;
+
+  foreach $key ( sort keys %list2 ){
+    if ( $list1{$key} ne 1 ) {
+       $key =~ s/\//\\/g;
+       print "\t$key\n";
+       copy_file( "$directory2$key", "$result_dir$key" );
+       $counter++;
+    } else {
+       $hash1 = calculate_hash("$directory1$key");
+       $hash2 = calculate_hash("$directory2$key");
+       if ($hash1 ne $hash2) {
+         push @changed_files, $key;
+       }
+    }
+  }
+
+  print "\nInfo:\tTotal $counter new file(s)\n";
+
+  print "\nInfo:\tList of the changed file\n";
+
+  $counter = 0;
+
+  foreach $file ( @changed_files ){
+      $counter++;
+      print "\t$file\n";
+  }
+
+  print "\nInfo:\tTotal $counter file(s) changed\n";
+  print "Info:\tNote: Only new files are copied to $result_dir\n";
+}
+
+main();