From 10ff3db1ab76b462df99760e0166d4d8ed9f237b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 5 Mar 2019 15:53:25 +0100 Subject: [PATCH 1/4] Added first iteration/poc of changelog task --- package.json | 4 +++- scripts/cli/index.ts | 8 ++++++++ scripts/cli/tasks/changelog.ts | 34 ++++++++++++++++++++++++++++++++++ yarn.lock | 5 +++++ 4 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 scripts/cli/tasks/changelog.ts diff --git a/package.json b/package.json index c5136cf5e02..269328d5221 100644 --- a/package.json +++ b/package.json @@ -73,6 +73,7 @@ "html-webpack-plugin": "^3.2.0", "husky": "^1.3.1", "inquirer": "^6.2.2", + "issue-regex": "^3.0.0", "jest": "^23.6.0", "jest-date-mock": "^1.0.6", "lint-staged": "^8.1.3", @@ -140,7 +141,8 @@ "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: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" }, "husky": { "hooks": { diff --git a/scripts/cli/index.ts b/scripts/cli/index.ts index 559f7295ad0..108f7877569 100644 --- a/scripts/cli/index.ts +++ b/scripts/cli/index.ts @@ -4,6 +4,7 @@ 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'; program.option('-d, --depreciate ', 'Inform about npm script deprecation', v => v.split(',')); @@ -38,6 +39,13 @@ program }); }); +program + .command('core:changelog') + .description('Builds changelog markdown') + .action(async cmd => { + await execTask(changelogTask)({}); + }); + 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..3e87ca888b0 --- /dev/null +++ b/scripts/cli/tasks/changelog.ts @@ -0,0 +1,34 @@ +import { Task, TaskRunner } from './task'; +import axios from 'axios'; +import issueRegex from 'issue-regex'; + +const githubGrafanaUrl = 'https://github.com/grafana/grafana'; + +interface ChangelogOptions {} + +const changelogTaskRunner: TaskRunner = async () => { + let client = axios.create({ + baseURL: 'https://api.github.com/repos/grafana/grafana', + timeout: 10000, + }); + + const res = await client.get('/issues?state=closed&labels=' + encodeURIComponent('add to changelog')); + let markdown = ''; + + for (const item of res.data) { + markdown += '* ' + item.title; + markdown += ` [#${item.number}](${githubGrafanaUrl}/issues/${item.number})`; + + for (const issue of item.body.match(issueRegex())) { + markdown += ` [#${issue}](${githubGrafanaUrl}/issues/${issue})`; + } + + markdown += '\n'; + } + + console.log(markdown); +}; + +export const changelogTask = new Task(); +changelogTask.setName('Changelog generator task'); +changelogTask.setRunner(changelogTaskRunner); diff --git a/yarn.lock b/yarn.lock index 3d97ef64374..4bfd7775564 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9929,6 +9929,11 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +issue-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/issue-regex/-/issue-regex-3.0.0.tgz#275c5dac460e7827819f749747baf686109695b7" + integrity sha512-KGkx4olfVCmESgFvImfiehUcY+WXnyVZ7uHKJO1eJWQr5QaAn9MSc0ejbCqCrBjafxwDxJ3cB5+dw8tQ8KZNzg== + istanbul-api@^1.3.1: version "1.3.7" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" From 72ca51dadc05b4f966bcbf5e0cd96ea4aeb4ed6b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Tue, 5 Mar 2019 16:12:27 +0100 Subject: [PATCH 2/4] Updated to add PR author, skip PR issue references --- package.json | 1 - scripts/cli/tasks/changelog.ts | 10 +++------- yarn.lock | 5 ----- 3 files changed, 3 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index 269328d5221..471a7cba762 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,6 @@ "html-webpack-plugin": "^3.2.0", "husky": "^1.3.1", "inquirer": "^6.2.2", - "issue-regex": "^3.0.0", "jest": "^23.6.0", "jest-date-mock": "^1.0.6", "lint-staged": "^8.1.3", diff --git a/scripts/cli/tasks/changelog.ts b/scripts/cli/tasks/changelog.ts index 3e87ca888b0..1e8ebf9c09c 100644 --- a/scripts/cli/tasks/changelog.ts +++ b/scripts/cli/tasks/changelog.ts @@ -1,6 +1,5 @@ import { Task, TaskRunner } from './task'; import axios from 'axios'; -import issueRegex from 'issue-regex'; const githubGrafanaUrl = 'https://github.com/grafana/grafana'; @@ -16,12 +15,9 @@ const changelogTaskRunner: TaskRunner = async () => { let markdown = ''; for (const item of res.data) { - markdown += '* ' + item.title; - markdown += ` [#${item.number}](${githubGrafanaUrl}/issues/${item.number})`; - - for (const issue of item.body.match(issueRegex())) { - markdown += ` [#${issue}](${githubGrafanaUrl}/issues/${issue})`; - } + markdown += '* ' + item.title + '.'; + markdown += ` [#${item.number}](${githubGrafanaUrl}/pull/${item.number})`; + markdown += `, [@${item.user.login}](${item.user.html_url})`; markdown += '\n'; } diff --git a/yarn.lock b/yarn.lock index 4bfd7775564..3d97ef64374 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9929,11 +9929,6 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= -issue-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/issue-regex/-/issue-regex-3.0.0.tgz#275c5dac460e7827819f749747baf686109695b7" - integrity sha512-KGkx4olfVCmESgFvImfiehUcY+WXnyVZ7uHKJO1eJWQr5QaAn9MSc0ejbCqCrBjafxwDxJ3cB5+dw8tQ8KZNzg== - istanbul-api@^1.3.1: version "1.3.7" resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa" From 153b3e5cf5c218808eaa798f2e8d6782f3dbe53f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 6 Mar 2019 12:28:07 +0100 Subject: [PATCH 3/4] Updated changelog task --- scripts/cli/index.ts | 10 +++++++++- scripts/cli/tasks/changelog.ts | 25 ++++++++++++++++++++++--- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/scripts/cli/index.ts b/scripts/cli/index.ts index 108f7877569..d2b3c75a61b 100644 --- a/scripts/cli/index.ts +++ b/scripts/cli/index.ts @@ -41,9 +41,17 @@ program program .command('core:changelog') + .option('-m, --milestone ', 'Specify milestone') .description('Builds changelog markdown') .action(async cmd => { - await execTask(changelogTask)({}); + if (!cmd.milestone) { + console.log('Please specify milestone, example: --m 6.0.1'); + return; + } + + await execTask(changelogTask)({ + milestone: cmd.milestone, + }); }); program.parse(process.argv); diff --git a/scripts/cli/tasks/changelog.ts b/scripts/cli/tasks/changelog.ts index 1e8ebf9c09c..fc56c60531c 100644 --- a/scripts/cli/tasks/changelog.ts +++ b/scripts/cli/tasks/changelog.ts @@ -3,18 +3,37 @@ import axios from 'axios'; const githubGrafanaUrl = 'https://github.com/grafana/grafana'; -interface ChangelogOptions {} +interface ChangelogOptions { + milestone: string; +} -const changelogTaskRunner: TaskRunner = async () => { +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?state=closed&labels=' + encodeURIComponent('add to changelog')); + 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})`; From 7b67dcfbb8ff30407d9297d187541bba77bc2872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Wed, 6 Mar 2019 13:18:13 +0100 Subject: [PATCH 4/4] Added basic cherry pick helping task --- package.json | 3 +-- scripts/cli/index.ts | 10 +++++++- scripts/cli/tasks/cherrypick.ts | 42 +++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 3 deletions(-) create mode 100644 scripts/cli/tasks/cherrypick.ts 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);