Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
6da3752
Fix warnings in Xcode 27
insidegui Jun 9, 2026
7a6673c
Fix warning about isolated conformance in VirtualMachineControls
insidegui Jun 9, 2026
f3bea97
Update SwiftUI introspect
insidegui Jun 9, 2026
5a4f399
Define model for provisioning configuration
insidegui Jun 9, 2026
2b8ca5d
Implement provisioning configuration validation
insidegui Jun 9, 2026
f762956
Enable automatic signing for managed schemes
insidegui Jun 9, 2026
4d8e9d7
Materialize provisioning start options in VMInstance
insidegui Jun 9, 2026
a974323
Secure storage mechanism for provisioning password
insidegui Jun 9, 2026
2fec2bd
WIP: Provisioning in configuration UI
insidegui Jun 9, 2026
39c3c10
Improve provisioning configuration UI
insidegui Jun 10, 2026
c0db084
Keep track of firstBootDate and lastBootDate for non-recovery boots
insidegui Jun 10, 2026
c15173a
Declare Skip Setup Assistant feature in catalog
insidegui Jun 10, 2026
92b4989
Display provisioning feature support status in configuration, disable…
insidegui Jun 10, 2026
37f4594
Add picker in virtual machine configuration that allows copying the c…
insidegui Jun 10, 2026
c440190
Exclude storage devices when applying template in post-install context
insidegui Jun 10, 2026
d0d575b
Move boot time updates to VMController, display appropriate message i…
insidegui Jun 10, 2026
2572e85
Remove print
insidegui Jun 10, 2026
8bbbab4
Fix guest Menu Bar hidden behind window title bar by disabling safe a…
insidegui Jun 10, 2026
71c570e
Implement custom virtual machine restore mechanism (#688)
insidegui Jun 12, 2026
c597021
Validate provisioning configuration using Virtualization API upon sav…
insidegui Jun 12, 2026
98a2727
Surface provisioning configuration errors in configuration UI
insidegui Jun 12, 2026
432f0eb
Do not allow empty passwords for provisioning
insidegui Jun 12, 2026
f182ed4
Fix VirtualInstallationService runpath
insidegui Jun 12, 2026
fe5adcc
Removing leading/trailing whitespaces from provisioning full name and…
insidegui Jun 12, 2026
3f232b0
Fix race condition when duplicating virtual machine that caused some …
insidegui Jun 12, 2026
0d752ce
Reduce debounce interval for saving VM configuration
insidegui Jun 12, 2026
144c3d1
Move install console log predicate responsibility into each install b…
insidegui Jun 12, 2026
5b49603
Use backend-provided install console log predicate, revamp console UI
insidegui Jun 12, 2026
f216d8e
Disable mouse events in VM view during installation
insidegui Jun 12, 2026
d2b2a5d
Recover logs emitted since installation began when opening console
insidegui Jun 12, 2026
25cdd3a
Fix installation console log stream causing installation to stall; fi…
insidegui Jun 12, 2026
942c909
Fix missing copy framework in Guest target
insidegui Jun 12, 2026
6b3bf0c
VirtualBuddyGuest app support for legacy guest OSes (#692)
insidegui Jun 15, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -23,4 +23,5 @@ Sharing.h
Tests/Private
Design/Icon
Build/
MockServer/
MockServer/
CIProjectVersion.xcconfig
18 changes: 18 additions & 0 deletions Scripts/check_guest_app_deployment_target.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#!/usr/bin/env zsh

# This script prevents raising the deployment target for VirtualBuddyGuest without placing the corresponding legacy archive in data/LegacyGuest,
# ensuring that older releases are always made available to users running legacy guest OSes

set -e

source "Scripts/legacy_guest_env.zsh"

# This only runs for builds using Managed configurations (Beta configurations are also managed)
if [[ "$CONFIGURATION" == *"Managed"* || "$CONFIGURATION" == *"Beta"* ]]; then
EXPECTED_GUEST_ARCHIVE="${SRCROOT}/${LEGACY_GUEST_ARCHIVE_DIR}/VirtualBuddyGuest_minOS_${LATEST_LEGACY_GUEST_APP_ARCHIVE_DEPLOYMENT_TARGET}.dmg"

if [ ! -f "${EXPECTED_GUEST_ARCHIVE}" ]; then
echo "error: The deployment target for VirtualBuddyGuest has been raised to ${MACOSX_DEPLOYMENT_TARGET} without a legacy archive being created for the latest version that supported ${LATEST_LEGACY_GUEST_APP_ARCHIVE_DEPLOYMENT_TARGET}. Please use dmgdist against a notarized build of VirtualBuddyGuest to generate an archive and register it with vctool before proceeding with this release."
exit 1
fi
fi
9 changes: 9 additions & 0 deletions Scripts/legacy_guest_env.zsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#!/usr/bin/env zsh

# Path to legacy guest app archive directory relative to VirtualBuddy repo root
export LEGACY_GUEST_ARCHIVE_DIR=data/LegacyGuestApp

# The deployment target for the latest VirtualBuddyGuest app archive
# If a managed build is attempted with a different value without an archive
# existing with this version number suffix, the build fails.
export LATEST_LEGACY_GUEST_APP_ARCHIVE_DEPLOYMENT_TARGET="14.0"
882 changes: 854 additions & 28 deletions VirtualBuddy.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions VirtualBuddy.xcodeproj/xcshareddata/xcodecloud/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"id" : "8e11e5f0-93f5-45e9-8b15-57ea4662691e",
"targets" : [
{
"id" : "E4EC8AE8-A4E2-4AA2-9A6A-2E1FADB38BC2",
"name" : "VirtualBuddy"
}
]
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down Expand Up @@ -55,6 +55,10 @@
argument = "-VBAPIEnvironment local"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "-VBForceBuiltInSoftwareCatalog YES"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "-VBDisableMemoryLeakAssertions YES"
isEnabled = "NO">
Expand All @@ -65,9 +69,33 @@
</CommandLineArgument>
<CommandLineArgument
argument = "-WHVerbosePacketLogging YES"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "-VerboseUILoggingEnabled YES"
isEnabled = "YES">
</CommandLineArgument>
<CommandLineArgument
argument = "-VBForceVirtualInstallationBackend YES"
isEnabled = "NO">
</CommandLineArgument>
<CommandLineArgument
argument = "-VBAllowAllGuestAppVersions YES"
isEnabled = "NO">
</CommandLineArgument>
</CommandLineArguments>
<EnvironmentVariables>
<EnvironmentVariable
key = "VI_TEST_MODE"
value = "1"
isEnabled = "NO">
</EnvironmentVariable>
<EnvironmentVariable
key = "VB_TOOL"
value = "vctool"
isEnabled = "NO">
</EnvironmentVariable>
</EnvironmentVariables>
</LaunchAction>
<ProfileAction
buildConfiguration = "Beta_Release"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2700"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F4EFB5622FDB2A0D00AF2A63"
BuildableName = "VirtualInstallation.framework"
ReferencedContainer = "container:VirtualBuddy.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"
queueDebuggingEnabled = "No">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F4EFB5622FDB2A0D00AF2A63"
BuildableName = "VirtualInstallation.framework"
ReferencedContainer = "container:VirtualBuddy.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2700"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
buildImplicitDependencies = "YES"
buildArchitectures = "Automatic">
<BuildActionEntries>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F4EFB5B32FDB2BD300AF2A63"
BuildableName = "VirtualInstallationService.xpc"
ReferencedContainer = "container:VirtualBuddy.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
shouldUseLaunchSchemeArgsEnv = "YES"
shouldAutocreateTestPlan = "YES">
</TestAction>
<LaunchAction
buildConfiguration = "Debug"
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
launchStyle = "0"
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES"
queueDebuggingEnabled = "No">
</LaunchAction>
<ProfileAction
buildConfiguration = "Release"
shouldUseLaunchSchemeArgsEnv = "YES"
savedToolIdentifier = ""
useCustomWorkingDirectory = "NO"
debugDocumentVersioning = "YES">
<MacroExpansion>
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "F4EFB5B32FDB2BD300AF2A63"
BuildableName = "VirtualInstallationService.xpc"
ReferencedContainer = "container:VirtualBuddy.xcodeproj">
</BuildableReference>
</MacroExpansion>
</ProfileAction>
<AnalyzeAction
buildConfiguration = "Debug">
</AnalyzeAction>
<ArchiveAction
buildConfiguration = "Release"
revealArchiveInOrganizer = "YES">
</ArchiveAction>
</Scheme>
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "2650"
LastUpgradeVersion = "2700"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
12 changes: 7 additions & 5 deletions VirtualBuddy/Bootstrap/VirtualBuddyAppDelegate.swift
Original file line number Diff line number Diff line change
Expand Up @@ -37,20 +37,22 @@ import SwiftUI
private var cancellables = Set<AnyCancellable>()

func applicationDidFinishLaunching(_ notification: Notification) {
GuestAdditionsDiskImage.current.$state.sink { state in
GuestAdditionsDiskImage.default.$state.sink { state in
switch state {
case .ready:
self.logger.debug("Guest disk image ready")
self.logger.debug("Default guest disk image ready")
case .downloading:
self.logger.debug("Default guest disk image downloading")
case .installing:
self.logger.debug("Guest disk image installing")
self.logger.debug("Default guest disk image installing")
case .installFailed(let error):
self.logger.debug("Guest disk image installation failed - \(error, privacy: .public)")
self.logger.debug("Default guest disk image installation failed - \(error, privacy: .public)")
}
}
.store(in: &cancellables)

Task {
try? await GuestAdditionsDiskImage.current.installIfNeeded()
try? await GuestAdditionsDiskImage.default.installIfNeeded()
}

#if DEBUG
Expand Down
3 changes: 2 additions & 1 deletion VirtualBuddy/CommandLine/vctool/CatalogCommand.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ struct CatalogCommand: AsyncParsableCommand {
subcommands: [
ImageCommand.self,
GroupCommand.self,
MigrateCommand.self
MigrateCommand.self,
LegacyGuestAppCommand.self
]
)
}
Loading