diff --git a/Sources/tart/Commands/Create.swift b/Sources/tart/Commands/Create.swift index 7509430..a5f7d1b 100644 --- a/Sources/tart/Commands/Create.swift +++ b/Sources/tart/Commands/Create.swift @@ -9,7 +9,11 @@ struct Create: AsyncParsableCommand { @Argument(help: "VM name") var name: String - @Option(help: ArgumentHelp("Path to the IPSW file (or \"latest\") to fetch the latest appropriate IPSW", valueName: "path")) var fromIPSW: String? + @Option(help: ArgumentHelp("Path to the IPSW file (or \"latest\") to fetch the latest appropriate IPSW", valueName: "path")) + var fromIPSW: String? + + @Option(help: ArgumentHelp("Disk size in Gb")) + var diskSize: UInt8 = 32 func validate() throws { if fromIPSW == nil { @@ -22,9 +26,9 @@ struct Create: AsyncParsableCommand { let vmDir = try VMStorage().create(name) if fromIPSW! == "latest" { - _ = try await VM(vmDir: vmDir, ipswURL: nil) + _ = try await VM(vmDir: vmDir, ipswURL: nil, diskSizeGB: diskSize) } else { - _ = try await VM(vmDir: vmDir, ipswURL: URL(fileURLWithPath: fromIPSW!)) + _ = try await VM(vmDir: vmDir, ipswURL: URL(fileURLWithPath: fromIPSW!), diskSizeGB: diskSize) } Foundation.exit(0) diff --git a/Sources/tart/Commands/Set.swift b/Sources/tart/Commands/Set.swift index c6f82ce..283297e 100644 --- a/Sources/tart/Commands/Set.swift +++ b/Sources/tart/Commands/Set.swift @@ -16,6 +16,9 @@ struct Set: AsyncParsableCommand { @Option(help: "VM display settings in a format of x(x)?. For example, 1200x800 or 1200x800x72") var display: VMDisplayConfig? + @Option(help: .hidden) + var diskSize: UInt8? + func run() async throws { do { let vmStorage = VMStorage() @@ -43,6 +46,10 @@ struct Set: AsyncParsableCommand { } try vmConfig.save(toURL: vmDir.configURL) + + if diskSize != nil { + try vmDir.resizeDisk(diskSize!) + } Foundation.exit(0) } catch { diff --git a/Sources/tart/VM.swift b/Sources/tart/VM.swift index c1668b9..241b39c 100644 --- a/Sources/tart/VM.swift +++ b/Sources/tart/VM.swift @@ -78,7 +78,7 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { return expectedIPSWLocation } - init(vmDir: VMDirectory, ipswURL: URL?, diskSize: UInt64 = 32 * 1024 * 1024 * 1024) async throws { + init(vmDir: VMDirectory, ipswURL: URL?, diskSizeGB: UInt8) async throws { let ipswURL = ipswURL != nil ? ipswURL! : try await VM.retrieveLatestIPSW(); // Load the restore image and try to get the requirements @@ -97,10 +97,7 @@ class VM: NSObject, VZVirtualMachineDelegate, ObservableObject { let auxStorage = try VZMacAuxiliaryStorage(creatingStorageAt: vmDir.nvramURL, hardwareModel: requirements.hardwareModel) // Create disk - FileManager.default.createFile(atPath: vmDir.diskURL.path, contents: nil, attributes: nil) - let diskFileHandle = try FileHandle.init(forWritingTo: vmDir.diskURL) - try diskFileHandle.truncate(atOffset: diskSize) - try diskFileHandle.close() + try vmDir.resizeDisk(diskSizeGB) name = vmDir.name // Create config diff --git a/Sources/tart/VMDirectory.swift b/Sources/tart/VMDirectory.swift index 26de971..6510790 100644 --- a/Sources/tart/VMDirectory.swift +++ b/Sources/tart/VMDirectory.swift @@ -39,4 +39,14 @@ struct VMDirectory { throw UninitializedVMDirectoryError() } } + + func resizeDisk(_ sizeGB: UInt8) throws { + if !FileManager.default.fileExists(atPath: diskURL.path) { + FileManager.default.createFile(atPath: diskURL.path, contents: nil, attributes: nil) + } + let diskFileHandle = try FileHandle.init(forWritingTo: diskURL) + // macOS considers kilo being 1000 and not 1024 + try diskFileHandle.truncate(atOffset: UInt64(sizeGB) * 1000 * 1000 * 1000) + try diskFileHandle.close() + } }