group output (#191)
This commit is contained in:
		@@ -173,7 +173,7 @@ class GitAuthHelper {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  async removeGlobalAuth(): Promise<void> {
 | 
			
		||||
    core.info(`Unsetting HOME override`)
 | 
			
		||||
    core.debug(`Unsetting HOME override`)
 | 
			
		||||
    this.git.removeEnvironmentVariable('HOME')
 | 
			
		||||
    await io.rmRF(this.temporaryHomePath)
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,11 @@
 | 
			
		||||
import * as assert from 'assert'
 | 
			
		||||
import * as core from '@actions/core'
 | 
			
		||||
import * as fs from 'fs'
 | 
			
		||||
import * as fsHelper from './fs-helper'
 | 
			
		||||
import * as io from '@actions/io'
 | 
			
		||||
import * as path from 'path'
 | 
			
		||||
import {IGitCommandManager} from './git-command-manager'
 | 
			
		||||
import {IGitSourceSettings} from './git-source-settings'
 | 
			
		||||
 | 
			
		||||
export async function prepareExistingDirectory(
 | 
			
		||||
  git: IGitCommandManager | undefined,
 | 
			
		||||
@@ -11,6 +13,10 @@ export async function prepareExistingDirectory(
 | 
			
		||||
  repositoryUrl: string,
 | 
			
		||||
  clean: boolean
 | 
			
		||||
): Promise<void> {
 | 
			
		||||
  assert.ok(repositoryPath, 'Expected repositoryPath to be defined')
 | 
			
		||||
  assert.ok(repositoryUrl, 'Expected repositoryUrl to be defined')
 | 
			
		||||
 | 
			
		||||
  // Indicates whether to delete the directory contents
 | 
			
		||||
  let remove = false
 | 
			
		||||
 | 
			
		||||
  // Check whether using git or REST API
 | 
			
		||||
@@ -38,6 +44,7 @@ export async function prepareExistingDirectory(
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
      core.startGroup('Removing previously created refs, to avoid conflicts')
 | 
			
		||||
      // Checkout detached HEAD
 | 
			
		||||
      if (!(await git.isDetached())) {
 | 
			
		||||
        await git.checkoutDetach()
 | 
			
		||||
@@ -54,9 +61,11 @@ export async function prepareExistingDirectory(
 | 
			
		||||
      for (const branch of branches) {
 | 
			
		||||
        await git.branchDelete(true, branch)
 | 
			
		||||
      }
 | 
			
		||||
      core.endGroup()
 | 
			
		||||
 | 
			
		||||
      // Clean
 | 
			
		||||
      if (clean) {
 | 
			
		||||
        core.startGroup('Cleaning the repository')
 | 
			
		||||
        if (!(await git.tryClean())) {
 | 
			
		||||
          core.debug(
 | 
			
		||||
            `The clean command failed. This might be caused by: 1) path too long, 2) permission issue, or 3) file in use. For futher investigation, manually run 'git clean -ffdx' on the directory '${repositoryPath}'.`
 | 
			
		||||
@@ -65,6 +74,7 @@ export async function prepareExistingDirectory(
 | 
			
		||||
        } else if (!(await git.tryReset())) {
 | 
			
		||||
          remove = true
 | 
			
		||||
        }
 | 
			
		||||
        core.endGroup()
 | 
			
		||||
 | 
			
		||||
        if (remove) {
 | 
			
		||||
          core.warning(
 | 
			
		||||
 
 | 
			
		||||
@@ -32,7 +32,9 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Git command manager
 | 
			
		||||
  core.startGroup('Getting Git version info')
 | 
			
		||||
  const git = await getGitCommandManager(settings)
 | 
			
		||||
  core.endGroup()
 | 
			
		||||
 | 
			
		||||
  // Prepare existing directory, otherwise recreate
 | 
			
		||||
  if (isExisting) {
 | 
			
		||||
@@ -78,21 +80,27 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
 | 
			
		||||
  if (
 | 
			
		||||
    !fsHelper.directoryExistsSync(path.join(settings.repositoryPath, '.git'))
 | 
			
		||||
  ) {
 | 
			
		||||
    core.startGroup('Initializing the repository')
 | 
			
		||||
    await git.init()
 | 
			
		||||
    await git.remoteAdd('origin', repositoryUrl)
 | 
			
		||||
    core.endGroup()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // Disable automatic garbage collection
 | 
			
		||||
  core.startGroup('Disabling automatic garbage collection')
 | 
			
		||||
  if (!(await git.tryDisableAutomaticGarbageCollection())) {
 | 
			
		||||
    core.warning(
 | 
			
		||||
      `Unable to turn off git automatic garbage collection. The git fetch operation may trigger garbage collection and cause a delay.`
 | 
			
		||||
    )
 | 
			
		||||
  }
 | 
			
		||||
  core.endGroup()
 | 
			
		||||
 | 
			
		||||
  const authHelper = gitAuthHelper.createAuthHelper(git, settings)
 | 
			
		||||
  try {
 | 
			
		||||
    // Configure auth
 | 
			
		||||
    core.startGroup('Setting up auth')
 | 
			
		||||
    await authHelper.configureAuth()
 | 
			
		||||
    core.endGroup()
 | 
			
		||||
 | 
			
		||||
    // LFS install
 | 
			
		||||
    if (settings.lfs) {
 | 
			
		||||
@@ -100,33 +108,44 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Fetch
 | 
			
		||||
    core.startGroup('Fetching the repository')
 | 
			
		||||
    const refSpec = refHelper.getRefSpec(settings.ref, settings.commit)
 | 
			
		||||
    await git.fetch(settings.fetchDepth, refSpec)
 | 
			
		||||
    core.endGroup()
 | 
			
		||||
 | 
			
		||||
    // Checkout info
 | 
			
		||||
    core.startGroup('Determining the checkout info')
 | 
			
		||||
    const checkoutInfo = await refHelper.getCheckoutInfo(
 | 
			
		||||
      git,
 | 
			
		||||
      settings.ref,
 | 
			
		||||
      settings.commit
 | 
			
		||||
    )
 | 
			
		||||
    core.endGroup()
 | 
			
		||||
 | 
			
		||||
    // LFS fetch
 | 
			
		||||
    // Explicit lfs-fetch to avoid slow checkout (fetches one lfs object at a time).
 | 
			
		||||
    // Explicit lfs fetch will fetch lfs objects in parallel.
 | 
			
		||||
    if (settings.lfs) {
 | 
			
		||||
      core.startGroup('Fetching LFS objects')
 | 
			
		||||
      await git.lfsFetch(checkoutInfo.startPoint || checkoutInfo.ref)
 | 
			
		||||
      core.endGroup()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // Checkout
 | 
			
		||||
    core.startGroup('Checking out the ref')
 | 
			
		||||
    await git.checkout(checkoutInfo.ref, checkoutInfo.startPoint)
 | 
			
		||||
    core.endGroup()
 | 
			
		||||
 | 
			
		||||
    // Submodules
 | 
			
		||||
    if (settings.submodules) {
 | 
			
		||||
      try {
 | 
			
		||||
        // Temporarily override global config
 | 
			
		||||
        core.startGroup('Setting up auth for fetching submodules')
 | 
			
		||||
        await authHelper.configureGlobalAuth()
 | 
			
		||||
        core.endGroup()
 | 
			
		||||
 | 
			
		||||
        // Checkout submodules
 | 
			
		||||
        core.startGroup('Fetching submodules')
 | 
			
		||||
        await git.submoduleSync(settings.nestedSubmodules)
 | 
			
		||||
        await git.submoduleUpdate(
 | 
			
		||||
          settings.fetchDepth,
 | 
			
		||||
@@ -136,10 +155,13 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
 | 
			
		||||
          'git config --local gc.auto 0',
 | 
			
		||||
          settings.nestedSubmodules
 | 
			
		||||
        )
 | 
			
		||||
        core.endGroup()
 | 
			
		||||
 | 
			
		||||
        // Persist credentials
 | 
			
		||||
        if (settings.persistCredentials) {
 | 
			
		||||
          core.startGroup('Persisting credentials for submodules')
 | 
			
		||||
          await authHelper.configureSubmoduleAuth()
 | 
			
		||||
          core.endGroup()
 | 
			
		||||
        }
 | 
			
		||||
      } finally {
 | 
			
		||||
        // Remove temporary global config override
 | 
			
		||||
@@ -152,7 +174,9 @@ export async function getSource(settings: IGitSourceSettings): Promise<void> {
 | 
			
		||||
  } finally {
 | 
			
		||||
    // Remove auth
 | 
			
		||||
    if (!settings.persistCredentials) {
 | 
			
		||||
      core.startGroup('Removing auth')
 | 
			
		||||
      await authHelper.removeAuth()
 | 
			
		||||
      core.endGroup()
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,17 +1,76 @@
 | 
			
		||||
export interface IGitSourceSettings {
 | 
			
		||||
  /**
 | 
			
		||||
   * The location on disk where the repository will be placed
 | 
			
		||||
   */
 | 
			
		||||
  repositoryPath: string
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The repository owner
 | 
			
		||||
   */
 | 
			
		||||
  repositoryOwner: string
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The repository name
 | 
			
		||||
   */
 | 
			
		||||
  repositoryName: string
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The ref to fetch
 | 
			
		||||
   */
 | 
			
		||||
  ref: string
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The commit to checkout
 | 
			
		||||
   */
 | 
			
		||||
  commit: string
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Indicates whether to clean the repository
 | 
			
		||||
   */
 | 
			
		||||
  clean: boolean
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The depth when fetching
 | 
			
		||||
   */
 | 
			
		||||
  fetchDepth: number
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Indicates whether to fetch LFS objects
 | 
			
		||||
   */
 | 
			
		||||
  lfs: boolean
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Indicates whether to checkout submodules
 | 
			
		||||
   */
 | 
			
		||||
  submodules: boolean
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Indicates whether to recursively checkout submodules
 | 
			
		||||
   */
 | 
			
		||||
  nestedSubmodules: boolean
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The auth token to use when fetching the repository
 | 
			
		||||
   */
 | 
			
		||||
  authToken: string
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * The SSH key to configure
 | 
			
		||||
   */
 | 
			
		||||
  sshKey: string
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Additional SSH known hosts
 | 
			
		||||
   */
 | 
			
		||||
  sshKnownHosts: string
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Indicates whether the server must be a known host
 | 
			
		||||
   */
 | 
			
		||||
  sshStrict: boolean
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Indicates whether to persist the credentials on disk to enable scripting authenticated git commands
 | 
			
		||||
   */
 | 
			
		||||
  persistCredentials: boolean
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user