diff --git a/Scripting/UTM.sdef b/Scripting/UTM.sdef
index 1fc018c2..393ea21b 100644
--- a/Scripting/UTM.sdef
+++ b/Scripting/UTM.sdef
@@ -141,11 +141,14 @@
+
+
+
-
+
diff --git a/Scripting/UTMScripting.swift b/Scripting/UTMScripting.swift
index 900344f1..07524c62 100644
--- a/Scripting/UTMScripting.swift
+++ b/Scripting/UTMScripting.swift
@@ -125,7 +125,7 @@ extension SBObject: UTMScriptingWindow {}
@objc optional var memory: String { get } // RAM size.
@objc optional var backend: UTMScriptingBackend { get } // Emulation/virtualization engine used.
@objc optional var status: UTMScriptingStatus { get } // Current running status.
- @objc optional func start()
+ @objc optional func startSaving(_ saving: Bool)
@objc optional func suspendSaving(_ saving: Bool)
@objc optional func stopBy(_ by: UTMScriptingStopMethod)
}
diff --git a/Scripting/UTMScriptingVirtualMachineImpl.swift b/Scripting/UTMScriptingVirtualMachineImpl.swift
index 1502ba48..97116dc2 100644
--- a/Scripting/UTMScriptingVirtualMachineImpl.swift
+++ b/Scripting/UTMScriptingVirtualMachineImpl.swift
@@ -121,7 +121,14 @@ class UTMScriptingVirtualMachineImpl: NSObject {
}
@objc func start(_ command: NSScriptCommand) {
+ let shouldSaveState = command.evaluatedArguments?["saveFlag"] as? Bool ?? true
withScriptCommand(command) { [self] in
+ if !shouldSaveState {
+ guard let vm = vm as? UTMQemuVirtualMachine else {
+ throw ScriptingError.operationNotSupported
+ }
+ vm.isRunningAsSnapshot = true
+ }
data.run(vm: vm, startImmediately: false)
if vm.state == .vmStopped {
try await vm.vmStart()
@@ -134,7 +141,7 @@ class UTMScriptingVirtualMachineImpl: NSObject {
}
@objc func suspend(_ command: NSScriptCommand) {
- let shouldSaveState = command.evaluatedArguments?["doneFlag"] as? Bool ?? false
+ let shouldSaveState = command.evaluatedArguments?["saveFlag"] as? Bool ?? false
withScriptCommand(command) { [self] in
try await vm.vmPause(save: shouldSaveState)
}
@@ -158,10 +165,12 @@ class UTMScriptingVirtualMachineImpl: NSObject {
extension UTMScriptingVirtualMachineImpl {
enum ScriptingError: Error, LocalizedError {
case operationNotAvailable
+ case operationNotSupported
var localizedDescription: String {
switch self {
case .operationNotAvailable: return NSLocalizedString("Operation not available.", comment: "UTMScriptingVirtualMachineImpl")
+ case .operationNotSupported: return NSLocalizedString("Operation not supported by the backend.", comment: "UTMScriptingVirtualMachineImpl")
}
}
}
diff --git a/utmctl/UTMCtl.swift b/utmctl/UTMCtl.swift
index 8eed494a..2bb8be6f 100644
--- a/utmctl/UTMCtl.swift
+++ b/utmctl/UTMCtl.swift
@@ -203,9 +203,12 @@ extension UTMCtl {
@Flag(name: .shortAndLong, help: "Attach to the first serial port after start.")
var attach: Bool = false
+ @Flag(help: "Run VM as a snapshot and do not save changes to disk.")
+ var disposible: Bool = false
+
func run(with application: UTMScriptingApplication) throws {
let vm = try virtualMachine(forIdentifier: identifer, in: application)
- vm.start!()
+ vm.startSaving!(!disposible)
if attach {
var attachCommand = Attach()
attachCommand.environment = environment