#!/usr/bin/perl

use strict;
use warnings;

1 until <> =~ /(?:=-)+=/; # skip to the first block

my %entries;
my ($date, @files, @description, $state);
while (<>) {
    chomp;
    unless ($state) {
        $date = $_;
        $state = 1;
    } elsif ($state == 1) {
        if ($_) { # files are delimited by an empty line
            push @files, $_;
        } else {
            $state = 2;
        }
    } elsif ($state == 2) {
        if (/(?:=-)+=/ or /\A[a-f0-9]{32}\z/) {
            my $description = join "\n", @description;
            $description =~ s/\A\n+//s; # remove leading and trailing empty lines
            $description =~ s/\n+\z//s;

            my $entry = ($entries{$description} ||= {});
            push @{ $entry->{dates} }, $date;
            push @{ $entry->{files} }, @files;

            ($date, @files, @description, $state) = ();
        } else {
            push @description, $_;
        }
    }
}

foreach my $description (sort {$entries{$a}{dates}[0] cmp $entries{$b}{dates}[0]} keys %entries) {
    my $entry = $entries{$description};
    print join ("\n", @{ $entry->{dates} }, @{ $entry->{files} }), "\n\n", $description, "\n\n\n=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=\n";
}
