mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-31 05:25:55 +08:00 
			
		
		
		
	Fix: Checkout fail in self-hosted runners when faulty submodule are checked-in (#1196)
* Fix Self hosted runner issue wrt bad submodules - solution cleanup working space. * Fix format with npm run format output * Add mock implementation for new function submoduleStatus * Add 2 test cases for submodule status. * Codeql-Action Analyse revert v1 to v2 --------- Co-authored-by: Bassem Dghaidi <568794+Link-@users.noreply.github.com> Co-authored-by: sminnie <minnie@sankhe.com>
This commit is contained in:
		| @@ -281,6 +281,65 @@ describe('git-directory-helper tests', () => { | ||||
|     expect(git.branchDelete).toHaveBeenCalledWith(false, 'local-branch-2') | ||||
|   }) | ||||
|  | ||||
|   const cleanWhenSubmoduleStatusIsFalse = | ||||
|     'cleans when submodule status is false' | ||||
|  | ||||
|   it(cleanWhenSubmoduleStatusIsFalse, async () => { | ||||
|     // Arrange | ||||
|     await setup(cleanWhenSubmoduleStatusIsFalse) | ||||
|     await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '') | ||||
|  | ||||
|     //mock bad submodule | ||||
|  | ||||
|     const submoduleStatus = git.submoduleStatus as jest.Mock<any, any> | ||||
|     submoduleStatus.mockImplementation(async (remote: boolean) => { | ||||
|       return false | ||||
|     }) | ||||
|  | ||||
|     // Act | ||||
|     await gitDirectoryHelper.prepareExistingDirectory( | ||||
|       git, | ||||
|       repositoryPath, | ||||
|       repositoryUrl, | ||||
|       clean, | ||||
|       ref | ||||
|     ) | ||||
|  | ||||
|     // Assert | ||||
|     const files = await fs.promises.readdir(repositoryPath) | ||||
|     expect(files).toHaveLength(0) | ||||
|     expect(git.tryClean).toHaveBeenCalled() | ||||
|   }) | ||||
|  | ||||
|   const doesNotCleanWhenSubmoduleStatusIsTrue = | ||||
|     'does not clean when submodule status is true' | ||||
|  | ||||
|   it(doesNotCleanWhenSubmoduleStatusIsTrue, async () => { | ||||
|     // Arrange | ||||
|     await setup(doesNotCleanWhenSubmoduleStatusIsTrue) | ||||
|     await fs.promises.writeFile(path.join(repositoryPath, 'my-file'), '') | ||||
|  | ||||
|     const submoduleStatus = git.submoduleStatus as jest.Mock<any, any> | ||||
|     submoduleStatus.mockImplementation(async (remote: boolean) => { | ||||
|       return true | ||||
|     }) | ||||
|  | ||||
|     // Act | ||||
|     await gitDirectoryHelper.prepareExistingDirectory( | ||||
|       git, | ||||
|       repositoryPath, | ||||
|       repositoryUrl, | ||||
|       clean, | ||||
|       ref | ||||
|     ) | ||||
|  | ||||
|     // Assert | ||||
|  | ||||
|     const files = await fs.promises.readdir(repositoryPath) | ||||
|     expect(files.sort()).toEqual(['.git', 'my-file']) | ||||
|     expect(git.tryClean).toHaveBeenCalled() | ||||
|   }) | ||||
|  | ||||
|   const removesLockFiles = 'removes lock files' | ||||
|   it(removesLockFiles, async () => { | ||||
|     // Arrange | ||||
| @@ -423,6 +482,9 @@ async function setup(testName: string): Promise<void> { | ||||
|     submoduleForeach: jest.fn(), | ||||
|     submoduleSync: jest.fn(), | ||||
|     submoduleUpdate: jest.fn(), | ||||
|     submoduleStatus: jest.fn(async () => { | ||||
|       return true | ||||
|     }), | ||||
|     tagExists: jest.fn(), | ||||
|     tryClean: jest.fn(async () => { | ||||
|       return true | ||||
|   | ||||
		Reference in New Issue
	
	Block a user