mirror of
https://github.com/cirruslabs/tart.git
synced 2026-10-06 22:21:12 +02:00
* Support wildcards in `credHelpers` With #591 `tart pull` fails when for example you have `ecr-login` set as the default `credsStore` but you try to pull our images from `ghcr.io`. This change reverts #591 and instead supports regex in `credHelpers`. This is not supported by Docker itself but highly demanded in https://github.com/docker/cli/issues/2928 I think it's fine to support it for Tart. Additionally this change bumps the minimum host macOS version to Ventura in order to bring `Regex`. Yes, `Regex` only supported in Swift for macOS 13+ 🤦♂️I think it's fine in the light of Sonoma release and Tart 2.0.0. * Removed Monterey mentions from docs
59 lines
1.7 KiB
Swift
59 lines
1.7 KiB
Swift
import ArgumentParser
|
|
import Dispatch
|
|
import SwiftUI
|
|
import Foundation
|
|
|
|
struct Create: AsyncParsableCommand {
|
|
static var configuration = CommandConfiguration(abstract: "Create a VM")
|
|
|
|
@Argument(help: "VM name")
|
|
var name: String
|
|
|
|
@Option(help: ArgumentHelp("create a macOS VM using path to the IPSW file or URL (or \"latest\", to fetch the latest supported IPSW automatically)", valueName: "path"))
|
|
var fromIPSW: String?
|
|
|
|
@Flag(help: "create a Linux VM")
|
|
var linux: Bool = false
|
|
|
|
@Option(help: ArgumentHelp("Disk size in Gb"))
|
|
var diskSize: UInt16 = 50
|
|
|
|
func validate() throws {
|
|
if fromIPSW == nil && !linux {
|
|
throw ValidationError("Please specify either a --from-ipsw or --linux option!")
|
|
}
|
|
}
|
|
|
|
func run() async throws {
|
|
let tmpVMDir = try VMDirectory.temporary()
|
|
|
|
// Lock the temporary VM directory to prevent it's garbage collection
|
|
let tmpVMDirLock = try FileLock(lockURL: tmpVMDir.baseURL)
|
|
try tmpVMDirLock.lock()
|
|
|
|
try await withTaskCancellationHandler(operation: {
|
|
if let fromIPSW = fromIPSW {
|
|
let ipswURL: URL
|
|
|
|
if fromIPSW == "latest" {
|
|
ipswURL = try await VM.latestIPSWURL()
|
|
} else if fromIPSW.starts(with: "http://") || fromIPSW.starts(with: "https://") {
|
|
ipswURL = URL(string: fromIPSW)!
|
|
} else {
|
|
ipswURL = URL(fileURLWithPath: fromIPSW)
|
|
}
|
|
|
|
_ = try await VM(vmDir: tmpVMDir, ipswURL: ipswURL, diskSizeGB: diskSize)
|
|
}
|
|
|
|
if linux {
|
|
_ = try await VM.linux(vmDir: tmpVMDir, diskSizeGB: diskSize)
|
|
}
|
|
|
|
try VMStorageLocal().move(name, from: tmpVMDir)
|
|
}, onCancel: {
|
|
try? FileManager.default.removeItem(at: tmpVMDir.baseURL)
|
|
})
|
|
}
|
|
}
|