diff -r b3cee849fa46 -r fad26422216a filebrowser/helpertools/snapshot_compare_dirs.pl --- /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 -2 -r \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();