The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

use strict;
use warnings;
use Text::Wrap qw( wrap );

$Text::Wrap::unexpand = 0;    # tabs must die

my %section_headers = (
    Bug           => 'Bugfixes',
    Improvement   => 'Improvements',
    "New Feature" => 'New features',
    Task          => 'Tasks',
    'Sub-task'    => 'Tasks',
    Test          => 'Tests',
);

while (<>) {
    next unless /\S/;
    s/\s*$//;
    s/^\s*//;

    if (/^\s*Release Notes/) {
        # Start the entry with the release number.
        /(\d+\.\d+\.\d+)/ or die "Couldn't match version number in $_";
        my $version = $1;
        print "$1  XXXX-XX-XX\n";
    }
    elsif (/^\*\*\s*(.*)/) {
        # Start a new section.
        my $section_header = $section_headers{$1}
            or die "Unknown issue type: '$1'";
        print "\n";
        print "  $section_header:\n\n";
    }
    elsif (/\* (\[LUCY-\d+\] - )\s*(.*)/) {
        # Process an issue.
        my $issue_start   = "    * $1";
        my $title         = $2;
        my $indent_amount = length($issue_start);
        my $indent        = " " x $indent_amount;
        $Text::Wrap::columns = 78 - $indent_amount;
        $title = wrap( "", $indent, $title );
        print "$issue_start$title\n";
    }
    else {
        die "Unexpected line: $_";
    }
}

print "\n";

__END__

=head1 NAME

format_changes_entry.pl

=head1 SYNOPSIS

	cat jira_release_notes.txt | format_changes_entry.pl > changes_entry.txt

=head1 DESCRIPTION

JIRA can automatically generate a "Release Notes" in text format, but the
layout is less than ideal for the purposes of Lucy CHANGES entries and release
announcement emails.  This script makes the text more user-friendly by
wrapping long lines, collapsing whitespace and so on.

=cut