mirror of
				https://code.forgejo.org/actions/checkout.git
				synced 2025-11-03 22:29:11 +00:00 
			
		
		
		
	Merge 0548471950 into ff7abcd0c3
				
					
				
			This commit is contained in:
		
						commit
						34471ff859
					
				
					 4 changed files with 248 additions and 5 deletions
				
			
		
							
								
								
									
										3
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -2,4 +2,5 @@ __test__/_temp
 | 
			
		|||
_temp/
 | 
			
		||||
lib/
 | 
			
		||||
node_modules/
 | 
			
		||||
.vscode/
 | 
			
		||||
.vscode/
 | 
			
		||||
.idea/
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -134,6 +134,7 @@ describe('Test fetchDepth and fetchTags options', () => {
 | 
			
		|||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        '--no-recurse-submodules',
 | 
			
		||||
        '--filter=filterValue',
 | 
			
		||||
| 
						 | 
				
			
			@ -248,6 +249,7 @@ describe('Test fetchDepth and fetchTags options', () => {
 | 
			
		|||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        '--no-recurse-submodules',
 | 
			
		||||
        '--filter=filterValue',
 | 
			
		||||
| 
						 | 
				
			
			@ -364,6 +366,7 @@ describe('Test fetchDepth and fetchTags options', () => {
 | 
			
		|||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        '--no-recurse-submodules',
 | 
			
		||||
        '--progress',
 | 
			
		||||
| 
						 | 
				
			
			@ -376,3 +379,225 @@ describe('Test fetchDepth and fetchTags options', () => {
 | 
			
		|||
    )
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
 | 
			
		||||
describe('Test git 2.48 tag fetching behavior', () => {
 | 
			
		||||
  beforeEach(async () => {
 | 
			
		||||
    jest.spyOn(fshelper, 'fileExistsSync').mockImplementation(jest.fn())
 | 
			
		||||
    jest.spyOn(fshelper, 'directoryExistsSync').mockImplementation(jest.fn())
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  afterEach(() => {
 | 
			
		||||
    jest.restoreAllMocks()
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('should perform separate tag fetch for git 2.48 when fetchTags is true', async () => {
 | 
			
		||||
    mockExec.mockImplementation((path, args, options) => {
 | 
			
		||||
      if (args.includes('version')) {
 | 
			
		||||
        options.listeners.stdout(Buffer.from('2.48.1'))
 | 
			
		||||
      }
 | 
			
		||||
      return 0
 | 
			
		||||
    })
 | 
			
		||||
    jest.spyOn(exec, 'exec').mockImplementation(mockExec)
 | 
			
		||||
 | 
			
		||||
    const workingDirectory = 'test'
 | 
			
		||||
    const lfs = false
 | 
			
		||||
    const doSparseCheckout = false
 | 
			
		||||
    git = await commandManager.createCommandManager(
 | 
			
		||||
      workingDirectory,
 | 
			
		||||
      lfs,
 | 
			
		||||
      doSparseCheckout
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    const refSpec = ['refspec1']
 | 
			
		||||
    const options = {
 | 
			
		||||
      fetchTags: true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await git.fetch(refSpec, options)
 | 
			
		||||
 | 
			
		||||
    // First call: main fetch with --no-tags
 | 
			
		||||
    expect(mockExec).toHaveBeenNthCalledWith(
 | 
			
		||||
      2, // First call is version check
 | 
			
		||||
      expect.any(String),
 | 
			
		||||
      [
 | 
			
		||||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--no-tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        '--no-recurse-submodules',
 | 
			
		||||
        'origin',
 | 
			
		||||
        'refspec1'
 | 
			
		||||
      ],
 | 
			
		||||
      expect.any(Object)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // Second call: separate tag fetch
 | 
			
		||||
    expect(mockExec).toHaveBeenNthCalledWith(
 | 
			
		||||
      3,
 | 
			
		||||
      expect.any(String),
 | 
			
		||||
      [
 | 
			
		||||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        'origin'
 | 
			
		||||
      ],
 | 
			
		||||
      expect.any(Object)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    expect(mockExec).toHaveBeenCalledTimes(3) // version + main fetch + tag fetch
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('should perform separate tag fetch with progress for git 2.48', async () => {
 | 
			
		||||
    mockExec.mockImplementation((path, args, options) => {
 | 
			
		||||
      if (args.includes('version')) {
 | 
			
		||||
        options.listeners.stdout(Buffer.from('2.48.0'))
 | 
			
		||||
      }
 | 
			
		||||
      return 0
 | 
			
		||||
    })
 | 
			
		||||
    jest.spyOn(exec, 'exec').mockImplementation(mockExec)
 | 
			
		||||
 | 
			
		||||
    const workingDirectory = 'test'
 | 
			
		||||
    const lfs = false
 | 
			
		||||
    const doSparseCheckout = false
 | 
			
		||||
    git = await commandManager.createCommandManager(
 | 
			
		||||
      workingDirectory,
 | 
			
		||||
      lfs,
 | 
			
		||||
      doSparseCheckout
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    const refSpec = ['refspec1']
 | 
			
		||||
    const options = {
 | 
			
		||||
      fetchTags: true,
 | 
			
		||||
      showProgress: true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await git.fetch(refSpec, options)
 | 
			
		||||
 | 
			
		||||
    // Main fetch with --no-tags and --progress
 | 
			
		||||
    expect(mockExec).toHaveBeenNthCalledWith(
 | 
			
		||||
      2,
 | 
			
		||||
      expect.any(String),
 | 
			
		||||
      [
 | 
			
		||||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--no-tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        '--no-recurse-submodules',
 | 
			
		||||
        '--progress',
 | 
			
		||||
        'origin',
 | 
			
		||||
        'refspec1'
 | 
			
		||||
      ],
 | 
			
		||||
      expect.any(Object)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // Separate tag fetch with --progress
 | 
			
		||||
    expect(mockExec).toHaveBeenNthCalledWith(
 | 
			
		||||
      3,
 | 
			
		||||
      expect.any(String),
 | 
			
		||||
      [
 | 
			
		||||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        '--progress',
 | 
			
		||||
        'origin'
 | 
			
		||||
      ],
 | 
			
		||||
      expect.any(Object)
 | 
			
		||||
    )
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('should NOT perform separate tag fetch for git 2.48 when fetchTags is false', async () => {
 | 
			
		||||
    mockExec.mockImplementation((path, args, options) => {
 | 
			
		||||
      if (args.includes('version')) {
 | 
			
		||||
        options.listeners.stdout(Buffer.from('2.48.1'))
 | 
			
		||||
      }
 | 
			
		||||
      return 0
 | 
			
		||||
    })
 | 
			
		||||
    jest.spyOn(exec, 'exec').mockImplementation(mockExec)
 | 
			
		||||
 | 
			
		||||
    const workingDirectory = 'test'
 | 
			
		||||
    const lfs = false
 | 
			
		||||
    const doSparseCheckout = false
 | 
			
		||||
    git = await commandManager.createCommandManager(
 | 
			
		||||
      workingDirectory,
 | 
			
		||||
      lfs,
 | 
			
		||||
      doSparseCheckout
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    const refSpec = ['refspec1']
 | 
			
		||||
    const options = {
 | 
			
		||||
      fetchTags: false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await git.fetch(refSpec, options)
 | 
			
		||||
 | 
			
		||||
    // Only one fetch call with --no-tags
 | 
			
		||||
    expect(mockExec).toHaveBeenNthCalledWith(
 | 
			
		||||
      2,
 | 
			
		||||
      expect.any(String),
 | 
			
		||||
      [
 | 
			
		||||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--no-tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        '--no-recurse-submodules',
 | 
			
		||||
        'origin',
 | 
			
		||||
        'refspec1'
 | 
			
		||||
      ],
 | 
			
		||||
      expect.any(Object)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    expect(mockExec).toHaveBeenCalledTimes(2) // version + single fetch only
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  it('should use normal behavior for non-2.48 git versions', async () => {
 | 
			
		||||
    mockExec.mockImplementation((path, args, options) => {
 | 
			
		||||
      if (args.includes('version')) {
 | 
			
		||||
        options.listeners.stdout(Buffer.from('2.47.0'))
 | 
			
		||||
      }
 | 
			
		||||
      return 0
 | 
			
		||||
    })
 | 
			
		||||
    jest.spyOn(exec, 'exec').mockImplementation(mockExec)
 | 
			
		||||
 | 
			
		||||
    const workingDirectory = 'test'
 | 
			
		||||
    const lfs = false
 | 
			
		||||
    const doSparseCheckout = false
 | 
			
		||||
    git = await commandManager.createCommandManager(
 | 
			
		||||
      workingDirectory,
 | 
			
		||||
      lfs,
 | 
			
		||||
      doSparseCheckout
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    const refSpec = ['refspec1']
 | 
			
		||||
    const options = {
 | 
			
		||||
      fetchTags: true
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    await git.fetch(refSpec, options)
 | 
			
		||||
 | 
			
		||||
    // Single fetch with --tags
 | 
			
		||||
    expect(mockExec).toHaveBeenNthCalledWith(
 | 
			
		||||
      2,
 | 
			
		||||
      expect.any(String),
 | 
			
		||||
      [
 | 
			
		||||
        '-c',
 | 
			
		||||
        'protocol.version=2',
 | 
			
		||||
        'fetch',
 | 
			
		||||
        '--tags',
 | 
			
		||||
        '--prune',
 | 
			
		||||
        '--no-recurse-submodules',
 | 
			
		||||
        'origin',
 | 
			
		||||
        'refspec1'
 | 
			
		||||
      ],
 | 
			
		||||
      expect.any(Object)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    expect(mockExec).toHaveBeenCalledTimes(2) // version + single fetch only
 | 
			
		||||
  })
 | 
			
		||||
})
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										4
									
								
								dist/index.js
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								dist/index.js
									
										
									
									
										vendored
									
									
								
							| 
						 | 
				
			
			@ -653,8 +653,8 @@ class GitCommandManager {
 | 
			
		|||
    fetch(refSpec, options) {
 | 
			
		||||
        return __awaiter(this, void 0, void 0, function* () {
 | 
			
		||||
            const args = ['-c', 'protocol.version=2', 'fetch'];
 | 
			
		||||
            if (!refSpec.some(x => x === refHelper.tagsRefSpec) && !options.fetchTags) {
 | 
			
		||||
                args.push('--no-tags');
 | 
			
		||||
            if (!refSpec.some(x => x === refHelper.tagsRefSpec)) {
 | 
			
		||||
                args.push(options.fetchTags ? '--tags' : '--no-tags');
 | 
			
		||||
            }
 | 
			
		||||
            args.push('--prune', '--no-recurse-submodules');
 | 
			
		||||
            if (options.showProgress) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -261,8 +261,12 @@ class GitCommandManager {
 | 
			
		|||
    }
 | 
			
		||||
  ): Promise<void> {
 | 
			
		||||
    const args = ['-c', 'protocol.version=2', 'fetch']
 | 
			
		||||
    if (!refSpec.some(x => x === refHelper.tagsRefSpec) && !options.fetchTags) {
 | 
			
		||||
      args.push('--no-tags')
 | 
			
		||||
    const hasTagsRefSpec = refSpec.some(x => x === refHelper.tagsRefSpec)
 | 
			
		||||
    const needsSeparateTagFetch = this.gitVersion.toString().startsWith('2.48') && options.fetchTags && !hasTagsRefSpec
 | 
			
		||||
 | 
			
		||||
    if (!hasTagsRefSpec) {
 | 
			
		||||
      // For git 2.48, skip --tags here if we need separate fetch
 | 
			
		||||
      args.push(needsSeparateTagFetch || !options.fetchTags ? '--no-tags' : '--tags')
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    args.push('--prune', '--no-recurse-submodules')
 | 
			
		||||
| 
						 | 
				
			
			@ -293,6 +297,19 @@ class GitCommandManager {
 | 
			
		|||
    await retryHelper.execute(async () => {
 | 
			
		||||
      await that.execGit(args)
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    // Separate tag fetch for git 2.48
 | 
			
		||||
    if (needsSeparateTagFetch) {
 | 
			
		||||
      const tagArgs = ['-c', 'protocol.version=2', 'fetch', '--tags', '--prune']
 | 
			
		||||
      if (options.showProgress) {
 | 
			
		||||
        tagArgs.push('--progress')
 | 
			
		||||
      }
 | 
			
		||||
      tagArgs.push('origin')
 | 
			
		||||
 | 
			
		||||
      await retryHelper.execute(async () => {
 | 
			
		||||
        await that.execGit(tagArgs)
 | 
			
		||||
      })
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async getDefaultBranch(repositoryUrl: string): Promise<string> {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue