From 949927eddaf67b527dfd18a99e136e28ed363709 Mon Sep 17 00:00:00 2001 From: Paul Gschwendtner Date: Wed, 4 May 2022 07:30:54 +0000 Subject: [PATCH] build: remove outdated/obsolete github PR utility scripts (#45868) Removes scripts and documentation for tools which are no longer actively used and likely do not work anyway at this point. All of our PR-related tooling has moved into the `yarn ng-dev` command. The `PR_REVIEW` markdown file is deleted since it was soley about the legacy review scripts and the PR review workflow also does not seem like the common/standard workflow Angular team members follow. PR Close #45868 --- docs/PR_REVIEW.md | 154 ----------- scripts/github/merge-pr | 25 -- scripts/github/push-pr | 59 ---- scripts/github/push-upstream | 12 - scripts/github/rebase-pr | 7 - scripts/github/review-pr | 66 ----- scripts/github/utils/git_util.js | 95 ------- scripts/github/utils/github_closes.js | 36 --- scripts/github/utils/json_extract.js | 62 ----- scripts/github/utils/json_extract_test.js | 49 ---- scripts/github/utils/labels.json | 30 --- scripts/github/utils/pulls.json | 314 ---------------------- 12 files changed, 909 deletions(-) delete mode 100644 docs/PR_REVIEW.md delete mode 100755 scripts/github/merge-pr delete mode 100755 scripts/github/push-pr delete mode 100755 scripts/github/push-upstream delete mode 100755 scripts/github/rebase-pr delete mode 100755 scripts/github/review-pr delete mode 100644 scripts/github/utils/git_util.js delete mode 100644 scripts/github/utils/github_closes.js delete mode 100644 scripts/github/utils/json_extract.js delete mode 100644 scripts/github/utils/json_extract_test.js delete mode 100644 scripts/github/utils/labels.json delete mode 100644 scripts/github/utils/pulls.json diff --git a/docs/PR_REVIEW.md b/docs/PR_REVIEW.md deleted file mode 100644 index 18a8b615ed8..00000000000 --- a/docs/PR_REVIEW.md +++ /dev/null @@ -1,154 +0,0 @@ -# PR Review - -## Tools - -A better way to do a code-review of a PR is to do it in your IDE. -Here are two scripts which allow you to perform the review and create local changes which can be appended to the PR. - -### 1. Loading PR - -Run this command to load the changes into your local repository where your IDE is running. - -``` -$ ./scripts/github/review-pr 24623 -``` - -This will result in output: - -``` -Already on 'master' -Your branch is up to date with 'origin/master'. -Fetching pull request #24623 with 1 SHA(s) into branch range: pr/24623_base..pr/24623_top -====================================================================================== -cef93a51b (pr/24623_top) ci: scripts to review PRs locally -====================================================================================== -Switched to a new branch 'pr/24623' -On branch pr/24623 -Untracked files: - (use "git add ..." to include in what will be committed) - - docs/PR_REVIEW.md - scripts/github/push-pr - scripts/github/review-pr - -nothing added to commit but untracked files present (use "git add" to track) -``` - -Note that the script created `pr/24623_top` and `pr/24623_base` branches which denote SHAs where the PR start and end. - -``` -cef93a51b (pr/24623_top) ci: scripts to review PRs locally -637805a0c (pr/24623_base) docs: update `lowercase` pipe example in "AngularJS to Angular" guide (#24588) -``` - -Knowing `pr/24623_top` and `pr/24623_base` makes it convenient to refer to different SHAs in PR when rebasing or resetting. - -### 2. Review PR - -Because the script has reset the `HEAD` of the PR the changes show up as unstaged files. - -``` -$ git status -On branch pr/24623 -Untracked files: - (use "git add ..." to include in what will be committed) - - docs/PR_REVIEW.md - scripts/github/push-pr - scripts/github/review-pr - -nothing added to commit but untracked files present (use "git add" to track) -``` - -Use your IDE to review the untracked files as needed. -A good trick is to use your IDE to stage the files which were already reviewed. -When all files are staged the review is done. - -### 3. Creating Edits - -At any point you can edit any line in the repository. -The idea is to create edits locally and push them to the PR later. -This is useful because it is often times easier to make minor changes locally than to request the PR author to change and repush through a comment (often times the comment is larger than the change.) - -Example of a local edit. -``` -echo "# here is a change" >> docs/PR_REVIEW.md -``` - -### 4. Creating a Commit From Local Edits - -Since the HEAD has been reset to `pr/24623_base` so that changes show up in `git status` we have to reverse the reset to only see our local changes. -To do that reset the `HEAD` to `pr/24623_top`. - -``` -$ git reset pr/24623_top -``` - -Doing so will remove all PR changes and only leave your local modifications which you have done. -You can verify by running `git status` and `git diff` to see only your changes (PR changes have been removed.) - -``` -$ git status -On branch pr/24623 -Changes not staged for commit: - (use "git add ..." to update what will be committed) - (use "git checkout -- ..." to discard changes in working directory) - - modified: docs/PR_REVIEW.md - -no changes added to commit (use "git add" and/or "git commit -a") -``` -``` -$ git diff -diff --git a/docs/PR_REVIEW.md b/docs/PR_REVIEW.md -index 184b5aeca..83517fbe0 100644 ---- a/docs/PR_REVIEW.md -+++ b/docs/PR_REVIEW.md -@@ -8,4 +8,4 @@ A better way to do code review of the PR is to do it in your IDE. Here are two s -existing text -- -\ No newline at end of file -+# here is a change -``` - -Next step is to turn your local changes into a `fixup!` commit. -Run `git commit --all --fixup HEAD` to create a `fixup!` commit. - -NOTE: If you added new files they must be added using `git add .` or they will not be picked up by the `git commit --all` flag. - -``` -$ git commit --all --fixup HEAD -[pr/24623 45ae87ce4] fixup! ci: scripts to review PRs locally - 1 file changed, 1 insertion(+), 1 deletion(-) -``` - -You can verify that the `fixup!` commit with your local modifications was created. -``` -$ git log --oneline -45ae87ce4 (HEAD -> pr/24623) fixup! ci: scripts to review PRs locally -cef93a51b (pr/24623_top) ci: scripts to review PRs locally -``` - -### 5. Pushing local edits back to the PR - -The last step is to push your local changes back into the PR. -Use `./scripts/github/push-pr` script for that. - -``` -$ ./scripts/github/push-pr -Assuming PR #24623 ->>> git push git@github.com:mhevery/angular.git HEAD:review_pr_script -Counting objects: 4, done. -Delta compression using up to 8 threads. -Compressing objects: 100% (4/4), done. -Writing objects: 100% (4/4), 392 bytes | 392.00 KiB/s, done. -Total 4 (delta 3), reused 0 (delta 0) -remote: Resolving deltas: 100% (3/3), completed with 3 local objects. -To github.com:mhevery/angular.git - cef93a51b..45ae87ce4 HEAD -> review_pr_script -``` - -NOTE: Notice that we did not have to specify the PR number since the script can guess it from the branch name. - -If you visit https://github.com/angular/angular/pull/24623/commits you will see that your `fixup!` commit has been added to the PR. -This greatly simplifies the work for many minor changes to the PR. diff --git a/scripts/github/merge-pr b/scripts/github/merge-pr deleted file mode 100755 index b2d1eb4890b..00000000000 --- a/scripts/github/merge-pr +++ /dev/null @@ -1,25 +0,0 @@ -#!/usr/bin/env bash - -# Clippy ascii art copied from https://github.com/gbigwood/Clippo -echo -e " -################################################ -/ \ _________________ -| | / \\ -@ @ | It looks like | -|| || | you are trying | -|| || <--| to merge a PR. | -|\_/| \_________________/ -\___/ - -A new merge script is available using `ng-dev`! - -To merge a pr using the new tooling run: - -$ yarn -s ng-dev pr merge - - -This script has been fully deprecated as it no -longer correctly determines branch targets due -to how it determines the current version and -defines patch branches. -################################################" diff --git a/scripts/github/push-pr b/scripts/github/push-pr deleted file mode 100755 index 758508a0866..00000000000 --- a/scripts/github/push-pr +++ /dev/null @@ -1,59 +0,0 @@ -#!/usr/bin/env node - -const shell = require('shelljs'); -shell.config.fatal = true; -const util = require('./utils/git_util'); - -if (require.main === module) { - main(process.argv.splice(2)).then( - (v) => process.exitCode, - (e) => console.error(process.exitCode = 1, e) - ); -} - -async function main(args) { - let flags = ''; - let prNumber = 0; - let printHelp = false; - - args.forEach((arg) => { - if (prNumber == 0 && Number.parseInt(arg) > 0) { - prNumber = Number.parseInt(arg); - } else if (arg == '--help') { - printHelp = true; - } else if (arg == '--force-with-lease') { - flags += ' --force-with-lease'; - } else if (arg == '--force') { - flags += ' --force'; - } else { - shell.echo('Unexpected argument: ', arg); - } - }); - - if (!prNumber) { - const branch = util.getCurrentBranch(); - const maybePr = branch.split('/')[1]; - if (maybePr > 0) { - shell.echo(`PR number not specified. Defaulting to #${maybePr}.`); - prNumber = maybePr; - } - } - - if (!prNumber || printHelp) { - shell.echo(`Push the current HEAD into an existing pull request.`); - shell.echo(``); - shell.echo(`${process.argv[1]} [PR_NUMBER] [--force-with-lease]`); - shell.echo(``); - shell.echo(` --force-with-lease Continues even \if change can\'t be fast-forwarded.`); - shell.echo(` --force Forces the push with --force.`); - shell.echo(` [PR_NUMBER] If not present the script guesses the PR from the branch name.`); - return 1; - } - - const prInfo = await util.githubPrInfo(prNumber); - const prPushCmd = `git push${flags} ${prInfo.repository.gitUrl} HEAD:${prInfo.branch}`; - shell.echo(`>>> ${prPushCmd}`); - shell.exec(prPushCmd); - - return 0; - } diff --git a/scripts/github/push-upstream b/scripts/github/push-upstream deleted file mode 100755 index a8028088566..00000000000 --- a/scripts/github/push-upstream +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -u -e -o pipefail - -PATCH_BRANCH=`git branch --list '*.x' | cut -d ' ' -f2- | sort -r | head -n1` -# Trim whitespace -PATCH_BRANCH=`echo $PATCH_BRANCH` - -PUSH_BRANCHES="git push git@github.com:angular/angular.git master:master $PATCH_BRANCH:$PATCH_BRANCH" - -echo $PUSH_BRANCHES -$PUSH_BRANCHES diff --git a/scripts/github/rebase-pr b/scripts/github/rebase-pr deleted file mode 100755 index 277819f3869..00000000000 --- a/scripts/github/rebase-pr +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -# TODO: Remove this deprecation warning after a reasonable period. - -echo "The rebase script has been replaced by the rebase script provided in ng-dev"; -echo "To run the rebase via ng-dev run the following command:" -echo " $ yarn -s ng-dev pr rebase " diff --git a/scripts/github/review-pr b/scripts/github/review-pr deleted file mode 100755 index 9e9ff8ba96e..00000000000 --- a/scripts/github/review-pr +++ /dev/null @@ -1,66 +0,0 @@ -#!/usr/bin/env node - -const shell = require('shelljs'); -shell.config.fatal = true; -const util = require('./utils/git_util'); - -if (require.main === module) { - main(process.argv.splice(2)).then( - (v) => process.exitCode = v, - (e) => console.error(process.exitCode = 1, e) - ); -} - -async function main(args) { - let prNumber = 0; - - args.forEach((arg) => { - if (prNumber == 0 && arg > 0) { - prNumber = arg; - } else { - shell.echo('Unexpected argument: ', arg); - } - }); - - if (prNumber === 0) { - shell.echo('Bring github pull request onto your local repo for review and edit'); - shell.echo(''); - shell.echo(`${process.argv[1]} PR_NUMBER`); - shell.echo(''); - return 1; - } - - if (util.gitHasLocalModifications()) { - shell.echo('Local modification detected. exiting...'); - return 1; - } - - let prShaCount = (await util.githubPrInfo(prNumber)).commits; - - shell.exec(`git checkout master`); - if (util.execNoFatal(`git rev-parse --verify --quiet pr/${prNumber}`).code == 0) { - shell.exec(`git branch -D pr/${prNumber}`); - } - - shell.echo(`Fetching pull request #${prNumber} with ${prNumber} SHA(s) into branch range: pr/${prNumber}_base..pr/${prNumber}_top`); - shell.exec(`git fetch -f git@github.com:angular/angular.git pull/${prNumber}/head:pr/${prNumber}_top`); - - shell.exec(`git branch -f pr/${prNumber}_bottom pr/${prNumber}_top~${prShaCount - 1}`); - shell.exec(`git branch -f pr/${prNumber}_base pr/${prNumber}_top~${prShaCount}`); - - // Create aliases - shell.exec(`git branch -f pr/TOP pr/${prNumber}_top`); - shell.exec(`git branch -f pr/BASE pr/${prNumber}_base`); - shell.exec(`git branch -f pr/BOTTOM pr/${prNumber}_bottom`); - - shell.echo(`======================================================================================`); - shell.exec(`git log --oneline --color pr/${prNumber}_base..pr/${prNumber}_top`); - shell.echo(`======================================================================================`); - - // Reset the HEAD so that we can see changed files for review - shell.exec(`git checkout --force -b pr/${prNumber} pr/${prNumber}_top`); - shell.exec(`git reset pr/${prNumber}_base`); - shell.exec(`git status`); - - return 0; -} diff --git a/scripts/github/utils/git_util.js b/scripts/github/utils/git_util.js deleted file mode 100644 index c9b0c858e2c..00000000000 --- a/scripts/github/utils/git_util.js +++ /dev/null @@ -1,95 +0,0 @@ -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -const https = require('https'); -const shell = require('shelljs'); - -function httpGet(server, path, headers) { - return new Promise((resolve, reject) => { - const options = { - hostname: server, - port: 443, - path: path, - method: 'GET', - headers: {'User-Agent': 'script', ...headers} - }; - https - .get( - options, - (res) => { - let json = ''; - res.on('data', (chunk) => json += chunk.toString()); - res.on('end', () => resolve(json)); - }) - .on('error', (e) => reject(e)); - }); -} - -let warnNoToken = true; - -async function githubGet(path) { - const token = process.env['TOKEN']; - const headers = {}; - if (token) { - headers.Authorization = 'token ' + token; - } else if (warnNoToken) { - warnNoToken = false; - console.warn('############################################################'); - console.warn('############################################################'); - console.warn('WARNING: you should set the TOKEN variable to a github token'); - console.warn('############################################################'); - console.warn('############################################################'); - } - - return JSON.parse(await httpGet('api.github.com', '/repos/angular/angular/' + path, headers)); -} - -async function githubPrInfo(prNumber) { - const pr = (await githubGet('pulls/' + prNumber)); - const label = pr.head.label.split(':'); - const user = label[0]; - const branch = label[1]; - return { - commits: pr.commits, - repository: { - user: user, - gitUrl: `git@github.com:${user}/angular.git`, - }, - branch: branch - }; -} - -function gitHasLocalModifications() { - return execNoFatal('git diff-index --quiet HEAD --').code != 0; -} - -function execNoFatal(cmd, options) { - const fatal = shell.config.fatal; - try { - shell.config.fatal = false; - return shell.exec(cmd, options); - } finally { - shell.config.fatal = fatal; - } -} - -function getCurrentBranch() { - return shell.exec('git branch', {silent: true}) - .stdout.toString() - .split('\n') // Break into lines - .map((v) => v.trim()) // trim - .filter((b) => b[0] == '*') // select current branch - .map((b) => b.split(' ')[1])[0]; // remove leading `*` -} - -exports.httpGet = httpGet; -exports.githubGet = githubGet; -exports.githubPrInfo = githubPrInfo; -exports.gitHasLocalModifications = gitHasLocalModifications; -exports.execNoFatal = execNoFatal; -exports.getCurrentBranch = getCurrentBranch; diff --git a/scripts/github/utils/github_closes.js b/scripts/github/utils/github_closes.js deleted file mode 100644 index 77b0f7d610f..00000000000 --- a/scripts/github/utils/github_closes.js +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env node - -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -var msg = ''; - -if (require.main === module) { - process.stdin.setEncoding('utf8'); - - process.stdin.on('readable', () => { - const chunk = process.stdin.read(); - if (chunk !== null) { - msg += chunk; - } - }); - - process.stdin.on('end', () => { - var argv = process.argv.slice(2); - console.info(rewriteMsg(msg, argv[0])); - }); -} - -function rewriteMsg(msg, prNo) { - var lines = msg.split(/\n/); - lines[0] += ' (#' + prNo + ')'; - lines.push('PR Close #' + prNo); - return lines.join('\n'); -} - -exports.rewriteMsg = rewriteMsg; diff --git a/scripts/github/utils/json_extract.js b/scripts/github/utils/json_extract.js deleted file mode 100644 index 1b006759a38..00000000000 --- a/scripts/github/utils/json_extract.js +++ /dev/null @@ -1,62 +0,0 @@ -#!/usr/bin/env node - -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -var json = ''; - -if (require.main === module) { - process.stdin.setEncoding('utf8'); - - process.stdin.on('readable', () => { - const chunk = process.stdin.read(); - if (chunk !== null) { - json += chunk; - } - }); - - process.stdin.on('end', () => { - var obj = JSON.parse(json); - var argv = process.argv.slice(2); - extractPaths(obj, argv).forEach(function(line) { - console.info(line); - }); - }); -} - -function extractPaths(obj, paths) { - var lines = []; - paths.forEach(function(exp) { - var objs = obj instanceof Array ? [].concat(obj) : [obj]; - exp.split('.').forEach(function(name) { - for (var i = 0; i < objs.length; i++) { - var o = objs[i]; - if (o instanceof Array) { - // Expand and do over - objs = objs.slice(0, i).concat(o).concat(objs.slice(i + 1, objs.length)); - i--; - } else { - name.split('=').forEach(function(name, index) { - if (index == 0) { - objs[i] = o = o[name]; - } else if (name.charAt(0) == '^') { - if (o.indexOf(name.slice(1)) !== 0) { - objs.splice(i, 1); - i--; - } - } - }); - } - } - }); - lines.push(objs.join('|')); - }); - return lines; -} - -exports.extractPaths = extractPaths; diff --git a/scripts/github/utils/json_extract_test.js b/scripts/github/utils/json_extract_test.js deleted file mode 100644 index e15684f534e..00000000000 --- a/scripts/github/utils/json_extract_test.js +++ /dev/null @@ -1,49 +0,0 @@ -#!/usr/bin/env node - -/** - * @license - * Copyright Google LLC All Rights Reserved. - * - * Use of this source code is governed by an MIT-style license that can be - * found in the LICENSE file at https://angular.io/license - */ - -var assert = require('assert'); -var extractPaths = require('./json_extract').extractPaths; - -var SAMPLE_LABELS = [ - { - 'id': 149476251, - 'url': 'https://api.github.com/repos/angular/angular/labels/cla:%20yes', - 'name': 'cla: yes', - 'color': '009800', - 'default': false - }, - { - 'id': 533874619, - 'url': 'https://api.github.com/repos/angular/angular/labels/comp:%20aio', - 'name': 'comp: aio', - 'color': 'c7def8', - 'default': false - }, - { - 'id': 133556520, - 'url': 'https://api.github.com/repos/angular/angular/labels/PR%20action:%20merge', - 'name': 'PR action: merge', - 'color': '99ff66', - 'default': false - }, - { - 'id': 655699838, - 'url': 'https://api.github.com/repos/angular/angular/labels/PR%20target:%20master%20&%20patch', - 'name': 'PR target: master & patch', - 'color': '5319e7', - 'default': false - } -]; - -assert.deepEqual(extractPaths({head: {label: 'value1'}}, ['head.label']), ['value1']); -assert.deepEqual( - extractPaths(SAMPLE_LABELS, ['name']), - ['cla: yes|comp: aio|PR action: merge|PR target: master & patch']); -assert.deepEqual(extractPaths(SAMPLE_LABELS, ['name=^PR target:']), ['PR target: master & patch']); diff --git a/scripts/github/utils/labels.json b/scripts/github/utils/labels.json deleted file mode 100644 index 7a6384d11e0..00000000000 --- a/scripts/github/utils/labels.json +++ /dev/null @@ -1,30 +0,0 @@ -[ - { - "id": 149476251, - "url": "https://api.github.com/repos/angular/angular/labels/cla:%20yes", - "name": "cla: yes", - "color": "009800", - "default": false - }, - { - "id": 533874619, - "url": "https://api.github.com/repos/angular/angular/labels/comp:%20aio", - "name": "comp: aio", - "color": "c7def8", - "default": false - }, - { - "id": 133556520, - "url": "https://api.github.com/repos/angular/angular/labels/PR%20action:%20merge", - "name": "PR action: merge", - "color": "99ff66", - "default": false - }, - { - "id": 655699838, - "url": "https://api.github.com/repos/angular/angular/labels/PR%20target:%20master%20&%20patch", - "name": "PR target: master & patch", - "color": "5319e7", - "default": false - } -] diff --git a/scripts/github/utils/pulls.json b/scripts/github/utils/pulls.json deleted file mode 100644 index 6233e4c680a..00000000000 --- a/scripts/github/utils/pulls.json +++ /dev/null @@ -1,314 +0,0 @@ -{ - "url": "https://api.github.com/repos/angular/angular/pulls/18730", - "id": 136020267, - "html_url": "https://github.com/angular/angular/pull/18730", - "diff_url": "https://github.com/angular/angular/pull/18730.diff", - "patch_url": "https://github.com/angular/angular/pull/18730.patch", - "issue_url": "https://api.github.com/repos/angular/angular/issues/18730", - "number": 18730, - "state": "open", - "locked": false, - "title": "docs(aio): typo in metadata guide", - "user": { - "login": "cexbrayat", - "id": 411874, - "avatar_url": "https://avatars3.githubusercontent.com/u/411874?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/cexbrayat", - "html_url": "https://github.com/cexbrayat", - "followers_url": "https://api.github.com/users/cexbrayat/followers", - "following_url": "https://api.github.com/users/cexbrayat/following{/other_user}", - "gists_url": "https://api.github.com/users/cexbrayat/gists{/gist_id}", - "starred_url": "https://api.github.com/users/cexbrayat/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/cexbrayat/subscriptions", - "organizations_url": "https://api.github.com/users/cexbrayat/orgs", - "repos_url": "https://api.github.com/users/cexbrayat/repos", - "events_url": "https://api.github.com/users/cexbrayat/events{/privacy}", - "received_events_url": "https://api.github.com/users/cexbrayat/received_events", - "type": "User", - "site_admin": false - }, - "body": "## PR Type\r\n\r\nSimple typo fix in aio guide\r\n\r\n\r\n```\r\n[ ] Bugfix\r\n[ ] Feature\r\n[ ] Code style update (formatting, local variables)\r\n[ ] Refactoring (no functional changes, no api changes)\r\n[ ] Build related changes\r\n[ ] CI related changes\r\n[x] Documentation content changes\r\n[ ] angular.io application / infrastructure changes\r\n[ ] Other... Please describe:\r\n```", - "created_at": "2017-08-16T13:11:04Z", - "updated_at": "2017-08-17T13:59:21Z", - "closed_at": null, - "merged_at": null, - "merge_commit_sha": "35f8a4fdd7b37d41d8ed71c0f9978ed3e751da43", - "assignee": null, - "assignees": [ - - ], - "requested_reviewers": [ - - ], - "milestone": null, - "commits_url": "https://api.github.com/repos/angular/angular/pulls/18730/commits", - "review_comments_url": "https://api.github.com/repos/angular/angular/pulls/18730/comments", - "review_comment_url": "https://api.github.com/repos/angular/angular/pulls/comments{/number}", - "comments_url": "https://api.github.com/repos/angular/angular/issues/18730/comments", - "statuses_url": "https://api.github.com/repos/angular/angular/statuses/d59a5eec6cc60e301033300957f0c959b8056650", - "head": { - "label": "cexbrayat:docs/metadata-guide", - "ref": "docs/metadata-guide", - "sha": "d59a5eec6cc60e301033300957f0c959b8056650", - "user": { - "login": "cexbrayat", - "id": 411874, - "avatar_url": "https://avatars3.githubusercontent.com/u/411874?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/cexbrayat", - "html_url": "https://github.com/cexbrayat", - "followers_url": "https://api.github.com/users/cexbrayat/followers", - "following_url": "https://api.github.com/users/cexbrayat/following{/other_user}", - "gists_url": "https://api.github.com/users/cexbrayat/gists{/gist_id}", - "starred_url": "https://api.github.com/users/cexbrayat/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/cexbrayat/subscriptions", - "organizations_url": "https://api.github.com/users/cexbrayat/orgs", - "repos_url": "https://api.github.com/users/cexbrayat/repos", - "events_url": "https://api.github.com/users/cexbrayat/events{/privacy}", - "received_events_url": "https://api.github.com/users/cexbrayat/received_events", - "type": "User", - "site_admin": false - }, - "repo": { - "id": 25485740, - "name": "angular", - "full_name": "cexbrayat/angular", - "owner": { - "login": "cexbrayat", - "id": 411874, - "avatar_url": "https://avatars3.githubusercontent.com/u/411874?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/cexbrayat", - "html_url": "https://github.com/cexbrayat", - "followers_url": "https://api.github.com/users/cexbrayat/followers", - "following_url": "https://api.github.com/users/cexbrayat/following{/other_user}", - "gists_url": "https://api.github.com/users/cexbrayat/gists{/gist_id}", - "starred_url": "https://api.github.com/users/cexbrayat/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/cexbrayat/subscriptions", - "organizations_url": "https://api.github.com/users/cexbrayat/orgs", - "repos_url": "https://api.github.com/users/cexbrayat/repos", - "events_url": "https://api.github.com/users/cexbrayat/events{/privacy}", - "received_events_url": "https://api.github.com/users/cexbrayat/received_events", - "type": "User", - "site_admin": false - }, - "private": false, - "html_url": "https://github.com/cexbrayat/angular", - "description": null, - "fork": true, - "url": "https://api.github.com/repos/cexbrayat/angular", - "forks_url": "https://api.github.com/repos/cexbrayat/angular/forks", - "keys_url": "https://api.github.com/repos/cexbrayat/angular/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/cexbrayat/angular/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/cexbrayat/angular/teams", - "hooks_url": "https://api.github.com/repos/cexbrayat/angular/hooks", - "issue_events_url": "https://api.github.com/repos/cexbrayat/angular/issues/events{/number}", - "events_url": "https://api.github.com/repos/cexbrayat/angular/events", - "assignees_url": "https://api.github.com/repos/cexbrayat/angular/assignees{/user}", - "branches_url": "https://api.github.com/repos/cexbrayat/angular/branches{/branch}", - "tags_url": "https://api.github.com/repos/cexbrayat/angular/tags", - "blobs_url": "https://api.github.com/repos/cexbrayat/angular/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/cexbrayat/angular/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/cexbrayat/angular/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/cexbrayat/angular/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/cexbrayat/angular/statuses/{sha}", - "languages_url": "https://api.github.com/repos/cexbrayat/angular/languages", - "stargazers_url": "https://api.github.com/repos/cexbrayat/angular/stargazers", - "contributors_url": "https://api.github.com/repos/cexbrayat/angular/contributors", - "subscribers_url": "https://api.github.com/repos/cexbrayat/angular/subscribers", - "subscription_url": "https://api.github.com/repos/cexbrayat/angular/subscription", - "commits_url": "https://api.github.com/repos/cexbrayat/angular/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/cexbrayat/angular/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/cexbrayat/angular/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/cexbrayat/angular/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/cexbrayat/angular/contents/{+path}", - "compare_url": "https://api.github.com/repos/cexbrayat/angular/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/cexbrayat/angular/merges", - "archive_url": "https://api.github.com/repos/cexbrayat/angular/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/cexbrayat/angular/downloads", - "issues_url": "https://api.github.com/repos/cexbrayat/angular/issues{/number}", - "pulls_url": "https://api.github.com/repos/cexbrayat/angular/pulls{/number}", - "milestones_url": "https://api.github.com/repos/cexbrayat/angular/milestones{/number}", - "notifications_url": "https://api.github.com/repos/cexbrayat/angular/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/cexbrayat/angular/labels{/name}", - "releases_url": "https://api.github.com/repos/cexbrayat/angular/releases{/id}", - "deployments_url": "https://api.github.com/repos/cexbrayat/angular/deployments", - "created_at": "2014-10-20T20:42:42Z", - "updated_at": "2017-07-03T09:58:51Z", - "pushed_at": "2017-08-16T13:20:57Z", - "git_url": "git://github.com/cexbrayat/angular.git", - "ssh_url": "git@github.com:cexbrayat/angular.git", - "clone_url": "https://github.com/cexbrayat/angular.git", - "svn_url": "https://github.com/cexbrayat/angular", - "homepage": null, - "size": 62846, - "stargazers_count": 1, - "watchers_count": 1, - "language": "TypeScript", - "has_issues": false, - "has_projects": true, - "has_downloads": true, - "has_wiki": true, - "has_pages": false, - "forks_count": 0, - "mirror_url": null, - "open_issues_count": 0, - "forks": 0, - "open_issues": 0, - "watchers": 1, - "default_branch": "master" - } - }, - "base": { - "label": "angular:master", - "ref": "master", - "sha": "32ff21c16bf1833d2da9f8e2ec8536f7a13f92de", - "user": { - "login": "angular", - "id": 139426, - "avatar_url": "https://avatars3.githubusercontent.com/u/139426?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/angular", - "html_url": "https://github.com/angular", - "followers_url": "https://api.github.com/users/angular/followers", - "following_url": "https://api.github.com/users/angular/following{/other_user}", - "gists_url": "https://api.github.com/users/angular/gists{/gist_id}", - "starred_url": "https://api.github.com/users/angular/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/angular/subscriptions", - "organizations_url": "https://api.github.com/users/angular/orgs", - "repos_url": "https://api.github.com/users/angular/repos", - "events_url": "https://api.github.com/users/angular/events{/privacy}", - "received_events_url": "https://api.github.com/users/angular/received_events", - "type": "Organization", - "site_admin": false - }, - "repo": { - "id": 24195339, - "name": "angular", - "full_name": "angular/angular", - "owner": { - "login": "angular", - "id": 139426, - "avatar_url": "https://avatars3.githubusercontent.com/u/139426?v=4", - "gravatar_id": "", - "url": "https://api.github.com/users/angular", - "html_url": "https://github.com/angular", - "followers_url": "https://api.github.com/users/angular/followers", - "following_url": "https://api.github.com/users/angular/following{/other_user}", - "gists_url": "https://api.github.com/users/angular/gists{/gist_id}", - "starred_url": "https://api.github.com/users/angular/starred{/owner}{/repo}", - "subscriptions_url": "https://api.github.com/users/angular/subscriptions", - "organizations_url": "https://api.github.com/users/angular/orgs", - "repos_url": "https://api.github.com/users/angular/repos", - "events_url": "https://api.github.com/users/angular/events{/privacy}", - "received_events_url": "https://api.github.com/users/angular/received_events", - "type": "Organization", - "site_admin": false - }, - "private": false, - "html_url": "https://github.com/angular/angular", - "description": "One framework. Mobile & desktop.", - "fork": false, - "url": "https://api.github.com/repos/angular/angular", - "forks_url": "https://api.github.com/repos/angular/angular/forks", - "keys_url": "https://api.github.com/repos/angular/angular/keys{/key_id}", - "collaborators_url": "https://api.github.com/repos/angular/angular/collaborators{/collaborator}", - "teams_url": "https://api.github.com/repos/angular/angular/teams", - "hooks_url": "https://api.github.com/repos/angular/angular/hooks", - "issue_events_url": "https://api.github.com/repos/angular/angular/issues/events{/number}", - "events_url": "https://api.github.com/repos/angular/angular/events", - "assignees_url": "https://api.github.com/repos/angular/angular/assignees{/user}", - "branches_url": "https://api.github.com/repos/angular/angular/branches{/branch}", - "tags_url": "https://api.github.com/repos/angular/angular/tags", - "blobs_url": "https://api.github.com/repos/angular/angular/git/blobs{/sha}", - "git_tags_url": "https://api.github.com/repos/angular/angular/git/tags{/sha}", - "git_refs_url": "https://api.github.com/repos/angular/angular/git/refs{/sha}", - "trees_url": "https://api.github.com/repos/angular/angular/git/trees{/sha}", - "statuses_url": "https://api.github.com/repos/angular/angular/statuses/{sha}", - "languages_url": "https://api.github.com/repos/angular/angular/languages", - "stargazers_url": "https://api.github.com/repos/angular/angular/stargazers", - "contributors_url": "https://api.github.com/repos/angular/angular/contributors", - "subscribers_url": "https://api.github.com/repos/angular/angular/subscribers", - "subscription_url": "https://api.github.com/repos/angular/angular/subscription", - "commits_url": "https://api.github.com/repos/angular/angular/commits{/sha}", - "git_commits_url": "https://api.github.com/repos/angular/angular/git/commits{/sha}", - "comments_url": "https://api.github.com/repos/angular/angular/comments{/number}", - "issue_comment_url": "https://api.github.com/repos/angular/angular/issues/comments{/number}", - "contents_url": "https://api.github.com/repos/angular/angular/contents/{+path}", - "compare_url": "https://api.github.com/repos/angular/angular/compare/{base}...{head}", - "merges_url": "https://api.github.com/repos/angular/angular/merges", - "archive_url": "https://api.github.com/repos/angular/angular/{archive_format}{/ref}", - "downloads_url": "https://api.github.com/repos/angular/angular/downloads", - "issues_url": "https://api.github.com/repos/angular/angular/issues{/number}", - "pulls_url": "https://api.github.com/repos/angular/angular/pulls{/number}", - "milestones_url": "https://api.github.com/repos/angular/angular/milestones{/number}", - "notifications_url": "https://api.github.com/repos/angular/angular/notifications{?since,all,participating}", - "labels_url": "https://api.github.com/repos/angular/angular/labels{/name}", - "releases_url": "https://api.github.com/repos/angular/angular/releases{/id}", - "deployments_url": "https://api.github.com/repos/angular/angular/deployments", - "created_at": "2014-09-18T16:12:01Z", - "updated_at": "2017-08-17T16:52:26Z", - "pushed_at": "2017-08-17T16:44:18Z", - "git_url": "git://github.com/angular/angular.git", - "ssh_url": "git@github.com:angular/angular.git", - "clone_url": "https://github.com/angular/angular.git", - "svn_url": "https://github.com/angular/angular", - "homepage": "https://angular.io", - "size": 64855, - "stargazers_count": 26993, - "watchers_count": 26993, - "language": "TypeScript", - "has_issues": true, - "has_projects": true, - "has_downloads": true, - "has_wiki": false, - "has_pages": false, - "forks_count": 6796, - "mirror_url": null, - "open_issues_count": 1860, - "forks": 6796, - "open_issues": 1860, - "watchers": 26993, - "default_branch": "master" - } - }, - "_links": { - "self": { - "href": "https://api.github.com/repos/angular/angular/pulls/18730" - }, - "html": { - "href": "https://github.com/angular/angular/pull/18730" - }, - "issue": { - "href": "https://api.github.com/repos/angular/angular/issues/18730" - }, - "comments": { - "href": "https://api.github.com/repos/angular/angular/issues/18730/comments" - }, - "review_comments": { - "href": "https://api.github.com/repos/angular/angular/pulls/18730/comments" - }, - "review_comment": { - "href": "https://api.github.com/repos/angular/angular/pulls/comments{/number}" - }, - "commits": { - "href": "https://api.github.com/repos/angular/angular/pulls/18730/commits" - }, - "statuses": { - "href": "https://api.github.com/repos/angular/angular/statuses/d59a5eec6cc60e301033300957f0c959b8056650" - } - }, - "merged": false, - "mergeable": true, - "rebaseable": true, - "mergeable_state": "clean", - "merged_by": null, - "comments": 0, - "review_comments": 2, - "maintainer_can_modify": true, - "commits": 1, - "additions": 1, - "deletions": 1, - "changed_files": 1 -}