diff --git a/src/scripts/tools/add_tools.ps1 b/src/scripts/tools/add_tools.ps1 index cfe28fe9..46c99757 100644 --- a/src/scripts/tools/add_tools.ps1 +++ b/src/scripts/tools/add_tools.ps1 @@ -28,6 +28,39 @@ Function Edit-ComposerConfig() { Set-ComposerAuth } +# Function to merge auth.json fragments. +Function Get-MergedAuthJson { + [CmdletBinding()] + param( + [Parameter(Mandatory)][string[]] $ComposerAuth + ) + if (Test-Path $composer_home\auth.json) { + try { + $existing = Get-Content $composer_home\auth.json -Raw | ConvertFrom-Json + } catch { + $existing = [PSCustomObject]@{} + } + } else { + $existing = [PSCustomObject]@{} + } + foreach ($fragment in $ComposerAuth) { + $piece = ('{' + $fragment + '}') | ConvertFrom-Json + foreach ($prop in $piece.PSObject.Properties) { + if ($prop.Name -eq 'http-basic') { + if (-not $existing.'http-basic') { + $existing | Add-Member -MemberType NoteProperty -Name 'http-basic' -Value ([PSCustomObject]@{}) -Force + } + foreach ($domainProp in $prop.Value.PSObject.Properties) { + $existing.'http-basic' | Add-Member -MemberType NoteProperty -Name $domainProp.Name -Value $domainProp.Value -Force + } + } else { + $existing | Add-Member -MemberType NoteProperty -Name $prop.Name -Value $prop.Value -Force + } + } + } + return $existing | ConvertTo-Json -Depth 5 +} + # Function to setup authentication in composer. Function Set-ComposerAuth() { if(Test-Path env:COMPOSER_AUTH_JSON) { @@ -48,7 +81,7 @@ Function Set-ComposerAuth() { $composer_auth += '"github-oauth": {"github.com": "' + $env:GITHUB_TOKEN + '"}' } if($composer_auth.length) { - Add-Env COMPOSER_AUTH ('{' + ($composer_auth -join ',') + '}') + Set-Content -Path $composer_home\auth.json -Value (Get-MergedAuthJson $composer_auth) } } diff --git a/src/scripts/tools/add_tools.sh b/src/scripts/tools/add_tools.sh index 99a736f6..7cd6524b 100644 --- a/src/scripts/tools/add_tools.sh +++ b/src/scripts/tools/add_tools.sh @@ -46,6 +46,25 @@ configure_composer() { set_composer_auth } +# Function to merge auth.json fragments. +get_merged_auth_json() { + local auth_file="$composer_home/auth.json" + local merged + [[ -f "$auth_file" ]] && merged=$(<"$auth_file") || merged='{}' + for frag in "$@"; do + local obj="{$frag}" + merged=$(jq -n --argjson b "$merged" --argjson n "$obj" ' + if $n|has("http-basic") then + (($b["http-basic"]//{}) + $n["http-basic"]) as $hb + | ($b + $n) | .["http-basic"] = $hb + else + $b + $n + end + ') + done + printf '%s' "$merged" +} + # Function to setup authentication in composer. set_composer_auth() { if [ -n "$COMPOSER_AUTH_JSON" ]; then @@ -63,7 +82,7 @@ set_composer_auth() { composer_auth+=( '"github-oauth": {"github.com": "'"${GITHUB_TOKEN:-$COMPOSER_TOKEN}"'"}' ) fi if ((${#composer_auth[@]})); then - add_env COMPOSER_AUTH "{$(IFS=$','; echo "${composer_auth[*]}")}" + get_merged_auth_json "${composer_auth[@]}" | tee "$composer_home/auth.json" >/dev/null fi }