https://github.com/da-viper updated https://github.com/llvm/llvm-project/pull/162635
>From c62a3532785cc0b5a72475a965ba4a99404432ba Mon Sep 17 00:00:00 2001 From: Ebuka Ezike <[email protected]> Date: Thu, 9 Oct 2025 12:04:09 +0100 Subject: [PATCH 1/2] [lldb-dap] expand tilde in dap executable path Users may have multiple devices and would like to resolve the homepath based on the machine they are on. --- .../lldb-dap/src-ts/debug-adapter-factory.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts index 7060638a94864..c34f8866fb2e3 100644 --- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts +++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts @@ -1,3 +1,4 @@ +import * as os from "os"; import * as path from "path"; import * as util from "util"; import * as vscode from "vscode"; @@ -9,6 +10,16 @@ import { LogFilePathProvider, LogType } from "./logging"; const exec = util.promisify(child_process.execFile); +/** + * Expands the character `~` to the user's home directory + */ +function expandUser(file_path: string): string { + if (file_path.startsWith("~")) { + return os.homedir() + file_path.slice(1); + } + return file_path; +} + async function isExecutable(path: string): Promise<Boolean> { try { await fs.access(path, fs.constants.X_OK); @@ -116,8 +127,9 @@ async function getDAPExecutable( configuration: vscode.DebugConfiguration, ): Promise<string> { // Check if the executable was provided in the launch configuration. - const launchConfigPath = configuration["debugAdapterExecutable"]; + let launchConfigPath = configuration["debugAdapterExecutable"]; if (typeof launchConfigPath === "string" && launchConfigPath.length !== 0) { + launchConfigPath = expandUser(launchConfigPath); if (!(await isExecutable(launchConfigPath))) { throw new ErrorWithNotification( `Debug adapter path "${launchConfigPath}" is not a valid file. The path comes from your launch configuration.`, @@ -129,7 +141,7 @@ async function getDAPExecutable( // Check if the executable was provided in the extension's configuration. const config = vscode.workspace.getConfiguration("lldb-dap", workspaceFolder); - const configPath = config.get<string>("executable-path"); + const configPath = expandUser(config.get<string>("executable-path") ?? ""); if (configPath && configPath.length !== 0) { if (!(await isExecutable(configPath))) { throw new ErrorWithNotification( >From 4c25214fa0ee77292e32987584c4557845006bda Mon Sep 17 00:00:00 2001 From: Ebuka Ezike <[email protected]> Date: Fri, 31 Oct 2025 15:26:59 +0000 Subject: [PATCH 2/2] [lldb-dap] add test case --- lldb/tools/lldb-dap/package.json | 5 ++- .../lldb-dap/src-ts/debug-adapter-factory.ts | 12 +---- lldb/tools/lldb-dap/src-ts/utils.ts | 41 +++++++++++++++++ lldb/tools/lldb-dap/tsconfig.json | 5 ++- .../lldb-dap/unittests-ts/expandUser.test.ts | 45 +++++++++++++++++++ 5 files changed, 94 insertions(+), 14 deletions(-) create mode 100644 lldb/tools/lldb-dap/src-ts/utils.ts create mode 100644 lldb/tools/lldb-dap/unittests-ts/expandUser.test.ts diff --git a/lldb/tools/lldb-dap/package.json b/lldb/tools/lldb-dap/package.json index e961c2e48b258..6c0212e0869a9 100644 --- a/lldb/tools/lldb-dap/package.json +++ b/lldb/tools/lldb-dap/package.json @@ -31,6 +31,7 @@ "chokidar": "^4.0.3" }, "devDependencies": { + "@types/mocha": "^10.0.1", "@types/node": "^18.19.41", "@types/tabulator-tables": "^6.2.10", "@types/vscode": "1.75.0", @@ -38,6 +39,7 @@ "@vscode/debugprotocol": "^1.68.0", "@vscode/vsce": "^3.2.2", "esbuild": "^0.25.9", + "mocha": "^10.2.0", "prettier": "^3.4.2", "prettier-plugin-curly": "^0.3.1", "tabulator-tables": "^6.3.1", @@ -53,9 +55,10 @@ "bundle-symbols-table-view": "npx tsc -p src-ts/webview --noEmit && npx esbuild src-ts/webview/symbols-table-view.ts --bundle --format=iife --outdir=./out/webview", "bundle-tabulator": "cp node_modules/tabulator-tables/dist/js/tabulator.min.js ./out/webview/ && cp node_modules/tabulator-tables/dist/css/tabulator_midnight.min.css ./out/webview/ && cp node_modules/tabulator-tables/dist/css/tabulator_simple.min.css ./out/webview/", "bundle-webview": "npm run bundle-symbols-table-view && npm run bundle-tabulator", + "check-unit": "npx tsc -p ./ && mocha ./out/unittests-ts", "vscode:prepublish": "npm run bundle-webview && npm run bundle-extension", "watch": "npm run bundle-webview && tsc -watch -p ./", - "format": "npx prettier './src-ts/' --write", + "format": "npx prettier './src-ts/' './unittests-ts' --write", "package": "rm -rf ./out && vsce package --out ./out/lldb-dap.vsix", "publish": "vsce publish", "vscode-uninstall": "code --uninstall-extension llvm-vs-code-extensions.lldb-dap", diff --git a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts index c34f8866fb2e3..433d48fab9d85 100644 --- a/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts +++ b/lldb/tools/lldb-dap/src-ts/debug-adapter-factory.ts @@ -1,4 +1,3 @@ -import * as os from "os"; import * as path from "path"; import * as util from "util"; import * as vscode from "vscode"; @@ -7,19 +6,10 @@ import * as fs from "node:fs/promises"; import { ConfigureButton, OpenSettingsButton } from "./ui/show-error-message"; import { ErrorWithNotification } from "./ui/error-with-notification"; import { LogFilePathProvider, LogType } from "./logging"; +import { expandUser } from "./utils"; const exec = util.promisify(child_process.execFile); -/** - * Expands the character `~` to the user's home directory - */ -function expandUser(file_path: string): string { - if (file_path.startsWith("~")) { - return os.homedir() + file_path.slice(1); - } - return file_path; -} - async function isExecutable(path: string): Promise<Boolean> { try { await fs.access(path, fs.constants.X_OK); diff --git a/lldb/tools/lldb-dap/src-ts/utils.ts b/lldb/tools/lldb-dap/src-ts/utils.ts new file mode 100644 index 0000000000000..efebe0b0f42ba --- /dev/null +++ b/lldb/tools/lldb-dap/src-ts/utils.ts @@ -0,0 +1,41 @@ +import * as os from "os"; +import * as path from "path"; + +/** + * Expands the character `~` to the user's home directory + */ +export function expandUser(file_path: string): string { + if (os.platform() == "win32") { + return file_path; + } + + if (!file_path) { + return ""; + } + + if (!file_path.startsWith("~")) { + return file_path; + } + + const path_len = file_path.length; + if (path_len == 1) { + return os.homedir(); + } + + if (file_path.charAt(1) == path.sep) { + return path.join(os.homedir(), file_path.substring(1)); + } + + const sep_index = file_path.indexOf(path.sep); + const user_name_end = sep_index == -1 ? file_path.length : sep_index; + const user_name = file_path.substring(1, user_name_end); + try { + if (user_name == os.userInfo().username) { + return path.join(os.homedir(), file_path.substring(user_name_end)); + } + } catch (err) { + return file_path; + } + + return file_path; +} diff --git a/lldb/tools/lldb-dap/tsconfig.json b/lldb/tools/lldb-dap/tsconfig.json index 06a484a1fc263..215b1d493e052 100644 --- a/lldb/tools/lldb-dap/tsconfig.json +++ b/lldb/tools/lldb-dap/tsconfig.json @@ -3,13 +3,14 @@ "moduleResolution": "node", "module": "commonjs", "outDir": "out", - "rootDir": "src-ts", + "rootDirs": ["src-ts", "unittests-ts"], "sourceMap": true, "strict": true, "target": "es6" }, "include": [ - "src-ts" + "src-ts", + "unittests-ts" ], "exclude": [ "node_modules", diff --git a/lldb/tools/lldb-dap/unittests-ts/expandUser.test.ts b/lldb/tools/lldb-dap/unittests-ts/expandUser.test.ts new file mode 100644 index 0000000000000..0fefbb025c2c8 --- /dev/null +++ b/lldb/tools/lldb-dap/unittests-ts/expandUser.test.ts @@ -0,0 +1,45 @@ +import { suite, test, suiteSetup, suiteTeardown } from "mocha"; +import * as assert from "assert"; +import * as os from "os"; +import * as process from "process"; +import { expandUser } from "../src-ts/utils"; + +suite("expandUser Test", function () { + let home_env: { [key: string]: string | undefined } = {}; + const local_username = os.userInfo().username; + + suiteSetup(function () { + if (os.platform() == "win32") { + this.skip(); + } + home_env.HOME = process.env.HOME; + process.env.HOME = "/home/buildbot"; + }); + + suiteTeardown(function () { + process.env.HOME = home_env.HOME; + }); + + test("tilde ", function () { + assert.equal(expandUser("~"), "/home/buildbot"); + assert.equal(expandUser("~/"), "/home/buildbot/"); + assert.equal(expandUser("~/worker"), "/home/buildbot/worker"); + }); + + test("tilde with username", function () { + assert.equal(expandUser(`~${local_username}`), "/home/buildbot"); + assert.equal(expandUser(`~${local_username}/`), "/home/buildbot/"); + assert.equal(expandUser(`~${local_username}/dev`), "/home/buildbot/dev"); + + // test unknown user + assert.notEqual(expandUser("~not_a_user"), "/home/build/bot"); + }); + + test("empty", function () { + assert.equal(expandUser(""), ""); + }); + + test("no tilde", function () { + assert.equal(expandUser("/home/buildbot/worker"), "/home/buildbot/worker"); + }); +}); _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
