From e35a951c08856619bb98ece5de1cba702c02c5bb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 7 Jun 2026 21:02:58 +0000 Subject: [PATCH 1/4] chore(deps): bump actions/checkout from 6.0.2 to 6.0.3 Bumps [actions/checkout](https://github.com/actions/checkout) from 6.0.2 to 6.0.3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/de0fac2e4500dabe0009e67214ff5f5447ce83dd...df4cb1c069e1874edd31b4311f1884172cec0e10) --- updated-dependencies: - dependency-name: actions/checkout dependency-version: 6.0.3 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/ci.yml | 12 ++++++------ .github/workflows/release.yml | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4da4af9..c02299d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: name: Dependency Age Gate runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: @@ -28,7 +28,7 @@ jobs: name: Lint (TypeScript) runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: '20' @@ -44,7 +44,7 @@ jobs: name: Lint (Rust) runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable with: components: rustfmt, clippy @@ -82,7 +82,7 @@ jobs: --health-timeout 5s --health-retries 10 steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable - uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1 with: @@ -106,7 +106,7 @@ jobs: name: Test Frontend runs-on: ubuntu-latest steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: node-version: '20' @@ -133,7 +133,7 @@ jobs: runs-on: ubuntu-latest needs: [test-rust, test-frontend] steps: - - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + - uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable - uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0 with: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0772d7f..786bb5e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -31,7 +31,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 + uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3 - name: Install Linux dependencies if: matrix.platform == 'ubuntu-22.04' From 9e4c3ed026bdb3b56d645208e623f4fdd189b109 Mon Sep 17 00:00:00 2001 From: Elliot Date: Fri, 19 Jun 2026 22:46:56 -0500 Subject: [PATCH 2/4] fix: run cargo fmt and add missing fields to test struct --- src-tauri/crates/mas-admin/src/lib.rs | 5 +---- .../crates/mas-core/src/connection/manager.rs | 14 ++++++++++--- .../crates/mas-core/src/connection/store.rs | 21 +++++++++++++------ .../query_database_context_regression.rs | 3 +++ src-tauri/src/commands/mod.rs | 4 +++- 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/src-tauri/crates/mas-admin/src/lib.rs b/src-tauri/crates/mas-admin/src/lib.rs index d35ab8a..648d893 100644 --- a/src-tauri/crates/mas-admin/src/lib.rs +++ b/src-tauri/crates/mas-admin/src/lib.rs @@ -101,10 +101,7 @@ impl AdminService { ) -> Result<(), CoreError> { tracing::info!(process_id = process_id, "Killing MySQL process"); let pool = self.connection_manager.get_pool(connection_id)?; - let result = sqlx::query("KILL ?") - .bind(process_id) - .execute(&pool) - .await; + let result = sqlx::query("KILL ?").bind(process_id).execute(&pool).await; match result { Ok(_) => { tracing::info!(process_id = process_id, "Process killed successfully"); diff --git a/src-tauri/crates/mas-core/src/connection/manager.rs b/src-tauri/crates/mas-core/src/connection/manager.rs index f75aca4..4c5ed31 100644 --- a/src-tauri/crates/mas-core/src/connection/manager.rs +++ b/src-tauri/crates/mas-core/src/connection/manager.rs @@ -35,7 +35,10 @@ impl ConnectionManager { "Creating connection pool" ); - let charset = profile.charset.clone().unwrap_or_else(|| "utf8mb4".to_string()); + let charset = profile + .charset + .clone() + .unwrap_or_else(|| "utf8mb4".to_string()); let mut options = MySqlConnectOptions::new() .host(&profile.host) .port(profile.port) @@ -64,7 +67,9 @@ impl ConnectionManager { .after_connect(move |conn, _meta| { let charset = charset_for_after_connect.clone(); Box::pin(async move { - sqlx::query(&format!("SET NAMES {}", charset)).execute(&mut *conn).await?; + sqlx::query(&format!("SET NAMES {}", charset)) + .execute(&mut *conn) + .await?; Ok(()) }) }) @@ -150,7 +155,10 @@ impl ConnectionManager { ) -> Result { let start = Instant::now(); - let charset = profile.charset.clone().unwrap_or_else(|| "utf8mb4".to_string()); + let charset = profile + .charset + .clone() + .unwrap_or_else(|| "utf8mb4".to_string()); let mut options = MySqlConnectOptions::new() .host(&profile.host) .port(profile.port) diff --git a/src-tauri/crates/mas-core/src/connection/store.rs b/src-tauri/crates/mas-core/src/connection/store.rs index 8ad2816..d4d5884 100644 --- a/src-tauri/crates/mas-core/src/connection/store.rs +++ b/src-tauri/crates/mas-core/src/connection/store.rs @@ -55,12 +55,21 @@ impl ConnectionStore { db.execute("ALTER TABLE connection_profiles ADD COLUMN env TEXT", []) .ok(); // Migration: add advanced settings columns if missing - db.execute("ALTER TABLE connection_profiles ADD COLUMN connect_timeout_secs INTEGER", []) - .ok(); - db.execute("ALTER TABLE connection_profiles ADD COLUMN query_timeout_secs INTEGER", []) - .ok(); - db.execute("ALTER TABLE connection_profiles ADD COLUMN charset TEXT", []) - .ok(); + db.execute( + "ALTER TABLE connection_profiles ADD COLUMN connect_timeout_secs INTEGER", + [], + ) + .ok(); + db.execute( + "ALTER TABLE connection_profiles ADD COLUMN query_timeout_secs INTEGER", + [], + ) + .ok(); + db.execute( + "ALTER TABLE connection_profiles ADD COLUMN charset TEXT", + [], + ) + .ok(); tracing::debug!("Connection profiles table initialized"); Ok(()) } diff --git a/src-tauri/crates/mas-core/tests/query_database_context_regression.rs b/src-tauri/crates/mas-core/tests/query_database_context_regression.rs index 5d5db93..a345f5b 100644 --- a/src-tauri/crates/mas-core/tests/query_database_context_regression.rs +++ b/src-tauri/crates/mas-core/tests/query_database_context_regression.rs @@ -20,6 +20,9 @@ fn test_profile() -> ConnectionProfile { pool_min: 1, pool_max: 5, read_only: false, + connect_timeout_secs: None, + query_timeout_secs: None, + charset: None, environment: None, created_at: Utc::now(), updated_at: Utc::now(), diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs index dfe8111..eee8951 100644 --- a/src-tauri/src/commands/mod.rs +++ b/src-tauri/src/commands/mod.rs @@ -534,7 +534,9 @@ pub async fn write_file_contents(path: String, contents: String) -> Result<(), S .ok_or_else(|| "Invalid path: missing file name".to_string())?, ) } else { - path_buf.canonicalize().map_err(|e| format!("Invalid path: {e}"))? + path_buf + .canonicalize() + .map_err(|e| format!("Invalid path: {e}"))? }; tokio::fs::write(&resolved, &contents).await.map_err(|e| { tracing::error!(error = %e, path = %path, "Failed to write file"); From 11a0c296c18eba409a431e3576e24d1637081e87 Mon Sep 17 00:00:00 2001 From: Elliot Date: Fri, 19 Jun 2026 22:40:56 -0500 Subject: [PATCH 3/4] fix: correct undo/redo logic for cell edits and insert rows --- .../editor/__tests__/QueryToolbar.test.tsx | 4 ++-- src/hooks/useGridEditing.ts | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/components/editor/__tests__/QueryToolbar.test.tsx b/src/components/editor/__tests__/QueryToolbar.test.tsx index 72daf6a..3cff48a 100644 --- a/src/components/editor/__tests__/QueryToolbar.test.tsx +++ b/src/components/editor/__tests__/QueryToolbar.test.tsx @@ -386,10 +386,10 @@ describe("QueryToolbar", () => { expect(screen.getByText("Save").closest("button")).toBeDisabled(); }); - it("shows Running state when executing", () => { + it("shows Cancel button when executing", () => { mockIsExecuting = true; render(); - expect(screen.getByText("Running...")).toBeInTheDocument(); + expect(screen.getByText("Cancel")).toBeInTheDocument(); expect(screen.queryByText("Run")).not.toBeInTheDocument(); }); diff --git a/src/hooks/useGridEditing.ts b/src/hooks/useGridEditing.ts index 4bf558d..b203c56 100644 --- a/src/hooks/useGridEditing.ts +++ b/src/hooks/useGridEditing.ts @@ -134,6 +134,7 @@ export function useGridEditing() { setDeletes(new Set()); undoStack.current = []; redoStack.current = []; + bumpVersion(); }, []); const applyAction = useCallback((action: EditAction): EditAction => { @@ -143,7 +144,11 @@ export function useGridEditing() { const next = new Map(prev); const rowChanges = [...(next.get(action.rowIndex) ?? [])]; const existing = rowChanges.findIndex((c) => c.column === action.column); - if (action.newValue === action.oldValue || (action.oldValue === undefined && action.newValue === action.oldValue)) { + if (existing >= 0 && action.newValue === rowChanges[existing].originalValue) { + rowChanges.splice(existing, 1); + if (rowChanges.length === 0) next.delete(action.rowIndex); + else next.set(action.rowIndex, rowChanges); + } else if (action.newValue === action.oldValue) { if (existing >= 0) { rowChanges.splice(existing, 1); if (rowChanges.length === 0) next.delete(action.rowIndex); @@ -172,6 +177,10 @@ export function useGridEditing() { return { ...action, index: -1 }; } case "deleteRow": { + if (action.rowIndex === -1) { + setInserts((prev) => prev.slice(0, -1)); + return { type: "insertRow", index: 0 }; // forward action for redo + } setDeletes((prev: Set) => { const next = new Set(prev); if (next.has(action.rowIndex)) next.delete(action.rowIndex); @@ -194,7 +203,9 @@ export function useGridEditing() { const redo = useCallback(() => { const action = redoStack.current.pop(); if (!action) return; - const reverse = applyAction(reverseAction(action)); + const reverse = action.type === "insertRow" + ? applyAction(action) + : applyAction(reverseAction(action)); undoStack.current.push(reverse); bumpVersion(); }, [applyAction]); From b67f2e15efd9a7c953313c94b823ca571176d7de Mon Sep 17 00:00:00 2001 From: Elliot Date: Fri, 19 Jun 2026 23:03:07 -0500 Subject: [PATCH 4/4] fix: add missing ConnectionProfile fields to integration_tests.rs --- src-tauri/crates/mas-core/tests/integration_tests.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src-tauri/crates/mas-core/tests/integration_tests.rs b/src-tauri/crates/mas-core/tests/integration_tests.rs index 16be1dc..1c22cd0 100644 --- a/src-tauri/crates/mas-core/tests/integration_tests.rs +++ b/src-tauri/crates/mas-core/tests/integration_tests.rs @@ -42,6 +42,9 @@ fn test_profile() -> ConnectionProfile { pool_min: 1, pool_max: 5, read_only: false, + connect_timeout_secs: None, + query_timeout_secs: None, + charset: None, environment: None, created_at: Utc::now(), updated_at: Utc::now(),