Skip to content

Commit 5fb8ee3

Browse files
Fix reducer and resolver.
1 parent f1feb66 commit 5fb8ee3

File tree

6 files changed

+117
-105
lines changed

6 files changed

+117
-105
lines changed

src/client/pythonEnvironments/base/info/env.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
import { cloneDeep } from 'lodash';
55
import { Architecture } from '../../../common/utils/platform';
6+
import { arePathsSame } from '../../common/externalDependencies';
67

78
import {
89
PythonEnvInfo,
@@ -91,3 +92,31 @@ function updateEnv(env: PythonEnvInfo, updates: {
9192
env.version = updates.version;
9293
}
9394
}
95+
96+
/**
97+
* Determine if the given infos correspond to the same env.
98+
*
99+
* @param environment1 - one of the two envs to compare
100+
* @param environment2 - one of the two envs to compare
101+
*/
102+
export function areSameEnv(
103+
environment1: PythonEnvInfo | string,
104+
environment2: PythonEnvInfo | string,
105+
): boolean {
106+
let path1: string;
107+
let path2: string;
108+
if (typeof environment1 === 'string') {
109+
path1 = environment1;
110+
} else {
111+
path1 = environment1.executable.filename;
112+
}
113+
if (typeof environment2 === 'string') {
114+
path2 = environment2;
115+
} else {
116+
path2 = environment2.executable.filename;
117+
}
118+
if (arePathsSame(path1, path2)) {
119+
return true;
120+
}
121+
return false;
122+
}

src/client/pythonEnvironments/base/info/index.ts

Lines changed: 0 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import { Uri } from 'vscode';
55
import { Architecture } from '../../../common/utils/platform';
66
import { BasicVersionInfo, VersionInfo } from '../../../common/utils/version';
7-
import { arePathsSame } from '../../common/externalDependencies';
87

98
/**
109
* IDs for the various supported Python environments.
@@ -138,31 +137,3 @@ export type PythonEnvInfo = _PythonEnvInfo & {
138137
defaultDisplayName?: string;
139138
searchLocation?: Uri;
140139
};
141-
142-
/**
143-
* Determine if the given infos correspond to the same env.
144-
*
145-
* @param environment1 - one of the two envs to compare
146-
* @param environment2 - one of the two envs to compare
147-
*/
148-
export function areSameEnvironment(
149-
environment1: PythonEnvInfo | string,
150-
environment2: PythonEnvInfo | string,
151-
): boolean {
152-
let path1: string;
153-
let path2: string;
154-
if (typeof environment1 === 'string') {
155-
path1 = environment1;
156-
} else {
157-
path1 = environment1.executable.filename;
158-
}
159-
if (typeof environment2 === 'string') {
160-
path2 = environment2;
161-
} else {
162-
path2 = environment2.executable.filename;
163-
}
164-
if (arePathsSame(path1, path2)) {
165-
return true;
166-
}
167-
return false;
168-
}

src/client/pythonEnvironments/base/locators/composite/environmentsReducer.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@ import { cloneDeep, isEqual } from 'lodash';
55
import { Event, EventEmitter } from 'vscode';
66
import { traceVerbose } from '../../../../common/logger';
77
import { createDeferred } from '../../../../common/utils/async';
8-
import { areSameEnvironment, PythonEnvInfo, PythonEnvKind } from '../../info';
8+
import { PythonEnvInfo, PythonEnvKind } from '../../info';
9+
import { areSameEnv } from '../../info/env';
910
import {
1011
ILocator, IPythonEnvsIterator, PythonEnvUpdatedEvent, PythonLocatorQuery,
1112
} from '../../locator';
@@ -28,13 +29,13 @@ export class PythonEnvsReducer implements ILocator {
2829
iterator.onUpdated!((event) => {
2930
if (event === null) {
3031
waitForUpdatesDeferred.resolve();
31-
} else if (environment && areSameEnvironment(environment, event.new)) {
32-
environment = event.new;
32+
} else if (environment && areSameEnv(environment, event.update)) {
33+
environment = event.update;
3334
}
3435
});
3536
let result = await iterator.next();
3637
while (!result.done) {
37-
if (areSameEnvironment(result.value, env)) {
38+
if (areSameEnv(result.value, env)) {
3839
environment = result.value;
3940
}
4041
// eslint-disable-next-line no-await-in-loop
@@ -72,13 +73,13 @@ async function* iterEnvsIterator(
7273
state.done = true;
7374
checkIfFinishedAndNotify(state, didUpdate);
7475
} else {
75-
const oldIndex = seen.findIndex((s) => areSameEnvironment(s, event.old));
76-
if (oldIndex !== -1) {
76+
if (seen[event.index] !== undefined) {
7777
state.pending += 1;
78-
resolveDifferencesInBackground(oldIndex, event.new, state, didUpdate, seen).ignoreErrors();
78+
resolveDifferencesInBackground(event.index, event.update, state, didUpdate, seen)
79+
.ignoreErrors();
7980
} else {
8081
// This implies a problem in a downstream locator
81-
traceVerbose(`Expected already iterated env, got ${event.old}`);
82+
traceVerbose(`Expected already iterated env, got ${event.old} (#${event.index})`);
8283
}
8384
}
8485
});
@@ -87,7 +88,7 @@ async function* iterEnvsIterator(
8788
let result = await iterator.next();
8889
while (!result.done) {
8990
const currEnv = result.value;
90-
const oldIndex = seen.findIndex((s) => areSameEnvironment(s, currEnv));
91+
const oldIndex = seen.findIndex((s) => areSameEnv(s, currEnv));
9192
if (oldIndex !== -1) {
9293
state.pending += 1;
9394
resolveDifferencesInBackground(oldIndex, currEnv, state, didUpdate, seen).ignoreErrors();
@@ -115,8 +116,8 @@ async function resolveDifferencesInBackground(
115116
const oldEnv = seen[oldIndex];
116117
const merged = mergeEnvironments(oldEnv, newEnv);
117118
if (!isEqual(oldEnv, merged)) {
118-
didUpdate.fire({ old: oldEnv, new: merged });
119119
seen[oldIndex] = merged;
120+
didUpdate.fire({ index: oldIndex, old: oldEnv, update: merged });
120121
}
121122
state.pending -= 1;
122123
checkIfFinishedAndNotify(state, didUpdate);

src/client/pythonEnvironments/base/locators/composite/environmentsResolver.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { cloneDeep } from 'lodash';
55
import { Event, EventEmitter } from 'vscode';
66
import { traceVerbose } from '../../../../common/logger';
77
import { IEnvironmentInfoService } from '../../../info/environmentInfoService';
8-
import { areSameEnvironment, PythonEnvInfo } from '../../info';
8+
import { PythonEnvInfo } from '../../info';
99
import { InterpreterInformation } from '../../info/interpreter';
1010
import {
1111
ILocator, IPythonEnvsIterator, PythonEnvUpdatedEvent, PythonLocatorQuery,
@@ -62,14 +62,14 @@ export class PythonEnvsResolver implements ILocator {
6262
state.done = true;
6363
checkIfFinishedAndNotify(state, didUpdate);
6464
} else {
65-
const oldIndex = seen.findIndex((s) => areSameEnvironment(s, event.old));
66-
if (oldIndex !== -1) {
67-
seen[oldIndex] = event.new;
65+
if (seen[event.index] !== undefined) {
66+
seen[event.index] = event.update;
6867
state.pending += 1;
69-
this.resolveInBackground(oldIndex, state, didUpdate, seen).ignoreErrors();
68+
this.resolveInBackground(event.index, state, didUpdate, seen)
69+
.ignoreErrors();
7070
} else {
7171
// This implies a problem in a downstream locator
72-
traceVerbose(`Expected already iterated env in resolver, got ${event.old}`);
72+
traceVerbose(`Expected already iterated env, got ${event.old} (#${event.index})`);
7373
}
7474
}
7575
});
@@ -102,8 +102,9 @@ export class PythonEnvsResolver implements ILocator {
102102
);
103103
if (interpreterInfo) {
104104
const resolvedEnv = getResolvedEnv(interpreterInfo, seen[envIndex]);
105-
didUpdate.fire({ old: seen[envIndex], new: resolvedEnv });
105+
const old = seen[envIndex];
106106
seen[envIndex] = resolvedEnv;
107+
didUpdate.fire({ old, index: envIndex, update: resolvedEnv });
107108
}
108109
state.pending -= 1;
109110
checkIfFinishedAndNotify(state, didUpdate);

0 commit comments

Comments
 (0)