c083e023b6
To avoid annoying merge conflicts. Perl script is provided for convenience and simple format checking in PRs.
90 lines
2.8 KiB
Perl
Executable File
90 lines
2.8 KiB
Perl
Executable File
#!/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 read_changefiles {
|
|
my $dirpath = shift;
|
|
opendir my $dir, $dirpath or die "Cannot open directory $dirpath: $!";
|
|
my @files = 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 ($filename =~ /^\d+/);
|
|
|
|
$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 $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 $url = '';
|
|
if ($print_urls) {
|
|
my $pr = find_pr($commit);
|
|
my $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;
|