blob: 88a412bbb0da09c6fba56261e90235c38df40388 [file] [log] [blame]
/*---------------------------------------------------------
* 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);
};
};