src/Private/Backup/Get-BackupLock.ps1

function Get-BackupLock {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$ProjectRoot
    )

    Write-RenderKitLog -Level Debug -Message "Get-BackupLock started for '$ProjectRoot'."

    $lockPath = Get-BackupLockPath -ProjectRoot $ProjectRoot
    $lockDir = Split-Path $lockPath

    if (!(Test-Path $lockDir)){
        Write-RenderKitLog -Level Error -Message "RenderKit metadata folder is missing for project '$ProjectRoot'."
        throw "RenderKit folder missing - invalid RenderKit project"
    }

    $state = Test-BackupLock -ProjectRoot $ProjectRoot

    if ($state.IsLocked) {
        $machine = if ($state.Lock.PSObject.Properties.Name -contains "machine") {
            [string]$state.Lock.machine
        }
        elseif ($state.Lock.PSObject.Properties.Name -contains "maschine") {
            [string]$state.Lock.maschine
        }
        else {
            "unknown-machine"
        }

        Write-RenderKitLog -Level Error -Message "Backup lock already present for '$ProjectRoot' (PID $($state.Lock.processId) on $machine)."
        throw "Backup already running (PID $($state.Lock.processId) on $machine)."
    }

    if ($state.IsStale -and (Test-Path -Path $lockPath -PathType Leaf)) {
        Write-RenderKitLog -Level Warning -Message "Removing stale backup lock at '$lockPath'."
        Remove-Item -Path $lockPath -Force -ErrorAction Stop
    }

    $ownerToken = [guid]::NewGuid().ToString()
    $lock = @{
        lockType        = "backup"
        lockedAt        = (Get-Date).ToString("o")
        ownerToken      = $ownerToken
        processId       = $PID
        machine         = $ENV:COMPUTERNAME
        maschine        = $ENV:COMPUTERNAME
        user            = $ENV:USERNAME
        toolVersion     = $script:RenderKitModuleVersion
    }

    $lock |
        ConvertTo-Json -Depth 5 |
        Set-Content -Path $lockPath -Encoding UTF8

    return [PSCustomObject]@{
        ProjectRoot = $ProjectRoot
        LockPath    = $lockPath
        OwnerToken  = $ownerToken
        LockedAt    = $lock.lockedAt
    }
}