Extensions/Git.Clone.Input.UGit.Extension.ps1

<#
.SYNOPSIS
    Git Clone extended input
.DESCRIPTION
    Extends the input for git clone.

    By default, if --progress is not found, it will be added to any git clone.
.EXAMPLE
    git clone https://github.com/MDN/content.git # This is a big repo. Progress bars will be very welcome.
.EXAMPLE
    # If we don't check things out, cloning is faster.
    git clone https://github.com/PowerShell/PowerShell -NoCheckout
    # (of course, that's because we're not copying files, just history)
.EXAMPLE
    # We can also clone more quickly by only picking a certain number of commits
    git clone https://github.com/Microsoft/vscode.git -Depth 1
    # (of course, this will make the history lie to you,
    # by saying everything was changed whenever anything was changed)
#>

[ValidatePattern('^git clone')]
[Management.Automation.Cmdlet("Use","Git")]
[CmdletBinding(PositionalBinding=$false)]
param(
# If set, will not check out files from the respository.
[Parameter(ValueFromPipelineByPropertyName)]
[switch]
$NoCheckout,

# Employ a sparse-checkout.
# Only files in the toplevel directory will be present by default.
# Sparse checkout can be configured with git sparse-checkout.
[Parameter(ValueFromPipelineByPropertyName)]
[switch]
$Sparse,

# Create a shallow clone with a history truncated to the specified number of commits
[Parameter(ValueFromPipelineByPropertyName)]
[uint32]
$Depth,

# Create a shallow clone with a history after the specified time.
[Parameter(ValueFromPipelineByPropertyName)]
[string]
$Since,

# One or more filters
[Parameter(ValueFromPipelineByPropertyName)]
[string[]]
$Filter,

# If set, will clone nothing.
# This means not checking out, filtering everything from the tree, and using sparse checkout
[Parameter(ValueFromPipelineByPropertyName)]
[Alias('None','Nada')]
[switch]
$Nothing
)

# If we're cloning nothing, it means:
if ($Nothing) {
    $NoCheckout = $true # * No checking out
    $Sparse = $true # * Sparse checkouts only
    $filter = "tree:0" # * Pick nothing from the tree
    $Depth = 1 # * With a depth of 1
}

if ($Depth) {
    '--depth'
    "$Depth"
}

if ($NoCheckout) {'--no-checkout'}

if ($Sparse) {'--sparse'}

if ($Since) {
    if ($since -is [DateTime]) {
        "--shallow-since=$($Since.ToString('o'))"
    } elseif ($since -match '^\d+') {
        "--shallow-since=$since"
    } else {
        Write-Warning "-Since must be a date or a number followed by a date unit."
    }
}

if ($filter) {
    foreach ($gitFilter in $filter) {
        "--filter=$gitFilter"
    }
}

if ($gitArgument -notcontains '--progress') {
    '--progress'
}