Add support for Cygwin on windows - fixes #31

This commit is contained in:
Sander Declerck 2025-09-10 13:31:30 +02:00
parent bd0f9118cf
commit 0a6fd4cbb7
No known key found for this signature in database

View file

@ -3,7 +3,8 @@ import {
doesExecutableExistOnSystem, doesExecutableExistOnSystem,
removeLinesMatchingPattern, removeLinesMatchingPattern,
} from "../helpers.js"; } from "../helpers.js";
import { execSync } from "child_process"; import { execSync, spawnSync } from "child_process";
import * as os from "os";
const shellName = "Bash"; const shellName = "Bash";
const executableName = "bash"; const executableName = "bash";
@ -43,10 +44,12 @@ function setup() {
function getStartupFile() { function getStartupFile() {
try { try {
return execSync(startupFileCommand, { var path = execSync(startupFileCommand, {
encoding: "utf8", encoding: "utf8",
shell: executableName, shell: executableName,
}).trim(); }).trim();
return windowsFixPath(path);
} catch (error) { } catch (error) {
throw new Error( throw new Error(
`Command failed: ${startupFileCommand}. Error: ${error.message}` `Command failed: ${startupFileCommand}. Error: ${error.message}`
@ -54,6 +57,50 @@ function getStartupFile() {
} }
} }
function windowsFixPath(path) {
try {
if (os.platform() !== "win32") {
return path;
}
// On windows cygwin bash, paths are returned in format /c/user/..., but we need it in format C:\user\...
// To convert, the cygpath -w command can be used to convert to the desired format.
// Cygpath only exists on Cygwin, so we first check if the command is available.
// If it is, we use it to convert the path.
if (hasCygpath()) {
return cygpathw(path);
}
return path;
} catch {
return path;
}
}
function hasCygpath() {
try {
var result = spawnSync("where", ["cygpath"], { shell: executableName });
return result.status === 0;
} catch {
return false;
}
}
function cygpathw(path) {
try {
var result = spawnSync("cygpath", ["-w", path], {
encoding: "utf8",
shell: executableName,
});
if (result.status === 0) {
return result.stdout.trim();
}
return path;
} catch {
return path;
}
}
export default { export default {
name: shellName, name: shellName,
isInstalled, isInstalled,