[rt18107] Extracted the pathmap functionality from integrity-checker.pl
authorLiam Whalen <liam.whalen@bc.libraries.coop>
Wed, 11 Dec 2013 23:56:00 +0000 (15:56 -0800)
committerLiam Whalen <liam.whalen@bc.libraries.coop>
Fri, 13 Dec 2013 17:57:08 +0000 (09:57 -0800)
We can use access_pathmap.pl to grab the list of all modules by calling
it with only the --config option and no --component option.  If you add
the --component option then the program will return the associated paths
for that component in the INI file specified by --config.  If you add
--srcpath it will retrieve the mapping for that srcpath.

access_pathmap.pl now has all the required functionality for
integrity-checker.pl to function.  There is one problem I have run into.
Some of the files in /srv/openils/var/web/xul/server are copied from
Open-ILS/xul/staff_client/chrome/content/ and the pathmap.ini does not
account for this, so they show up as untracked.  I will try and figure
out how to take this into consideration once I have access_pathmap.pl
working with the git-deploy.sh script.

Signed-off-by: Liam Whalen <liam.whalen@bc.libraries.coop>
deployment/access_pathmap.pl [new file with mode: 0755]
deployment/integrity-checker.pl

diff --git a/deployment/access_pathmap.pl b/deployment/access_pathmap.pl
new file mode 100755 (executable)
index 0000000..b2cfdae
--- /dev/null
@@ -0,0 +1,57 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use Config::Simple;
+use Getopt::Long;
+
+my ($help, $config_file, $component, $srcpath); 
+
+GetOptions(
+    'help'              => \$help,            # show help message and exit
+    'config=s'          => \$config_file,     # INI file for path mappings
+    'component=s'       => \$component,       # The component to grab the source paths for
+    'srcpath=s'         => \$srcpath          # The source path to grap the destination path for
+);
+
+if ($help) {
+    print <<"HELP";
+
+OPTIONS:
+    --help
+        Show help message and exit.
+    --config
+        Location of INI file for path mappings.
+    --component
+        The component of the INI file for which you want the paths
+    --srcpath
+        The source path to return the destination path for
+
+HELP
+    exit;
+}
+
+# load config
+die "No config file specified\n" unless ($config_file);
+die "Config file does not exist\n" unless (-r $config_file and -s $config_file);
+my $cfg = new Config::Simple($config_file);
+
+if (!$component) {
+    my @components = ();
+    #pull out components from INI file
+    open my $fh, '<', $config_file;
+    while (<$fh>) {
+        chomp;
+        if ($_ =~ /^\[[^]]+\]$/) {
+            $_ =~ s/[\[\]]//g;
+            push(@components, $_);
+        }
+    }
+    print "@components\n";
+} elsif (!$srcpath) {
+    foreach my $key (keys $cfg->get_block($component)) {
+        print $key . "\n";
+    }
+} else {
+    print $cfg->get_block($component)->{$srcpath};
+}
+
index 2aa21ea..e9b6e1b 100755 (executable)
@@ -1,4 +1,6 @@
 #!/usr/bin/perl
+use strict;
+use warnings;
 # On Ubuntu, you'll want the following packages:
 # - libconfig-simple-perl
 # - libgit-repository-perl
@@ -13,7 +15,7 @@ use Git::Repository::Command;
 use Getopt::Long;
 use Data::Dumper;
 
-my ($help, $config_file, $all, $print_hashes, $repo_path, $check_files);
+my ($help, $config_file, $repo_path, $all, $check_files, $hash_file, $since, $git_output, $deployed_output);
 my $branch = 'HEAD';
 my $remote = 'origin';
 my @components;
@@ -78,14 +80,7 @@ HELP
 }
 
 # specify all possible components (--all option);
-# it would be better to pull all block labels from the config file,
-# but that's not possible with Config::Simple
-@components = qw/perl tt2 web xul misc/ if ($all);
-
-# load config
-die "No config file specified\n" unless ($config_file);
-die "Config file does not exist\n" unless (-r $config_file and -s $config_file);
-my $cfg = new Config::Simple($config_file);
+@components = split(' ', `./access_pathmap.pl --config $config_file`) if ($all);
 
 if ($git_output) {
     open (GITOUTPUT, '>>', $git_output) or die "Could not open $git_output: $!\n";
@@ -107,7 +102,7 @@ if ($hash_file) {
 }
 
 foreach my $component (@components) {
-    my $paths = $cfg->get_block($component);
+    my @paths = split('\n', `./access_pathmap.pl --config $config_file --component $component`);
 
     # if no hash file was supplied, grab git hashes from repo
     if (!$hash_file) {
@@ -125,7 +120,7 @@ foreach my $component (@components) {
         }
 
         # get hashes from git
-        foreach my $srcpath (keys %$paths) {
+        foreach my $srcpath (@paths) {
             # use git-ls-tree to traverse the file tree starting at $srcpath
             # e.g. `git ls-tree -r HEAD Open-ILS/src/perlmods/lib`
             my @tree = $repo->run( 'ls-tree' => '-r', $branch, $srcpath );
@@ -139,16 +134,16 @@ foreach my $component (@components) {
 
     # check deployed files
     if ($check_files || $deployed_output) {
-        foreach my $srcpath (keys %$paths) {
-            my $destpath = $paths->{$srcpath};
-            my @files;
+        foreach my $srcpath (@paths) {
+            my $destpath = `./access_pathmap.pl --config $config_file --component $component --srcpath $srcpath`;
 
             # for each file in the destination path, push the file's absolute path to @files;
             # output will include symlinked files, but will not include directories
+            # clear @files for each time through loop
+            my @files = ();
             find( { wanted => sub { push @files, $_ if -f }, follow => 1, no_chdir => 1 }, $destpath );
 
             foreach my $file (@files) {
-
                 if ($since) {
                     # convert $since to seconds since epoch
                     my $since_ts = UnixDate($since, '%s');
@@ -173,7 +168,7 @@ foreach my $component (@components) {
                         print "modified\t$file\n";
                     }
                 }
-                print DEPLOYEDOUTPUT $hash, "\t", $filename, "\n" if ($deployed_output);
+                print DEPLOYEDOUTPUT $hash, "\t", $file, "\n" if ($deployed_output);
 
             }
         }