Skip to content
This repository was archived by the owner on May 23, 2025. It is now read-only.

Commit d8e9734

Browse files
committed
fix: ignore empty stash
Ignore "No stash entries found." when stashing is enabled but no files were actually stashed. Resolves: #55
1 parent 67192b9 commit d8e9734

File tree

2 files changed

+50
-1
lines changed

2 files changed

+50
-1
lines changed

src/perform-backmerge.test.ts

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,49 @@ describe("perform-backmerge", () => {
247247
verify(mockedGit.unstash()).calledAfter(pushAction);
248248
});
249249

250+
it("stash and unstash with empty stash", async () => {
251+
const mockedGit = mock(Git);
252+
const mockedLogger = mock(NullLogger);
253+
when(mockedGit.checkout(anyString())).thenResolve();
254+
when(mockedGit.configFetchAllRemotes()).thenResolve();
255+
when(mockedGit.getModifiedFiles())
256+
.thenReturn(new Promise<string[]>(resolve => resolve([])));
257+
when(mockedGit.fetch()).thenResolve();
258+
when(mockedGit.commit(anyString())).thenResolve();
259+
when(mockedGit.rebase(anyString())).thenResolve();
260+
const makeError = require('execa/lib/error')
261+
when(mockedGit.unstash()).thenThrow(makeError({
262+
stderr: 'No stash entries found.',
263+
parsed: {options:{timeout: 0}}
264+
}));
265+
when(mockedGit.push(anyString(), anyString(), anything())).thenResolve();
266+
267+
const context = {logger: instance(mockedLogger), branch: {name: 'master'}, options: {repositoryUrl: 'my-repo'}} as Context;
268+
269+
await performBackmerge(
270+
instance(mockedGit),
271+
{
272+
backmergeBranches: ['develop'],
273+
clearWorkspace: true,
274+
restoreWorkspace: true
275+
},
276+
context
277+
);
278+
verify(mockedLogger.log('Performing back-merge into develop branch "develop".')).once();
279+
verify(mockedGit.checkout('master')).once();
280+
verify(mockedGit.configFetchAllRemotes()).once();
281+
verify(mockedGit.fetch(context.options!.repositoryUrl)).once();
282+
283+
const checkoutDevelopAction = mockedGit.checkout('develop');
284+
verify(mockedGit.stash()).calledBefore(checkoutDevelopAction);
285+
verify(checkoutDevelopAction).once();
286+
verify(mockedGit.rebase('master')).once();
287+
288+
const pushAction = mockedGit.push('my-repo', 'develop', false)
289+
verify(pushAction).once();
290+
verify(mockedGit.unstash()).calledAfter(pushAction);
291+
});
292+
250293
it("merge as backmerge strategy", async () => {
251294
const mockedGit = mock(Git);
252295
const mockedLogger = mock(NullLogger);

src/perform-backmerge.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,13 @@ export async function performBackmerge(git: Git, pluginConfig: Partial<Config>,
130130

131131
if (options.restoreWorkspace) {
132132
context.logger.log('Restoring stashed files to Git workspace.');
133-
await git.unstash();
133+
try {
134+
await git.unstash();
135+
} catch (error: any) {
136+
if (error?.stderr !== 'No stash entries found.') {
137+
throw error;
138+
}
139+
}
134140
}
135141
}
136142

0 commit comments

Comments
 (0)