* Replaced the nested export form with a scrollable layout.
* Made the table selection checkboxes directly visible.
* Preserved the Select All and Select None buttons.
* Kept the view selection controls.
* Cleared stale table selections when switching databases.
* Added automatic database loading when the application opens.
* Preserved the existing SQL editor and administration functionality.
This commit is contained in:
Mark Gregory
2026-10-16 21:51:45 +01:00
parent 86df4fb185
commit 819e5cf46e
20 changed files with 263 additions and 150 deletions
+94 -23
View File
@@ -68,6 +68,11 @@ struct MainView: View {
) == "dark" ? .dark : .light
)
.background(Color(nsColor: .windowBackgroundColor))
.task {
if model.databases.isEmpty, model.selected != nil {
model.loadDatabases()
}
}
.sheet(isPresented: $showingDatabaseTransfer) {
WorkbenchDatabaseTransferView(model: model)
}
@@ -1572,6 +1577,9 @@ struct WorkbenchDatabaseTransferView: View {
@State private var exportStructure = true
@State private var exportData = true
@State private var includeDrop = false
@State private var includeViews = true
@State private var availableViews: [String] = []
@State private var selectedViews: Set<String> = []
@State private var loadingTables = false
@State private var availableDatabases: [String] = []
@State private var loadingDatabases = false
@@ -1593,8 +1601,10 @@ struct WorkbenchDatabaseTransferView: View {
.pickerStyle(.segmented)
.padding(20)
Form {
Section("MySQL Connection") {
ScrollView {
VStack(alignment: .leading, spacing: 16) {
GroupBox("MySQL Connection") {
VStack(alignment: .leading, spacing: 10) {
LabeledContent("Connection") {
Text(selectedProfile?.name ?? "Not selected")
}
@@ -1613,14 +1623,18 @@ struct WorkbenchDatabaseTransferView: View {
}
.disabled(loadingDatabases || selectedProfile == nil)
}
}
}
if selectedMode == 0 {
Section("Export Options") {
GroupBox("Export Options") {
VStack(alignment: .leading, spacing: 10) {
Toggle("Table structure", isOn: $exportStructure)
Toggle("Table data", isOn: $exportData)
Toggle("Add DROP TABLE IF EXISTS", isOn: $includeDrop)
.disabled(!exportStructure)
Toggle("Include views (definitions)", isOn: $includeViews)
.disabled(!exportStructure)
HStack {
Text("Tables (\(selectedTables.count) selected)")
Spacer()
@@ -1630,25 +1644,43 @@ struct WorkbenchDatabaseTransferView: View {
.disabled(loadingTables)
}
if loadingTables { ProgressView("Loading tables…") }
ScrollView {
LazyVStack(alignment: .leading) {
ForEach(availableTables, id: \.self) { table in
Toggle(table, isOn: Binding(
get: { selectedTables.contains(table) },
set: { checked in
if checked { selectedTables.insert(table) }
else { selectedTables.remove(table) }
}
))
if availableTables.isEmpty && !loadingTables {
Text("No tables found. Select a database or refresh the list.")
.foregroundStyle(.secondary)
}
ForEach(availableTables, id: \.self) { table in
Toggle(table, isOn: Binding(
get: { selectedTables.contains(table) },
set: { checked in
if checked { selectedTables.insert(table) }
else { selectedTables.remove(table) }
}
))
}
if includeViews && exportStructure {
HStack {
Text("Views (\(selectedViews.count) selected)")
Spacer()
Button("All") { selectedViews = Set(availableViews) }
Button("None") { selectedViews.removeAll() }
}
ForEach(availableViews, id: \.self) { view in
Toggle(view, isOn: Binding(
get: { selectedViews.contains(view) },
set: { checked in
if checked { selectedViews.insert(view) }
else { selectedViews.remove(view) }
}
))
}
}
.frame(maxHeight: 180)
Text("Exports base tables with batched INSERT statements. Views, triggers, routines and transaction-consistent snapshots are not included.")
Text("Exports base tables and selected views. Triggers, routines, consistent snapshots and guaranteed row ordering are not yet supported.")
.font(.caption).foregroundStyle(.secondary)
}
}
} else {
Section("Import Options") {
GroupBox("Import Options") {
VStack(alignment: .leading, spacing: 10) {
Text("Import SQL statements into the selected database.")
.foregroundStyle(.secondary)
@@ -1656,9 +1688,11 @@ struct WorkbenchDatabaseTransferView: View {
.font(.caption)
.foregroundStyle(.secondary)
}
}
}
Section("Progress") {
GroupBox("Progress") {
VStack(alignment: .leading, spacing: 10) {
ProgressView(value: progress)
.frame(maxWidth: .infinity)
@@ -1666,9 +1700,12 @@ struct WorkbenchDatabaseTransferView: View {
.font(.caption)
.foregroundStyle(.secondary)
.textSelection(.enabled)
}
}
}
}
.formStyle(.grouped)
.frame(maxWidth: .infinity, alignment: .leading)
.padding(20)
Divider()
@@ -1701,7 +1738,7 @@ struct WorkbenchDatabaseTransferView: View {
.disabled(
selectedProfile == nil ||
database.isEmpty ||
(selectedMode == 0 && (selectedTables.isEmpty || (!exportStructure && !exportData)))
(selectedMode == 0 && ((!exportStructure && !exportData) || (selectedTables.isEmpty && !(exportStructure && includeViews && !selectedViews.isEmpty))))
)
}
}
@@ -1719,6 +1756,10 @@ struct WorkbenchDatabaseTransferView: View {
await loadTransferDatabases()
}
.task(id: database) {
availableTables = []
selectedTables = []
availableViews = []
selectedViews = []
if !database.isEmpty { await loadTables() }
}
.confirmationDialog(
@@ -1846,7 +1887,11 @@ struct WorkbenchDatabaseTransferView: View {
@MainActor
private func loadTables() async {
guard !database.isEmpty else { availableTables = []; selectedTables = []; return }
guard !database.isEmpty else {
availableTables = []; selectedTables = []
availableViews = []; selectedViews = []
return
}
loadingTables = true
defer { loadingTables = false }
do {
@@ -1855,10 +1900,16 @@ struct WorkbenchDatabaseTransferView: View {
row.count > 1 && row[1].uppercased() == "BASE TABLE" ? row[0] : nil
}
selectedTables = Set(availableTables)
availableViews = rows.rows.compactMap { row in
row.count > 1 && row[1].uppercased() == "VIEW" ? row[0] : nil
}
selectedViews = Set(availableViews)
} catch {
status = "Cannot list tables: \(error.localizedDescription)"
availableTables = []
selectedTables = []
availableViews = []
selectedViews = []
}
}
@@ -1866,7 +1917,11 @@ struct WorkbenchDatabaseTransferView: View {
// preserved rather than reconstructed from QueryResult's String values.
@MainActor
private func exportSQL(to url: URL) async {
guard !selectedTables.isEmpty, exportStructure || exportData else { return }
guard exportStructure || exportData else { return }
let views = exportStructure && includeViews
? availableViews.filter { selectedViews.contains($0) }
: []
guard !selectedTables.isEmpty || !views.isEmpty else { return }
isWorking = true
progress = 0
let tables = availableTables.filter { selectedTables.contains($0) }
@@ -1937,7 +1992,23 @@ struct WorkbenchDatabaseTransferView: View {
if batch.rows.count < 250 { break }
}
}
progress = Double(index + 1) / Double(tables.count)
progress = Double(index + 1) / Double(max(tables.count + views.count, 1))
}
// Views are exported after base tables so dependencies exist on restore.
// The server's SHOW CREATE VIEW response may contain a DEFINER clause;
// importing under a different MySQL account can require extra privileges.
for (index, view) in views.enumerated() {
try Task.checkCancellation()
let qualified = "\(db).\(quoteIdentifier(view))"
status = "Exporting view \(view)"
let definition = try await execute("SHOW CREATE VIEW \(qualified)")
guard let row = definition.rows.first, row.count > 1 else {
throw WorkbenchTransferError.message("Missing CREATE VIEW for \(view)")
}
try write("\n-- View \(qualified)\n")
if includeDrop { try write("DROP VIEW IF EXISTS \(qualified);\n") }
try write(row[1] + ";\n")
progress = Double(tables.count + index + 1) / Double(max(tables.count + views.count, 1))
}
try Task.checkCancellation()
try handle?.close()
@@ -1948,7 +2019,7 @@ struct WorkbenchDatabaseTransferView: View {
try FileManager.default.moveItem(at: tempURL, to: url)
}
progress = 1
status = "Export complete: \(tables.count) tables"
status = "Export complete: \(tables.count) tables, \(views.count) views"
} catch is CancellationError {
status = "Export cancelled; no final backup was written"
} catch {
@@ -7,7 +7,7 @@
"key": "MySQL Workbench",
"location": {
"startingColumn": 18,
"startingLine": 93
"startingLine": 98
}
},
{
@@ -15,7 +15,7 @@
"key": "Navigator",
"location": {
"startingColumn": 20,
"startingLine": 182
"startingLine": 187
}
},
{
@@ -23,7 +23,7 @@
"key": "Administration",
"location": {
"startingColumn": 22,
"startingLine": 183
"startingLine": 188
}
},
{
@@ -31,7 +31,7 @@
"key": "Schemas",
"location": {
"startingColumn": 22,
"startingLine": 184
"startingLine": 189
}
},
{
@@ -39,7 +39,7 @@
"key": "SCHEMAS",
"location": {
"startingColumn": 22,
"startingLine": 204
"startingLine": 209
}
},
{
@@ -47,7 +47,7 @@
"key": "Edit Connection",
"location": {
"startingColumn": 36,
"startingLine": 258
"startingLine": 263
}
},
{
@@ -55,7 +55,7 @@
"key": "Set as Default Schema",
"location": {
"startingColumn": 24,
"startingLine": 375
"startingLine": 380
}
},
{
@@ -63,7 +63,7 @@
"key": "Refresh Tables",
"location": {
"startingColumn": 24,
"startingLine": 379
"startingLine": 384
}
},
{
@@ -71,7 +71,7 @@
"key": "Load Tables",
"location": {
"startingColumn": 28,
"startingLine": 449
"startingLine": 454
}
},
{
@@ -79,7 +79,7 @@
"key": "Tables",
"location": {
"startingColumn": 22,
"startingLine": 422
"startingLine": 427
}
},
{
@@ -87,7 +87,7 @@
"key": "Select First 100 Rows",
"location": {
"startingColumn": 20,
"startingLine": 505
"startingLine": 510
}
},
{
@@ -95,7 +95,7 @@
"key": "New Query Tab",
"location": {
"startingColumn": 19,
"startingLine": 626
"startingLine": 631
}
},
{
@@ -103,7 +103,7 @@
"key": "Default Schema:",
"location": {
"startingColumn": 18,
"startingLine": 651
"startingLine": 656
}
},
{
@@ -111,7 +111,7 @@
"key": "SQL Editor",
"location": {
"startingColumn": 18,
"startingLine": 661
"startingLine": 666
}
},
{
@@ -119,7 +119,7 @@
"key": "Execute SQL",
"location": {
"startingColumn": 19,
"startingLine": 639
"startingLine": 644
}
},
{
@@ -127,7 +127,7 @@
"key": "Format SQL",
"location": {
"startingColumn": 19,
"startingLine": 646
"startingLine": 651
}
},
{
@@ -135,7 +135,7 @@
"key": "%lld",
"location": {
"startingColumn": 26,
"startingLine": 701
"startingLine": 706
}
},
{
@@ -143,7 +143,7 @@
"key": "Result Grid",
"location": {
"startingColumn": 22,
"startingLine": 733
"startingLine": 738
}
},
{
@@ -151,7 +151,7 @@
"key": "No query results",
"location": {
"startingColumn": 26,
"startingLine": 751
"startingLine": 756
}
},
{
@@ -159,7 +159,7 @@
"key": "Action Output",
"location": {
"startingColumn": 22,
"startingLine": 773
"startingLine": 778
}
},
{
@@ -167,7 +167,7 @@
"key": "UTF-8",
"location": {
"startingColumn": 18,
"startingLine": 848
"startingLine": 853
}
},
{
@@ -175,7 +175,7 @@
"key": "Connection Settings",
"location": {
"startingColumn": 18,
"startingLine": 1023
"startingLine": 1028
}
},
{
@@ -183,7 +183,7 @@
"key": "Connection Name",
"location": {
"startingColumn": 21,
"startingLine": 1028
"startingLine": 1033
}
},
{
@@ -191,7 +191,7 @@
"key": "Hostname",
"location": {
"startingColumn": 21,
"startingLine": 1033
"startingLine": 1038
}
},
{
@@ -199,7 +199,7 @@
"key": "Port",
"location": {
"startingColumn": 21,
"startingLine": 1038
"startingLine": 1043
}
},
{
@@ -207,7 +207,7 @@
"key": "Username",
"location": {
"startingColumn": 21,
"startingLine": 1044
"startingLine": 1049
}
},
{
@@ -215,7 +215,7 @@
"key": "Password (macOS Keychain)",
"location": {
"startingColumn": 21,
"startingLine": 1049
"startingLine": 1054
}
},
{
@@ -223,7 +223,7 @@
"key": "Default Schema",
"location": {
"startingColumn": 21,
"startingLine": 1054
"startingLine": 1059
}
},
{
@@ -231,7 +231,7 @@
"key": "Cancel",
"location": {
"startingColumn": 24,
"startingLine": 1062
"startingLine": 1067
}
},
{
@@ -239,7 +239,7 @@
"key": "Save",
"location": {
"startingColumn": 24,
"startingLine": 1066
"startingLine": 1071
}
},
{
@@ -247,7 +247,7 @@
"key": "The server did not return any columns.",
"location": {
"startingColumn": 25,
"startingLine": 1388
"startingLine": 1393
}
},
{
@@ -255,7 +255,7 @@
"key": "Loading %@…",
"location": {
"startingColumn": 30,
"startingLine": 1366
"startingLine": 1371
}
},
{
@@ -263,7 +263,7 @@
"key": "No Data",
"location": {
"startingColumn": 21,
"startingLine": 1385
"startingLine": 1390
}
},
{
@@ -271,7 +271,7 @@
"key": "Unable to Load %@",
"location": {
"startingColumn": 25,
"startingLine": 1372
"startingLine": 1377
}
},
{
@@ -279,7 +279,7 @@
"key": "Retry",
"location": {
"startingColumn": 28,
"startingLine": 1378
"startingLine": 1383
}
},
{
@@ -287,7 +287,7 @@
"key": "Refresh",
"location": {
"startingColumn": 23,
"startingLine": 1427
"startingLine": 1432
}
},
{
@@ -295,7 +295,7 @@
"key": "SQL Editor",
"location": {
"startingColumn": 23,
"startingLine": 1434
"startingLine": 1439
}
},
{
@@ -303,7 +303,7 @@
"key": "Not loaded",
"location": {
"startingColumn": 22,
"startingLine": 1512
"startingLine": 1517
}
},
{
@@ -311,7 +311,7 @@
"key": "Updated %@",
"location": {
"startingColumn": 21,
"startingLine": 1509
"startingLine": 1514
}
},
{
@@ -319,7 +319,7 @@
"key": "%lld rows",
"location": {
"startingColumn": 18,
"startingLine": 1517
"startingLine": 1522
}
},
{
@@ -327,7 +327,7 @@
"key": "Import SQL into %@?",
"location": {
"startingColumn": 13,
"startingLine": 1725
"startingLine": 1766
}
},
{
@@ -335,7 +335,7 @@
"key": "Operation",
"location": {
"startingColumn": 20,
"startingLine": 1589
"startingLine": 1597
}
},
{
@@ -343,7 +343,7 @@
"key": "Data Export",
"location": {
"startingColumn": 22,
"startingLine": 1590
"startingLine": 1598
}
},
{
@@ -351,39 +351,39 @@
"key": "Data Import / Restore",
"location": {
"startingColumn": 22,
"startingLine": 1591
"startingLine": 1599
}
},
{
"comment": "",
"key": "MySQL Connection",
"location": {
"startingColumn": 25,
"startingLine": 1597
"startingColumn": 26,
"startingLine": 1606
}
},
{
"comment": "",
"key": "Export Options",
"location": {
"startingColumn": 29,
"startingLine": 1619
"startingColumn": 30,
"startingLine": 1630
}
},
{
"comment": "",
"key": "Import Options",
"location": {
"startingColumn": 29,
"startingLine": 1651
"startingColumn": 30,
"startingLine": 1682
}
},
{
"comment": "",
"key": "Progress",
"location": {
"startingColumn": 25,
"startingLine": 1661
"startingColumn": 26,
"startingLine": 1694
}
},
{
@@ -391,7 +391,7 @@
"key": "Connection",
"location": {
"startingColumn": 36,
"startingLine": 1598
"startingLine": 1608
}
},
{
@@ -399,7 +399,7 @@
"key": "Database",
"location": {
"startingColumn": 28,
"startingLine": 1602
"startingLine": 1612
}
},
{
@@ -407,7 +407,7 @@
"key": "Select Database",
"location": {
"startingColumn": 30,
"startingLine": 1603
"startingLine": 1613
}
},
{
@@ -415,15 +415,23 @@
"key": "Refresh Databases",
"location": {
"startingColumn": 32,
"startingLine": 1611
"startingLine": 1621
}
},
{
"comment": "",
"key": "Exports base tables with batched INSERT statements. Views, triggers, routines and transaction-consistent snapshots are not included.",
"key": "No tables found. Select a database or refresh the list.",
"location": {
"startingColumn": 34,
"startingLine": 1648
}
},
{
"comment": "",
"key": "Exports base tables and selected views. Triggers, routines, consistent snapshots and guaranteed row ordering are not yet supported.",
"location": {
"startingColumn": 30,
"startingLine": 1647
"startingLine": 1677
}
},
{
@@ -431,7 +439,7 @@
"key": "Table structure",
"location": {
"startingColumn": 32,
"startingLine": 1620
"startingLine": 1632
}
},
{
@@ -439,7 +447,7 @@
"key": "Table data",
"location": {
"startingColumn": 32,
"startingLine": 1621
"startingLine": 1633
}
},
{
@@ -447,7 +455,15 @@
"key": "Add DROP TABLE IF EXISTS",
"location": {
"startingColumn": 32,
"startingLine": 1622
"startingLine": 1634
}
},
{
"comment": "",
"key": "Include views (definitions)",
"location": {
"startingColumn": 32,
"startingLine": 1636
}
},
{
@@ -455,7 +471,7 @@
"key": "Loading tables…",
"location": {
"startingColumn": 57,
"startingLine": 1632
"startingLine": 1646
}
},
{
@@ -463,7 +479,7 @@
"key": "Tables (%lld selected)",
"location": {
"startingColumn": 34,
"startingLine": 1625
"startingLine": 1639
}
},
{
@@ -471,7 +487,7 @@
"key": "All",
"location": {
"startingColumn": 36,
"startingLine": 1627
"startingLine": 1641
}
},
{
@@ -479,7 +495,7 @@
"key": "None",
"location": {
"startingColumn": 36,
"startingLine": 1628
"startingLine": 1642
}
},
{
@@ -487,7 +503,31 @@
"key": "Refresh",
"location": {
"startingColumn": 36,
"startingLine": 1629
"startingLine": 1643
}
},
{
"comment": "",
"key": "Views (%lld selected)",
"location": {
"startingColumn": 38,
"startingLine": 1662
}
},
{
"comment": "",
"key": "All",
"location": {
"startingColumn": 40,
"startingLine": 1664
}
},
{
"comment": "",
"key": "None",
"location": {
"startingColumn": 40,
"startingLine": 1665
}
},
{
@@ -495,7 +535,7 @@
"key": "Import SQL statements into the selected database.",
"location": {
"startingColumn": 30,
"startingLine": 1652
"startingLine": 1684
}
},
{
@@ -503,7 +543,7 @@
"key": "Supports ordinary SQL statements. Dumps using custom DELIMITER directives or stored routines are not supported yet.",
"location": {
"startingColumn": 30,
"startingLine": 1655
"startingLine": 1687
}
},
{
@@ -511,7 +551,7 @@
"key": "Close",
"location": {
"startingColumn": 24,
"startingLine": 1676
"startingLine": 1713
}
},
{
@@ -519,7 +559,7 @@
"key": "Cancel",
"location": {
"startingColumn": 28,
"startingLine": 1684
"startingLine": 1721
}
},
{
@@ -527,7 +567,7 @@
"key": "Export SQL…",
"location": {
"startingColumn": 31,
"startingLine": 1691
"startingLine": 1728
}
},
{
@@ -535,7 +575,7 @@
"key": "Import SQL…",
"location": {
"startingColumn": 31,
"startingLine": 1692
"startingLine": 1729
}
},
{
@@ -543,7 +583,7 @@
"key": "Import SQL",
"location": {
"startingColumn": 20,
"startingLine": 1728
"startingLine": 1769
}
},
{
@@ -551,7 +591,7 @@
"key": "Cancel",
"location": {
"startingColumn": 20,
"startingLine": 1736
"startingLine": 1777
}
},
{
@@ -559,7 +599,7 @@
"key": "SQL files can modify or delete existing database objects and data. Ensure you have a backup before continuing.",
"location": {
"startingColumn": 17,
"startingLine": 1741
"startingLine": 1782
}
},
{
@@ -567,7 +607,7 @@
"key": "Database Import / Export",
"location": {
"startingColumn": 22,
"startingLine": 1753
"startingLine": 1794
}
},
{
@@ -575,7 +615,7 @@
"key": "Built-in native MySQL database tools",
"location": {
"startingColumn": 22,
"startingLine": 1756
"startingLine": 1797
}
}
]
@@ -7,3 +7,5 @@
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
/Volumes/Developer/Applications/WorkbenchReplacement/build/Build/Products/Debug/WorkbenchReplacement.app
@@ -19,7 +19,7 @@
<dict>
<key>cdhash</key>
<data>
kACWojMyCPE6G6Uw22tGzRrP2x4=
Iv3+eGn5ABjizzuIQDv3FNnVrWE=
</data>
<key>requirement</key>
<string>identifier "WorkbenchReplacement.debug" and anchor apple generic and certificate leaf[subject.CN] = "Apple Development: Mark Gregory (FLBRJ3BYDD)" and certificate 1[field.1.2.840.113635.100.6.2.1] /* exists */</string>
+47 -47
View File
@@ -48,7 +48,7 @@
<key>uniqueIdentifier</key>
<string>087CD1E0-7E94-4934-A62E-C6C070CD1577</string>
</dict>
<key>AD44F407-7FE5-46AE-A82F-8FAC1CA2720B</key>
<key>20B4B0A0-41A0-44A0-BA02-3E5707BABE60</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
@@ -57,7 +57,7 @@
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>AD44F407-7FE5-46AE-A82F-8FAC1CA2720B.xcactivitylog</string>
<string>20B4B0A0-41A0-44A0-BA02-3E5707BABE60.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
@@ -82,13 +82,55 @@
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813875703.86912405</real>
<real>813876442.84578598</real>
<key>timeStoppedRecording</key>
<real>813875715.47182798</real>
<real>813876454.95874095</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>AD44F407-7FE5-46AE-A82F-8FAC1CA2720B</string>
<string>20B4B0A0-41A0-44A0-BA02-3E5707BABE60</string>
</dict>
<key>705B952B-2A37-40D9-B731-8E2290C15462</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
<key>documentTypeString</key>
<string>&lt;nil&gt;</string>
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>705B952B-2A37-40D9-B731-8E2290C15462.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
<dict>
<key>highLevelStatus</key>
<string>S</string>
<key>totalNumberOfAnalyzerIssues</key>
<integer>0</integer>
<key>totalNumberOfErrors</key>
<integer>0</integer>
<key>totalNumberOfTestFailures</key>
<integer>0</integer>
<key>totalNumberOfWarnings</key>
<integer>0</integer>
</dict>
<key>schemeIdentifier-containerName</key>
<string>WorkbenchReplacement project</string>
<key>schemeIdentifier-schemeName</key>
<string>WorkbenchReplacement</string>
<key>schemeIdentifier-sharedScheme</key>
<integer>1</integer>
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813876591.82079995</real>
<key>timeStoppedRecording</key>
<real>813876604.10285401</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>705B952B-2A37-40D9-B731-8E2290C15462</string>
</dict>
<key>AF582207-87B3-4A2E-A532-DA0FD8F61FBD</key>
<dict>
@@ -132,48 +174,6 @@
<key>uniqueIdentifier</key>
<string>AF582207-87B3-4A2E-A532-DA0FD8F61FBD</string>
</dict>
<key>BA4E5983-8DAA-49CA-A677-11E73E67F0B0</key>
<dict>
<key>className</key>
<string>IDECommandLineBuildLog</string>
<key>documentTypeString</key>
<string>&lt;nil&gt;</string>
<key>domainType</key>
<string>Xcode.IDEActivityLogDomainType.BuildLog</string>
<key>fileName</key>
<string>BA4E5983-8DAA-49CA-A677-11E73E67F0B0.xcactivitylog</string>
<key>hasPrimaryLog</key>
<true/>
<key>primaryObservable</key>
<dict>
<key>highLevelStatus</key>
<string>S</string>
<key>totalNumberOfAnalyzerIssues</key>
<integer>0</integer>
<key>totalNumberOfErrors</key>
<integer>0</integer>
<key>totalNumberOfTestFailures</key>
<integer>0</integer>
<key>totalNumberOfWarnings</key>
<integer>0</integer>
</dict>
<key>schemeIdentifier-containerName</key>
<string>WorkbenchReplacement project</string>
<key>schemeIdentifier-schemeName</key>
<string>WorkbenchReplacement</string>
<key>schemeIdentifier-sharedScheme</key>
<integer>1</integer>
<key>signature</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>timeStartedRecording</key>
<real>813875867.553792</real>
<key>timeStoppedRecording</key>
<real>813875879.94755697</real>
<key>title</key>
<string>Building project WorkbenchReplacement with scheme WorkbenchReplacement and configuration Debug</string>
<key>uniqueIdentifier</key>
<string>BA4E5983-8DAA-49CA-A677-11E73E67F0B0</string>
</dict>
</dict>
</dict>
</plist>
@@ -1 +1 @@
1792183470.9957151: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex")
1792183792.223736: Module build session file for module cache at Path(str: "/Volumes/Developer/Applications/WorkbenchReplacement/build/ModuleCache.noindex")
+1 -1
View File
@@ -3,7 +3,7 @@
<plist version="1.0">
<dict>
<key>LastAccessedDate</key>
<date>2026-10-16T20:44:30Z</date>
<date>2026-10-16T20:49:52Z</date>
<key>WorkspacePath</key>
<string>/Volumes/Developer/Applications/WorkbenchReplacement/WorkbenchReplacement.xcodeproj</string>
</dict>