Public/Clone-GitRepo.ps1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function Clone-GitRepo {
  <#
      .Synopsis
      Clone a Git Repository

      .EXAMPLE
      Clone-Git -Repo https://github.com/Woznet/WozTools.git -Path D:\git\repos
  #>

  [CmdletBinding()]
  [Alias('cgit')]
  param(
    # Git Repository to Clone
    [Parameter(ValueFromPipeline)]
    [String[]]$Repo = $(Get-Clipboard),
    # Location the repository folder will be saved to
    [ValidateScript({
          if(-Not ($_ | Test-Path -PathType Container)) {
            throw ('Unable to locate - {0}' -f $_)
          }
          return $true
    })]
    [String]$Path = 'V:\git\repos'
  )
  Begin {
    if (-not ([Environment]::GetEnvironmentVariable('GIT_REDIRECT_STDERR') -eq '2>&1')) {
      [Environment]::SetEnvironmentVariable('GIT_REDIRECT_STDERR','2>&1')
      Start-Sleep -Seconds 1
      Update-SessionEnvironment
    }
    if (-not (Get-Command -Name git.exe)) { throw 'Install git.exe' }
    $RepoDir = [System.Collections.ArrayList]@()
    $null = $RepoDir.Add('')
  }
  Process {
    Invoke-InDirectory -Path $Path -ScriptBlock {
      foreach ($RepoUrl in $Repo) {
        $null = $RepoDir.Add([System.IO.Path]::Combine($Path, ((Split-Path -Path $RepoUrl -Leaf).Split('.')[0])))
        git clone --recurse-submodules $RepoUrl
      }
    }
  }
  end {
    $RepoDir
  }
}