Compare commits

...

10 Commits

Author SHA1 Message Date
18f90432be build: update distribution (#1216)
Co-authored-by: peter-evans <peter-evans@users.noreply.github.com>
2022-08-18 17:29:42 +09:00
2721abb4d0 fix: handle nothing to commit when autocrlf is set (#1211) 2022-08-18 17:20:00 +09:00
20dac2ed48 build: update distribution (#1208)
Co-authored-by: peter-evans <peter-evans@users.noreply.github.com>
2022-08-17 12:37:21 +09:00
8557470a68 feat: support no_proxy environment variable (#1205)
Co-authored-by: TGANSTE <till.ganster@mercedes-benz.com>
2022-08-17 12:25:36 +09:00
10db75894f docs: add info about workflow permissions 2022-06-08 17:57:28 +09:00
5a6b15373e docs: clearer description of update behaviour 2022-06-08 17:30:26 +09:00
923ad837f1 force tryFetch (#1189) 2022-06-03 17:30:50 +09:00
f094b77505 fix: avoid issue with case sensitivity of repo names (#1179)
* fix: avoid issue with case sensitivity in condition

* chore: upgrade jest to v28
2022-05-08 17:37:36 +09:00
af7c021bb9 docs: shorten quote 2022-04-22 14:27:14 +09:00
97872c4843 docs: update GA quote/ref in concepts-guidelines.md (#1169)
* Update GA quote/ref in concepts-guidelines.md

The current quote and reference link appear to be out of date

* Change "Triggering further workflow runs" excerpt
2022-04-14 08:39:38 +09:00
10 changed files with 3985 additions and 1712 deletions

View File

@ -36,6 +36,13 @@ Create Pull Request action will:
You can also pin to a [specific release](https://github.com/peter-evans/create-pull-request/releases) version in the format `@v4.x.x`
### Workflow permissions
For this action to work you must explicitly allow GitHub Actions to create pull requests.
This setting can be found in a repository's settings under Actions > General > Workflow permissions.
For repositories belonging to an organization, this setting can be managed by admins in organization settings under Actions > General > Workflow permissions.
### Action inputs
All inputs are **optional**. If not set, sensible defaults will be used.
@ -106,7 +113,7 @@ How the action behaves:
- If there are changes (i.e. a diff exists with the checked-out base branch), the changes will be pushed to a new `branch` and a pull request created.
- If there are no changes (i.e. no diff exists with the checked-out base branch), no pull request will be created and the action exits silently.
- If a pull request already exists and there are no further changes (i.e. no diff with the current pull request branch) then the action exits silently.
- If a pull request already exists it will be updated if necessary. Local changes in the Actions workspace, or changes on the base branch, can cause an update. If no update is required the action exits silently.
- If a pull request exists and new changes on the base branch make the pull request unnecessary (i.e. there is no longer a diff between the pull request branch and the base), the pull request is automatically closed. Additionally, if `delete-branch` is set to `true` the `branch` will be deleted.
For further details about how the action works and usage guidelines, see [Concepts, guidelines and advanced usage](docs/concepts-guidelines.md).

View File

@ -10,7 +10,7 @@ if [[ "$(docker images -q $IMAGE 2> /dev/null)" == "" || $ARG1 == "build" ]]; th
cat > Dockerfile << EOF
FROM node:12-alpine
RUN apk --no-cache add git git-daemon
RUN npm install jest --global
RUN npm install jest jest-environment-jsdom --global
WORKDIR /cpr
COPY __test__/entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

28
dist/index.js vendored
View File

@ -39,6 +39,7 @@ exports.createOrUpdateBranch = exports.tryFetch = exports.getWorkingBaseAndType
const core = __importStar(__nccwpck_require__(2186));
const uuid_1 = __nccwpck_require__(5840);
const CHERRYPICK_EMPTY = 'The previous cherry-pick is now empty, possibly due to conflict resolution.';
const NOTHING_TO_COMMIT = 'nothing to commit, working tree clean';
var WorkingBaseType;
(function (WorkingBaseType) {
WorkingBaseType["Branch"] = "branch";
@ -62,7 +63,9 @@ exports.getWorkingBaseAndType = getWorkingBaseAndType;
function tryFetch(git, remote, branch) {
return __awaiter(this, void 0, void 0, function* () {
try {
yield git.fetch([`${branch}:refs/remotes/${remote}/${branch}`], remote);
yield git.fetch([`${branch}:refs/remotes/${remote}/${branch}`], remote, [
'--force'
]);
return true;
}
catch (_a) {
@ -136,7 +139,12 @@ function createOrUpdateBranch(git, commitMessage, base, branch, branchRemoteName
if (signoff) {
popts.push('--signoff');
}
yield git.commit(popts);
const commitResult = yield git.commit(popts, true);
// 'nothing to commit' can occur when core.autocrlf is set to true
if (commitResult.exitCode != 0 &&
!commitResult.stdout.includes(NOTHING_TO_COMMIT)) {
throw new Error(`Unexpected error: ${commitResult.stderr}`);
}
}
// Remove uncommitted tracked and untracked changes
yield git.exec(['reset', '--hard']);
@ -672,7 +680,7 @@ class GitCommandManager {
return yield this.exec(args, allowAllExitCodes);
});
}
commit(options) {
commit(options, allowAllExitCodes = false) {
return __awaiter(this, void 0, void 0, function* () {
const args = ['commit'];
if (this.identityGitOptions) {
@ -681,7 +689,7 @@ class GitCommandManager {
if (options) {
args.push(...options);
}
yield this.exec(args);
return yield this.exec(args, allowAllExitCodes);
});
}
config(configKey, configValue, globalConfig) {
@ -968,7 +976,7 @@ class GitHubHelper {
}
catch (e) {
if (e.message &&
e.message.includes(`A pull request already exists for ${headBranch}`)) {
e.message.includes(`A pull request already exists for`)) {
core.info(`A pull request already exists for ${headBranch}`);
}
else {
@ -1136,13 +1144,21 @@ const plugin_paginate_rest_1 = __nccwpck_require__(4193);
const plugin_rest_endpoint_methods_1 = __nccwpck_require__(3044);
const https_proxy_agent_1 = __nccwpck_require__(7219);
exports.Octokit = core_1.Octokit.plugin(plugin_paginate_rest_1.paginateRest, plugin_rest_endpoint_methods_1.restEndpointMethods, autoProxyAgent);
// Octokit plugin to support the https_proxy environment variable
// Octokit plugin to support the https_proxy and no_proxy environment variable
function autoProxyAgent(octokit) {
const proxy = process.env.https_proxy || process.env.HTTPS_PROXY;
const noProxy = process.env.no_proxy || process.env.NO_PROXY;
let noProxyArray = [];
if (noProxy) {
noProxyArray = noProxy.split(',');
}
if (!proxy)
return;
const agent = new https_proxy_agent_1.HttpsProxyAgent(proxy);
octokit.hook.before('request', options => {
if (noProxyArray.includes(options.request.hostname)) {
return;
}
options.request.agent = agent;
});
}

View File

@ -136,9 +136,9 @@ For further reading regarding the security of pull requests, see this GitHub blo
Pull requests created by the action using the default `GITHUB_TOKEN` cannot trigger other workflows. If you have `on: pull_request` or `on: push` workflows acting as checks on pull requests, they will not run.
> When you use the repository's GITHUB_TOKEN to perform tasks on behalf of the GitHub Actions app, events triggered by the GITHUB_TOKEN will not create a new workflow run.
> When you use the repository's `GITHUB_TOKEN` to perform tasks, events triggered by the `GITHUB_TOKEN` will not create a new workflow run. This prevents you from accidentally creating recursive workflow runs. For example, if a workflow run pushes code using the repository's `GITHUB_TOKEN`, a new workflow will not run even when the repository contains a workflow configured to run when `push` events occur.
[GitHub Actions: Events that trigger workflows](https://docs.github.com/en/actions/reference/events-that-trigger-workflows#triggering-new-workflows-using-a-personal-access-token)
[GitHub Actions: Triggering a workflow from a workflow](https://docs.github.com/en/actions/using-workflows/triggering-a-workflow#triggering-a-workflow-from-a-workflow)
#### Workarounds to trigger further workflow runs

5608
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -38,7 +38,7 @@
"uuid": "^8.3.2"
},
"devDependencies": {
"@types/jest": "^27.0.3",
"@types/jest": "^27.5.0",
"@types/node": "^16.11.11",
"@typescript-eslint/parser": "^5.5.0",
"@vercel/ncc": "^0.32.0",
@ -46,12 +46,13 @@
"eslint-import-resolver-typescript": "^2.5.0",
"eslint-plugin-github": "^4.3.5",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-jest": "^25.3.0",
"jest": "^27.4.3",
"jest-circus": "^27.4.2",
"eslint-plugin-jest": "^26.1.5",
"jest": "^28.1.0",
"jest-circus": "^28.1.0",
"jest-environment-jsdom": "^28.1.0",
"js-yaml": "^4.1.0",
"prettier": "^2.5.0",
"ts-jest": "^27.0.7",
"ts-jest": "^28.0.2",
"typescript": "^4.5.2"
}
}

View File

@ -4,6 +4,7 @@ import {v4 as uuidv4} from 'uuid'
const CHERRYPICK_EMPTY =
'The previous cherry-pick is now empty, possibly due to conflict resolution.'
const NOTHING_TO_COMMIT = 'nothing to commit, working tree clean'
export enum WorkingBaseType {
Branch = 'branch',
@ -33,7 +34,9 @@ export async function tryFetch(
branch: string
): Promise<boolean> {
try {
await git.fetch([`${branch}:refs/remotes/${remote}/${branch}`], remote)
await git.fetch([`${branch}:refs/remotes/${remote}/${branch}`], remote, [
'--force'
])
return true
} catch {
return false
@ -132,7 +135,14 @@ export async function createOrUpdateBranch(
if (signoff) {
popts.push('--signoff')
}
await git.commit(popts)
const commitResult = await git.commit(popts, true)
// 'nothing to commit' can occur when core.autocrlf is set to true
if (
commitResult.exitCode != 0 &&
!commitResult.stdout.includes(NOTHING_TO_COMMIT)
) {
throw new Error(`Unexpected error: ${commitResult.stderr}`)
}
}
// Remove uncommitted tracked and untracked changes

View File

@ -53,7 +53,10 @@ export class GitCommandManager {
return await this.exec(args, allowAllExitCodes)
}
async commit(options?: string[]): Promise<void> {
async commit(
options?: string[],
allowAllExitCodes = false
): Promise<GitOutput> {
const args = ['commit']
if (this.identityGitOptions) {
args.unshift(...this.identityGitOptions)
@ -63,7 +66,7 @@ export class GitCommandManager {
args.push(...options)
}
await this.exec(args)
return await this.exec(args, allowAllExitCodes)
}
async config(

View File

@ -67,7 +67,7 @@ export class GitHubHelper {
} catch (e: any) {
if (
e.message &&
e.message.includes(`A pull request already exists for ${headBranch}`)
e.message.includes(`A pull request already exists for`)
) {
core.info(`A pull request already exists for ${headBranch}`)
} else {

View File

@ -11,13 +11,23 @@ export const Octokit = Core.plugin(
autoProxyAgent
)
// Octokit plugin to support the https_proxy environment variable
// Octokit plugin to support the https_proxy and no_proxy environment variable
function autoProxyAgent(octokit: Core) {
const proxy = process.env.https_proxy || process.env.HTTPS_PROXY
const noProxy = process.env.no_proxy || process.env.NO_PROXY
let noProxyArray: string[] = []
if (noProxy) {
noProxyArray = noProxy.split(',')
}
if (!proxy) return
const agent = new HttpsProxyAgent(proxy)
octokit.hook.before('request', options => {
if (noProxyArray.includes(options.request.hostname)) {
return
}
options.request.agent = agent
})
}