diff --git a/libs/localenv/envkey.go b/libs/localenv/envkey.go index 070668ba82..23dc0f9ca5 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 92246f6bc0..cdb2a20c2e 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 1033b90909..3c64d15462 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) {