--- /dev/null
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+exports.execTool = exports.commandExists = exports.runGoTool = exports.goBinPath = exports.installGoBin = void 0;
+const tslib_1 = require("tslib");
+const path_1 = tslib_1.__importDefault(require("path"));
+const fs_1 = tslib_1.__importDefault(require("fs"));
+const util_1 = tslib_1.__importDefault(require("util"));
+const child_process_1 = require("child_process");
+const coc_nvim_1 = require("coc.nvim");
+const which_1 = tslib_1.__importDefault(require("which"));
+const config_1 = require("./config");
+const runExec = util_1.default.promisify(child_process_1.exec);
+const isWin = process.platform === 'win32';
+async function installGoBin(source, force = false, getVersion) {
+ const name = goBinName(source);
+ if (!force && await goBinExists(name)) {
+ return true;
+ }
+ const statusItem = coc_nvim_1.window.createStatusBarItem(90, { progress: true });
+ statusItem.text = `Installing '${name}'`;
+ statusItem.show();
+ const success = await goRun(`get ${source}@latest`) && await goBinExists(name);
+ if (success) {
+ const vname = getVersion ? `${name}@${await getVersion()}` : name;
+ coc_nvim_1.window.showMessage(`Installed '${vname}'`);
+ }
+ else {
+ coc_nvim_1.window.showMessage(`Failed to install '${name}'`, 'error');
+ }
+ statusItem.hide();
+ return success;
+}
+exports.installGoBin = installGoBin;
+async function goBinPath(source) {
+ const name = goBinName(source);
+ return path_1.default.join(await config_1.configDir('bin'), name + (isWin ? ".exe" : ""));
+}
+exports.goBinPath = goBinPath;
+async function runGoTool(name, args = []) {
+ const bin = await goBinPath(name);
+ return new Promise((resolve) => {
+ const p = child_process_1.spawn(bin, args);
+ let out = "";
+ p.stdout.on('data', (data) => out += data);
+ p.on("close", code => resolve([code, out]));
+ });
+}
+exports.runGoTool = runGoTool;
+async function commandExists(command) {
+ if (path_1.default.isAbsolute(command)) {
+ return fileExists(command);
+ }
+ return new Promise((resolve) => { which_1.default(command, (err) => resolve(err == null)); });
+}
+exports.commandExists = commandExists;
+////////////////////////////////////////////////////////////////////////////////
+async function goBinExists(source) {
+ const name = goBinName(source);
+ const bin = await goBinPath(name);
+ return fileExists(bin);
+}
+async function fileExists(path) {
+ return new Promise((resolve) => fs_1.default.open(path, 'r', (err) => resolve(err === null)));
+}
+async function goRun(args) {
+ const gopath = await config_1.configDir('tools');
+ const gobin = await config_1.configDir('bin');
+ const env = {
+ GO111MODULE: 'on',
+ GOBIN: gobin,
+ GOPATH: gopath,
+ GOROOT: '',
+ GOTOOLDIR: '',
+ };
+ const cmd = isWin
+ ? `go ${args}`
+ : `env GOBIN=${gobin} go ${args}`;
+ const opts = {
+ env: Object.assign({}, process.env, env),
+ cwd: gopath,
+ shell: isWin ? undefined : process.env.SHELL,
+ windowsHide: true,
+ };
+ try {
+ await runExec(cmd, opts);
+ }
+ catch (ex) {
+ coc_nvim_1.window.showMessage(ex, 'error');
+ return false;
+ }
+ return true;
+}
+async function execTool(source, args, input) {
+ const [bin, name] = await Promise.all([
+ goBinPath(source),
+ goBinName(source),
+ ]);
+ if (!await commandExists(bin)) {
+ await installGoBin(source);
+ }
+ return new Promise((resolve, reject) => {
+ const p = child_process_1.execFile(bin, args, { cwd: coc_nvim_1.workspace.cwd }, async (err, stdout, stderr) => {
+ if (err && err.code === "ENOENT") {
+ return reject(`Error: Command ${name} not found! Run "CocCommand go.install.${name}" to install it and try again.`);
+ }
+ if (err) {
+ return reject(stderr.toString());
+ }
+ return resolve(stdout.toString());
+ });
+ if (p.pid) {
+ p.stdin.end(input);
+ }
+ });
+}
+exports.execTool = execTool;
+////////////////////////////////////////////////////////////////////////////////
+function goBinName(source) {
+ return source.replace(/\/\.\.\.$/, '').split('/').pop();
+}
+//# sourceMappingURL=tools.js.map
\ No newline at end of file