tagging: Allow using titles in for related stories.
[matthijs/upstream/blosxom-plugins.git] / scripts / globalise-config-variables
1 #!/usr/bin/perl
2
3 # Script to convert blosxom plugin config variables to globals, 
4 #   for setting via 'blosxom.conf' or 'config' or 'prefs'
5 #
6
7 use strict;
8 use Getopt::Std;
9 use IO::File;
10 use File::Copy;
11
12 my %opts = ();
13 getopts('nq', \%opts);
14 my $noop = $opts{n};
15 my $quiet = $opts{q};
16
17 my $dir = shift @ARGV || '*';
18 for my $pname ( glob $dir ) {
19   next unless -f $pname;
20   my $ph = IO::File->new( $pname, 'r' )
21     or warn "Cannot open plugin '$pname' for read: $!" and next;
22   my $plugin = '';
23   {
24     local $/ = undef;
25     $plugin = <$ph>;
26     close $ph;
27   }
28   next unless $plugin;
29   next unless $plugin =~ m/__END_CONFIG__/;
30   print "Updating $pname ...\n" unless $quiet;
31   unless ($noop) {
32     my ($pre, $post) = split m/__END_CONFIG__/, $plugin, 2;
33     my $modified = $pre;
34
35     # Globalise lexicals
36     my @lexicals = ();
37     while ($modified =~ m/^(\s*#\s*)?my\s+((\$\w+)\s*=)/m) {
38       push @lexicals, $3;
39       $modified =~ s/^(\s*#\s*)?my\s+((\$\w+)\s*=)/$1$2/m;
40     }
41     # Add a 'use vars' for lexicals if in strict mode
42     my %seen = ();
43     @lexicals = map { $seen{$_}++ ? () : $_ } @lexicals;
44     my $lexicals = join ' ', @lexicals;
45     $modified =~ s/^(use\s+strict\b[^\n]+\n)/$1use vars qw($lexicals);\n/m;
46
47     # Add unless defined fragments to all config variables
48     $modified =~ s/\G(.*?^#?\s*([\$\@%]\w+)\s*=[^;]+);/$1 unless defined $2;/msg;
49
50 #   print "modified:\n\n$modified\n\n";
51 #   next;
52     next if $modified eq $pre;
53
54     # Reconstitute and write out
55     $plugin = $modified . "__END_CONFIG__" . $post;
56     $ph = IO::File->new( "$pname.tmp", 'w' )
57       or die "Cannot open plugin '$pname.tmp' for write: $!";
58     print $ph $plugin 
59       or die "Cannot write to plugin '$pname.tmp': $!";
60     close $ph
61       or die "Cannot close plugin '$pname.tmp': $!";
62     move "$pname.tmp", $pname 
63       or die "Cannot move plugin '$pname.tmp' to '$pname': $!";
64   }
65 }
66 print "Done.\n" unless $quiet;
67