From b496d84d4a40efeb034f72d70d78f2668c5c0db1 Mon Sep 17 00:00:00 2001 From: Ngo Quoc Dat Date: Mon, 20 Apr 2026 19:26:38 +0700 Subject: [PATCH 1/3] fix: use Icon Composer .icon for proper macOS icon padding Upgrade CI Xcode from 26.2 to 26.5 where actool no longer crashes on .icon files in headless environments. Remove the workaround that deleted AppIcon.icon and fell back to unpadded .appiconset PNGs. Fixes #769 --- .github/workflows/build-plugin.yml | 2 +- .github/workflows/build.yml | 6 +++--- scripts/build-release.sh | 7 ------- 3 files changed, 4 insertions(+), 11 deletions(-) diff --git a/.github/workflows/build-plugin.yml b/.github/workflows/build-plugin.yml index 690089876..c4a803283 100644 --- a/.github/workflows/build-plugin.yml +++ b/.github/workflows/build-plugin.yml @@ -62,7 +62,7 @@ jobs: - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: "26.2" + xcode-version: "26.5" - name: Download static libraries env: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1799f37d4..c12ee17ad 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,7 +42,7 @@ jobs: - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '26.2' + xcode-version: '26.5' - name: Download static libraries env: @@ -156,7 +156,7 @@ jobs: - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '26.2' + xcode-version: '26.5' - name: Download static libraries env: @@ -287,7 +287,7 @@ jobs: - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '26.2' + xcode-version: '26.5' - name: Download build artifacts uses: actions/download-artifact@v4 diff --git a/scripts/build-release.sh b/scripts/build-release.sh index 445437f6b..bf355c508 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -315,13 +315,6 @@ build_for_arch() { prepare_libmongoc "$arch" prepare_hiredis "$arch" - # Xcode 26's Icon Composer (.icon) crashes actool in headless CI. - # Keep AppIcon.appiconset as fallback; remove .icon so actool uses it. - if [ -d "TablePro/AppIcon.icon" ] && [ -d "TablePro/Assets.xcassets/AppIcon.appiconset" ]; then - echo "🎨 Using AppIcon.appiconset fallback for headless CI..." - rm -rf "TablePro/AppIcon.icon" - fi - # Persistent SPM package cache (speeds up CI on self-hosted runners) SPM_CACHE_DIR="${HOME}/.spm-cache" mkdir -p "$SPM_CACHE_DIR" From e10899b2244a5ba173375e7d83db382bef7c9341 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Tue, 21 Apr 2026 12:27:28 +0700 Subject: [PATCH 2/3] fix: use macos-26 runners for Xcode 26.5 and fix SwiftLint errors --- .github/workflows/build-plugin.yml | 2 +- .github/workflows/build.yml | 6 +++--- TablePro/Views/Main/Child/MainStatusBarView.swift | 1 - TablePro/Views/Main/MainContentView.swift | 10 ++++++---- TablePro/Views/QueryPlan/QueryPlanTreeView.swift | 1 - 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/.github/workflows/build-plugin.yml b/.github/workflows/build-plugin.yml index c4a803283..2fa705adb 100644 --- a/.github/workflows/build-plugin.yml +++ b/.github/workflows/build-plugin.yml @@ -44,7 +44,7 @@ jobs: build-plugin: name: "Build ${{ matrix.tag }}" needs: resolve-tags - runs-on: macos-15 + runs-on: macos-26 timeout-minutes: 30 strategy: matrix: ${{ fromJson(needs.resolve-tags.outputs.matrix) }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index c12ee17ad..69089fb48 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,7 +32,7 @@ jobs: build-arm64: name: Build ARM64 - runs-on: macos-15 + runs-on: macos-26 timeout-minutes: 20 steps: @@ -146,7 +146,7 @@ jobs: build-x86_64: name: Build x86_64 - runs-on: macos-15 + runs-on: macos-26 timeout-minutes: 25 steps: @@ -271,7 +271,7 @@ jobs: release: name: Create GitHub Release - runs-on: macos-15 + runs-on: macos-26 needs: [lint, build-arm64, build-x86_64] if: startsWith(github.ref, 'refs/tags/v') timeout-minutes: 10 diff --git a/TablePro/Views/Main/Child/MainStatusBarView.swift b/TablePro/Views/Main/Child/MainStatusBarView.swift index 7ac6e9491..3f2edd75c 100644 --- a/TablePro/Views/Main/Child/MainStatusBarView.swift +++ b/TablePro/Views/Main/Child/MainStatusBarView.swift @@ -9,7 +9,6 @@ import SwiftUI /// Status bar at the bottom of the results section struct MainStatusBarView: View { - let tab: QueryTab? let filterStateManager: FilterStateManager let columnVisibilityManager: ColumnVisibilityManager diff --git a/TablePro/Views/Main/MainContentView.swift b/TablePro/Views/Main/MainContentView.swift index 8a04216b3..7886916c8 100644 --- a/TablePro/Views/Main/MainContentView.swift +++ b/TablePro/Views/Main/MainContentView.swift @@ -125,10 +125,12 @@ struct MainContentView: View { private func sheetContent(for sheet: ActiveSheet) -> some View { let dismissBinding = Binding( get: { coordinator.activeSheet != nil }, - set: { if !$0 { - coordinator.activeSheet = nil - coordinator.exportPreselectedTableNames = nil - } } + set: { + if !$0 { + coordinator.activeSheet = nil + coordinator.exportPreselectedTableNames = nil + } + } ) switch sheet { diff --git a/TablePro/Views/QueryPlan/QueryPlanTreeView.swift b/TablePro/Views/QueryPlan/QueryPlanTreeView.swift index 250967c81..f42ab201c 100644 --- a/TablePro/Views/QueryPlan/QueryPlanTreeView.swift +++ b/TablePro/Views/QueryPlan/QueryPlanTreeView.swift @@ -51,7 +51,6 @@ struct QueryPlanTreeView: View { // MARK: - Row View private struct QueryPlanRowView: View { - let node: QueryPlanNode var body: some View { From fa979d14ee3e0193e4655f952060db0acab40a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ng=C3=B4=20Qu=E1=BB=91c=20=C4=90=E1=BA=A1t?= Date: Tue, 21 Apr 2026 12:37:17 +0700 Subject: [PATCH 3/3] fix: use xcode-version 26.5-beta and fix remaining SwiftLint errors --- .github/workflows/build-plugin.yml | 2 +- .github/workflows/build.yml | 6 +++--- .../Export/ForeignApp/DBeaverImporter.swift | 14 +++++++------- .../Export/ForeignApp/SequelAceImporter.swift | 2 +- .../Export/ForeignApp/TablePlusImporter.swift | 10 +++++----- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build-plugin.yml b/.github/workflows/build-plugin.yml index 2fa705adb..58b1a2e87 100644 --- a/.github/workflows/build-plugin.yml +++ b/.github/workflows/build-plugin.yml @@ -62,7 +62,7 @@ jobs: - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: "26.5" + xcode-version: "26.5-beta" - name: Download static libraries env: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 69089fb48..fea2942d9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -42,7 +42,7 @@ jobs: - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '26.5' + xcode-version: '26.5-beta' - name: Download static libraries env: @@ -156,7 +156,7 @@ jobs: - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '26.5' + xcode-version: '26.5-beta' - name: Download static libraries env: @@ -287,7 +287,7 @@ jobs: - name: Select Xcode uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: '26.5' + xcode-version: '26.5-beta' - name: Download build artifacts uses: actions/download-artifact@v4 diff --git a/TablePro/Core/Services/Export/ForeignApp/DBeaverImporter.swift b/TablePro/Core/Services/Export/ForeignApp/DBeaverImporter.swift index df403acc5..c3b3cc60d 100644 --- a/TablePro/Core/Services/Export/ForeignApp/DBeaverImporter.swift +++ b/TablePro/Core/Services/Export/ForeignApp/DBeaverImporter.swift @@ -327,14 +327,14 @@ struct DBeaverImporter: ForeignAppImporter { private func defaultPort(for dbType: String) -> Int { switch dbType { - case "MySQL", "MariaDB": return 3306 - case "PostgreSQL": return 5432 + case "MySQL", "MariaDB": return 3_306 + case "PostgreSQL": return 5_432 case "MongoDB": return 27_017 - case "Redis": return 6379 - case "SQL Server": return 1433 - case "Oracle": return 1521 - case "ClickHouse": return 8123 - case "Cassandra": return 9042 + case "Redis": return 6_379 + case "SQL Server": return 1_433 + case "Oracle": return 1_521 + case "ClickHouse": return 8_123 + case "Cassandra": return 9_042 default: return 0 } } diff --git a/TablePro/Core/Services/Export/ForeignApp/SequelAceImporter.swift b/TablePro/Core/Services/Export/ForeignApp/SequelAceImporter.swift index 00034c7c1..9e2616eaa 100644 --- a/TablePro/Core/Services/Export/ForeignApp/SequelAceImporter.swift +++ b/TablePro/Core/Services/Export/ForeignApp/SequelAceImporter.swift @@ -157,7 +157,7 @@ struct SequelAceImporter: ForeignAppImporter { } else if let strPort = entry["port"] as? String, let parsed = Int(strPort) { port = parsed } else { - port = 3306 + port = 3_306 } let username = entry["user"] as? String ?? "" let database = entry["database"] as? String ?? "" diff --git a/TablePro/Core/Services/Export/ForeignApp/TablePlusImporter.swift b/TablePro/Core/Services/Export/ForeignApp/TablePlusImporter.swift index b30a95779..1c806bc7b 100644 --- a/TablePro/Core/Services/Export/ForeignApp/TablePlusImporter.swift +++ b/TablePro/Core/Services/Export/ForeignApp/TablePlusImporter.swift @@ -206,7 +206,7 @@ struct TablePlusImporter: ForeignAppImporter { let paths = entry["TlsKeyPaths"] as? [String] ?? [] return ExportableSSLConfig( mode: "Required", - caCertificatePath: paths.count > 0 ? paths[0] : nil, + caCertificatePath: !paths.isEmpty ? paths[0] : nil, clientCertificatePath: paths.count > 1 ? paths[1] : nil, clientKeyPath: paths.count > 2 ? paths[2] : nil ) @@ -247,11 +247,11 @@ struct TablePlusImporter: ForeignAppImporter { private func defaultPort(for dbType: String) -> Int { switch dbType { - case "MySQL", "MariaDB": return 3306 - case "PostgreSQL", "Redshift": return 5432 + case "MySQL", "MariaDB": return 3_306 + case "PostgreSQL", "Redshift": return 5_432 case "MongoDB": return 27_017 - case "Redis": return 6379 - case "SQL Server": return 1433 + case "Redis": return 6_379 + case "SQL Server": return 1_433 default: return 0 } }