diff --git a/package.json b/package.json index c5136cf5e02..6b5a018e46b 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "gui:releasePrepare": "ts-node --project ./scripts/cli/tsconfig.json ./scripts/cli/index.ts gui:release", "gui:publish": "cd packages/grafana-ui/dist && npm publish --access public", "gui:release": "ts-node --project ./scripts/cli/tsconfig.json ./scripts/cli/index.ts gui:release -p", - "cli:help": "ts-node --project ./scripts/cli/tsconfig.json ./scripts/cli/index.ts --help" + "cli": "ts-node --project ./scripts/cli/tsconfig.json ./scripts/cli/index.ts" }, "husky": { "hooks": { diff --git a/scripts/cli/index.ts b/scripts/cli/index.ts index 559f7295ad0..ced56e1eacd 100644 --- a/scripts/cli/index.ts +++ b/scripts/cli/index.ts @@ -4,6 +4,8 @@ import chalk from 'chalk'; import { startTask } from './tasks/core.start'; import { buildTask } from './tasks/grafanaui.build'; import { releaseTask } from './tasks/grafanaui.release'; +import { changelogTask } from './tasks/changelog'; +import { cherryPickTask } from './tasks/cherrypick'; program.option('-d, --depreciate ', 'Inform about npm script deprecation', v => v.split(',')); @@ -38,6 +40,28 @@ program }); }); +program + .command('changelog') + .option('-m, --milestone ', 'Specify milestone') + .description('Builds changelog markdown') + .action(async cmd => { + if (!cmd.milestone) { + console.log('Please specify milestone, example: --m 6.0.1'); + return; + } + + await execTask(changelogTask)({ + milestone: cmd.milestone, + }); + }); + +program + .command('cherrypick') + .description('Helps find commits to cherry pick') + .action(async cmd => { + await execTask(cherryPickTask)({}); + }); + program.parse(process.argv); if (program.depreciate && program.depreciate.length === 2) { diff --git a/scripts/cli/tasks/changelog.ts b/scripts/cli/tasks/changelog.ts new file mode 100644 index 00000000000..fc56c60531c --- /dev/null +++ b/scripts/cli/tasks/changelog.ts @@ -0,0 +1,49 @@ +import { Task, TaskRunner } from './task'; +import axios from 'axios'; + +const githubGrafanaUrl = 'https://github.com/grafana/grafana'; + +interface ChangelogOptions { + milestone: string; +} + +const changelogTaskRunner: TaskRunner = async ({ milestone }) => { + let client = axios.create({ + baseURL: 'https://api.github.com/repos/grafana/grafana', + timeout: 10000, + }); + + const res = await client.get('/issues', { + params: { + state: 'closed', + labels: 'add to changelog', + }, + }); + + let markdown = ''; + + for (const item of res.data) { + if (!item.milestone) { + console.log('Item missing milestone', item.number); + continue; + } + + // For some reason I could not get the github api to filter on milestone and label + // So doing this filter here + if (item.milestone.title !== milestone) { + continue; + } + + markdown += '* ' + item.title + '.'; + markdown += ` [#${item.number}](${githubGrafanaUrl}/pull/${item.number})`; + markdown += `, [@${item.user.login}](${item.user.html_url})`; + + markdown += '\n'; + } + + console.log(markdown); +}; + +export const changelogTask = new Task(); +changelogTask.setName('Changelog generator task'); +changelogTask.setRunner(changelogTaskRunner); diff --git a/scripts/cli/tasks/cherrypick.ts b/scripts/cli/tasks/cherrypick.ts new file mode 100644 index 00000000000..73dfc5379d5 --- /dev/null +++ b/scripts/cli/tasks/cherrypick.ts @@ -0,0 +1,42 @@ +import { Task, TaskRunner } from './task'; +import axios from 'axios'; + +interface CherryPickOptions {} + +const cherryPickRunner: TaskRunner = async () => { + let client = axios.create({ + baseURL: 'https://api.github.com/repos/grafana/grafana', + timeout: 10000, + }); + + const res = await client.get('/issues', { + params: { + state: 'closed', + labels: 'cherry-pick needed', + }, + }); + + // sort by closed date + res.data.sort(function(a, b) { + return new Date(b.closed_at).getTime() - new Date(a.closed_at).getTime(); + }); + + for (const item of res.data) { + if (!item.milestone) { + console.log(item.number + ' missing milestone!'); + continue; + } + + console.log(item.number + ' closed_at ' + item.closed_at + ' ' + item.html_url); + const issueDetails = await client.get(item.pull_request.url); + const commits = await client.get(issueDetails.data.commits_url); + + for (const commit of commits.data) { + console.log(commit.commit.message + ' sha: ' + commit.sha); + } + } +}; + +export const cherryPickTask = new Task(); +cherryPickTask.setName('Cherry pick task'); +cherryPickTask.setRunner(cherryPickRunner);