diff --git a/__test__/create-or-update-branch.int.test.ts b/__test__/create-or-update-branch.int.test.ts index aaa45bf..09fa8ae 100644 --- a/__test__/create-or-update-branch.int.test.ts +++ b/__test__/create-or-update-branch.int.test.ts @@ -245,6 +245,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(trackedContent) expect( @@ -273,6 +274,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_trackedContent) @@ -294,6 +296,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(UNTRACKED_FILE)).toEqual(untrackedContent) expect( @@ -322,6 +325,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(UNTRACKED_FILE)).toEqual(_untrackedContent) @@ -345,6 +349,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -374,6 +379,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('not-updated') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -395,6 +401,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -432,6 +439,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -463,6 +471,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -491,6 +500,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() expect(await getFileContent(TRACKED_FILE)).toEqual(defaultTrackedContent) @@ -512,6 +522,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -552,6 +563,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -579,6 +591,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -622,6 +635,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -647,6 +661,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -685,6 +700,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -707,6 +723,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(commits.changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual( @@ -738,6 +755,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_commits.changes.tracked) @@ -764,6 +782,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -799,6 +818,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -827,6 +847,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -870,6 +891,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -897,6 +919,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -926,6 +949,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -948,6 +972,7 @@ describe('create-or-update-branch tests', () => { true, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -984,6 +1009,7 @@ describe('create-or-update-branch tests', () => { true, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1013,6 +1039,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_MULTI ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1042,6 +1069,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_MULTI ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1064,6 +1092,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_WILDCARD ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1093,6 +1122,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_WILDCARD ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1115,10 +1145,55 @@ describe('create-or-update-branch tests', () => { false, ['nonexistent/*'] ) + await git.checkout(BRANCH) expect(result.action).toEqual('none') expect(await gitLogMatches([INIT_COMMIT_MESSAGE])).toBeTruthy() }) + it('tests create consecutive branches with restored changes from stash', async () => { + const BRANCHA = `${BRANCH}-a` + const BRANCHB = `${BRANCH}-b` + + // Create tracked and untracked file changes + const changes = await createChanges() + const commitMessage = uuidv4() + const resultA = await createOrUpdateBranch( + git, + commitMessage, + '', + BRANCHA, + REMOTE_NAME, + false, + ['a'] + ) + const resultB = await createOrUpdateBranch( + git, + commitMessage, + '', + BRANCHB, + REMOTE_NAME, + false, + ['b'] + ) + await git.checkout(BRANCHA) + expect(resultA.action).toEqual('created') + expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) + expect( + await gitLogMatches([commitMessage, INIT_COMMIT_MESSAGE]) + ).toBeTruthy() + await git.checkout(BRANCHB) + expect(resultB.action).toEqual('created') + expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) + expect( + await gitLogMatches([commitMessage, INIT_COMMIT_MESSAGE]) + ).toBeTruthy() + + // Delete the local branches + await git.checkout(DEFAULT_BRANCH) + await git.exec(['branch', '--delete', '--force', BRANCHA]) + await git.exec(['branch', '--delete', '--force', BRANCHB]) + }) + // Working Base is Not Base (WBNB) it('tests no changes resulting in no new branch being created (WBNB)', async () => { @@ -1135,6 +1210,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('none') expect(await gitLogMatches([INIT_COMMIT_MESSAGE])).toBeTruthy() }) @@ -1155,6 +1231,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(trackedContent) expect( @@ -1186,6 +1263,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_trackedContent) @@ -1210,6 +1288,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(UNTRACKED_FILE)).toEqual(untrackedContent) expect( @@ -1241,6 +1320,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(UNTRACKED_FILE)).toEqual(_untrackedContent) @@ -1267,6 +1347,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1299,6 +1380,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('not-updated') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1323,6 +1405,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1363,6 +1446,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1397,6 +1481,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1428,6 +1513,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() expect(await getFileContent(TRACKED_FILE)).toEqual(defaultTrackedContent) @@ -1454,6 +1540,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1497,6 +1584,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1527,6 +1615,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1573,6 +1662,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeFalsy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1601,6 +1691,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1642,6 +1733,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1667,6 +1759,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(commits.changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual( @@ -1701,6 +1794,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_commits.changes.tracked) @@ -1730,6 +1824,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1768,6 +1863,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1799,6 +1895,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1845,6 +1942,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1875,6 +1973,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1907,6 +2006,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1936,6 +2036,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -1969,6 +2070,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -1995,6 +2097,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(result.action).toEqual('created') expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) @@ -2036,6 +2139,7 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) expect(_result.action).toEqual('updated') expect(_result.hasDiffWithBase).toBeTruthy() expect(await getFileContent(TRACKED_FILE)).toEqual(_changes.tracked) @@ -2068,7 +2172,56 @@ describe('create-or-update-branch tests', () => { false, ADD_PATHS_DEFAULT ) + await git.checkout(BRANCH) // The action cannot successfully create the branch expect(result.action).toEqual('none') }) + + it('tests create consecutive branches with restored changes from stash in detached HEAD state (WBNR)', async () => { + // Checkout the HEAD commit SHA + const headSha = await git.revParse('HEAD') + await git.checkout(headSha) + + const BRANCHA = `${BRANCH}-a` + const BRANCHB = `${BRANCH}-b` + + // Create tracked and untracked file changes + const changes = await createChanges() + const commitMessage = uuidv4() + const resultA = await createOrUpdateBranch( + git, + commitMessage, + BASE, + BRANCHA, + REMOTE_NAME, + false, + ['a'] + ) + const resultB = await createOrUpdateBranch( + git, + commitMessage, + BASE, + BRANCHB, + REMOTE_NAME, + false, + ['b'] + ) + await git.checkout(BRANCHA) + expect(resultA.action).toEqual('created') + expect(await getFileContent(TRACKED_FILE)).toEqual(changes.tracked) + expect( + await gitLogMatches([commitMessage, INIT_COMMIT_MESSAGE]) + ).toBeTruthy() + await git.checkout(BRANCHB) + expect(resultB.action).toEqual('created') + expect(await getFileContent(UNTRACKED_FILE)).toEqual(changes.untracked) + expect( + await gitLogMatches([commitMessage, INIT_COMMIT_MESSAGE]) + ).toBeTruthy() + + // Delete the local branches + await git.checkout(DEFAULT_BRANCH) + await git.exec(['branch', '--delete', '--force', BRANCHA]) + await git.exec(['branch', '--delete', '--force', BRANCHB]) + }) }) diff --git a/dist/index.js b/dist/index.js index 0310109..571a907 100644 --- a/dist/index.js +++ b/dist/index.js @@ -162,9 +162,8 @@ function createOrUpdateBranch(git, commitMessage, base, branch, branchRemoteName throw new Error(`Unexpected error: ${commitResult.stderr}`); } } - // Remove uncommitted tracked and untracked changes - yield git.exec(['reset', '--hard']); - yield git.exec(['clean', '-f', '-d']); + // Stash any uncommitted tracked and untracked changes + const stashed = yield git.stashPush(['--include-untracked']); // Perform fetch and reset the working base // Commits made during the workflow will be removed if (workingBaseType == WorkingBaseType.Branch) { @@ -262,6 +261,12 @@ function createOrUpdateBranch(git, commitMessage, base, branch, branchRemoteName result.headSha = yield git.revParse('HEAD'); // Delete the temporary branch yield git.exec(['branch', '--delete', '--force', tempBranch]); + // Checkout the working base to leave the local repository as it was found + yield git.checkout(workingBase); + // Restore any stashed changes + if (stashed) { + yield git.stashPop(); + } return result; }); } @@ -434,7 +439,7 @@ function createPullRequest(inputs) { yield git.push([ '--force-with-lease', branchRemoteName, - `HEAD:refs/heads/${inputs.branch}` + `${inputs.branch}:refs/heads/${inputs.branch}` ]); core.endGroup(); } @@ -858,6 +863,25 @@ class GitCommandManager { return output.stdout.trim(); }); } + stashPush(options) { + return __awaiter(this, void 0, void 0, function* () { + const args = ['stash', 'push']; + if (options) { + args.push(...options); + } + const output = yield this.exec(args); + return output.stdout.trim() !== 'No local changes to save'; + }); + } + stashPop(options) { + return __awaiter(this, void 0, void 0, function* () { + const args = ['stash', 'pop']; + if (options) { + args.push(...options); + } + yield this.exec(args); + }); + } status(options) { return __awaiter(this, void 0, void 0, function* () { const args = ['status']; diff --git a/src/create-or-update-branch.ts b/src/create-or-update-branch.ts index ebdef12..cb1fcbb 100644 --- a/src/create-or-update-branch.ts +++ b/src/create-or-update-branch.ts @@ -106,6 +106,13 @@ function splitLines(multilineString: string): string[] { .filter(x => x !== '') } +interface CreateOrUpdateBranchResult { + action: string + base: string + hasDiffWithBase: boolean + headSha: string +} + export async function createOrUpdateBranch( git: GitCommandManager, commitMessage: string, @@ -163,9 +170,8 @@ export async function createOrUpdateBranch( } } - // Remove uncommitted tracked and untracked changes - await git.exec(['reset', '--hard']) - await git.exec(['clean', '-f', '-d']) + // Stash any uncommitted tracked and untracked changes + const stashed = await git.stashPush(['--include-untracked']) // Perform fetch and reset the working base // Commits made during the workflow will be removed @@ -283,12 +289,13 @@ export async function createOrUpdateBranch( // Delete the temporary branch await git.exec(['branch', '--delete', '--force', tempBranch]) + // Checkout the working base to leave the local repository as it was found + await git.checkout(workingBase) + + // Restore any stashed changes + if (stashed) { + await git.stashPop() + } + return result } - -interface CreateOrUpdateBranchResult { - action: string - base: string - hasDiffWithBase: boolean - headSha: string -} diff --git a/src/create-pull-request.ts b/src/create-pull-request.ts index 3fa3ec2..83bf8bc 100644 --- a/src/create-pull-request.ts +++ b/src/create-pull-request.ts @@ -195,7 +195,7 @@ export async function createPullRequest(inputs: Inputs): Promise { await git.push([ '--force-with-lease', branchRemoteName, - `HEAD:refs/heads/${inputs.branch}` + `${inputs.branch}:refs/heads/${inputs.branch}` ]) core.endGroup() } diff --git a/src/git-command-manager.ts b/src/git-command-manager.ts index 87a6dd9..5ab6972 100644 --- a/src/git-command-manager.ts +++ b/src/git-command-manager.ts @@ -210,6 +210,23 @@ export class GitCommandManager { return output.stdout.trim() } + async stashPush(options?: string[]): Promise { + const args = ['stash', 'push'] + if (options) { + args.push(...options) + } + const output = await this.exec(args) + return output.stdout.trim() !== 'No local changes to save' + } + + async stashPop(options?: string[]): Promise { + const args = ['stash', 'pop'] + if (options) { + args.push(...options) + } + await this.exec(args) + } + async status(options?: string[]): Promise { const args = ['status'] if (options) {