mirror of
https://github.com/stablyai/orca.git
synced 2026-09-22 08:02:28 +00:00
88 lines
2.4 KiB
TypeScript
88 lines
2.4 KiB
TypeScript
import { isWindowsAbsolutePathLike } from './cross-platform-path'
|
|
|
|
export type SetupRunnerCommandPlatform = 'windows' | 'posix'
|
|
export type SetupRunnerCommandShell = 'posix' | 'windows'
|
|
|
|
export type SetupRunnerCommandResolution = {
|
|
command: string
|
|
runnerScriptPathForShell: string
|
|
shell: SetupRunnerCommandShell
|
|
}
|
|
|
|
export function buildSetupRunnerCommand(
|
|
runnerScriptPath: string,
|
|
platform: SetupRunnerCommandPlatform
|
|
): string {
|
|
return resolveSetupRunnerCommand(runnerScriptPath, platform).command
|
|
}
|
|
|
|
export function getSetupRunnerCommandPlatformForPath(
|
|
runnerScriptPath: string,
|
|
fallbackPlatform: SetupRunnerCommandPlatform
|
|
): SetupRunnerCommandPlatform {
|
|
if (isWindowsAbsolutePathLike(runnerScriptPath)) {
|
|
return 'windows'
|
|
}
|
|
if (runnerScriptPath.startsWith('/')) {
|
|
return 'posix'
|
|
}
|
|
return fallbackPlatform
|
|
}
|
|
|
|
export function resolveSetupRunnerCommand(
|
|
runnerScriptPath: string,
|
|
platform: SetupRunnerCommandPlatform
|
|
): SetupRunnerCommandResolution {
|
|
if (platform === 'windows') {
|
|
if (isWslUncPath(runnerScriptPath)) {
|
|
const linuxPath = wslUncToLinuxPath(runnerScriptPath)
|
|
return {
|
|
command: `bash ${quotePosixArg(linuxPath)}`,
|
|
runnerScriptPathForShell: linuxPath,
|
|
shell: 'posix'
|
|
}
|
|
}
|
|
if (runnerScriptPath.startsWith('/') && !isWindowsAbsolutePathLike(runnerScriptPath)) {
|
|
return {
|
|
command: `bash ${quotePosixArg(runnerScriptPath)}`,
|
|
runnerScriptPathForShell: runnerScriptPath,
|
|
shell: 'posix'
|
|
}
|
|
}
|
|
return {
|
|
command: `cmd.exe /c ${quoteWindowsArg(runnerScriptPath)}`,
|
|
runnerScriptPathForShell: runnerScriptPath,
|
|
shell: 'windows'
|
|
}
|
|
}
|
|
|
|
return {
|
|
command: `bash ${quotePosixArg(runnerScriptPath)}`,
|
|
runnerScriptPathForShell: runnerScriptPath,
|
|
shell: 'posix'
|
|
}
|
|
}
|
|
|
|
export function isWslUncPath(path: string): boolean {
|
|
const normalized = path.replace(/\\/g, '/')
|
|
return /^\/\/(wsl\.localhost|wsl\$)\//i.test(normalized)
|
|
}
|
|
|
|
export function wslUncToLinuxPath(windowsPath: string): string {
|
|
const normalized = windowsPath.replace(/\\/g, '/')
|
|
const match = normalized.match(/^\/\/(wsl\.localhost|wsl\$)\/[^/]+(\/.*)?$/i)
|
|
return match?.[2] || '/'
|
|
}
|
|
|
|
function quotePosixArg(value: string): string {
|
|
if (/^[A-Za-z0-9_./:-]+$/.test(value)) {
|
|
return value
|
|
}
|
|
|
|
return `'${value.replace(/'/g, `'\\''`)}'`
|
|
}
|
|
|
|
function quoteWindowsArg(value: string): string {
|
|
return `"${value.replace(/"/g, '""')}"`
|
|
}
|