#!/usr/bin/php $url, CURLOPT_RETURNTRANSFER => 1, CURLOPT_HTTPHEADER => [ 'User-Agent: ssddanbrown', ] ]); $data = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if (!empty($err)) error($err); return json_decode($data, true); } // Check a milestone is provided if (count($argv) < 2) { error("Milestone ID required"); } // Get milestone info from GitHub $milestoneID = intval($argv[1]); $issues = []; $requestIssues = []; $page = 1; $issueURL = 'https://api.github.com/repos/BookStackApp/BookStack/issues?milestone='. $milestoneID .'&state=all'; do { $requestIssues = getJSON($issueURL . '&page=' . $page); $issues = array_merge($issues, $requestIssues); $page++; } while (count($requestIssues) > 0); // Get BookStack version and check if a feature or minor release $milestone = $issues[0]['milestone']; $versionMatch = []; preg_match('/v[0-9.]{5,7}/', $milestone['title'], $versionMatch); $version = $versionMatch[0]; $splitVersion = explode('.', $version); $isFeature = count($splitVersion) === 2; // Output title output("# BookStack {$version}\n"); // Output header text and links output("### Links\n"); output("- [Update instructions](https://www.bookstackapp.com/docs/admin/updates)"); if ($isFeature) { $urlVersion = implode('-', $splitVersion); output("- [Update details on blog](https://www.bookstackapp.com/blog/bookstack-release-{$urlVersion}/)"); } output("\n### Full List of Changes\n"); output("This release contains the following fixes and changes:\n"); // Output issues foreach ($issues as $issue) { $output = '* '; $output .= trim($issue['title'], '.') . '.'; if (isset($issue['pull_request']) && $issue['user']['login'] !== 'ssddanbrown') { $output .= " Thanks to [@{$issue['user']['login']}]({$issue['html_url']})."; } $output .= " ([#{$issue['number']}]({$issue['html_url']}))"; output($output); }