Skip to content

Commit

Permalink
Add include-labels feature
Browse files Browse the repository at this point in the history
  • Loading branch information
peter-evans committed Oct 18, 2021
1 parent 0ac9ed6 commit 7ad71cc
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 5 deletions.
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -71,6 +71,7 @@ jobs:
| `repository` | The target GitHub repository containing the pull request. | `github.repository` (Current repository) |
| `head` | Filter pull requests by head user or head organization and branch name in the format `user:ref-name` or `organization:ref-name`. Use the `*` wildcard match any ref. e.g. `my-org:new-script-format` or `octocat:*`. | |
| `base` | Filter pull requests by base branch name. Example: `gh-pages`. | |
| `include-labels` | A comma or newline separated list of pull request labels to include. Allows any labels if unspecified. | |
| `exclude-labels` | A comma or newline separated list of pull request labels to exclude. | |
| `exclude-drafts` | Exclude draft pull requests. | `false` |

Expand Down
4 changes: 4 additions & 0 deletions action.yml
Expand Up @@ -15,6 +15,10 @@ inputs:
description: >
Filter pull requests by base branch name.
Example: gh-pages.
include-labels:
description: >
A comma or newline separated list of pull request labels to include.
Allows any labels if unspecified.
exclude-labels:
description: 'A comma or newline separated list of pull request labels to exclude'
exclude-drafts:
Expand Down
15 changes: 11 additions & 4 deletions dist/index.js
Expand Up @@ -5,7 +5,7 @@
/***/ ((module) => {

"use strict";
module.exports = JSON.parse('{"name":"@octokit/rest","version":"16.43.2","publishConfig":{"access":"public"},"description":"GitHub REST API client for Node.js","keywords":["octokit","github","rest","api-client"],"author":"Gregor Martynus (https://github.com/gr2m)","contributors":[{"name":"Mike de Boer","email":"info@mikedeboer.nl"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Joe Gallo","email":"joe@brassafrax.com"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"repository":"https://github.com/octokit/rest.js","dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^4.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^6.0.0","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"types":"index.d.ts","scripts":{"coverage":"nyc report --reporter=html && open coverage/index.html","lint":"prettier --check \'{lib,plugins,scripts,test}/**/*.{js,json,ts}\' \'docs/*.{js,json}\' \'docs/src/**/*\' index.js README.md package.json","lint:fix":"prettier --write \'{lib,plugins,scripts,test}/**/*.{js,json,ts}\' \'docs/*.{js,json}\' \'docs/src/**/*\' index.js README.md package.json","pretest":"npm run -s lint","test":"nyc mocha test/mocha-node-setup.js \\"test/*/**/*-test.js\\"","test:browser":"cypress run --browser chrome","build":"npm-run-all build:*","build:ts":"npm run -s update-endpoints:typescript","prebuild:browser":"mkdirp dist/","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","prevalidate:ts":"npm run -s build:ts","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","start-fixtures-server":"octokit-fixtures-server"},"license":"MIT","files":["index.js","index.d.ts","lib","plugins"],"nyc":{"ignore":["test"]},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}],"_resolved":"https://registry.npmjs.org/@octokit/rest/-/rest-16.43.2.tgz","_integrity":"sha512-ngDBevLbBTFfrHZeiS7SAMAZ6ssuVmXuya+F/7RaVvlysgGa1JKJkKWY+jV6TCJYcW0OALfJ7nTIGXcBXzycfQ==","_from":"@octokit/rest@16.43.2"}');
module.exports = JSON.parse('{"name":"@octokit/rest","version":"16.43.2","publishConfig":{"access":"public"},"description":"GitHub REST API client for Node.js","keywords":["octokit","github","rest","api-client"],"author":"Gregor Martynus (https://github.com/gr2m)","contributors":[{"name":"Mike de Boer","email":"info@mikedeboer.nl"},{"name":"Fabian Jakobs","email":"fabian@c9.io"},{"name":"Joe Gallo","email":"joe@brassafrax.com"},{"name":"Gregor Martynus","url":"https://github.com/gr2m"}],"repository":"https://github.com/octokit/rest.js","dependencies":{"@octokit/auth-token":"^2.4.0","@octokit/plugin-paginate-rest":"^1.1.1","@octokit/plugin-request-log":"^1.0.0","@octokit/plugin-rest-endpoint-methods":"2.4.0","@octokit/request":"^5.2.0","@octokit/request-error":"^1.0.2","atob-lite":"^2.0.0","before-after-hook":"^2.0.0","btoa-lite":"^1.0.0","deprecation":"^2.0.0","lodash.get":"^4.4.2","lodash.set":"^4.3.2","lodash.uniq":"^4.5.0","octokit-pagination-methods":"^1.1.0","once":"^1.4.0","universal-user-agent":"^4.0.0"},"devDependencies":{"@gimenete/type-writer":"^0.1.3","@octokit/auth":"^1.1.1","@octokit/fixtures-server":"^5.0.6","@octokit/graphql":"^4.2.0","@types/node":"^13.1.0","bundlesize":"^0.18.0","chai":"^4.1.2","compression-webpack-plugin":"^3.1.0","cypress":"^4.0.0","glob":"^7.1.2","http-proxy-agent":"^4.0.0","lodash.camelcase":"^4.3.0","lodash.merge":"^4.6.1","lodash.upperfirst":"^4.3.1","lolex":"^6.0.0","mkdirp":"^1.0.0","mocha":"^7.0.1","mustache":"^4.0.0","nock":"^11.3.3","npm-run-all":"^4.1.2","nyc":"^15.0.0","prettier":"^1.14.2","proxy":"^1.0.0","semantic-release":"^17.0.0","sinon":"^8.0.0","sinon-chai":"^3.0.0","sort-keys":"^4.0.0","string-to-arraybuffer":"^1.0.0","string-to-jsdoc-comment":"^1.0.0","typescript":"^3.3.1","webpack":"^4.0.0","webpack-bundle-analyzer":"^3.0.0","webpack-cli":"^3.0.0"},"types":"index.d.ts","scripts":{"coverage":"nyc report --reporter=html && open coverage/index.html","lint":"prettier --check \'{lib,plugins,scripts,test}/**/*.{js,json,ts}\' \'docs/*.{js,json}\' \'docs/src/**/*\' index.js README.md package.json","lint:fix":"prettier --write \'{lib,plugins,scripts,test}/**/*.{js,json,ts}\' \'docs/*.{js,json}\' \'docs/src/**/*\' index.js README.md package.json","pretest":"npm run -s lint","test":"nyc mocha test/mocha-node-setup.js \\"test/*/**/*-test.js\\"","test:browser":"cypress run --browser chrome","build":"npm-run-all build:*","build:ts":"npm run -s update-endpoints:typescript","prebuild:browser":"mkdirp dist/","build:browser":"npm-run-all build:browser:*","build:browser:development":"webpack --mode development --entry . --output-library=Octokit --output=./dist/octokit-rest.js --profile --json > dist/bundle-stats.json","build:browser:production":"webpack --mode production --entry . --plugin=compression-webpack-plugin --output-library=Octokit --output-path=./dist --output-filename=octokit-rest.min.js --devtool source-map","generate-bundle-report":"webpack-bundle-analyzer dist/bundle-stats.json --mode=static --no-open --report dist/bundle-report.html","update-endpoints":"npm-run-all update-endpoints:*","update-endpoints:fetch-json":"node scripts/update-endpoints/fetch-json","update-endpoints:typescript":"node scripts/update-endpoints/typescript","prevalidate:ts":"npm run -s build:ts","validate:ts":"tsc --target es6 --noImplicitAny index.d.ts","postvalidate:ts":"tsc --noEmit --target es6 test/typescript-validate.ts","start-fixtures-server":"octokit-fixtures-server"},"license":"MIT","files":["index.js","index.d.ts","lib","plugins"],"nyc":{"ignore":["test"]},"release":{"publish":["@semantic-release/npm",{"path":"@semantic-release/github","assets":["dist/*","!dist/*.map.gz"]}]},"bundlesize":[{"path":"./dist/octokit-rest.min.js.gz","maxSize":"33 kB"}]}');

/***/ }),

Expand Down Expand Up @@ -389,13 +389,14 @@ function run() {
repository: core.getInput('repository'),
head: core.getInput('head'),
base: core.getInput('base'),
includeLabels: utils.getInputAsArray('include-labels'),
excludeLabels: utils.getInputAsArray('exclude-labels'),
excludeDrafts: core.getInput('exclude-drafts') === 'true'
};
core.debug(`Inputs: ${util_1.inspect(inputs)}`);
const [headOwner, head] = inputValidator.parseHead(inputs.head);
const pullsHelper = new pulls_helper_1.PullsHelper(inputs.token);
const pulls = yield pullsHelper.get(inputs.repository, head, headOwner, inputs.base, inputs.excludeLabels, inputs.excludeDrafts);
const pulls = yield pullsHelper.get(inputs.repository, head, headOwner, inputs.base, inputs.includeLabels, inputs.excludeLabels, inputs.excludeDrafts);
if (pulls.length > 0) {
core.info(`${pulls.length} pull request(s) found.`);
// Checkout
Expand Down Expand Up @@ -482,7 +483,7 @@ class PullsHelper {
}
});
}
get(repository, head, headOwner, base, excludeLabels, excludeDrafts) {
get(repository, head, headOwner, base, includeLabels, excludeLabels, excludeDrafts) {
return __awaiter(this, void 0, void 0, function* () {
const [owner, repo] = repository.split('/');
const params = {
Expand Down Expand Up @@ -532,9 +533,15 @@ class PullsHelper {
// Filter heads from forks where 'maintainer can modify' is false
(p.node.headRepositoryOwner.login == owner ||
p.node.maintainerCanModify) &&
// Filter out pull requests that do not have labels in the include list
(includeLabels.length == 0 ||
p.node.labels.nodes.some(function (value) {
// At least one label is in the include list
return includeLabels.includes(value.name);
})) &&
// Filter out pull requests with labels in the exclude list
p.node.labels.nodes.every(function (value) {
// Label is not in the exclude list
// Every label is not in the exclude list
return !excludeLabels.includes(value.name);
}) &&
// Filter out drafts if set to exclude
Expand Down
2 changes: 2 additions & 0 deletions src/main.ts
Expand Up @@ -17,6 +17,7 @@ async function run(): Promise<void> {
repository: core.getInput('repository'),
head: core.getInput('head'),
base: core.getInput('base'),
includeLabels: utils.getInputAsArray('include-labels'),
excludeLabels: utils.getInputAsArray('exclude-labels'),
excludeDrafts: core.getInput('exclude-drafts') === 'true'
}
Expand All @@ -30,6 +31,7 @@ async function run(): Promise<void> {
head,
headOwner,
inputs.base,
inputs.includeLabels,
inputs.excludeLabels,
inputs.excludeDrafts
)
Expand Down
9 changes: 8 additions & 1 deletion src/pulls-helper.ts
Expand Up @@ -20,6 +20,7 @@ export class PullsHelper {
head: string,
headOwner: string,
base: string,
includeLabels: string[],
excludeLabels: string[],
excludeDrafts: boolean
): Promise<Pull[]> {
Expand Down Expand Up @@ -70,9 +71,15 @@ export class PullsHelper {
// Filter heads from forks where 'maintainer can modify' is false
(p.node.headRepositoryOwner.login == owner ||
p.node.maintainerCanModify) &&
// Filter out pull requests that do not have labels in the include list
(includeLabels.length == 0 ||
p.node.labels.nodes.some(function (value: Label): boolean {
// At least one label is in the include list
return includeLabels.includes(value.name)
})) &&
// Filter out pull requests with labels in the exclude list
p.node.labels.nodes.every(function (value: Label): boolean {
// Label is not in the exclude list
// Every label is not in the exclude list
return !excludeLabels.includes(value.name)
}) &&
// Filter out drafts if set to exclude
Expand Down

0 comments on commit 7ad71cc

Please sign in to comment.