Internal/Git执行.ps1

# Git 命令执行相关的内部辅助函数

function 组成-Git参数 {
    param(
        [Parameter(Mandatory = $true)]
        [string[]]$参数,

        [Parameter()]
        [AllowEmptyString()]
        [string]$代理 = ""
    )

    # 代理仅通过 -c 命令行参数注入本次进程(不写入任何 git 配置文件),
    # 因此不影响用户手动执行 git。
    $完整参数 = @()
    if (-not [string]::IsNullOrWhiteSpace($代理)) {
        $完整参数 += @("-c", "http.proxy=$代理", "-c", "https.proxy=$代理")
    }
    $完整参数 += $参数
    return $完整参数
}

function 执行-Git命令 {
    param(
        [Parameter(Mandatory = $true)]
        [string[]]$参数,

        [Parameter()]
        [AllowEmptyString()]
        [string]$代理 = ""
    )

    & git @(组成-Git参数 $参数 $代理)
    if ($LASTEXITCODE -ne 0) {
        throw "git $($参数 -join ' ') 执行失败。"
    }
}

function 尝试-Git命令 {
    param(
        [Parameter(Mandatory = $true)]
        [string[]]$参数,

        [Parameter()]
        [AllowEmptyString()]
        [string]$代理 = ""
    )

    & git @(组成-Git参数 $参数 $代理)
    return $LASTEXITCODE -eq 0
}

function 读取-Git文本 {
    param(
        [Parameter(Mandatory = $true)]
        [string[]]$参数,

        [Parameter()]
        [AllowEmptyString()]
        [string]$代理 = ""
    )

    $输出 = & git @(组成-Git参数 $参数 $代理)
    if ($LASTEXITCODE -ne 0) {
        throw "git $($参数 -join ' ') 执行失败。"
    }

    return ($输出 -join "`n").Trim()
}

<#
.SYNOPSIS
    执行只读的 git 命令并返回输出,失败时返回空字符串而非抛错。
    合并 stderr 并用 try/catch 兜底,确保在 EAP=Stop 下绝不影响调用者。
#>

function 尝试读取-Git文本 {
    param(
        [Parameter(Mandatory = $true)]
        [string[]]$参数,

        [Parameter()]
        [AllowEmptyString()]
        [string]$代理 = ""
    )

    try {
        $输出 = & git @(组成-Git参数 $参数 $代理) 2>&1
        if ($LASTEXITCODE -ne 0) {
            return ""
        }

        return (($输出 | ForEach-Object { "$_" }) -join "`n").Trim()
    }
    catch {
        return ""
    }
}