Implement branch list using callbacks from exec function (#1045)
When trying to list local branches to figure out what needs cleaned up during runs on non-ephemeral Actions Runners, we use git rev-parse --symbolic-full-name to get a list of branches. This can lead to ambiguous ref name errors when there are branches and tags with similar names. Part of the reason we use rev-parse --symbolic-full-name vs git branch --list or git rev-parse --symbolic seems to related to a bug in Git 2.18. Until we can deprecate our usage of Git 2.18, I think we need to keep --symbolic-full-name. Since part of the problem is that these ambiguous ref name errors clog the Actions annotation limits, this is a mitigation to suppress those messages until we can get rid of the workaround.pull/1050/head
							parent
							
								
									755da8c3cf
								
							
						
					
					
						commit
						8856415920
					
				| @ -0,0 +1,80 @@ | ||||
| import * as exec from '@actions/exec' | ||||
| import * as fshelper from '../lib/fs-helper' | ||||
| import * as commandManager from '../lib/git-command-manager' | ||||
| 
 | ||||
| let git: commandManager.IGitCommandManager | ||||
| let mockExec = jest.fn() | ||||
| 
 | ||||
| describe('git-auth-helper tests', () => { | ||||
|   beforeAll(async () => {}) | ||||
| 
 | ||||
|   beforeEach(async () => { | ||||
|     jest.spyOn(fshelper, 'fileExistsSync').mockImplementation(jest.fn()) | ||||
|     jest.spyOn(fshelper, 'directoryExistsSync').mockImplementation(jest.fn()) | ||||
|   }) | ||||
| 
 | ||||
|   afterEach(() => { | ||||
|     jest.restoreAllMocks() | ||||
|   }) | ||||
| 
 | ||||
|   afterAll(() => {}) | ||||
| 
 | ||||
|   it('branch list matches', async () => { | ||||
|     mockExec.mockImplementation((path, args, options) => { | ||||
|       console.log(args, options.listeners.stdout) | ||||
| 
 | ||||
|       if (args.includes('version')) { | ||||
|         options.listeners.stdout(Buffer.from('2.18')) | ||||
|         return 0 | ||||
|       } | ||||
| 
 | ||||
|       if (args.includes('rev-parse')) { | ||||
|         options.listeners.stdline(Buffer.from('refs/heads/foo')) | ||||
|         options.listeners.stdline(Buffer.from('refs/heads/bar')) | ||||
|         return 0 | ||||
|       } | ||||
| 
 | ||||
|       return 1 | ||||
|     }) | ||||
|     jest.spyOn(exec, 'exec').mockImplementation(mockExec) | ||||
|     const workingDirectory = 'test' | ||||
|     const lfs = false | ||||
|     git = await commandManager.createCommandManager(workingDirectory, lfs) | ||||
| 
 | ||||
|     let branches = await git.branchList(false) | ||||
| 
 | ||||
|     expect(branches).toHaveLength(2) | ||||
|     expect(branches.sort()).toEqual(['foo', 'bar'].sort()) | ||||
|   }) | ||||
| 
 | ||||
|   it('ambiguous ref name output is captured', async () => { | ||||
|     mockExec.mockImplementation((path, args, options) => { | ||||
|       console.log(args, options.listeners.stdout) | ||||
| 
 | ||||
|       if (args.includes('version')) { | ||||
|         options.listeners.stdout(Buffer.from('2.18')) | ||||
|         return 0 | ||||
|       } | ||||
| 
 | ||||
|       if (args.includes('rev-parse')) { | ||||
|         options.listeners.stdline(Buffer.from('refs/heads/foo')) | ||||
|         // If refs/tags/v1 and refs/heads/tags/v1 existed on this repository
 | ||||
|         options.listeners.errline( | ||||
|           Buffer.from("error: refname 'tags/v1' is ambiguous") | ||||
|         ) | ||||
|         return 0 | ||||
|       } | ||||
| 
 | ||||
|       return 1 | ||||
|     }) | ||||
|     jest.spyOn(exec, 'exec').mockImplementation(mockExec) | ||||
|     const workingDirectory = 'test' | ||||
|     const lfs = false | ||||
|     git = await commandManager.createCommandManager(workingDirectory, lfs) | ||||
| 
 | ||||
|     let branches = await git.branchList(false) | ||||
| 
 | ||||
|     expect(branches).toHaveLength(1) | ||||
|     expect(branches.sort()).toEqual(['foo'].sort()) | ||||
|   }) | ||||
| }) | ||||
					Loading…
					
					
				
		Reference in New Issue