Codebase list i3-gaps / master release-notes / generator.pl
master

Tree @master (Download .tar.gz)

generator.pl @masterraw · history · blame

#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
use Getopt::Long;

my @template = (
'
 ┌──────────────────────────────┐
 │ Release notes for i3 v4.21   │
 └──────────────────────────────┘

This is i3 v4.21. This version is considered stable. All users of i3 are
strongly encouraged to upgrade.


 ┌────────────────────────────┐
 │ Changes in i3 v4.21        │
 └────────────────────────────┘

',
'
 ┌────────────────────────────┐
 │ Bugfixes                   │
 └────────────────────────────┘

');

my $print_urls = 0;
my $result = GetOptions('print-urls' => \$print_urls);

sub get_number {
  my $s = shift;
  return $1 if $s =~ m/^(\d+)/;
  return -1;
}

sub read_changefiles {
    my $dirpath = shift;
    opendir my $dir, $dirpath or die "Cannot open directory $dirpath: $!";
    my @files = sort { get_number($a) <=> get_number($b) } readdir $dir;

    closedir $dir;

    my $s = '';
    for my $filename (@files) {
        next if $filename eq '.';
        next if $filename eq '..';
        next if $filename eq '0-example';

        die "Filename $filename should start with a number (e.g. the pull request number)" unless get_number($filename) > 0;

        $filename = $dirpath . '/' . $filename;
        open my $in, '<', $filename or die "can't open $filename: $!";
        my @lines = <$in>;
        close $in or die "can't close $filename: $!";

        my $content = trim(join("\n  ", map { trim($_) } @lines));
        die "$filename can't be empty" unless length($content) > 0;

        my $url = '';
        if ($print_urls) {
            my $commit = `git log --diff-filter=A --pretty=format:"%H" $filename`;
            $commit = trim($commit) if defined($commit);
            die "$filename: git log failed to find commit" if ($?) || (length($commit) == 0);

            my $pr = find_pr($commit);
            $url = 'https://github.com/i3/i3/commit/' . $commit;
            $url = 'https://github.com/i3/i3/pull/' . $pr if defined($pr);
            $url = $url . "\n";
        }

        $s = $s . '  • ' . $content . "\n" . $url;
    }
    return $s;
}

sub find_pr {
    my $hash = shift;
    my $result = `git log --merges --ancestry-path --oneline $hash..next | grep 'Merge pull request' | tail -n1`;
    return unless defined($result);

    return unless ($result =~ /Merge pull request .([0-9]+)/);
    return $1;
}

sub trim {
    (my $s = $_[0]) =~ s/^\s+|\s+$//g;
    return $s;
}

# Expected to run for i3's git root
my $changes = read_changefiles('release-notes/changes');
my $bugfixes = read_changefiles('release-notes/bugfixes');

print $template[0] . $changes . $template[1] . $bugfixes;