.gitignore added
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-go / lib / utils / tools.js
diff --git a/.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js b/.config/coc/extensions/node_modules/coc-go/lib/utils/tools.js
new file mode 100644 (file)
index 0000000..655d7a5
--- /dev/null
@@ -0,0 +1,121 @@
+"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