summaryrefslogtreecommitdiff
path: root/local/Version-Munge.pl
diff options
context:
space:
mode:
Diffstat (limited to 'local/Version-Munge.pl')
-rwxr-xr-xlocal/Version-Munge.pl170
1 files changed, 170 insertions, 0 deletions
diff --git a/local/Version-Munge.pl b/local/Version-Munge.pl
new file mode 100755
index 0000000..7f6f29c
--- /dev/null
+++ b/local/Version-Munge.pl
@@ -0,0 +1,170 @@
+#!/usr/bin/perl
+
+use Getopt::Std;
+
+sub usage {
+ print "
+$0 [-v VERSION] -R -C -M -D -h
+
+ -M Modify the files with a new version (-v required)
+ -v VERSION Use VERSION as the version string
+ -T TAG Use TAG as SVN tag (must being with Ext-)
+ -C Commit changes to the files
+ -R Revert changes to the files
+ -D Compare files (svn diff)
+ -f FILE Just do a particular file
+ -t TYPE Just do a particular type of file
+ -P Print resulting modified lines
+ -V verbose
+";
+ exit 1;
+}
+
+getopts("Pv:T:RCMDhnf:t:V",\%opts) || usage();
+if ($opts{'h'}) { usage(); }
+
+if (!$opts{'v'} && $opts{'M'} && !$opts{'T'}) {
+ warn "no version (-v or -T) specified";
+ usage;
+}
+if (!$opts{'R'} && !$opts{'M'} && !$opts{'C'} && !$opts{'D'}) {
+ warn "nothing to do (need -R -C -D or -M)\n";
+ usage;
+}
+
+my @exprs = (
+ # documentation files
+ { type => 'docs',
+ expr => 'Version: [\.0-9a-zA-Z]+',
+ repl => 'Version: $VERSION',
+ files => [qw(README FAQ dist/net-snmp.spec)],
+ not_required => {'dist/net-snmp.spec' => 1}
+ },
+
+ # Makefiles
+ { type => 'Makefile',
+ expr => 'VERSION = [\.0-9a-zA-Z]+',
+ repl => 'VERSION = $VERSION',
+ files => [qw(dist/Makefile)],
+ not_required => {'dist/Makefile' => 1}
+ },
+
+ # perl files
+ { type => 'perl',
+ expr => 'VERSION = \'(.*)\'',
+ repl => 'VERSION = \'$VERSION_FLOAT\'',
+ files => [qw(perl/SNMP/SNMP.pm
+ perl/agent/agent.pm
+ perl/agent/Support/Support.pm
+ perl/agent/default_store/default_store.pm
+ perl/default_store/default_store.pm
+ perl/OID/OID.pm
+ perl/ASN/ASN.pm
+ perl/AnyData_SNMP/Storage.pm
+ perl/AnyData_SNMP/Format.pm
+ perl/TrapReceiver/TrapReceiver.pm
+ )],
+ not_required => {'perl/agent/Support/Support.pm' => 1}
+ },
+
+ # configure script files
+ { type => 'configure',
+ expr => 'AC_INIT\\(\\[Net-SNMP\\], \\[([^\\]]+)\\]',
+ repl => 'AC_INIT([Net-SNMP], [$VERSION]',
+ files => [qw(configure.ac)],
+ exec => 'autoconf',
+ exfiles => [qw(configure)],
+ },
+
+ );
+
+#
+# set up versioning information
+#
+if ($opts{'T'} && !$opts{'v'}) {
+ $opts{'v'} = $opts{'T'};
+ die "usage error: version tag must begin with Ext-" if ($opts{'T'} !~ /^Ext-/);
+ $opts{'v'} =~ s/^Ext-//;
+ $opts{'v'} =~ s/-/./g;
+}
+$VERSION = $opts{'v'};
+$VERSION_FLOAT = floatize_version($VERSION);
+
+
+#
+# loop through all the expression types
+#
+my @files;
+for ($i = 0; $i <= $#exprs; $i++) {
+
+ # drop other file types if only one was requested.
+ next if ($opts{'t'} && $exprs[$i]{'type'} ne $opts{'t'});
+
+ # loop through each file and process
+ foreach my $f (@{$exprs[$i]->{'files'}}) {
+
+ # skip files that weren't specifically in the todo list if need be
+ next if ($opts{'f'} && $f ne $opts{'f'});
+
+ # remove the changes and revert to SVN
+ if ($opts{'R'}) {
+ print "removing changes and updating $f\n" if ($opts{'V'});
+ system("svn revert $f");
+ }
+
+ # make sure it exists
+ if (! -f $f) {
+ if (!exists($exprs[$i]->{'not_required'}{$f})) {
+ print STDERR "FAILED to find file $f\n";
+ exit(1);
+ } else {
+ print STDERR "SKIPPING file $f\n";
+ next;
+ }
+ }
+
+ # modify the files with the version
+ if ($opts{'M'}) {
+ rename ($f,"$f.bak");
+ open(I,"$f.bak");
+ open(O,">$f");
+ while (<I>) {
+ my $res = eval "s/$exprs[$i]->{'expr'}/$exprs[$i]->{'repl'}/";
+ if ($res && $opts{'P'}) {
+ my $shortened = $_;
+ $shortened =~ s/^\s*//;
+ printf("%s:\n %s", $f, $shortened);
+ }
+ print O;
+ }
+ close(I);
+ close(O);
+ unlink("$f.bak");
+ push @files, $f;
+ print "modified $f using s/$exprs[$i]->{'expr'}/$exprs[$i]->{'repl'}/\n" if ($opts{'V'});
+ }
+
+ # run diff if requested.
+ if ($opts{'D'}) {
+ print "diffing $f\n" if ($opts{'V'});
+ system("svn diff $f");
+ }
+ }
+ system($exprs[$i]->{'exec'}) if ($exprs[$i]->{'exec'});
+ push @files, @{$exprs[$i]->{'exfiles'}} if ($exprs[$i]->{'exfiles'});
+}
+
+#
+# commit the modified files
+#
+if ($opts{'C'}) {
+ my $files = join(" ",@files);
+ print "committing $files\n" if ($opts{'V'});
+ $ret = system("svn commit -m \"- version tag ( $VERSION )\" $files");
+ exit($ret);
+}
+
+sub floatize_version {
+ my ($major, $minor, $patch, $opps) = ($_[0] =~ /^(\d+)\.(\d+)\.?(\d*)\.?(\d*)/);
+ return $major + $minor/100 + $patch/10000 + $opps/100000;
+}