From 846170afb26b98da632db6c8bda12ea5d6a7b4b9 Mon Sep 17 00:00:00 2001 From: Grigory Panov Date: Fri, 17 Jul 2026 14:49:26 +0200 Subject: [PATCH] Default serverless target to v5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Per the [P0] CLI Changes spec, the serverless stand-in used when the source does not pin a version is now serverless-v5 (was v4). This applies only to the fallback cases — a serverless job with no recorded version, and a bundle that records 'serverless' without a version. Explicitly passing --serverless-version is unaffected. Introduce defaultServerlessVersion in envkey.go and use it at both fallback sites so the default lives in one place. VS Code resolves the real version itself and passes --serverless-version explicitly, so this fallback applies only when the version is genuinely unknown. Co-authored-by: Isaac --- libs/localenv/envkey.go | 8 ++++++++ libs/localenv/target.go | 14 +++++++------- libs/localenv/target_test.go | 11 ++++++----- 3 files changed, 21 insertions(+), 12 deletions(-) diff --git a/libs/localenv/envkey.go b/libs/localenv/envkey.go index 070668ba826..23dc0f9ca53 100644 --- a/libs/localenv/envkey.go +++ b/libs/localenv/envkey.go @@ -14,6 +14,14 @@ import ( // by 3.10.6, so only the former bumps the minor. var clauseRe = regexp.MustCompile(`^(>=|<=|===|==|~=|!=|<|>)?\s*(\d+)\.(\d+)(\.\d+)?`) +// defaultServerlessVersion is the serverless environment version used when the +// source (a serverless job with no recorded version, or a bundle that only +// records "serverless") does not pin one. It is a documented stand-in for the +// latest LTS (spec §4.3 / §target-resolution); VS Code resolves the real version +// itself and passes --serverless-version explicitly, so this fallback only +// applies when the version is genuinely unknown. +const defaultServerlessVersion = "v5" + // NormalizeServerless returns the canonical "vN" spelling of a serverless // version accepting "4", "v4", or "V4". func NormalizeServerless(version string) string { diff --git a/libs/localenv/target.go b/libs/localenv/target.go index 92246f6bc0f..cdb2a20c2e6 100644 --- a/libs/localenv/target.go +++ b/libs/localenv/target.go @@ -118,11 +118,11 @@ func ResolveTarget(ctx context.Context, f TargetFlags, c ComputeClient, bt Bundl } if isServerless { // Use the job's recorded serverless environment version when present; - // fall back to v4 when the job did not pin one (documented stand-in from - // the original script, spec §4.3). + // fall back to the default when the job did not pin one (documented + // stand-in, spec §4.3). v := version if v == "" { - v = "v4" + v = defaultServerlessVersion } return &TargetInfo{ Source: "job", @@ -145,12 +145,12 @@ func ResolveTarget(ctx context.Context, f TargetFlags, c ComputeClient, bt Bundl } if bt.Serverless { - // Default to serverless-v4: the serverless env version is not recorded - // in the bundle/project (documented stand-in from the original script). + // The bundle records that the target is serverless but not which version, + // so use the default stand-in (spec §4.3). return &TargetInfo{ Source: "bundle", - ServerlessVersion: "v4", - EnvKey: EnvKeyForServerless("v4"), + ServerlessVersion: NormalizeServerless(defaultServerlessVersion), + EnvKey: EnvKeyForServerless(defaultServerlessVersion), }, nil } diff --git a/libs/localenv/target_test.go b/libs/localenv/target_test.go index 1033b90909d..3c64d154628 100644 --- a/libs/localenv/target_test.go +++ b/libs/localenv/target_test.go @@ -93,10 +93,11 @@ func TestResolveBundleNothingSelected(t *testing.T) { } func TestResolveBundleServerless(t *testing.T) { + // The bundle records serverless but no version, so the default stand-in applies. ti, err := ResolveTarget(t.Context(), TargetFlags{}, stubCompute{}, BundleTarget{Selected: true, Serverless: true}) require.NoError(t, err) assert.Equal(t, "bundle", ti.Source) - assert.Equal(t, "serverless/serverless-v4", ti.EnvKey) + assert.Equal(t, "serverless/serverless-"+defaultServerlessVersion, ti.EnvKey) } // jobStubCompute returns distinct values for the first (sparkVersion) and third @@ -143,13 +144,13 @@ func TestResolveJobServerlessUsesRecordedVersion(t *testing.T) { assert.Equal(t, "serverless/serverless-v3", ti.EnvKey) } -func TestResolveJobServerlessEmptyVersionFallsBackToV4(t *testing.T) { - // When the job records no serverless version, ResolveTarget defaults to v4 - // (documented stand-in), matching the bundle serverless path. +func TestResolveJobServerlessEmptyVersionFallsBackToDefault(t *testing.T) { + // When the job records no serverless version, ResolveTarget uses the default + // stand-in, matching the bundle serverless path. c := jobStubCompute{isServerless: true, version: ""} ti, err := ResolveTarget(t.Context(), TargetFlags{Job: "42"}, c, BundleTarget{}) require.NoError(t, err) - assert.Equal(t, "serverless/serverless-v4", ti.EnvKey) + assert.Equal(t, "serverless/serverless-"+defaultServerlessVersion, ti.EnvKey) } func TestValidateTargetFlagsMutuallyExclusive(t *testing.T) {