#!/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 = intval(array_pop($splitVersion)) === 0; // Output title output("# BookStack {$version}\n"); // Output header text and links if ($isFeature) { $urlVersion = implode('0', $splitVersion); output("- [Update instructions](https://www.bookstackapp.com/docs/admin/updates)"); output("- [Update details on blog](https://www.bookstackapp.com/blog/bookstack-release-{$urlVersion}/)"); output("\n### Full List of Changes\n"); } else { output("\nThis 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); }