diff g23m/system/busyb/tools/cmp_maks.pl @ 0:509db1a7b7b8

initial import: leo2moko-r1
author Space Falcon <falcon@ivan.Harhan.ORG>
date Mon, 01 Jun 2015 03:24:05 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m/system/busyb/tools/cmp_maks.pl	Mon Jun 01 03:24:05 2015 +0000
@@ -0,0 +1,298 @@
+#!perl -w
+
+# This script compares similar named control files (makefile, *.mak *.mk *.pl) in two directories. 
+#
+#
+# The script expects the utility diff to be in the path.
+#
+# The syntax of each line in the configuration file is the following (comments start with #)
+# <left_directory> <right_directory>
+#
+# Attention: file and directory names MUST NOT contain spaces or other white space
+use strict;
+
+use File::Glob ':glob';
+use File::Spec;
+
+# define global variables
+my $cnfFile=$ARGV[0];
+my $logFile="cmp_report.log";
+my $firstComment = 1;
+
+# find the config file
+@ARGV == 1 || die "Usage:\tcmp_maks.pl config_file\n";
+
+# check for diff.exe
+system("diff -v > cmp_report.log 2>&1") && die "ERROR: diff must be in the path \n";
+
+# open the config file
+#
+open (IN,"<$cnfFile")||die "Can't open $cnfFile !\n";
+
+# parse the config file
+#
+  my $line;
+
+  while(defined($line = <IN>))
+  {
+    # reset variable for next loop
+    my $leftDir;
+    my $rightDir;
+    my @files;
+    my @excludedFiles;
+    my @explicitFiles;
+
+    # ignore comments (starting with #)
+    if($line =~ /^\s*\#/) {
+      # print out special comments starting with ##
+      if ($' =~ /^\s*\#/) {
+        if ($firstComment == 1) {
+          print "\n";
+          $firstComment = 0;
+        }
+        print "[COMMENT]  $'";
+      }
+      else {
+        $firstComment = 1;
+      }
+      next;
+    }
+
+    # ignore empty lines
+    if($line =~ /^\s+$/) {
+      next;
+    }
+
+    # remove trailing \n
+    chomp($line);
+    
+    # put everything SEPARATED BY WHITESPACE in an array
+    @files = split(/\s+/,$line);
+
+    # find the directories (and remove them from the array)
+    $leftDir = $files[0]; shift(@files);
+    $rightDir = $files[0]; shift(@files);
+
+    # check whether the directories are wildcards
+#    if ($leftDir =~ s/(.*?)(\/\*)/$1/ && $rightDir =~ s/(.*?)(\/\*)/$1/ ) {
+    if ($leftDir =~ s:(.*?)([/\\]\*):$1: && $rightDir =~ s:(.*?)([/\\]\*):$1: ) {
+      my @dirs;
+      my @leftDirs;
+      my @rightDirs;
+
+      # check whether the parent directories exist
+      (-e $leftDir) || die "Directory $leftDir does not exist !\n";
+      (-e $rightDir) || die "Directory $rightDir does not exist !\n";
+
+      # find all sub directories left
+      @dirs = bsd_glob("$leftDir/*");
+      @dirs = sort @dirs;
+      foreach (@dirs) {
+        my ($drv,$dir);
+        ($drv,$dir,$_) = File::Spec->splitpath($_);
+        if (-d "$leftDir/$_") {
+          push (@leftDirs, "$_");
+        }
+      }
+
+      # reset variables
+      splice (@dirs);
+
+      # find all sub directories right
+      @dirs = bsd_glob("$rightDir/*");
+      @dirs = sort @dirs;
+      foreach (@dirs) {
+        my ($drv,$dir);
+        ($drv,$dir,$_) = File::Spec->splitpath($_);
+        if (-d "$rightDir/$_") {
+          push (@rightDirs, "$_");
+        }
+      }
+
+      # create a hash that uses the filename as the key and an integer as value
+      # to find those directories that are found in both directories or only in one
+      # of them
+      my %count;
+      my $element;
+
+      foreach $element (@leftDirs) { $count{$element}++; }
+      foreach $element (@rightDirs) { $count{$element}+=2; }
+  
+      # delete used arrays for later reuse
+      splice (@dirs);
+      splice (@leftDirs);
+      splice (@rightDirs);
+
+      foreach $element (keys %count) { 
+          if ($count{$element} == 1) {
+            push @leftDirs, $element;
+          }
+          elsif ($count{$element} == 2) {
+            push @rightDirs, $element;
+          }
+          elsif  ($count{$element} == 3) {
+            push @dirs, $element;
+          }
+      }
+      print "[LEFT   ]  $leftDir/*\n";
+      print "[RIGHT  ]  $rightDir/*\n";
+      foreach $element (sort(@leftDirs)) { 
+        print "[WARNING - directory missing right]     $element\n";
+      }
+      foreach $element (sort(@rightDirs)) { 
+        print "[WARNING - directory missing left]     $element\n";
+      }
+      print "\n";
+      foreach $element (sort(@dirs)) {
+        # ignore some commonly used version files
+        splice (@excludedFiles);
+#        push (@excludedFiles,"ver.obj");
+#        push (@excludedFiles,"$element\_version.obj");
+        cmp_dirs ("$leftDir/$element", "$rightDir/$element", \@excludedFiles, \@explicitFiles);
+      }
+
+    }
+    else {
+      # check whether the directories exist
+      (-e $leftDir) || die "Directory $leftDir does not exist !\n";
+      (-e $rightDir) || die "Directory $rightDir does not exist !\n";
+
+      if (defined($files[0])) {
+        # some files are are specified or excluded explicitely
+        foreach (@files) {
+          if (/^-/) {
+            push(@excludedFiles,$');
+          }
+          elsif(/^\+/) {
+            (-e "$leftDir/$'") || die "File $rightDir/$' does not exist !\n";
+            (-e "$rightDir/$'") || die "File $rightDir/$' does not exist !\n";
+            push(@explicitFiles,$');
+          }
+        }
+      }
+      cmp_dirs ($leftDir, $rightDir, \@excludedFiles, \@explicitFiles);
+    }
+ 
+  }
+
+
+# close the config file
+#
+close IN;
+
+# delete the log file
+#
+#unlink($logFile);
+
+###################
+#
+sub cmp_dirs {
+
+    my $leftDir = $_[0];
+    my $rightDir = $_[1];
+    my @excludedFiles = @{$_[2]};
+    my @explicitFiles = @{$_[3]};
+
+    my @files;
+    my @leftFiles;
+    my @rightFiles;
+    my $element;
+
+    if (defined($explicitFiles[0])) {
+      @files = @explicitFiles;
+    }
+    else {
+      @leftFiles = bsd_glob("$leftDir/*.mk");
+      push (@leftFiles, bsd_glob("$leftDir/*.mak"));
+      push (@leftFiles, bsd_glob("$leftDir/*makefile"));
+      push (@leftFiles, bsd_glob("$leftDir/*.pl"));
+
+      @leftFiles = sort @leftFiles;
+      foreach (@leftFiles) {
+        my ($drv,$dir);
+        ($drv,$dir,$_) = File::Spec->splitpath($_);
+      }
+  
+      @rightFiles = bsd_glob("$rightDir/*.mk");
+      push (@rightFiles, bsd_glob("$rightDir/*.mak"));
+      push (@rightFiles, bsd_glob("$rightDir/*makefile"));
+      push (@rightFiles, bsd_glob("$rightDir/*.pl"));
+      @rightFiles = sort @rightFiles;
+      foreach (@rightFiles) {
+        my ($drv,$dir);
+        ($drv,$dir,$_) = File::Spec->splitpath($_);
+      }
+  
+      # create a hash that uses the filename as the key and an integer as value
+      # to find those files that are found in both directories or only in one
+      # of them
+      my %count;
+
+      foreach $element (@leftFiles) { $count{$element}++; }
+      foreach $element (@rightFiles) { $count{$element}+=2; }
+  
+      # delete used arrays for later reuse
+      splice (@files);
+      splice (@leftFiles);
+      splice (@rightFiles);
+
+      # remove all exclude files
+      foreach $element (@excludedFiles) { 
+        if (exists($count{$element})) {
+#          print "Skipping file: $element \n";
+          delete($count{$element});
+        }
+      }
+
+      foreach $element (keys %count) { 
+          if ($count{$element} == 1) {
+            push @leftFiles, $element;
+          }
+          elsif ($count{$element} == 2) {
+            push @rightFiles, $element;
+          }
+          elsif  ($count{$element} == 3) {
+            push @files, $element;
+          }
+      }
+    }
+
+
+    print "[LEFT ]  $leftDir/\n";
+    print "[RIGHT]  $rightDir/\n";
+
+    if(defined($leftFiles[0]) || defined($rightFiles[0]) ) {
+      my %tmp;
+
+      foreach $element (@leftFiles)  { $tmp{$element} = "  [WARNING - file missing right]     $element\n" };
+      foreach $element (@rightFiles) { $tmp{$element} = "  [WARNING - file missing left ]     $element\n"; }
+
+      foreach $element (sort(keys %tmp)) { 
+        print $tmp{$element};
+      }
+    }
+
+
+    foreach (sort(@files)) {
+      if (system("cmp $leftDir/$_ $rightDir/$_ >>$logFile 2>&1")) {
+       print "  [ERROR   - files differ]     $_\n";
+       print "  [Diff'ing files]  $leftDir/$_  $rightDir/$_\n";
+ 
+       my $leftFile = "$leftDir/$_";
+       $leftFile =~ s:/:\\:g ;
+       my $rightFile = "$rightDir/$_";
+       $rightFile =~ s:/:\\:g ;
+
+       open(DIFFOUT, '-|', "diff -I ^#.*\$ -t -w -y --suppress-common-lines --width=120 $leftFile $rightFile");
+       #indent output
+       while (defined($line = <DIFFOUT>)) {
+         print "      $line";
+       }
+
+       close(DIFFOUT);
+       print " \n";
+
+      }
+    }
+   print "\n";
+}