mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-12-09 10:55:42 +00:00
Merge #9292
9292: fix: Code: clean-up #8951 r=wxb1ank a=wxb1ank #8951 was a major change in the VS Code extension and caused quite a few problems. This PR is a catch-all for bugs and improvements in the new code. This should fix: - #9284 - [this unreported bug](https://github.com/rust-analyzer/rust-analyzer/pull/8951/files#r651570446) - ...and one or two uncaught exceptions I just found The original lack of testing was my own fault, but this area of the VS Code API is also tricky for a couple reasons: - The [FileSystem](https://github.com/rust-analyzer/rust-analyzer/pull/8951/files#r651570446) API does not list or warn about any exceptions, but [FileSystemProvider](https://github.com/rust-analyzer/rust-analyzer/pull/8951/files#r651570446) (which `FileSystem` is a wrapper of, AFAICT) does. - At first glance, [Uri.path](https://github.com/rust-analyzer/rust-analyzer/pull/8951/files#r651570446) *looks* like it works for FS operations. It does not, at least, on Windows. You need to use `Uri.fsPath`. I only use Windows, so I need people on macOS, Linux, and (possibly) NixOS to test this. Co-authored-by: wxb1ank <wxblank@gmail.com>
This commit is contained in:
commit
d0f2bc3b87
3 changed files with 23 additions and 15 deletions
|
|
@ -158,7 +158,7 @@ export async function deactivate() {
|
|||
}
|
||||
|
||||
async function bootstrap(config: Config, state: PersistentState): Promise<string> {
|
||||
await vscode.workspace.fs.createDirectory(config.globalStorageUri);
|
||||
await vscode.workspace.fs.createDirectory(config.globalStorageUri).then();
|
||||
|
||||
if (!config.currentExtensionIsNightly) {
|
||||
await state.updateNightlyReleaseId(undefined);
|
||||
|
|
@ -277,11 +277,11 @@ async function patchelf(dest: vscode.Uri): Promise<void> {
|
|||
'';
|
||||
}
|
||||
`;
|
||||
const origFile = vscode.Uri.file(dest.path + "-orig");
|
||||
const origFile = vscode.Uri.file(dest.fsPath + "-orig");
|
||||
await vscode.workspace.fs.rename(dest, origFile);
|
||||
progress.report({ message: "Patching executable", increment: 20 });
|
||||
await new Promise((resolve, reject) => {
|
||||
const handle = exec(`nix-build -E - --argstr srcStr '${origFile.path}' -o '${dest.path}'`,
|
||||
const handle = exec(`nix-build -E - --argstr srcStr '${origFile.fsPath}' -o '${dest.fsPath}'`,
|
||||
(err, stdout, stderr) => {
|
||||
if (err != null) {
|
||||
reject(Error(stderr));
|
||||
|
|
@ -338,14 +338,14 @@ async function getServer(config: Config, state: PersistentState): Promise<string
|
|||
await state.updateServerVersion(undefined);
|
||||
}
|
||||
|
||||
if (state.serverVersion === config.package.version) return dest.path;
|
||||
if (state.serverVersion === config.package.version) return dest.fsPath;
|
||||
|
||||
if (config.askBeforeDownload) {
|
||||
const userResponse = await vscode.window.showInformationMessage(
|
||||
`Language server version ${config.package.version} for rust-analyzer is not installed.`,
|
||||
"Download now"
|
||||
);
|
||||
if (userResponse !== "Download now") return dest.path;
|
||||
if (userResponse !== "Download now") return dest.fsPath;
|
||||
}
|
||||
|
||||
const releaseTag = config.package.releaseTag;
|
||||
|
|
@ -372,7 +372,7 @@ async function getServer(config: Config, state: PersistentState): Promise<string
|
|||
}
|
||||
|
||||
await state.updateServerVersion(config.package.version);
|
||||
return dest.path;
|
||||
return dest.fsPath;
|
||||
}
|
||||
|
||||
function serverPath(config: Config): string | null {
|
||||
|
|
@ -383,7 +383,7 @@ async function isNixOs(): Promise<boolean> {
|
|||
try {
|
||||
const contents = (await vscode.workspace.fs.readFile(vscode.Uri.file("/etc/os-release"))).toString();
|
||||
return contents.indexOf("ID=nixos") !== -1;
|
||||
} catch (e) {
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -91,7 +91,7 @@ export async function download(opts: DownloadOpts) {
|
|||
// to prevent partially downloaded files when user kills vscode
|
||||
// This also avoids overwriting running executables
|
||||
const randomHex = crypto.randomBytes(5).toString("hex");
|
||||
const rawDest = path.parse(opts.dest.path);
|
||||
const rawDest = path.parse(opts.dest.fsPath);
|
||||
const tempFilePath = vscode.Uri.joinPath(vscode.Uri.file(rawDest.dir), `${rawDest.name}${randomHex}`);
|
||||
|
||||
await vscode.window.withProgress(
|
||||
|
|
@ -116,7 +116,7 @@ export async function download(opts: DownloadOpts) {
|
|||
}
|
||||
);
|
||||
|
||||
await vscode.workspace.fs.rename(tempFilePath, opts.dest);
|
||||
await vscode.workspace.fs.rename(tempFilePath, opts.dest, { overwrite: true });
|
||||
}
|
||||
|
||||
async function downloadFile(
|
||||
|
|
@ -148,7 +148,7 @@ async function downloadFile(
|
|||
const totalBytes = Number(res.headers.get('content-length'));
|
||||
assert(!Number.isNaN(totalBytes), "Sanity check of content-length protocol");
|
||||
|
||||
log.debug("Downloading file of", totalBytes, "bytes size from", urlString, "to", destFilePath.path);
|
||||
log.debug("Downloading file of", totalBytes, "bytes size from", urlString, "to", destFilePath.fsPath);
|
||||
|
||||
let readBytes = 0;
|
||||
res.body.on("data", (chunk: Buffer) => {
|
||||
|
|
@ -156,7 +156,7 @@ async function downloadFile(
|
|||
onProgress(readBytes, totalBytes);
|
||||
});
|
||||
|
||||
const destFileStream = fs.createWriteStream(destFilePath.path, { mode });
|
||||
const destFileStream = fs.createWriteStream(destFilePath.fsPath, { mode });
|
||||
const srcStream = gunzip ? res.body.pipe(zlib.createGunzip()) : res.body;
|
||||
|
||||
await pipeline(srcStream, destFileStream);
|
||||
|
|
|
|||
|
|
@ -159,7 +159,7 @@ export const getPathForExecutable = memoize(
|
|||
// it is not mentioned in docs and cannot be infered by the type signature...
|
||||
const standardPath = vscode.Uri.joinPath(vscode.Uri.file(os.homedir()), ".cargo", "bin", executableName);
|
||||
|
||||
if (isFile(standardPath.path)) return standardPath.path;
|
||||
if (isFileAtUri(standardPath)) return standardPath.fsPath;
|
||||
} catch (err) {
|
||||
log.error("Failed to read the fs info", err);
|
||||
}
|
||||
|
|
@ -177,9 +177,17 @@ function lookupInPath(exec: string): boolean {
|
|||
: [candidate];
|
||||
});
|
||||
|
||||
return candidates.some(isFile);
|
||||
return candidates.some(isFileAtPath);
|
||||
}
|
||||
|
||||
async function isFile(path: string): Promise<boolean> {
|
||||
return ((await vscode.workspace.fs.stat(vscode.Uri.file(path))).type & vscode.FileType.File) !== 0;
|
||||
async function isFileAtPath(path: string): Promise<boolean> {
|
||||
return isFileAtUri(vscode.Uri.file(path));
|
||||
}
|
||||
|
||||
async function isFileAtUri(uri: vscode.Uri): Promise<boolean> {
|
||||
try {
|
||||
return ((await vscode.workspace.fs.stat(uri)).type & vscode.FileType.File) !== 0;
|
||||
} catch {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue