Canonicalize rust-project.json manifest path

This commit is contained in:
Lukas Wirth 2023-03-27 21:55:02 +02:00
parent 284c1741d6
commit f1de133820
3 changed files with 12 additions and 7 deletions

View file

@ -166,6 +166,11 @@ impl AbsPath {
AbsPathBuf::try_from(self.0.to_path_buf()).unwrap() AbsPathBuf::try_from(self.0.to_path_buf()).unwrap()
} }
/// Equivalent of [`Path::canonicalize`] for `AbsPath`.
pub fn canonicalize(&self) -> Result<AbsPathBuf, std::io::Error> {
Ok(self.as_ref().canonicalize()?.try_into().unwrap())
}
/// Equivalent of [`Path::strip_prefix`] for `AbsPath`. /// Equivalent of [`Path::strip_prefix`] for `AbsPath`.
/// ///
/// Returns a relative path. /// Returns a relative path.

View file

@ -34,6 +34,11 @@ impl ManifestPath {
pub fn parent(&self) -> &AbsPath { pub fn parent(&self) -> &AbsPath {
self.file.parent().unwrap() self.file.parent().unwrap()
} }
/// Equivalent of [`Path::canonicalize`] for `ManifestPath`.
pub fn canonicalize(&self) -> Result<ManifestPath, std::io::Error> {
Ok((&**self).canonicalize()?.try_into().unwrap())
}
} }
impl ops::Deref for ManifestPath { impl ops::Deref for ManifestPath {

View file

@ -4,7 +4,7 @@
use std::{collections::VecDeque, fmt, fs, process::Command, sync::Arc}; use std::{collections::VecDeque, fmt, fs, process::Command, sync::Arc};
use anyhow::{bail, format_err, Context, Result}; use anyhow::{format_err, Context, Result};
use base_db::{ use base_db::{
CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency, Edition, Env, CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency, Edition, Env,
FileId, LangCrateOrigin, ProcMacroPaths, TargetLayoutLoadResult, FileId, LangCrateOrigin, ProcMacroPaths, TargetLayoutLoadResult,
@ -154,12 +154,7 @@ impl ProjectWorkspace {
) -> Result<ProjectWorkspace> { ) -> Result<ProjectWorkspace> {
let res = match manifest { let res = match manifest {
ProjectManifest::ProjectJson(project_json) => { ProjectManifest::ProjectJson(project_json) => {
let metadata = fs::symlink_metadata(&project_json).with_context(|| { let project_json = project_json.canonicalize()?;
format!("Failed to read json file {}", project_json.display())
})?;
if metadata.is_symlink() {
bail!("The project-json may not currently point to a symlink");
}
let file = fs::read_to_string(&project_json).with_context(|| { let file = fs::read_to_string(&project_json).with_context(|| {
format!("Failed to read json file {}", project_json.display()) format!("Failed to read json file {}", project_json.display())
})?; })?;