|
Packit |
fcad23 |
#!/usr/bin/perl
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
use strict;
|
|
Packit |
fcad23 |
use Text::Wrap;
|
|
Packit |
fcad23 |
my %output;
|
|
Packit |
fcad23 |
my $text;
|
|
Packit |
fcad23 |
my %stash;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
use Getopt::Long;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my %opts = (
|
|
Packit |
fcad23 |
c => 'CHANGES.new',
|
|
Packit |
fcad23 |
n => 'NEWS.new',
|
|
Packit |
fcad23 |
);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
LocalGetOptions(\%opts,
|
|
Packit |
fcad23 |
['s|start-regexp=s','A regexp to look for in files to start converting at'],
|
|
Packit |
fcad23 |
['e|end-regexp=s','A regexp to look for in files to end converting at'],
|
|
Packit |
fcad23 |
"",
|
|
Packit |
fcad23 |
['c|changes-file=s','A file to save CHANGES entries to'],
|
|
Packit |
fcad23 |
['n|news-file=s','A file to save NEWS entries to'],
|
|
Packit |
fcad23 |
['d|debug-line=s', 'Debugging output for lines matching STRING'],
|
|
Packit |
fcad23 |
"",
|
|
Packit |
fcad23 |
['GUI:otherargs_text','Input files to parse'],
|
|
Packit |
fcad23 |
);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
my $maybecontinue = 0;
|
|
Packit |
fcad23 |
my $lasttext = "";
|
|
Packit |
fcad23 |
my $lastfile;
|
|
Packit |
fcad23 |
my $lastcomponent;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
foreach my $argv (@ARGV) {
|
|
Packit |
fcad23 |
open(I, $argv);
|
|
Packit |
fcad23 |
if ($opts{'s'}) {
|
|
Packit |
fcad23 |
while () {
|
|
Packit |
fcad23 |
last if (/$opts{'s'}/o);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
while () {
|
|
Packit |
fcad23 |
my ($file, $component, $patbug, $nums, $text);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
last if ($opts{'e'} && /$opts{e}/o);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print STDERR "here: $_" if ($opts{'d'} && /$opts{'d'}/o);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# don't use this:
|
|
Packit |
fcad23 |
# FILE: BUGS: 123,456: text
|
|
Packit |
fcad23 |
($file, $patbug, $nums, $text) =
|
|
Packit |
fcad23 |
/(NEWS|CHANGES):\s*-*\s*\[*(BUG|PATCH)(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(.*)/;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print STDERR " 1:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# or this:
|
|
Packit |
fcad23 |
# FILE: component - text
|
|
Packit |
fcad23 |
($file, $component, $text) =
|
|
Packit |
fcad23 |
/(NEWS|CHANGES):\s*(\w+)\s*-+\s*(.*)/ if (!$file);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print STDERR " 2:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# what you should use:
|
|
Packit |
fcad23 |
# FILE: component: BUGS: 123,456: text
|
|
Packit |
fcad23 |
#
|
|
Packit |
fcad23 |
# or
|
|
Packit |
fcad23 |
# FILE: component: PATCH: 123,456: from someone text
|
|
Packit |
fcad23 |
# FILE: component: PATCH: 123,456: from "someone long" text
|
|
Packit |
fcad23 |
($file, $component, $patbug, $nums, $text) =
|
|
Packit |
fcad23 |
/(NEWS|CHANGES):\s*([^:]+):\s*-*\s*\[*(BUG|PATCH)(?:ES|S):*\s*([\d,\s*]*)\]*:*\s*-*\s*(?:from ["'][^"]+["']|from \w+|):*\s*(.*)/ if (!$file);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print STDERR " 3:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# or at least:
|
|
Packit |
fcad23 |
# FILE: component: text
|
|
Packit |
fcad23 |
($file, $component, $text) =
|
|
Packit |
fcad23 |
/(NEWS|CHANGES):\s*([^:]+):\s*-*\s*(.*)/ if (!$file);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print STDERR " 4:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# component left out
|
|
Packit |
fcad23 |
# FILE: [BUGS: 123,456]: text
|
|
Packit |
fcad23 |
($file, $patbug, $nums, $text) =
|
|
Packit |
fcad23 |
/(NEWS|CHANGES):\s*\[*(BUG|PATCH)*(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(.*)/ if (!$file);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
print STDERR " 5:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if ($opts{'d'} && /$opts{'d'}/o) {
|
|
Packit |
fcad23 |
my $bogus = 1; # breakable point
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
if (!$file && $maybecontinue) {
|
|
Packit |
fcad23 |
if (/^\s*(.+)$/) {
|
|
Packit |
fcad23 |
$text = $1;
|
|
Packit |
fcad23 |
$file = $lastfile;
|
|
Packit |
fcad23 |
$component = $lastcomponent;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# we're going to re-add these
|
|
Packit |
fcad23 |
pop @{$output{$opts{'c'}}{$component}};
|
|
Packit |
fcad23 |
pop @{$output{$opts{'n'}}{$component}} if ($file eq 'NEWS');
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
$maybecontinue = 0;
|
|
Packit |
fcad23 |
$lasttext = "";
|
|
Packit |
fcad23 |
next;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
} elsif (!$file) {
|
|
Packit |
fcad23 |
next;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
next if (exists($stash{$text}));
|
|
Packit |
fcad23 |
$stash{$text} = 1;
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
$component = "unspecified" if (!$component);
|
|
Packit |
fcad23 |
if ($patbug) {
|
|
Packit |
fcad23 |
$lasttext .= " [$patbug $nums]: $text";
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
$lasttext .= " $text";
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
$lasttext =~ s/^ //; # get rid of leading spaces
|
|
Packit |
fcad23 |
$lasttext =~ s/^([a-z])/uc($1)/e; # capitalize the first letter
|
|
Packit |
fcad23 |
$text = wrap(" - "," ","$lasttext") . "\n";
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#
|
|
Packit |
fcad23 |
# Assist with displaying categories in a sensible order
|
|
Packit |
fcad23 |
# snmplib first
|
|
Packit |
fcad23 |
# snmpd/snmp{apps}
|
|
Packit |
fcad23 |
# various other
|
|
Packit |
fcad23 |
# O/S specific (relies on upper case)
|
|
Packit |
fcad23 |
#
|
|
Packit |
fcad23 |
$component =~ s/^snmplib/00snmplib/;
|
|
Packit |
fcad23 |
$component =~ s/^snmp/0snmp/;
|
|
Packit |
fcad23 |
$component =~ s/^agent/0snmpd/; # Merge "agent" into "snmpd"
|
|
Packit |
fcad23 |
$component =~ s/^([A-Z])/zz\1/;
|
|
Packit |
fcad23 |
print STDERR " t:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
|
|
Packit |
fcad23 |
push @{$output{$opts{'c'}}{$component}}, $text;
|
|
Packit |
fcad23 |
push @{$output{$opts{'n'}}{$component}}, $text if ($file eq 'NEWS');
|
|
Packit |
fcad23 |
$lastfile = $file;
|
|
Packit |
fcad23 |
$lastcomponent = $component;
|
|
Packit |
fcad23 |
$maybecontinue = 1;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
# save the news and changes to appropriate files
|
|
Packit |
fcad23 |
foreach my $f ($opts{'c'}, $opts{'n'}) {
|
|
Packit |
fcad23 |
my $cat2;
|
|
Packit |
fcad23 |
open(O,">$f");
|
|
Packit |
fcad23 |
foreach my $cat (sort (keys(%{$output{$f}}))) {
|
|
Packit |
fcad23 |
($cat2 = $cat) =~ s/^00?|^zz//;
|
|
Packit |
fcad23 |
print O " $cat2:\n";
|
|
Packit |
fcad23 |
print O sort @{$output{$f}{$cat}};
|
|
Packit |
fcad23 |
print O "\n";
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
close(O);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
#######################################################################
|
|
Packit |
fcad23 |
# getopt long gui portability code
|
|
Packit |
fcad23 |
#
|
|
Packit |
fcad23 |
sub LocalGetOptions {
|
|
Packit |
fcad23 |
if (eval {require Getopt::GUI::Long;}) {
|
|
Packit |
fcad23 |
import Getopt::GUI::Long;
|
|
Packit |
fcad23 |
Getopt::GUI::Long::Configure(qw(display_help no_ignore_case));
|
|
Packit |
fcad23 |
return GetOptions(@_);
|
|
Packit |
fcad23 |
} else {
|
|
Packit |
fcad23 |
require Getopt::Long;
|
|
Packit |
fcad23 |
Getopt::Long::Configure(qw(auto_help no_ignore_case));
|
|
Packit |
fcad23 |
import Getopt::Long;
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
GetOptions(LocalOptionsMap(@_));
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
|
|
Packit |
fcad23 |
sub LocalOptionsMap {
|
|
Packit |
fcad23 |
my ($st, $cb, @opts) = ((ref($_[0]) eq 'HASH')
|
|
Packit |
fcad23 |
? (1, 1, $_[0]) : (0, 2));
|
|
Packit |
fcad23 |
for (my $i = $st; $i <= $#_; $i += $cb) {
|
|
Packit |
fcad23 |
if ($_[$i]) {
|
|
Packit |
fcad23 |
next if (ref($_[$i]) eq 'ARRAY' && $_[$i][0] =~ /^GUI:/);
|
|
Packit |
fcad23 |
push @opts, ((ref($_[$i]) eq 'ARRAY') ? $_[$i][0] : $_[$i]);
|
|
Packit |
fcad23 |
push @opts, $_[$i+1] if ($cb == 2);
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
}
|
|
Packit |
fcad23 |
return @opts;
|
|
Packit |
fcad23 |
}
|