diff --git a/package.json b/package.json index 471a7cba762..6b5a018e46b 100644 --- a/package.json +++ b/package.json @@ -140,8 +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:changelog": "ts-node --project ./scripts/cli/tsconfig.json ./scripts/cli/index.ts core:changelog" + "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 d2b3c75a61b..ced56e1eacd 100644 --- a/scripts/cli/index.ts +++ b/scripts/cli/index.ts @@ -5,6 +5,7 @@ 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(',')); @@ -40,7 +41,7 @@ program }); program - .command('core:changelog') + .command('changelog') .option('-m, --milestone ', 'Specify milestone') .description('Builds changelog markdown') .action(async cmd => { @@ -54,6 +55,13 @@ program }); }); +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/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);