| /*--------------------------------------------------------- |
| * Copyright 2022 The Go Authors. All rights reserved. |
| * Licensed under the MIT License. See LICENSE in the project root for license information. |
| *--------------------------------------------------------*/ |
| |
| import * as vscode from 'vscode'; |
| import path from 'path'; |
| |
| import { CommandFactory } from '.'; |
| import { getGoConfig, getGoplsConfig } from '../config'; |
| import { inspectGoToolVersion } from '../goInstallTools'; |
| import { getConfiguredTools } from '../goTools'; |
| import { getBinPath, getCurrentGoPath, getGoEnv, getGoVersion, getToolsGopath } from '../util'; |
| import { getEnvPath, initialEnvPath, getCurrentGoRoot } from '../utils/pathUtils'; |
| |
| export const getConfiguredGoTools: CommandFactory = () => { |
| return async () => { |
| // create an untitled markdown document. |
| const buf = []; |
| // Tool's path search is done by getBinPathWithPreferredGopath |
| // which searches places in the following order |
| // 1) absolute path for the alternateTool |
| // 2) GOBIN |
| // 3) toolsGopath |
| // 4) gopath |
| // 5) GOROOT |
| // 6) PATH |
| buf.push('# Tools Configuration\n'); |
| buf.push('\n## Environment\n'); |
| buf.push('GOBIN: ' + process.env['GOBIN']); |
| buf.push('toolsGopath: ' + getToolsGopath()); |
| buf.push('gopath: ' + getCurrentGoPath()); |
| buf.push('GOROOT: ' + getCurrentGoRoot()); |
| const currentEnvPath = getEnvPath(); |
| buf.push('PATH: ' + currentEnvPath); |
| if (currentEnvPath !== initialEnvPath) { |
| buf.push(`PATH (vscode launched with): ${initialEnvPath}`); |
| } |
| |
| buf.push('\n## Tools\n'); |
| try { |
| const goVersion = await getGoVersion(); |
| const allTools = getConfiguredTools(getGoConfig(), getGoplsConfig()); |
| const goVersionTooOld = goVersion?.lt('1.18') || false; |
| |
| buf.push(`\tgo:\t${goVersion?.binaryPath}: ${goVersion?.version}`); |
| const toolsInfo = await Promise.all( |
| allTools.map(async (tool) => { |
| const toolPath = getBinPath(tool.name); |
| // TODO(hyangah): print alternate tool info if set. |
| if (!path.isAbsolute(toolPath)) { |
| // getBinPath returns the absolute path is the tool exists. |
| // (See getBinPathWithPreferredGopath which is called underneath) |
| return `\t${tool.name}:\tnot installed`; |
| } |
| if (goVersionTooOld) { |
| return `\t${tool.name}:\t${toolPath}: unknown version`; |
| } |
| const { goVersion, moduleVersion, debugInfo } = await inspectGoToolVersion(toolPath); |
| if (goVersion || moduleVersion) { |
| return `\t${tool.name}:\t${toolPath}\t(version: ${moduleVersion} built with go: ${goVersion})`; |
| } else { |
| return `\t${tool.name}:\t${toolPath}\t(version: unknown - ${debugInfo})`; |
| } |
| }) |
| ); |
| toolsInfo.forEach((info) => { |
| buf.push(info); |
| }); |
| } catch (e) { |
| buf.push(`failed to get tools info: ${e}`); |
| } |
| |
| let folders = vscode.workspace.workspaceFolders?.map<{ name: string; path?: string }>((folder) => { |
| return { name: folder.name, path: folder.uri.fsPath }; |
| }); |
| if (!folders) { |
| folders = [{ name: 'no folder', path: undefined }]; |
| } |
| |
| buf.push('\n## Go env\n'); |
| for (const folder of folders) { |
| buf.push(`Workspace Folder (${folder.name}): ${folder.path}\n`); |
| try { |
| const out = await getGoEnv(folder.path); |
| // Append '\t' to the beginning of every line (^) of 'out'. |
| // 'g' = 'global matching', and 'm' = 'multi-line matching' |
| buf.push(out.replace(/^/gm, '\t')); |
| } catch (e) { |
| buf.push(`failed to run 'go env': ${e}`); |
| } |
| } |
| |
| // create a new untitled document |
| const doc = await vscode.workspace.openTextDocument({ |
| content: buf.join('\n'), |
| language: 'markdown' |
| }); |
| await vscode.window.showTextDocument(doc); |
| }; |
| }; |