plugins/bob/private/Resolve-JaxBobUserFiles.ps1

<#
.SYNOPSIS
    Files for the per-developer config layer.

.DESCRIPTION
    A repository has three kinds of non-default configuration, and they are not
    the same thing:

      - the team's defaults, which everyone gets (repoCommon)
      - who you are, which follows you between your machines (this layer)
      - this machine, which follows nobody (localOverride)

    The middle one is the reason this exists. It is tracked, so it reaches your
    other desktop through git and a teammate can see why your runs differ; it is
    selected by identity, so having everyone's file checked in loads only yours.

    Patterns carry a {user} token. Identity is the CLI's -user, else JAX_USER,
    else the OS user name, lowercased -- an explicit value first so a shared
    account, a CI box, or somebody checking a teammate's setup can say who it
    is standing in for.
#>

function Resolve-JaxBobUserFiles {
    [CmdletBinding()]
    param (
        [System.Collections.IDictionary] $Layers,
        [string] $RepoRoot,
        [string] $UserName
    )

    if ($null -eq $Layers -or -not $Layers.ContainsKey('userPatterns')) {
        return @()
    }

    $patterns = @($Layers['userPatterns'] | Where-Object { -not [string]::IsNullOrWhiteSpace($_) })
    if ($patterns.Count -eq 0) {
        return @()
    }

    if ([string]::IsNullOrWhiteSpace($UserName)) {
        $UserName = Get-JaxBobUserName
    }
    if ([string]::IsNullOrWhiteSpace($UserName)) {
        return @()
    }
    # Normalized here as well as in Get-JaxBobUserName, so `-user SNO` and a
    # `USERNAME=Sno` machine resolve the same file as `sno`.
    $UserName = $UserName.Trim().ToLowerInvariant()

    $resolvedPatterns = @($patterns | ForEach-Object {
        $_ -replace '\{user\}', $UserName -replace '\{USER\}', $UserName
    })

    return @(Resolve-JaxBobLayerFiles -Patterns $resolvedPatterns -RepoRoot $RepoRoot)
}