32 lines
1.3 KiB
PowerShell
32 lines
1.3 KiB
PowerShell
function Enter-SmailWorkspaceLock {
|
|
param([Parameter(Mandatory = $true)][string]$Root)
|
|
|
|
# 构建会归档 Go 嵌入资源,必须与同一源码目录的后端测试互斥。
|
|
# 使用系统互斥量,进程异常退出后也不会留下需要手工删除的锁文件。
|
|
$resolved = (Resolve-Path -LiteralPath $Root -ErrorAction Stop).ProviderPath
|
|
$identity = [IO.Path]::GetFullPath($resolved).TrimEnd('\').ToUpperInvariant()
|
|
$hash = [Security.Cryptography.SHA256]::Create()
|
|
try {
|
|
$digest = [BitConverter]::ToString($hash.ComputeHash([Text.Encoding]::UTF8.GetBytes($identity))).Replace('-', '')
|
|
} finally {
|
|
$hash.Dispose()
|
|
}
|
|
$mutex = [Threading.Mutex]::new($false, "Local\SmailWorkspace-$digest")
|
|
try {
|
|
$acquired = $false
|
|
try {
|
|
$acquired = $mutex.WaitOne(0)
|
|
} catch [Threading.AbandonedMutexException] {
|
|
# 上一个持有者异常退出时,系统已把互斥量交给当前线程。
|
|
$acquired = $true
|
|
}
|
|
if (-not $acquired) {
|
|
throw '同一工作区正在构建或执行后端测试,请等待结束后重试,避免嵌入资源被并发移动。'
|
|
}
|
|
return $mutex
|
|
} catch {
|
|
$mutex.Dispose()
|
|
throw
|
|
}
|
|
}
|