-
Notifications
You must be signed in to change notification settings - Fork 235
/
Copy pathupdate-scripts-yaml.pl
91 lines (86 loc) · 2.5 KB
/
update-scripts-yaml.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
use strict; use warnings;
use YAML::Tiny 1.59;
my $config = YAML::Tiny::LoadFile('_testing/config.yml');
my @yaml_keys;
if ($config) {
@yaml_keys = @{ $config->{scripts_yaml_keys}//[] };
}
die "no keys defined in config.yaml\n" unless @yaml_keys;
my @docs;
{ open my $ef, '<:utf8', '_data/scripts.yaml' or die $!;
@docs = Load(do { local $/; <$ef> });
}
my %oldmeta;
for (@{$docs[0]//[]}) {
$oldmeta{$_->{filename}} = $_;
}
my %newmeta;
for my $file (<scripts/*.pl scripts/*.py>) {
my ($filename, $base, $ext) =
$file =~ m,^scripts/((.*)\.(pl|py))$,;
my $info_file = "Test/$base/info.yml";
my @cdoc;
if (-f $info_file && open my $ef, '<:utf8', $info_file) {
local $@;
@cdoc = eval { Load(do { local $/; <$ef> }); };
if ($@) {
print "ERROR $base: $@\n";
@cdoc=();
}
}
if (@cdoc) {
$newmeta{$filename} = $cdoc[0][0];
for my $copykey (qw(modified version)) {
unless (defined $newmeta{$filename}{$copykey}) {
$newmeta{$filename}{$copykey}
= $oldmeta{$filename}{$copykey}
if defined $oldmeta{$filename}{$copykey};
}
}
$newmeta{$filename}{filename} = $filename;
my $modules = delete $newmeta{$filename}{modules};
$newmeta{$filename}{modules}
= join ' ', @$modules
if 'ARRAY' eq ref $modules;
my $commands = delete $newmeta{$filename}{commands};
my @commands = grep { !/ / } @$commands
if 'ARRAY' eq ref $commands;
$newmeta{$filename}{commands} = "@commands"
if @commands;
}
elsif (exists $oldmeta{$filename}) {
print "META-INF FOR $base NOT FOUND\n";
system "ls 'Test/$base/'*";
$newmeta{$filename} = $oldmeta{$filename};
}
else {
print "MISSING META FOR $base\n";
}
}
my @newdoc = map {
my $v = $newmeta{$_};
+{
map {
exists $v->{$_}
? ($_ => $v->{$_})
: ()
} sort @yaml_keys
}
} sort keys %newmeta;
YAML::Tiny::DumpFile('_data/scripts.yaml', \@newdoc);
if ($config && @{$config->{whitelist}//[]}) {
my $changed;
my @wl;
for my $sf (@{$config->{whitelist}}) {
if (-s "Test/$sf:passed") {
$changed = 1;
}
else {
push @wl, $sf;
}
}
if ($changed) {
$config->{whitelist} = \@wl;
YAML::Tiny::DumpFile('_testing/config.yml', $config);
}
}