From 10e0a22f6d439d7d511e4b3a8b1d874fb5b6be52 Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Wed, 29 Aug 2018 11:28:27 +0200 Subject: [PATCH] fixes #56015 --- extensions/git/src/main.ts | 78 +++++++++++++++++++++++++++----------- 1 file changed, 55 insertions(+), 23 deletions(-) diff --git a/extensions/git/src/main.ts b/extensions/git/src/main.ts index 0d3ebc4d560..4ceaf8e5fb1 100644 --- a/extensions/git/src/main.ts +++ b/extensions/git/src/main.ts @@ -8,7 +8,7 @@ import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); -import { ExtensionContext, workspace, window, Disposable, commands, Uri, OutputChannel } from 'vscode'; +import { ExtensionContext, workspace, window, Disposable, commands, Uri, OutputChannel, WorkspaceFolder } from 'vscode'; import { findGit, Git, IGit } from './git'; import { Model } from './model'; import { CommandCenter } from './commands'; @@ -20,6 +20,8 @@ import TelemetryReporter from 'vscode-extension-telemetry'; import { GitExtension } from './api/git'; import { GitProtocolHandler } from './protocolHandler'; import { createGitExtension } from './api/extension'; +import * as path from 'path'; +import * as fs from 'fs'; const deactivateTasks: { (): Promise; }[] = []; @@ -71,6 +73,54 @@ async function createModel(context: ExtensionContext, outputChannel: OutputChann return model; } +async function isGitRepository(folder: WorkspaceFolder): Promise { + if (folder.uri.scheme !== 'file') { + return false; + } + + const dotGit = path.join(folder.uri.fsPath, '.git'); + + try { + const dotGitStat = await new Promise((c, e) => fs.stat(dotGit, (err, stat) => err ? e(err) : c(stat))); + return dotGitStat.isDirectory(); + } catch (err) { + return false; + } +} + +async function warnAboutMissingGit(): Promise { + const config = workspace.getConfiguration('git'); + const shouldIgnore = config.get('ignoreMissingGitWarning') === true; + + if (shouldIgnore) { + return; + } + + if (!workspace.workspaceFolders) { + return; + } + + const areGitRepositories = await Promise.all(workspace.workspaceFolders.map(isGitRepository)); + + if (areGitRepositories.every(isGitRepository => !isGitRepository)) { + return; + } + + const download = localize('downloadgit', "Download Git"); + const neverShowAgain = localize('neverShowAgain', "Don't Show Again"); + const choice = await window.showWarningMessage( + localize('notfound', "Git not found. Install it or configure it using the 'git.path' setting."), + download, + neverShowAgain + ); + + if (choice === download) { + commands.executeCommand('vscode.open', Uri.parse('https://git-scm.com/')); + } else if (choice === neverShowAgain) { + await config.update('ignoreMissingGitWarning', true, true); + } +} + export async function activate(context: ExtensionContext): Promise { const disposables: Disposable[] = []; context.subscriptions.push(new Disposable(() => Disposable.from(...disposables).dispose())); @@ -100,28 +150,10 @@ export async function activate(context: ExtensionContext): Promise throw err; } - const config = workspace.getConfiguration('git'); - const shouldIgnore = config.get('ignoreMissingGitWarning') === true; - - if (!shouldIgnore) { - console.warn(err.message); - outputChannel.appendLine(err.message); - outputChannel.show(); - - const download = localize('downloadgit', "Download Git"); - const neverShowAgain = localize('neverShowAgain', "Don't Show Again"); - const choice = await window.showWarningMessage( - localize('notfound', "Git not found. Install it or configure it using the 'git.path' setting."), - download, - neverShowAgain - ); - - if (choice === download) { - commands.executeCommand('vscode.open', Uri.parse('https://git-scm.com/')); - } else if (choice === neverShowAgain) { - await config.update('ignoreMissingGitWarning', true, true); - } - } + console.warn(err.message); + outputChannel.appendLine(err.message); + + await warnAboutMissingGit(); return createGitExtension(); } -- GitLab