Skip to content
This repository has been archived by the owner on Jul 1, 2024. It is now read-only.

Commit

Permalink
feat: get rid of octokit
Browse files Browse the repository at this point in the history
BREAKING CHANGE:
- rename cli argument from token to gh-token
  • Loading branch information
DaRaFF committed Sep 21, 2020
1 parent 760f9f5 commit d88e57d
Show file tree
Hide file tree
Showing 11 changed files with 195 additions and 102 deletions.
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,8 @@ A simple CLI command to create a semantic-release minor bump pull request.
### via CLI

```bash
npx @daraff/create-bump-pr --token=<your-gh-token> --owner=<gh-owner> --repo=<gh-repo>
npx @daraff/create-bump-pr \
--owner=<gh-owner> \
--repo=<gh-repo> \
--gh-token=<your-gh-token>
```
21 changes: 14 additions & 7 deletions cli.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,23 @@
#!/usr/bin/env node

const argv = require('yargs')
.demandOption(['token', 'owner', 'repo'])
.demandOption(['gh-token', 'owner', 'repo'])
.option('gh-approval-token', {
description: 'gh token to auto approve the opened pull request',
type: 'string'
})
.help(false)
.version(false)
.argv
const run = require('./index')
const {token, owner, repo} = argv

run({token, owner, repo})
run(argv)
.then((pullRequest) => {
console.log(`The PR for the release-management bump has been opened at
${pullRequest.data.html_url}`)
console.log(`
The PR for the release-management bump has been opened at
${pullRequest.html_url}
`)
})
.catch((e) => {
console.log(e.message)
})
process.exit(1)
})
73 changes: 45 additions & 28 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
const _ = require('lodash')
const semver = require('semver')
const Octokit = require('./octokit')
const gitGetTags = require('./lib/git/get_tags')
const gitGetReadme = require('./lib/git/get_readme')
const gitCreateBranch = require('./lib/git/create_branch')
const updateContent = require('./lib/git/update_content')
const createPullRequest = require('./lib/git/create_pull_request')
const createApprovalForPullRequest = require('./lib/git/create_approval_for_pull_request')

// @return {'tag': '1.0.1', 'sha': '1234'}
const getHighestTag = async ({repo, owner, o}) => {
const tagsRaw = await o.getTagsByPage({repo, owner, page: 1, perPage: 5})
const getHighestTag = async ({repo, owner, token}) => {
const tagsRaw = await gitGetTags({owner, repo, token})
return _
.chain(tagsRaw.data)
.chain(tagsRaw)
.map((tag) => {
return {
'tag': tag.name,
Expand All @@ -22,56 +27,68 @@ const getHighestTag = async ({repo, owner, o}) => {
.value()
}

const getNextMinorTag = ({tag}) => {
return semver.inc(tag, 'minor')
}

// main application
module.exports = async ({owner, repo, token}) => {
const o = new Octokit(token)
module.exports = async ({owner, repo, ghToken, ghApprovalToken}) => {
const token = ghToken

const baseTagCommit = await getHighestTag({repo, owner, o})
const bumpTo = getNextMinorTag({tag: baseTagCommit.tag})
if (token === ghApprovalToken) throw new Error('gh-approval-token token must be different to the gh-token')
const baseTagCommit = await getHighestTag({repo, owner, token})

// get README.md
const readmeBase64 = await o.getReadme({owner, repo})
const readmeBase64Obj = await gitGetReadme({owner, repo, token})

// add an empty line to the readme to have a code diff for the upcoming pull request
const readme = Buffer.from(readmeBase64.data.content, 'base64').toString('ascii')
const readme = Buffer.from(readmeBase64Obj.content, 'base64').toString('ascii')
const newLineReadme = `\n ${readme}`
const newLineReadmeEncoded = Buffer.from(newLineReadme).toString('base64')

// create new release-branch
console.log(`try to create branch "bump-${bumpTo}"`)
await o.createBranch({
const branchName = `bump-to-next-minor-version-${Date.now()}`
console.log(`try to create branch "${branchName}"`)
const branch = await gitCreateBranch({
owner,
repo,
ref: `refs/heads/bump-${bumpTo}`,
token,
ref: `refs/heads/${branchName}`,
sha: baseTagCommit.sha
})

// add a new commit to the release-branch
await o.updateReadme({
const updatedContent = await updateContent({
owner,
repo,
path: readmeBase64.data.path,
message: `feat(release-management): Bump minor version to ${bumpTo} for release management`,
token,
path: readmeBase64Obj.path,
message: `feat(release-management): Bump minor version for release management`,
content: newLineReadmeEncoded,
sha: readmeBase64.data.sha,
branch: `bump-${bumpTo}`
sha: readmeBase64Obj.sha,
branch: branchName
})

// create the bump pull request
const pullRequest = await o.createPullRequest({
const pullRequest = await createPullRequest({
owner,
repo,
title: `Bump minor version to ${bumpTo} for release management`,
head: `bump-${bumpTo}`,
token,
title: `Bump minor version for release management`,
head: branchName,
base: 'master',
body: `## Description
Bump minor version to ${bumpTo} for release management`
body: `## Motivation
Bump minor version for release management
`
})

// response format https://developer.github.com/v3/pulls/#create-a-pull-request
// auto approval for pull request
if (ghApprovalToken) {
await createApprovalForPullRequest({
owner,
repo,
token: ghApprovalToken,
pull_number: pullRequest.number,
commit_id: updatedContent.commit.sha
})
}

return pullRequest
}
21 changes: 21 additions & 0 deletions lib/git/create_approval_for_pull_request.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
var request = require('request-promise');

// https://docs.github.com/en/rest/reference/pulls#create-a-review-for-a-pull-request
module.exports = async ({
owner, repo, token, pull_number, commit_id, event = 'APPROVE'
}) => {
try {
return request({
method: 'POST',
uri: `https://api.github.com/repos/${owner}/${repo}/pulls/${pull_number}/reviews`,
body: {commit_id, event},
headers: {
'Authorization': `token ${token}`,
'User-Agent': 'Request-Promise',
},
json: true
})
} catch (error) {
throw error
}
}
19 changes: 19 additions & 0 deletions lib/git/create_branch.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
var request = require('request-promise');

// https://docs.github.com/en/rest/reference/git#create-a-reference
module.exports = async ({owner, repo, token, ref, sha}) => {
try {
return await request({
method: 'POST',
uri: `https://api.github.com/repos/${owner}/${repo}/git/refs`,
body: {ref, sha},
headers: {
'Authorization': `token ${token}`,
'User-Agent': 'Request-Promise',
},
json: true
})
} catch (error) {
throw error
}
}
21 changes: 21 additions & 0 deletions lib/git/create_pull_request.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
var request = require('request-promise');

// https://docs.github.com/en/rest/reference/pulls#create-a-pull-request
module.exports = async ({
owner, repo, token, title, head, base, body
}) => {
try {
return request({
method: 'POST',
uri: `https://api.github.com/repos/${owner}/${repo}/pulls`,
body: {title, head, base, body},
headers: {
'Authorization': `token ${token}`,
'User-Agent': 'Request-Promise',
},
json: true
})
} catch (error) {
throw error
}
}
18 changes: 18 additions & 0 deletions lib/git/get_readme.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
var request = require('request-promise');

// https://docs.github.com/en/rest/reference/repos#list-repository-tags
// https://api.github.com/repos/livingdocsio/livingdocs-server/tags?access_token=1234
//
// @return base64 encoded README.md
module.exports = async ({owner, repo, token}) => {
try {
return await request({
uri: `https://api.github.com/repos/${owner}/${repo}/readme`,
qs: { access_token: token},
headers: { 'User-Agent': 'Request-Promise' },
json: true
})
} catch (error) {
throw error
}
}
28 changes: 28 additions & 0 deletions lib/git/get_tags.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
var request = require('request-promise');

// https://docs.github.com/en/rest/reference/repos#list-repository-tags
// https://api.github.com/repos/livingdocsio/livingdocs-server/tags?access_token=1234
//
// @return
// [
// {
// "name": "v0.1",
// "commit": {
// "sha": "c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc",
// "url": "https://api.github.com/repos/octocat/Hello-World/commits/c5b97d5ae6c19d5c5df71a34c7fbeeda2479ccbc"
// }
// }
// ]
module.exports = async ({owner, repo, token, page = 1, per_page = 10}) => {
try {
return await request({
uri: `https://api.github.com/repos/${owner}/${repo}/tags`,
qs: { access_token: token, page, per_page },
headers: { 'User-Agent': 'Request-Promise' },
json: true
})

} catch (error) {
throw error
}
}
23 changes: 23 additions & 0 deletions lib/git/update_content.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
var request = require('request-promise');

// https://docs.github.com/en/rest/reference/repos#create-or-update-file-contents
//
// @return
module.exports = async ({
owner, repo, token, path, message, content, sha, branch
}) => {
try {
return await request({
method: 'PUT',
uri: `https://api.github.com/repos/${owner}/${repo}/contents/${path}`,
body: {message, content, sha, branch},
headers: {
'Authorization': `token ${token}`,
'User-Agent': 'Request-Promise',
},
json: true
})
} catch (error) {
throw error
}
}
65 changes: 0 additions & 65 deletions octokit.js

This file was deleted.

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
"author": "Ralph Meier",
"license": "MIT",
"dependencies": {
"@octokit/rest": "^15.9.4",
"lodash": "^4.17.4",
"request": "^2.88.0",
"request-promise": "^4.2.5",
"semver": "5.5.1",
"yargs": "^12.0.2"
},
Expand Down

0 comments on commit d88e57d

Please sign in to comment.