diff --git a/src/services/gitService.ts b/src/services/gitService.ts index 8f18194..16614ba 100644 --- a/src/services/gitService.ts +++ b/src/services/gitService.ts @@ -224,8 +224,17 @@ const handleExistingBranch = async( = options; const { path: repoPath } = clonedRepo; - await runGitCommand(logger, repoPath, `git checkout ${branchName}`); - await runGitCommand(logger, repoPath, `git pull origin ${branchName}`); + // Delete local branch if it exists (stale from previous run) + const localBranches = await runGitCommand(logger, repoPath, "git branch"); + if (localBranches.includes(branchName)) { + await runGitCommand(logger, repoPath, `git branch -D ${branchName}`); + } + + await runGitCommand( + logger, + repoPath, + `git checkout -b ${branchName} origin/${branchName}`, + ); const currentVersion = await getCurrentVersionOnBranch(repoPath, packageName); diff --git a/test/services/gitService.spec.ts b/test/services/gitService.spec.ts index 1975d33..4ef22bd 100644 --- a/test/services/gitService.spec.ts +++ b/test/services/gitService.spec.ts @@ -203,6 +203,44 @@ describe("gitService", () => { expect(result.status).toBe("up-to-date"); }); + it("should delete stale local branch before checking out remote", async() => { + expect.assertions(2); + const branchDeleteCalls: Array = []; + mockExecAsync.mockImplementation((command: string) => { + if (command.includes("git branch -r")) { + return Promise.resolve({ + stderr: "", + stdout: " origin/dependencies/update-test-package\n", + }); + } + if (command.includes("git branch") && !command.includes("-")) { + // Return local branches including the stale one + return Promise.resolve({ + stderr: "", + stdout: "* main\n dependencies/update-test-package\n", + }); + } + if (command.includes("git branch -D")) { + branchDeleteCalls.push(command); + } + return Promise.resolve({ stderr: "", stdout: "" }); + }); + vi.mocked(readFile).mockResolvedValue(JSON.stringify({ + dependencies: { "test-package": "2.0.0" }, + })); + const { createOrUpdateBranch } = await import("../../src/services/gitService.js"); + const mockClonedRepo = createMockClonedRepo(); + const result = await createOrUpdateBranch({ + branchName: "dependencies/update-test-package", + clonedRepo: mockClonedRepo, + logger: mockLogger, + packageName: "test-package", + targetVersion: "2.0.0", + }); + expect(result.status).toBe("up-to-date"); + expect(branchDeleteCalls).toHaveLength(1); + }); + it("should fail when package is not found", async() => { expect.assertions(2); mockExecAsync.mockResolvedValue({ stderr: "", stdout: "" });