Skip to content

Commit 2c7b6d7

Browse files
d3r3kkDonJayamanne
authored andcommitted
Fix issues with glob pattern when discovering conda locations on windows. (#2803)
Further work toward #2794. - Correction to glob pattern/simplification of code. - Add more known default install paths. - Add warning message in swallowed catch statement.
1 parent 4a1a7ef commit 2c7b6d7

File tree

1 file changed

+36
-12
lines changed

1 file changed

+36
-12
lines changed

src/client/interpreter/locators/services/condaService.ts

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,45 @@
1-
import { inject, injectable, named, optional } from 'inversify';
1+
import {
2+
inject, injectable,
3+
named, optional
4+
} from 'inversify';
25
import * as path from 'path';
36
import { parse, SemVer } from 'semver';
47
import { compareVersion } from '../../../../utils/version';
58
import { warn } from '../../../common/logger';
6-
import { IFileSystem, IPlatformService } from '../../../common/platform/types';
9+
import {
10+
IFileSystem, IPlatformService
11+
} from '../../../common/platform/types';
712
import { IProcessServiceFactory } from '../../../common/process/types';
8-
import { IConfigurationService, ILogger, IPersistentStateFactory } from '../../../common/types';
13+
import {
14+
IConfigurationService, ILogger,
15+
IPersistentStateFactory
16+
} from '../../../common/types';
917
import { IServiceContainer } from '../../../ioc/types';
10-
import { CondaInfo, ICondaService, IInterpreterLocatorService, InterpreterType, PythonInterpreter, WINDOWS_REGISTRY_SERVICE } from '../../contracts';
18+
import {
19+
CondaInfo, ICondaService, IInterpreterLocatorService,
20+
InterpreterType, PythonInterpreter,
21+
WINDOWS_REGISTRY_SERVICE
22+
} from '../../contracts';
1123
import { CondaHelper } from './condaHelper';
1224

1325
// tslint:disable-next-line:no-require-imports no-var-requires
1426
const untildify: (value: string) => string = require('untildify');
1527

1628
// This glob pattern will match all of the following:
1729
// ~/anaconda/bin/conda, ~/anaconda3/bin/conda, ~/miniconda/bin/conda, ~/miniconda3/bin/conda
18-
export const CondaLocationsGlob = '~/*conda*/bin/conda';
19-
export const CondaLocationsGlobWin = `${[
30+
export const CondaLocationsGlob = untildify('~/*conda*/bin/conda');
31+
32+
// ...and for windows, the known default install locations:
33+
const condaGlobPathsForWindows = [
2034
'/ProgramData/Miniconda*/Scripts/conda.exe',
2135
'/ProgramData/Anaconda*/Scripts/conda.exe',
22-
untildify('~/AppData/Local/Continuum/miniconda*/Scripts/conda.exe'),
23-
untildify('~/AppData/Local/Continuum/miniconda*/Scripts/conda.exe')].join(',')}`;
36+
untildify('~/Miniconda*/Scripts/conda.exe'),
37+
untildify('~/Anaconda*/Scripts/conda.exe'),
38+
untildify('~/AppData/Local/Continuum/Miniconda*/Scripts/conda.exe'),
39+
untildify('~/AppData/Local/Continuum/Anaconda*/Scripts/conda.exe')];
40+
41+
// format for glob processing:
42+
export const CondaLocationsGlobWin = `{${condaGlobPathsForWindows.join(',')}}`;
2443

2544
/**
2645
* A wrapper around a conda installation.
@@ -272,15 +291,20 @@ export class CondaService implements ICondaService {
272291

273292
/**
274293
* Return the path to the "conda file", if there is one (in known locations).
294+
* Note: For now we simply return the first one found.
275295
*/
276296
private async getCondaFileFromKnownLocations(): Promise<string> {
277297
const fileSystem = this.serviceContainer.get<IFileSystem>(IFileSystem);
278298
const globPattern = this.platform.isWindows ? CondaLocationsGlobWin : CondaLocationsGlob;
279-
const condaFiles = await fileSystem.search(untildify(globPattern))
280-
.catch<string[]>(() => []);
281-
299+
const condaFiles = await fileSystem.search(globPattern)
300+
.catch<string[]>((failReason) => {
301+
warn(
302+
'Default conda location search failed.',
303+
`Searching for default install locations for conda results in error: ${failReason}`
304+
);
305+
return [];
306+
});
282307
const validCondaFiles = condaFiles.filter(condaPath => condaPath.length > 0);
283308
return validCondaFiles.length === 0 ? 'conda' : validCondaFiles[0];
284309
}
285-
286310
}

0 commit comments

Comments
 (0)