From 1204dcc2b4cbacb1ea4bfd19cbc65c083f5bfcd1 Mon Sep 17 00:00:00 2001 From: Karthik Nadig Date: Tue, 8 Nov 2022 12:34:33 -0800 Subject: [PATCH] Fix issue with extension prompt being shown to users after install (#20158) Fixes https://github.com/microsoft/vscode-python/issues/20157 --- src/client/linters/linterManager.ts | 8 +++---- src/client/linters/prompts/common.ts | 25 ++++++++++++++++++++++ src/client/linters/prompts/flake8Prompt.ts | 8 +++++++ src/client/linters/prompts/pylintPrompt.ts | 8 +++++++ 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src/client/linters/linterManager.ts b/src/client/linters/linterManager.ts index 01a4c4ca38ea..72c92aa1c77d 100644 --- a/src/client/linters/linterManager.ts +++ b/src/client/linters/linterManager.ts @@ -13,8 +13,8 @@ import { Bandit } from './bandit'; import { Flake8 } from './flake8'; import { LinterInfo } from './linterInfo'; import { MyPy } from './mypy'; -import { Flake8ExtensionPrompt } from './prompts/flake8Prompt'; -import { PylintExtensionPrompt } from './prompts/pylintPrompt'; +import { getOrCreateFlake8Prompt } from './prompts/flake8Prompt'; +import { getOrCreatePylintPrompt } from './prompts/pylintPrompt'; import { Prospector } from './prospector'; import { Pycodestyle } from './pycodestyle'; import { PyDocStyle } from './pydocstyle'; @@ -112,9 +112,9 @@ export class LinterManager implements ILinterManager { case Product.bandit: return new Bandit(serviceContainer); case Product.flake8: - return new Flake8(serviceContainer, new Flake8ExtensionPrompt(serviceContainer)); + return new Flake8(serviceContainer, getOrCreateFlake8Prompt(serviceContainer)); case Product.pylint: - return new Pylint(serviceContainer, new PylintExtensionPrompt(serviceContainer)); + return new Pylint(serviceContainer, getOrCreatePylintPrompt(serviceContainer)); case Product.mypy: return new MyPy(serviceContainer); case Product.prospector: diff --git a/src/client/linters/prompts/common.ts b/src/client/linters/prompts/common.ts index 509baaf4ee89..bf459f895ead 100644 --- a/src/client/linters/prompts/common.ts +++ b/src/client/linters/prompts/common.ts @@ -1,13 +1,38 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT License. +import * as fs from 'fs-extra'; +import * as path from 'path'; import { ShowToolsExtensionPrompt } from '../../common/experiments/groups'; import { IExperimentService, IExtensions, IPersistentState, IPersistentStateFactory } from '../../common/types'; import { IServiceContainer } from '../../ioc/types'; +import { traceLog } from '../../logging'; + +function isExtensionInstalledButDisabled(extensions: IExtensions, extensionId: string): boolean { + // When debugging the python extension this `extensionPath` below will point to your repo. + // If you are debugging this feature then set the `extensionPath` to right location after + // the next line. + const pythonExt = extensions.getExtension('ms-python.python'); + if (pythonExt) { + let found = false; + traceLog(`Extension search path: ${path.dirname(pythonExt.extensionPath)}`); + fs.readdirSync(path.dirname(pythonExt.extensionPath), { withFileTypes: false }).forEach((s) => { + if (s.toString().startsWith(extensionId)) { + found = true; + } + }); + return found; + } + return false; +} export function isExtensionInstalled(serviceContainer: IServiceContainer, extensionId: string): boolean { const extensions: IExtensions = serviceContainer.get(IExtensions); const extension = extensions.getExtension(extensionId); + if (!extension) { + // The extension you are looking for might be disabled. + return isExtensionInstalledButDisabled(extensions, extensionId); + } return extension !== undefined; } diff --git a/src/client/linters/prompts/flake8Prompt.ts b/src/client/linters/prompts/flake8Prompt.ts index 547644ba0383..c60767f2fa8d 100644 --- a/src/client/linters/prompts/flake8Prompt.ts +++ b/src/client/linters/prompts/flake8Prompt.ts @@ -61,3 +61,11 @@ export class Flake8ExtensionPrompt implements IToolsExtensionPrompt { return false; } } + +let _prompt: IToolsExtensionPrompt | undefined; +export function getOrCreateFlake8Prompt(serviceContainer: IServiceContainer): IToolsExtensionPrompt { + if (!_prompt) { + _prompt = new Flake8ExtensionPrompt(serviceContainer); + } + return _prompt; +} diff --git a/src/client/linters/prompts/pylintPrompt.ts b/src/client/linters/prompts/pylintPrompt.ts index 7c1ce30f3f8e..7a0693740b32 100644 --- a/src/client/linters/prompts/pylintPrompt.ts +++ b/src/client/linters/prompts/pylintPrompt.ts @@ -74,3 +74,11 @@ export class PylintExtensionPrompt implements IToolsExtensionPrompt { return false; } } + +let _prompt: IToolsExtensionPrompt | undefined; +export function getOrCreatePylintPrompt(serviceContainer: IServiceContainer): IToolsExtensionPrompt { + if (!_prompt) { + _prompt = new PylintExtensionPrompt(serviceContainer); + } + return _prompt; +}