Skip to content
Snippets Groups Projects
files2config 2.64 KiB
#! /usr/bin/env perl

use strict;
use warnings;

use Getopt::Std;
$Getopt::Std::STANDARD_HELP_VERSION = 1;

my %subst_map = (
    i => 'EXP_ID',
    a => 'ATMO_GRID_ID',
    o => 'OCEAN_GRID_ID',
    A => 'ATMO_GRID_TYPE',
    O => 'OCEAN_GRID_TYPE',
);

my $direct = 0;
my $xlog = '';
my %opts = ();
for my $var (keys %subst_map) {
    $opts{$var} = '';
}

getopts('dx'.join(':', keys(%subst_map), ''), \%opts) or die("\n");
exists $opts{d} and $direct = 1;
exists $opts{x} and $xlog = '\+';

my %file_info = ();

while(<>) {
    s/^\d{4,}-\d\d-\d\dT\d\d:\d\d:\d\d: //; # Remove log time stamps
    if(my ($mtd, undef, $src, $dst) =
       m{^$xlog\s*((cdo|cp|ln)\s.*)\s+(\S+)\s+(\S+)\s*$}) {
         #DEBUG# warn($_, join(':', $mtd, $src, $dst), "\n"); #DEBUG#
         # Clean source file name
         $src =~ s{/+$}{};
         $src =~ s{^\./+}{};
         # Clean destination file name
         $dst =~ s{/+$}{};
         $dst =~ s{^\./+}{};
         my $dir = $src;
         if($dir =~ m{/}) {
             $dir =~ s{^(.*)/.*$}{$1};
             $src =~ s{^.*/}{};
         }
         else {
             $dir = '.';
         }
         unless($dst && $dst ne '.') {
             $dst = $src
         }
         $direct and print($_, join(':', $mtd, $dir, $src, $dst), "\n");
         my $key = "$dir:$src:$dst";
         exists $file_info{$key} and die("duplicate key '$key'\n");
         $file_info{$key} = [$mtd, $dir, $src, $dst];
    }
}

sub subst_key($) {
    my $key = shift;
    for my $var (keys %subst_map) {
        if($opts{$var}) {
            $key =~ s/[._]$opts{$var}//;
        }
    }
    return $key;
}

sub subst_value($) {
    my $value = shift;