diff --git a/changelog/index.php b/changelog/index.php
index c06397d..09628ed 100644
--- a/changelog/index.php
+++ b/changelog/index.php
@@ -68,7 +68,7 @@ protected function processPR($repoName, $pr)
{
$title = $this->cleanTitle($pr['title']);
$id = '#' . $pr['number'];
- if ($repoName !== 'server') {
+ if ($repoName !== self::REPO_SERVER) {
$id = $repoName . $id;
}
$data = [
@@ -163,7 +163,7 @@ protected function getReposToIterate($head = 'master')
// Return repos names
$orgRepositories = array_map(fn($repo): string => $repo['name'], $results);
} catch (\Exception $e) {
- throw new Exception('Unable to fetch the github repositories list.');
+ throw new Exception('Unable to fetch the github repositories list: ' . $e->getMessage());
}
return [...$reposToIterate, ...array_intersect($orgRepositories, $shippedApps)];
@@ -514,40 +514,48 @@ protected function execute(InputInterface $input, OutputInterface $output)
$output->writeln("");
$output->writeln("
Changes
");
$output->writeln("");
- foreach ($prTitles['closed'] as $id => $data) {
- $repoName = $data['repoName'];
- $number = $data['number'];
- $title = $data['title'];
- $output->writeln("\t- $title ($repoName#$number)
");
+ $closedPRs = $this->groupPRsByRepo($prTitles['closed']);
+ foreach ($closedPRs as $repo => $prs) {
+ $output->writeln("- $repo
");
+ foreach ($prs as $id => $data) {
+ $repoName = $data['repoName'];
+ $number = $data['number'];
+ $title = $data['title'];
+ $output->writeln("\t- $title ($repoName#$number)
");
+ }
+ $output->writeln("
");
}
$output->writeln("
");
- $count = count($prTitles['pending']);
- if ($count > 0) {
- $output->writeln("$count pending PRs not printed - maybe the release is not ready yet");
- }
break;
case 'forum':
- foreach ($prTitles['closed'] as $id => $data) {
- $repoName = $data['repoName'];
- $number = $data['number'];
- $title = $data['title'];
- $output->writeln("* [$title ($repoName#$number)](https://github.com/$orgName/$repoName/pull/$number)");
- }
- $count = count($prTitles['pending']);
- if ($count > 0) {
- $output->writeln("$count pending PRs not printed - maybe the release is not ready yet");
+ // Making it a second heading as the first one is the title of the post
+ $output->writeln("## Nextcloud " . $milestoneToCheck);
+ $closedPRs = $this->groupPRsByRepo($prTitles['closed']);
+ foreach ($closedPRs as $repo => $prs) {
+ $output->writeln("\n### [$repo](https://github.com/$orgName/$repo)");
+ foreach ($prs as $id => $data) {
+ $repoName = $data['repoName'];
+ $number = $data['number'];
+ $title = $this->escapeMarkdown($data['title']);
+ $output->writeln("* [$title ($repoName#$number)](https://github.com/$orgName/$repoName/pull/$number)");
+ }
}
break;
case 'markdown':
default:
- foreach ($prTitles['closed'] as $id => $data) {
- $repoName = $data['repoName'];
- $number = $data['number'];
- $title = $data['title'];
- if ($repoName === 'server') {
- $output->writeln("* #$number");
- } else {
- $output->writeln("* $orgName/$repoName#$number");
+ $output->writeln("## Nextcloud " . $milestoneToCheck);
+ $closedPRs = $this->groupPRsByRepo($prTitles['closed']);
+ foreach ($closedPRs as $repo => $prs) {
+ $output->writeln("\n### [$repo](https://github.com/$orgName/$repo)");
+ foreach ($prs as $id => $data) {
+ $repoName = $data['repoName'];
+ $number = $data['number'];
+ $title = $data['title'];
+ if ($repoName === self::REPO_SERVER) {
+ $output->writeln("* #$number");
+ } else {
+ $output->writeln("* $orgName/$repoName#$number");
+ }
}
}
@@ -592,7 +600,7 @@ function ($a, $b) {
$output->writeln("* $author");
$prevAuthor = $author;
}
- if ($repoName === 'server') {
+ if ($repoName === self::REPO_SERVER) {
$output->writeln(" * [ ] #$number");
} else {
$output->writeln(" * [ ] $orgName/$repoName#$number");
@@ -606,6 +614,32 @@ function ($a, $b) {
# TODO
#$client->removeCache();
}
+
+ function escapeMarkdown(string $text): string {
+ // Escape characters that break markdown
+ $escapeChars = ['*', '_', '~', '`', '[', ']', '(', ')', '#', '+', '-', '!', '|'];
+ foreach ($escapeChars as $char) {
+ $text = str_replace($char, '\\' . $char, $text);
+ }
+ return $text;
+ }
+
+ function groupPRsByRepo($prs) {
+ $grouped = [];
+ foreach ($prs as $pr) {
+ $repo = $pr['repoName'];
+ $grouped[$repo][] = $pr;
+ }
+ ksort($grouped);
+
+ // Put server on top
+ if (isset($grouped[self::REPO_SERVER])) {
+ $serverPRs = $grouped[self::REPO_SERVER];
+ unset($grouped[self::REPO_SERVER]);
+ $grouped = array_merge([self::REPO_SERVER => $serverPRs], $grouped);
+ }
+ return $grouped;
+ }
}
$application = new Application();