From 42e0b1659343a9e06f65fb1a0db3c6ab3218d9f8 Mon Sep 17 00:00:00 2001 From: Peter Evans <18365890+peter-evans@users.noreply.github.com> Date: Tue, 22 Mar 2022 12:26:00 +0900 Subject: [PATCH] feat: allow add-paths to resolve to no changes --- README.md | 3 +- __test__/create-or-update-branch.int.test.ts | 186 +++++++++++++------ action.yml | 2 - dist/index.js | 36 ++-- docs/updating.md | 2 + src/create-or-update-branch.ts | 23 ++- src/git-command-manager.ts | 13 +- 7 files changed, 176 insertions(+), 89 deletions(-) diff --git a/README.md b/README.md index f2a42b0..35f2783 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ All inputs are **optional**. If not set, sensible defaults will be used. | --- | --- | --- | | `token` | `GITHUB_TOKEN` (permissions `contents: write` and `pull-requests: write`) or a `repo` scoped [Personal Access Token (PAT)](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token). | `GITHUB_TOKEN` | | `path` | Relative path under `GITHUB_WORKSPACE` to the repository. | `GITHUB_WORKSPACE` | -| `add-paths` | A comma or newline-separated list of file paths to commit. Paths should follow git's [pathspec](https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec) syntax. Defaults to adding all new and modified files. See [Add specific paths](#add-specific-paths). | `-A` | +| `add-paths` | A comma or newline-separated list of file paths to commit. Paths should follow git's [pathspec](https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec) syntax. If no paths are specified, all new and modified files are added. See [Add specific paths](#add-specific-paths). | | | `commit-message` | The message to use when committing changes. | `[create-pull-request] automated change` | | `committer` | The committer name and email address in the format `Display Name `. Defaults to the GitHub Actions bot user. | `GitHub ` | | `author` | The author name and email address in the format `Display Name `. Defaults to the user who triggered the workflow run. | `${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>` | @@ -147,7 +147,6 @@ If there are files or directories you want to ignore you can simply add them to You can control which files are committed with the `add-paths` input. Paths should follow git's [pathspec](https://git-scm.com/docs/gitglossary#Documentation/gitglossary.txt-aiddefpathspecapathspec) syntax. -Each path must resolve to a least one new or modified file to add. All file changes that do not match one of the paths will be discarded. ```yml diff --git a/__test__/create-or-update-branch.int.test.ts b/__test__/create-or-update-branch.int.test.ts index 49db5bf..213dc83 100644 --- a/__test__/create-or-update-branch.int.test.ts +++ b/__test__/create-or-update-branch.int.test.ts @@ -11,8 +11,8 @@ import {v4 as uuidv4} from 'uuid' const REPO_PATH = '/git/local/test-base' const REMOTE_NAME = 'origin' -const TRACKED_FILE = 'tracked-file.txt' -const UNTRACKED_FILE = 'untracked-file.txt' +const TRACKED_FILE = 'a/tracked-file.txt' +const UNTRACKED_FILE = 'b/untracked-file.txt' const DEFAULT_BRANCH = 'tests/master' const NOT_BASE_BRANCH = 'tests/branch-that-is-not-the-base' @@ -25,12 +25,14 @@ const BASE = DEFAULT_BRANCH const FORK_REMOTE_URL = 'git://127.0.0.1/test-fork.git' const FORK_REMOTE_NAME = 'fork' -const ADD_PATHS = ['-A'] -const ADD_PATHS_WILDCARD = ['*.txt'] +const ADD_PATHS_DEFAULT = [] +const ADD_PATHS_MULTI = ['a', 'b'] +const ADD_PATHS_WILDCARD = ['a/*.txt', 'b/*.txt'] async function createFile(filename: string, content?: string): Promise { const _content = content ? content : uuidv4() const filepath = path.join(REPO_PATH, filename) + await fs.promises.mkdir(path.dirname(filepath), {recursive: true}) await fs.promises.writeFile(filepath, _content, {encoding: 'utf8'}) return _content } @@ -224,7 +226,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('none') expect(await gitLogMatches([INIT_COMMIT_MESSAGE])).toBeTruthy() @@ -241,7 +243,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(trackedContent) @@ -269,7 +271,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -290,7 +292,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(UNTRACKED_FILE)).toEqual(untrackedContent) @@ -318,7 +320,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -341,7 +343,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -370,7 +372,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('not-updated') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -391,7 +393,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -428,7 +430,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -459,7 +461,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -487,7 +489,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() @@ -508,7 +510,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -548,7 +550,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() @@ -575,7 +577,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -618,7 +620,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() @@ -640,7 +642,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(commits.changes.tracked) @@ -671,7 +673,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -697,7 +699,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -732,7 +734,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -760,7 +762,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -803,7 +805,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -830,7 +832,7 @@ describe('create-or-update-branch tests', () => { BRANCH, FORK_REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -859,7 +861,7 @@ describe('create-or-update-branch tests', () => { BRANCH, FORK_REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -881,7 +883,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, true, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -917,7 +919,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, true, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -935,9 +937,58 @@ describe('create-or-update-branch tests', () => { ) }) - it('tests create and update with wildcard add-paths', async () => { - // The pull request branch will not be updated + it('tests create and update with multiple add-paths', async () => { + // Create tracked and untracked file changes + const changes = await createChanges() + const commitMessage = uuidv4() + const result = await createOrUpdateBranch( + git, + commitMessage, + '', + BRANCH, + REMOTE_NAME, + false, + ADD_PATHS_MULTI + ) + expect(result.action).toEqual('created') + expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) + expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) + expect( + await gitLogMatches([commitMessage, INIT_COMMIT_MESSAGE]) + ).toBeTruthy() + // Push pull request branch to remote + await git.push([ + '--force-with-lease', + REMOTE_NAME, + `HEAD:refs/heads/${BRANCH}` + ]) + + await afterTest(false) + await beforeTest() + + // Create tracked and untracked file changes + const _changes = await createChanges() + const _commitMessage = uuidv4() + const _result = await createOrUpdateBranch( + git, + _commitMessage, + '', + BRANCH, + REMOTE_NAME, + false, + ADD_PATHS_MULTI + ) + expect(_result.action).toEqual('updated') + expect(_result.hasDiffWithBase).toBeTruthy() + expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) + expect(await getFileContent(UNTRACKED_FILE)).toEqual(_changes.untracked) + expect( + await gitLogMatches([_commitMessage, INIT_COMMIT_MESSAGE]) + ).toBeTruthy() + }) + + it('tests create and update with wildcard add-paths', async () => { // Create tracked and untracked file changes const changes = await createChanges() const commitMessage = uuidv4() @@ -988,6 +1039,23 @@ describe('create-or-update-branch tests', () => { ).toBeTruthy() }) + it('tests create with add-paths resolving to no changes when other changes exist', async () => { + // Create tracked and untracked file changes + await createChanges() + const commitMessage = uuidv4() + const result = await createOrUpdateBranch( + git, + commitMessage, + '', + BRANCH, + REMOTE_NAME, + false, + ['nonexistent/*'] + ) + expect(result.action).toEqual('none') + expect(await gitLogMatches([INIT_COMMIT_MESSAGE])).toBeTruthy() + }) + // Working Base is Not Base (WBNB) it('tests no changes resulting in no new branch being created (WBNB)', async () => { @@ -1002,7 +1070,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('none') expect(await gitLogMatches([INIT_COMMIT_MESSAGE])).toBeTruthy() @@ -1022,7 +1090,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(trackedContent) @@ -1053,7 +1121,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1077,7 +1145,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(UNTRACKED_FILE)).toEqual(untrackedContent) @@ -1108,7 +1176,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1134,7 +1202,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1166,7 +1234,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('not-updated') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1190,7 +1258,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1230,7 +1298,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1264,7 +1332,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1295,7 +1363,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() @@ -1321,7 +1389,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1364,7 +1432,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() @@ -1394,7 +1462,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1440,7 +1508,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() @@ -1465,7 +1533,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(commits.changes.tracked) @@ -1499,7 +1567,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1528,7 +1596,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1566,7 +1634,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1597,7 +1665,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1643,7 +1711,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1673,7 +1741,7 @@ describe('create-or-update-branch tests', () => { BRANCH, FORK_REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1705,7 +1773,7 @@ describe('create-or-update-branch tests', () => { BRANCH, FORK_REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1734,7 +1802,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1767,7 +1835,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1793,7 +1861,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) @@ -1834,7 +1902,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() @@ -1866,7 +1934,7 @@ describe('create-or-update-branch tests', () => { BRANCH, REMOTE_NAME, false, - ADD_PATHS + ADD_PATHS_DEFAULT ) // The action cannot successfully create the branch expect(result.action).toEqual('none') diff --git a/action.yml b/action.yml index 09290a8..4cb37f6 100644 --- a/action.yml +++ b/action.yml @@ -13,8 +13,6 @@ inputs: A comma or newline-separated list of file paths to commit. Paths should follow git's pathspec syntax. Defaults to adding all new and modified files. - default: | - -A commit-message: description: 'The message to use when committing changes.' default: '[create-pull-request] automated change' diff --git a/dist/index.js b/dist/index.js index 6144a21..790a920 100644 --- a/dist/index.js +++ b/dist/index.js @@ -122,20 +122,25 @@ function createOrUpdateBranch(git, commitMessage, base, branch, branchRemoteName const tempBranch = (0, uuid_1.v4)(); yield git.checkout(tempBranch, 'HEAD'); // Commit any uncommitted changes - if (yield git.isDirty(true)) { + if (yield git.isDirty(true, addPaths)) { core.info('Uncommitted changes found. Adding a commit.'); - for (const path of addPaths) { - yield git.exec(['add', path], true); + const aopts = ['add']; + if (addPaths.length > 0) { + aopts.push(...['--', ...addPaths]); } - const params = ['-m', commitMessage]; + else { + aopts.push('-A'); + } + yield git.exec(aopts, true); + const popts = ['-m', commitMessage]; if (signoff) { - params.push('--signoff'); + popts.push('--signoff'); } - yield git.commit(params); - // Remove uncommitted tracked and untracked changes - yield git.exec(['reset', '--hard']); - yield git.exec(['clean', '-f']); + yield git.commit(popts); } + // Remove uncommitted tracked and untracked changes + yield git.exec(['reset', '--hard']); + yield git.exec(['clean', '-f', '-d']); // Perform fetch and reset the working base // Commits made during the workflow will be removed if (workingBaseType == WorkingBaseType.Branch) { @@ -752,18 +757,23 @@ class GitCommandManager { return output.exitCode === 1; }); } - isDirty(untracked) { + isDirty(untracked, pathspec) { return __awaiter(this, void 0, void 0, function* () { + const pathspecArgs = pathspec ? ['--', ...pathspec] : []; // Check untracked changes - if (untracked && (yield this.status(['--porcelain', '-unormal']))) { + const sargs = ['--porcelain', '-unormal']; + sargs.push(...pathspecArgs); + if (untracked && (yield this.status(sargs))) { return true; } // Check working index changes - if (yield this.hasDiff()) { + if (yield this.hasDiff(pathspecArgs)) { return true; } // Check staged changes - if (yield this.hasDiff(['--staged'])) { + const dargs = ['--staged']; + dargs.push(...pathspecArgs); + if (yield this.hasDiff(dargs)) { return true; } return false; diff --git a/docs/updating.md b/docs/updating.md index b33423c..980ed58 100644 --- a/docs/updating.md +++ b/docs/updating.md @@ -2,6 +2,8 @@ ### Breaking changes +- The `add-paths` input no longer accepts `-A` as a valid value. When committing all new and modified files the `add-paths` input should be omitted. + - If using self-hosted runners or GitHub Enterprise Server, there are minimum requirements for `v4` to run. See "What's new" below for details. ### What's new diff --git a/src/create-or-update-branch.ts b/src/create-or-update-branch.ts index 5dafc0d..cfb60bc 100644 --- a/src/create-or-update-branch.ts +++ b/src/create-or-update-branch.ts @@ -119,21 +119,26 @@ export async function createOrUpdateBranch( const tempBranch = uuidv4() await git.checkout(tempBranch, 'HEAD') // Commit any uncommitted changes - if (await git.isDirty(true)) { + if (await git.isDirty(true, addPaths)) { core.info('Uncommitted changes found. Adding a commit.') - for (const path of addPaths) { - await git.exec(['add', path], true) + const aopts = ['add'] + if (addPaths.length > 0) { + aopts.push(...['--', ...addPaths]) + } else { + aopts.push('-A') } - const params = ['-m', commitMessage] + await git.exec(aopts, true) + const popts = ['-m', commitMessage] if (signoff) { - params.push('--signoff') + popts.push('--signoff') } - await git.commit(params) - // Remove uncommitted tracked and untracked changes - await git.exec(['reset', '--hard']) - await git.exec(['clean', '-f']) + await git.commit(popts) } + // Remove uncommitted tracked and untracked changes + await git.exec(['reset', '--hard']) + await git.exec(['clean', '-f', '-d']) + // Perform fetch and reset the working base // Commits made during the workflow will be removed if (workingBaseType == WorkingBaseType.Branch) { diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts index 367f796..d9c9164 100644 --- a/src/git-command-manager.ts +++ b/src/git-command-manager.ts @@ -155,17 +155,22 @@ export class GitCommandManager { return output.exitCode === 1 } - async isDirty(untracked: boolean): Promise { + async isDirty(untracked: boolean, pathspec?: string[]): Promise { + const pathspecArgs = pathspec ? ['--', ...pathspec] : [] // Check untracked changes - if (untracked && (await this.status(['--porcelain', '-unormal']))) { + const sargs = ['--porcelain', '-unormal'] + sargs.push(...pathspecArgs) + if (untracked && (await this.status(sargs))) { return true } // Check working index changes - if (await this.hasDiff()) { + if (await this.hasDiff(pathspecArgs)) { return true } // Check staged changes - if (await this.hasDiff(['--staged'])) { + const dargs = ['--staged'] + dargs.push(...pathspecArgs) + if (await this.hasDiff(dargs)) { return true } return false