Skip to content

Commit c1964df

Browse files
Preserve explicit routing overrides
Keep overrides through manager refreshes and reject malformed association schema versions. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: 6b12d843-8011-4bfc-9ba9-f75761eadee2
1 parent aed8aee commit c1964df

4 files changed

Lines changed: 55 additions & 10 deletions

File tree

src/features/envManagers.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,6 @@ export class PythonEnvironmentManagers implements EnvironmentManagers {
580580
await manager.set(uris);
581581
await Promise.all(
582582
selections.map(async (selection) => {
583-
this.clearInlineRoutingOverride(selection.scope);
584583
const newEnv = await manager.get(selection.scope);
585584
if (!this.commitSelectionOperation(selection.key, selection.operation)) {
586585
return;
@@ -797,13 +796,6 @@ export class PythonEnvironmentManagers implements EnvironmentManagers {
797796
this._inlineRoutingOverrides.set(key, manager.id);
798797
}
799798

800-
private clearInlineRoutingOverride(scope: Uri): void {
801-
if (!this.inlineScriptRouting) {
802-
return;
803-
}
804-
this._inlineRoutingOverrides.delete(this.getInlineScriptSelectionKey(scope));
805-
}
806-
807799
private async publishEffectiveEnvironmentAfterOverrideClear(
808800
scope: Uri,
809801
previousManager: InternalEnvironmentManager,

src/managers/builtin/inlineScript/envManager.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2050,12 +2050,15 @@ export class InlineScriptEnvManager implements EnvironmentManager, Disposable {
20502050
}
20512051
const association = value as Record<string, unknown>;
20522052
const schemaVersion = association.schemaVersion;
2053-
if (typeof schemaVersion !== 'number') {
2053+
if (typeof schemaVersion !== 'number' || !Number.isSafeInteger(schemaVersion) || schemaVersion <= 0) {
20542054
return { kind: 'invalid' };
20552055
}
2056-
if (schemaVersion !== PERSISTED_ASSOCIATION_SCHEMA_VERSION) {
2056+
if (schemaVersion > PERSISTED_ASSOCIATION_SCHEMA_VERSION) {
20572057
return { kind: 'future' };
20582058
}
2059+
if (schemaVersion !== PERSISTED_ASSOCIATION_SCHEMA_VERSION) {
2060+
return { kind: 'invalid' };
2061+
}
20592062
const environmentPath = association.environmentPath;
20602063
const metadataBinding = association.metadataBinding;
20612064
if (typeof environmentPath !== 'string' || environmentPath.length === 0) {

src/test/features/envManagers.lastKnown.unit.test.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,26 @@ suite('PythonEnvironmentManagers getLastKnownEnvironment', () => {
535535
assert.strictEqual(envManagers.getLastKnownEnvironment(script), selectedEnvironment);
536536
});
537537

538+
test('preserves an explicit non-inline override during a batch manager refresh', async () => {
539+
const script = Uri.file('/workspace/project/script.py');
540+
projectsByUri.set(script.toString(), { name: 'project', uri: Uri.file('/workspace/project') });
541+
let selectedEnvironment: PythonEnvironment;
542+
const selectedId = registerManager(async () => selectedEnvironment, async () => undefined, 'venv');
543+
let inlineEnvironment: PythonEnvironment;
544+
const inlineId = registerManager(async () => inlineEnvironment, async () => undefined, 'inline-script');
545+
selectedEnvironment = { ...makeEnv('selected'), envId: { id: 'selected', managerId: selectedId } };
546+
inlineEnvironment = { ...makeEnv('inline'), envId: { id: 'inline', managerId: inlineId } };
547+
defaultManagerId = selectedId;
548+
markInlineScript(script);
549+
await envManagers.setEnvironment(script, inlineEnvironment, false);
550+
await envManagers.setEnvironment(script, selectedEnvironment, false);
551+
552+
await envManagers.setEnvironments([script], undefined, false);
553+
554+
assert.strictEqual(envManagers.getEnvironmentManager(script)?.id, selectedId);
555+
assert.strictEqual(envManagers.getLastKnownEnvironment(script), selectedEnvironment);
556+
});
557+
538558
test('publishes through the inline manager after an explicit override is cleared', async () => {
539559
const script = Uri.file('/workspace/project/script.py');
540560
projectsByUri.set(script.toString(), { name: 'project', uri: Uri.file('/workspace/project') });

src/test/managers/builtin/inlineScript/envManager.unit.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3818,6 +3818,36 @@ suite('InlineScriptEnvManager', () => {
38183818
assert.strictEqual(await manager.get(futureUri), undefined);
38193819
});
38203820

3821+
for (const schemaVersion of [0, -1, 1.5, Number.NaN, Number.POSITIVE_INFINITY]) {
3822+
test(`repairs a malformed numeric schema version (${String(schemaVersion)})`, async () => {
3823+
const invalidUri = scriptUri('invalid.py');
3824+
const validUri = scriptUri('valid.py');
3825+
const invalidEnvironment = await createOwnedEnvironment('0011223344556677');
3826+
const validEnvironment = await createOwnedEnvironment('fedcba9876543210');
3827+
persistedAssociations = {
3828+
[normalizePath(invalidUri.fsPath)]: {
3829+
schemaVersion,
3830+
environmentPath: invalidEnvironment.environmentPath.fsPath,
3831+
metadataBinding: {
3832+
kind: 'matched',
3833+
sourceIdentity: VALID_METADATA_IDENTITY,
3834+
},
3835+
},
3836+
[normalizePath(validUri.fsPath)]: matchedAssociationRecord(
3837+
validEnvironment.environmentPath.fsPath,
3838+
),
3839+
};
3840+
3841+
assert.strictEqual(await manager.get(invalidUri), undefined);
3842+
3843+
assert.deepStrictEqual(persistedAssociations, {
3844+
[normalizePath(validUri.fsPath)]: matchedAssociationRecord(
3845+
validEnvironment.environmentPath.fsPath,
3846+
),
3847+
});
3848+
});
3849+
}
3850+
38213851
test('removes a requested record with an unknown current binding kind without affecting unrelated entries', async () => {
38223852
const invalidUri = scriptUri('invalid.py');
38233853
const validUri = scriptUri('valid.py');

0 commit comments

Comments
 (0)