дзеркало
https://github.com/l0ng-ai/openidea.git
синхронізовано 2026-11-09 03:05:40 +02:00
fix(terminal): keep Windows shell paths intact (#1723)
The terminal's Shell path setting was split with POSIX rules, where a backslash escapes the next character, so C:\Windows\system32\cmd.exe reached the backend as C:Windowssystem32cmd.exe and every new terminal failed to start. On Windows a backslash is now a path separator, and an unquoted path up to its .exe/.cmd/.bat/.com is the program even with spaces; paths picked from the Installed Shells menu or Browse are quoted when they contain whitespace. This was the only place the setting is parsed. Fixes #1327
Цей коміт міститься в:
1 джерело
c75a630ede
коміт
f76c297fe9
4 files changed
+82
-5
No files matched your search
@@ -67,6 +67,28 @@ export function parseArgs(input: string, windowsPaths = false): string[] {
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* The program and arguments of a shell command line (Settings › Terminal › Shell path). On
|
||||
* Windows a backslash is a path separator, and an unquoted path up to its `.exe` / `.cmd` /
|
||||
* `.bat` / `.com` is the program even with spaces in it (`C:\Program Files\…\pwsh.exe -NoLogo`).
|
||||
*/
|
||||
export function parseShellCommand(line: string, windows: boolean): string[] {
|
||||
const text = line.trim();
|
||||
if (windows && !/["']/.test(text)) {
|
||||
const end = /\.(?:exe|cmd|bat|com)(?=\s|$)/i.exec(text);
|
||||
if (end) {
|
||||
const stop = end.index + end[0].length;
|
||||
return [text.slice(0, stop), ...parseArgs(text.slice(stop), true)];
|
||||
}
|
||||
}
|
||||
return parseArgs(text, windows);
|
||||
}
|
||||
|
||||
/** `path` as one word of a command line: quoted when it has whitespace. */
|
||||
export function quotePath(path: string): string {
|
||||
return /\s/.test(path) ? `"${path}"` : path;
|
||||
}
|
||||
|
||||
/** Inverse of `parseArgs` (quotes only when needed). */
|
||||
export function formatArgs(args: readonly string[]): string {
|
||||
return args.map((a) => (a === "" ? "''" : /[\s'"\\$`]/.test(a) ? `'${a.replace(/'/g, `'\\''`)}'` : a)).join(" ");
|
||||
|
||||
Reference in new issue
Заблокувати користувача