From 5a859224c1b3e3f9d8b34790039d9f00b7c60850 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Wed, 21 Jan 2026 11:24:12 -0600 Subject: [PATCH 01/25] Update the version upgrade tool --- tools/upgrade-version/src/main.rs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 212f82e9fc4..66b1c40a207 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -184,7 +184,18 @@ fn main() -> anyhow::Result<()> { process_license_file("LICENSE.txt", &full_version); process_license_file("licenses/BSL.txt", &full_version); + println!("$> cargo check"); cmd!("cargo", "check").run().expect("Cargo check failed!"); + + println!("$> pnpm --dir templates/quickstart-chat-typescript generate"); + cmd!("pnpm", "--dir", "templates/quickstart-chat-typescript", "generate") + .run() + .expect("pnpm generate failed!"); + + println!("$> cargo test -p spacetimedb-codegen"); + cmd!("cargo", "test", "-p", "spacetimedb-codegen").run()?; + println!("$> cargo insta review"); + cmd!("cargo", "insta", "review").run()?; } if matches.get_flag("typescript") || matches.get_flag("all") { From beca5be7484efdbdc2381de50bdfb2a306876478 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Wed, 21 Jan 2026 11:31:12 -0600 Subject: [PATCH 02/25] Allow the user to just accept the insta snapshot change --- tools/upgrade-version/src/main.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 66b1c40a207..e163e8ba2ee 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -192,8 +192,11 @@ fn main() -> anyhow::Result<()> { .run() .expect("pnpm generate failed!"); + // This gives an error because the snapshot has been updated println!("$> cargo test -p spacetimedb-codegen"); - cmd!("cargo", "test", "-p", "spacetimedb-codegen").run()?; + let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen").run(); + + // Let the user approve the snapshot change println!("$> cargo insta review"); cmd!("cargo", "insta", "review").run()?; } From 9d040e7c2d35dac9bf1b925df2195693e30b461b Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 05:13:10 -0600 Subject: [PATCH 03/25] Fix CI check --- .github/workflows/upgrade-version-check.yml | 2 +- tools/upgrade-version/src/main.rs | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/.github/workflows/upgrade-version-check.yml b/.github/workflows/upgrade-version-check.yml index 41f8f178573..3fbbb64cf93 100644 --- a/.github/workflows/upgrade-version-check.yml +++ b/.github/workflows/upgrade-version-check.yml @@ -16,7 +16,7 @@ jobs: - name: Checkout uses: actions/checkout@v3 - name: Verify that upgrade-version still works - run: cargo bump-versions 123.456.789 --rust-and-cli --csharp --typescript + run: cargo bump-versions 123.456.789 --rust-and-cli --csharp --typescript --accept-snapshots - name: Show diff run: git diff HEAD diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index e163e8ba2ee..dc9f2269bb2 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -127,6 +127,12 @@ fn main() -> anyhow::Result<()> { .help("Update all targets (equivalent to --typescript --rust-and-cli --csharp)") .conflicts_with_all(["typescript", "rust-and-cli", "csharp"]), ) + .arg( + Arg::new("accept-snapshots") + .long("accept-snapshots") + .action(clap::ArgAction::SetTrue) + .help("If there are snapshots to review automatically accept them all."), + ) .group( ArgGroup::new("update-targets") .args(["all", "typescript", "rust-and-cli", "csharp"]) @@ -196,9 +202,15 @@ fn main() -> anyhow::Result<()> { println!("$> cargo test -p spacetimedb-codegen"); let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen").run(); - // Let the user approve the snapshot change - println!("$> cargo insta review"); - cmd!("cargo", "insta", "review").run()?; + if matches.get_flag("accept-snapshots") { + // automatically accept the snapshot + println!("$> cargo insta accept"); + cmd!("cargo", "insta", "accept").run()?; + } else { + // Let the user manually approve the snapshot change + println!("$> cargo insta review"); + cmd!("cargo", "insta", "review").run()?; + } } if matches.get_flag("typescript") || matches.get_flag("all") { From 7d6ea9aff226ab4784bd3d9f8759aca6fa382582 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 05:33:37 -0600 Subject: [PATCH 04/25] Run pnpm build as well --- tools/upgrade-version/src/main.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index dc9f2269bb2..5bd2a70ee22 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -193,6 +193,11 @@ fn main() -> anyhow::Result<()> { println!("$> cargo check"); cmd!("cargo", "check").run().expect("Cargo check failed!"); + println!("$> pnpm run build"); + cmd!("pnpm", "run", "build") + .run() + .expect("pnpm run build failed!"); + println!("$> pnpm --dir templates/quickstart-chat-typescript generate"); cmd!("pnpm", "--dir", "templates/quickstart-chat-typescript", "generate") .run() From 179ef5aaf4b0fb7878c370bc0c7c851fe37274b5 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:23:21 -0600 Subject: [PATCH 05/25] Also pnpm install --- tools/upgrade-version/src/main.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 79377105bca..3d2f05e481b 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -193,6 +193,11 @@ fn main() -> anyhow::Result<()> { println!("$> cargo check"); cmd!("cargo", "check").run().expect("Cargo check failed!"); + println!("$> pnpm install"); + cmd!("pnpm", "install") + .run() + .expect("pnpm run build failed!"); + println!("$> pnpm run build"); cmd!("pnpm", "run", "build") .run() From 47ce799e98a4b44394db2a3d77862eada3415b0d Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:35:16 -0600 Subject: [PATCH 06/25] Small fix from template rename --- tools/upgrade-version/src/main.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 3d2f05e481b..6cafaeba9be 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -203,8 +203,8 @@ fn main() -> anyhow::Result<()> { .run() .expect("pnpm run build failed!"); - println!("$> pnpm --dir templates/quickstart-chat-typescript generate"); - cmd!("pnpm", "--dir", "templates/quickstart-chat-typescript", "generate") + println!("$> pnpm --dir templates/chat-react-ts generate"); + cmd!("pnpm", "--dir", "templates/chat-react-ts", "generate") .run() .expect("pnpm generate failed!"); From 89ce89caf090449db2ed83ed1ac2a6235e450a7b Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:37:53 -0600 Subject: [PATCH 07/25] Install npm/pnpm in workflow --- .github/workflows/upgrade-version-check.yml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/.github/workflows/upgrade-version-check.yml b/.github/workflows/upgrade-version-check.yml index 3fbbb64cf93..849657047d4 100644 --- a/.github/workflows/upgrade-version-check.yml +++ b/.github/workflows/upgrade-version-check.yml @@ -15,6 +15,14 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + # pnpm is required for regenerating the typescript bindings + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + - uses: pnpm/action-setup@v4 + with: + run_install: true - name: Verify that upgrade-version still works run: cargo bump-versions 123.456.789 --rust-and-cli --csharp --typescript --accept-snapshots - name: Show diff From be961a0307af5c823e03e0565673f6c1cf897aa4 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:42:26 -0600 Subject: [PATCH 08/25] Upgrade npm version --- .github/workflows/upgrade-version-check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/upgrade-version-check.yml b/.github/workflows/upgrade-version-check.yml index 849657047d4..f6abff297e5 100644 --- a/.github/workflows/upgrade-version-check.yml +++ b/.github/workflows/upgrade-version-check.yml @@ -19,7 +19,7 @@ jobs: - name: Set up Node.js uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 - uses: pnpm/action-setup@v4 with: run_install: true From 6a8b3001c5a09bc03388a17057082059057574af Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:47:14 -0600 Subject: [PATCH 09/25] Test after accepting new snapshot --- tools/upgrade-version/src/main.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 6cafaeba9be..f969d6d0b87 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -208,10 +208,6 @@ fn main() -> anyhow::Result<()> { .run() .expect("pnpm generate failed!"); - // This gives an error because the snapshot has been updated - println!("$> cargo test -p spacetimedb-codegen"); - let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen").run(); - if matches.get_flag("accept-snapshots") { // automatically accept the snapshot println!("$> cargo insta accept"); @@ -221,6 +217,10 @@ fn main() -> anyhow::Result<()> { println!("$> cargo insta review"); cmd!("cargo", "insta", "review").run()?; } + + // This gives an error because the snapshot has been updated + println!("$> cargo test -p spacetimedb-codegen"); + let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen").run(); } if matches.get_flag("typescript") || matches.get_flag("all") { From 3ade9ed84796c41a1ef3a3053b6c3ab44c4c5fe7 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 14:51:31 -0600 Subject: [PATCH 10/25] cargo fmt --- tools/upgrade-version/src/main.rs | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index f969d6d0b87..065f1c74032 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -194,33 +194,40 @@ fn main() -> anyhow::Result<()> { cmd!("cargo", "check").run().expect("Cargo check failed!"); println!("$> pnpm install"); - cmd!("pnpm", "install") - .run() - .expect("pnpm run build failed!"); + cmd!("pnpm", "install").run().expect("pnpm run build failed!"); println!("$> pnpm run build"); - cmd!("pnpm", "run", "build") - .run() - .expect("pnpm run build failed!"); - + cmd!("pnpm", "run", "build").run().expect("pnpm run build failed!"); + println!("$> pnpm --dir templates/chat-react-ts generate"); cmd!("pnpm", "--dir", "templates/chat-react-ts", "generate") .run() .expect("pnpm generate failed!"); + println!("$> cargo install cargo-insta"); + cmd!("cargo", "install", "cargo-insta") + .run() + .expect("cargo install cargo-insta failed!"); + if matches.get_flag("accept-snapshots") { // automatically accept the snapshot println!("$> cargo insta accept"); - cmd!("cargo", "insta", "accept").run()?; + cmd!("cargo", "insta", "accept") + .run() + .expect("cargo insta accept failed!"); } else { // Let the user manually approve the snapshot change println!("$> cargo insta review"); - cmd!("cargo", "insta", "review").run()?; + cmd!("cargo", "insta", "review") + .run() + .expect("cargo insta review failed!"); } // This gives an error because the snapshot has been updated println!("$> cargo test -p spacetimedb-codegen"); - let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen").run(); + cmd!("cargo", "test", "-p", "spacetimedb-codegen") + .run() + .expect("cargo test -p spacetimedb-codegen failed!"); } if matches.get_flag("typescript") || matches.get_flag("all") { From 43504e41d1af232c91c97eda3779df62726558f7 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 15:06:22 -0600 Subject: [PATCH 11/25] One more fix --- tools/upgrade-version/src/main.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 065f1c74032..bdc82ef8478 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -209,6 +209,10 @@ fn main() -> anyhow::Result<()> { .run() .expect("cargo install cargo-insta failed!"); + // This gives an error because the snapshot will be updated during the test + println!("$> cargo test -p spacetimedb-codegen (expected to fail)"); + let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen").run(); + if matches.get_flag("accept-snapshots") { // automatically accept the snapshot println!("$> cargo insta accept"); @@ -223,7 +227,7 @@ fn main() -> anyhow::Result<()> { .expect("cargo insta review failed!"); } - // This gives an error because the snapshot has been updated + // This should now pass println!("$> cargo test -p spacetimedb-codegen"); cmd!("cargo", "test", "-p", "spacetimedb-codegen") .run() From 2804fdc8fd2add4ee70558ead99fc18321f3c292 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 15:10:22 -0600 Subject: [PATCH 12/25] cargo fmt --- tools/upgrade-version/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index bdc82ef8478..876ad503e8f 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -212,7 +212,7 @@ fn main() -> anyhow::Result<()> { // This gives an error because the snapshot will be updated during the test println!("$> cargo test -p spacetimedb-codegen (expected to fail)"); let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen").run(); - + if matches.get_flag("accept-snapshots") { // automatically accept the snapshot println!("$> cargo insta accept"); From e44fa54236cb52dae8173dce82a3ec5109e512b8 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 19:28:30 -0600 Subject: [PATCH 13/25] Small fix for CI --- tools/upgrade-version/src/main.rs | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 876ad503e8f..b1b7247631e 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -209,23 +209,22 @@ fn main() -> anyhow::Result<()> { .run() .expect("cargo install cargo-insta failed!"); - // This gives an error because the snapshot will be updated during the test - println!("$> cargo test -p spacetimedb-codegen (expected to fail)"); - let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen").run(); - - if matches.get_flag("accept-snapshots") { - // automatically accept the snapshot - println!("$> cargo insta accept"); - cmd!("cargo", "insta", "accept") - .run() - .expect("cargo insta accept failed!"); + println!("$> INSTA_UPDATE=always cargo test -p spacetimedb-codegen --test codegen"); + cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") + .env("INSTA_UPDATE", "always") + .run() + .expect("cargo test -p spacetimedb-codegen --test codegen (INSTA_UPDATE=always) failed!"); + + + let insta_command = if matches.get_flag("accept-snapshots") { + "accept" } else { - // Let the user manually approve the snapshot change - println!("$> cargo insta review"); - cmd!("cargo", "insta", "review") - .run() - .expect("cargo insta review failed!"); - } + "review" + }; + println!("$> cargo insta {}", insta_command); + cmd!("cargo", "insta", insta_command) + .run() + .expect(format!("cargo insta {} failed!", insta_command).as_str()); // This should now pass println!("$> cargo test -p spacetimedb-codegen"); From ac9b4946a05bf04d6be07165c49fd7ee95f92d22 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 19:42:02 -0600 Subject: [PATCH 14/25] Cleanup --- tools/upgrade-version/src/main.rs | 51 +++++++++++++++---------------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index b1b7247631e..3165894daed 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -204,33 +204,32 @@ fn main() -> anyhow::Result<()> { .run() .expect("pnpm generate failed!"); - println!("$> cargo install cargo-insta"); - cmd!("cargo", "install", "cargo-insta") - .run() - .expect("cargo install cargo-insta failed!"); - - println!("$> INSTA_UPDATE=always cargo test -p spacetimedb-codegen --test codegen"); - cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") - .env("INSTA_UPDATE", "always") - .run() - .expect("cargo test -p spacetimedb-codegen --test codegen (INSTA_UPDATE=always) failed!"); - - - let insta_command = if matches.get_flag("accept-snapshots") { - "accept" + if matches.get_flag("accept_snapshots") { + // Generate and auto-accept snapshots + println!("$> INSTA_UPDATE=always cargo test -p spacetimedb-codegen --test codegen"); + cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") + .env("INSTA_UPDATE", "always") + .run() + .expect("cargo test -p spacetimedb-codegen --test codegen (INSTA_UPDATE=always) failed!"); } else { - "review" - }; - println!("$> cargo insta {}", insta_command); - cmd!("cargo", "insta", insta_command) - .run() - .expect(format!("cargo insta {} failed!", insta_command).as_str()); - - // This should now pass - println!("$> cargo test -p spacetimedb-codegen"); - cmd!("cargo", "test", "-p", "spacetimedb-codegen") - .run() - .expect("cargo test -p spacetimedb-codegen failed!"); + // Initial test - this will generate snapshots + println!("$> cargo test -p spacetimedb-codegen --test codegen"); + cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") + .run() + .expect("cargo test -p spacetimedb-codegen --test codegen failed!"); + + // Review the new snapshots + println!("$> cargo insta review"); + cmd!("cargo", "insta", "review") + .run() + .expect("cargo insta review failed!"); + + // Test again now that the user has had a chance to accept the snapshots + println!("$> cargo test -p spacetimedb-codegen --test codegen"); + cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") + .run() + .expect("cargo test -p spacetimedb-codegen --test codegen failed!"); + } } if matches.get_flag("typescript") || matches.get_flag("all") { From ea0b07c52ff4fbd7287ba00ecfe81a7e804143ba Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 19:53:59 -0600 Subject: [PATCH 15/25] Small bug fix --- tools/upgrade-version/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 3165894daed..11ddeda256d 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -204,7 +204,7 @@ fn main() -> anyhow::Result<()> { .run() .expect("pnpm generate failed!"); - if matches.get_flag("accept_snapshots") { + if matches.get_flag("accept-snapshots") { // Generate and auto-accept snapshots println!("$> INSTA_UPDATE=always cargo test -p spacetimedb-codegen --test codegen"); cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") From 8009ae912e1b0496e7ace3896fef9fd8ac535657 Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 20:04:13 -0600 Subject: [PATCH 16/25] Install cargo insta when a review is required --- tools/upgrade-version/src/main.rs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index 11ddeda256d..c9018f117f0 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -212,6 +212,11 @@ fn main() -> anyhow::Result<()> { .run() .expect("cargo test -p spacetimedb-codegen --test codegen (INSTA_UPDATE=always) failed!"); } else { + println!("$> cargo install cargo-insta"); + cmd!("cargo", "install", "cargo-insta") + .run() + .expect("cargo install cargo-insta failed!"); + // Initial test - this will generate snapshots println!("$> cargo test -p spacetimedb-codegen --test codegen"); cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") From e09974f4bcf525ab825e63db058a04c0799f520c Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 20:11:12 -0600 Subject: [PATCH 17/25] When review is required, the first pass of tests is expected to fail --- tools/upgrade-version/src/main.rs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index c9018f117f0..c5a28785ecf 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -217,11 +217,10 @@ fn main() -> anyhow::Result<()> { .run() .expect("cargo install cargo-insta failed!"); - // Initial test - this will generate snapshots + // Initial test - this will generate snapshots. This is expected to fail. println!("$> cargo test -p spacetimedb-codegen --test codegen"); - cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") - .run() - .expect("cargo test -p spacetimedb-codegen --test codegen failed!"); + let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") + .run(); // Review the new snapshots println!("$> cargo insta review"); From 4a6228fec73c9fefa0ee32ceebf06c91933453ab Mon Sep 17 00:00:00 2001 From: John Detter <4099508+jdetter@users.noreply.github.com> Date: Sat, 24 Jan 2026 20:15:11 -0600 Subject: [PATCH 18/25] Fix lints --- tools/upgrade-version/src/main.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/tools/upgrade-version/src/main.rs b/tools/upgrade-version/src/main.rs index c5a28785ecf..c9a02732ce8 100644 --- a/tools/upgrade-version/src/main.rs +++ b/tools/upgrade-version/src/main.rs @@ -219,8 +219,7 @@ fn main() -> anyhow::Result<()> { // Initial test - this will generate snapshots. This is expected to fail. println!("$> cargo test -p spacetimedb-codegen --test codegen"); - let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen") - .run(); + let _ = cmd!("cargo", "test", "-p", "spacetimedb-codegen", "--test", "codegen").run(); // Review the new snapshots println!("$> cargo insta review"); From 030d5fd6c9fbc0087c1cada7e2dbabe37e2b3f0c Mon Sep 17 00:00:00 2001 From: rekhoff Date: Sun, 25 Jan 2026 13:49:29 -0800 Subject: [PATCH 19/25] Broken out explicit `dotnet restore` for dotnet tests --- .github/workflows/ci.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f70b677ac0c..3daa2eddb0e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -571,6 +571,10 @@ jobs: cd sdks/csharp ./tools~/write-nuget-config.sh ../.. + - name: Restore .NET solution + working-directory: sdks/csharp + run: dotnet restore --configfile nuget.config SpacetimeDB.ClientSDK.sln + # Now, setup the Unity tests. - name: Patch spacetimedb dependency in Cargo.toml working-directory: demo/Blackholio/server-rust @@ -693,9 +697,13 @@ jobs: cd sdks/csharp ./tools~/write-nuget-config.sh ../.. + - name: Restore .NET solution + working-directory: sdks/csharp + run: dotnet restore --configfile nuget.config SpacetimeDB.ClientSDK.sln + - name: Run .NET tests working-directory: sdks/csharp - run: dotnet test -warnaserror + run: dotnet test -warnaserror --no-restore - name: Verify C# formatting working-directory: sdks/csharp From 3db9710acf03693aa9be815e55df9a44c658d603 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Sun, 25 Jan 2026 14:06:38 -0800 Subject: [PATCH 20/25] Update `write-nuget-config` with explicit clear and a key for nuget.org --- sdks/csharp/tools~/write-nuget-config.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sdks/csharp/tools~/write-nuget-config.sh b/sdks/csharp/tools~/write-nuget-config.sh index 7849ed08a96..5fddb7c5efe 100755 --- a/sdks/csharp/tools~/write-nuget-config.sh +++ b/sdks/csharp/tools~/write-nuget-config.sh @@ -14,10 +14,12 @@ cat >nuget.config < + + From e4ab0022d66c69d36e3303a1185101712765cba0 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Sun, 25 Jan 2026 14:29:53 -0800 Subject: [PATCH 21/25] Patched CI to copy `sdks/csharp/nuget.config` to repo root --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3daa2eddb0e..acb990d326c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -570,6 +570,7 @@ jobs: # See https://learn.microsoft.com/en-us/nuget/reference/nuget-config-file for more info on the config file. cd sdks/csharp ./tools~/write-nuget-config.sh ../.. + cp nuget.config ../.. - name: Restore .NET solution working-directory: sdks/csharp From 8ea2e1481e38587040a20c785e223f574ede39a7 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Sun, 25 Jan 2026 14:50:05 -0800 Subject: [PATCH 22/25] Corrected `NuGet.Config` capitalization and add another NuGet Override --- .github/workflows/ci.yml | 12 ++++++++++-- sdks/csharp/tools~/write-nuget-config.sh | 8 +++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index acb990d326c..34d392e46a1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,6 +70,14 @@ jobs: with: global-json-file: global.json + - name: Override NuGet packages + shell: bash + run: | + dotnet pack -c Release crates/bindings-csharp/BSATN.Runtime + dotnet pack -c Release crates/bindings-csharp/Runtime + bash sdks/csharp/tools~/write-nuget-config.sh . + cp sdks/csharp/NuGet.Config NuGet.Config + # nodejs and pnpm are required for the typescript quickstart smoketest - name: Set up Node.js uses: actions/setup-node@v4 @@ -570,11 +578,11 @@ jobs: # See https://learn.microsoft.com/en-us/nuget/reference/nuget-config-file for more info on the config file. cd sdks/csharp ./tools~/write-nuget-config.sh ../.. - cp nuget.config ../.. + cp NuGet.Config ../.. - name: Restore .NET solution working-directory: sdks/csharp - run: dotnet restore --configfile nuget.config SpacetimeDB.ClientSDK.sln + run: dotnet restore --configfile NuGet.Config SpacetimeDB.ClientSDK.sln # Now, setup the Unity tests. - name: Patch spacetimedb dependency in Cargo.toml diff --git a/sdks/csharp/tools~/write-nuget-config.sh b/sdks/csharp/tools~/write-nuget-config.sh index 5fddb7c5efe..cdea515344f 100755 --- a/sdks/csharp/tools~/write-nuget-config.sh +++ b/sdks/csharp/tools~/write-nuget-config.sh @@ -10,7 +10,7 @@ cd .. # available. # See https://learn.microsoft.com/en-us/nuget/reference/nuget-config-file for more info on the config file, # and https://tldp.org/LDP/abs/html/here-docs.html for more info on this bash feature. -cat >nuget.config <NuGet.Config < @@ -38,5 +38,7 @@ cat >nuget.config < EOF -echo "Wrote nuget.config contents:" -cat nuget.config +cp NuGet.Config nuget.config + +echo "Wrote NuGet.Config contents:" +cat NuGet.Config From 773c450002df0b3f8e3ed6f5542435719a6f16ba Mon Sep 17 00:00:00 2001 From: rekhoff Date: Sun, 25 Jan 2026 16:19:12 -0800 Subject: [PATCH 23/25] Corrected another NuGet..Config casing, added discrete context for NuGet.Configs --- .github/workflows/ci.yml | 7 +++--- sdks/csharp/tools~/write-nuget-config.sh | 30 ++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 34d392e46a1..46627105cc7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,8 +75,8 @@ jobs: run: | dotnet pack -c Release crates/bindings-csharp/BSATN.Runtime dotnet pack -c Release crates/bindings-csharp/Runtime - bash sdks/csharp/tools~/write-nuget-config.sh . - cp sdks/csharp/NuGet.Config NuGet.Config + cd sdks/csharp + ./tools~/write-nuget-config.sh ../.. # nodejs and pnpm are required for the typescript quickstart smoketest - name: Set up Node.js @@ -578,7 +578,6 @@ jobs: # See https://learn.microsoft.com/en-us/nuget/reference/nuget-config-file for more info on the config file. cd sdks/csharp ./tools~/write-nuget-config.sh ../.. - cp NuGet.Config ../.. - name: Restore .NET solution working-directory: sdks/csharp @@ -708,7 +707,7 @@ jobs: - name: Restore .NET solution working-directory: sdks/csharp - run: dotnet restore --configfile nuget.config SpacetimeDB.ClientSDK.sln + run: dotnet restore --configfile NuGet.Config SpacetimeDB.ClientSDK.sln - name: Run .NET tests working-directory: sdks/csharp diff --git a/sdks/csharp/tools~/write-nuget-config.sh b/sdks/csharp/tools~/write-nuget-config.sh index cdea515344f..aabae5a19e3 100755 --- a/sdks/csharp/tools~/write-nuget-config.sh +++ b/sdks/csharp/tools~/write-nuget-config.sh @@ -38,7 +38,33 @@ cat >NuGet.Config < EOF -cp NuGet.Config nuget.config +cat >"${SPACETIMEDB_REPO_PATH}/NuGet.Config" < + + + + + + + + + + + + + + + + + + + + + + + + +EOF -echo "Wrote NuGet.Config contents:" +echo "Wrote sdks/csharp/NuGet.Config contents:" cat NuGet.Config From f0fd738b6dad4f802330f8c5cdbb1226a7681015 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Sun, 25 Jan 2026 16:57:33 -0800 Subject: [PATCH 24/25] Incorporating similar fixes to the quickstart test --- smoketests/tests/quickstart.py | 38 ++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/smoketests/tests/quickstart.py b/smoketests/tests/quickstart.py index 254db8bed04..f9abdc4ab64 100644 --- a/smoketests/tests/quickstart.py +++ b/smoketests/tests/quickstart.py @@ -57,6 +57,18 @@ def load_nuget_config(p: Path): return xmltodict.parse(f.read(), force_list=["add", "packageSource", "package"]) return {} + +def _nuget_config_path(project_dir: Path) -> Path: + p_upper = project_dir / "NuGet.Config" + if p_upper.exists(): + return p_upper + + p_lower = project_dir / "nuget.config" + if p_lower.exists(): + return p_lower + + return p_upper + def save_nuget_config(p: Path, doc: dict): # Write back (pretty, UTF-8, no BOM) xml = xmltodict.unparse(doc, pretty=True) @@ -66,8 +78,13 @@ def add_source(doc: dict, *, key: str, path: str) -> None: cfg = doc.setdefault("configuration", {}) sources = cfg.setdefault("packageSources", {}) source_entries = sources.setdefault("add", []) - source = {"@key": key, "@value": path} - source_entries.append(source) + + for source in source_entries: + if source.get("@key") == key: + source["@value"] = str(path) + return + + source_entries.append({"@key": key, "@value": str(path)}) def add_mapping(doc: dict, *, key: str, pattern: str) -> None: cfg = doc.setdefault("configuration", {}) @@ -90,12 +107,25 @@ def add_mapping(doc: dict, *, key: str, pattern: str) -> None: def override_nuget_package(*, project_dir: Path, package: str, source_dir: Path, build_subdir: str): """Override nuget config to use a local NuGet package on a .NET project""" # Make sure the local package is built - run_cmd("dotnet", "pack", cwd=source_dir) + repo_nuget_config = STDB_DIR / "NuGet.Config" + if repo_nuget_config.exists(): + run_cmd( + "dotnet", + "restore", + "--configfile", + str(repo_nuget_config), + cwd=source_dir, + capture_stderr=True, + ) + run_cmd("dotnet", "pack", "-c", "Release", "--no-restore", cwd=source_dir) + else: + run_cmd("dotnet", "pack", "-c", "Release", cwd=source_dir) - p = Path(project_dir) / "nuget.config" + p = _nuget_config_path(Path(project_dir)) doc = load_nuget_config(p) add_source(doc, key=package, path=source_dir/build_subdir) add_mapping(doc, key=package, pattern=package) + add_source(doc, key="nuget.org", path="https://api.nuget.org/v3/index.json") # Fallback for other packages add_mapping(doc, key="nuget.org", pattern="*") save_nuget_config(p, doc) From bc5ea6be95909f682286dc2c8220351c8b2baa47 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Mon, 26 Jan 2026 17:49:11 -0800 Subject: [PATCH 25/25] Removing override from `quickstart.py` workflow --- smoketests/tests/quickstart.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/smoketests/tests/quickstart.py b/smoketests/tests/quickstart.py index f9abdc4ab64..18696caae0c 100644 --- a/smoketests/tests/quickstart.py +++ b/smoketests/tests/quickstart.py @@ -79,11 +79,6 @@ def add_source(doc: dict, *, key: str, path: str) -> None: sources = cfg.setdefault("packageSources", {}) source_entries = sources.setdefault("add", []) - for source in source_entries: - if source.get("@key") == key: - source["@value"] = str(path) - return - source_entries.append({"@key": key, "@value": str(path)}) def add_mapping(doc: dict, *, key: str, pattern: str) -> None: