Blame dist/extractnews

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
}