Skip to content

Commit

Permalink
Merge pull request #828 from Michael-F-Bryan/hotfix/target-dir
Browse files Browse the repository at this point in the history
Use the "cargo metadata" command instead of manipulating paths directly
  • Loading branch information
hannobraun authored Jul 18, 2022
2 parents 4a80380 + 9baa869 commit 626e5fb
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 17 deletions.
1 change: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions crates/fj-host/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ categories = ["encoding", "mathematics", "rendering"]
libloading = "0.7.2"
notify = "5.0.0-pre.15"
thiserror = "1.0.31"
cargo_metadata = "0.15.0"

[dependencies.fj]
version = "0.8.0"
Expand Down
59 changes: 42 additions & 17 deletions crates/fj-host/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ use std::{
collections::{HashMap, HashSet},
ffi::OsStr,
io,
path::PathBuf,
path::{Path, PathBuf},
process::Command,
sync::mpsc,
thread,
Expand All @@ -40,7 +40,8 @@ pub struct Model {
}

impl Model {
/// Initialize the model from a path
/// Initialize the model using the path to its crate (i.e. the folder
/// containing `Cargo.toml`).
///
/// Optionally, the target directory where plugin files are compiled to can
/// be provided. If it is not provided, the target directory is assumed to
Expand All @@ -49,31 +50,28 @@ impl Model {
path: PathBuf,
target_dir: Option<PathBuf>,
) -> io::Result<Self> {
let name = {
// Can't panic. It only would, if the path ends with "..", and we
// are canonicalizing it here to prevent that.
let canonical = path.canonicalize()?;
let file_name = canonical
.file_name()
.expect("Expected path to be canonical");

file_name.to_string_lossy().replace('-', "_")
};
let crate_dir = path.canonicalize()?;

let metadata = cargo_metadata::MetadataCommand::new()
.current_dir(&crate_dir)
.exec()
.map_err(metadata_error_to_io)?;

let src_path = path.join("src");
let pkg = package_associated_with_directory(&metadata, &crate_dir)?;
let src_path = crate_dir.join("src");

let lib_path = {
let name = pkg.name.replace('-', "_");
let file = HostPlatform::lib_file_name(&name);
let target_dir = target_dir.unwrap_or_else(|| path.join("target"));
let target_dir = target_dir
.unwrap_or_else(|| metadata.target_directory.clone().into());
target_dir.join("debug").join(file)
};

let manifest_path = path.join("Cargo.toml");

Ok(Self {
src_path,
lib_path,
manifest_path,
manifest_path: pkg.manifest_path.as_std_path().to_path_buf(),
})
}

Expand Down Expand Up @@ -208,6 +206,33 @@ impl Model {
}
}

fn metadata_error_to_io(e: cargo_metadata::Error) -> std::io::Error {
match e {
cargo_metadata::Error::Io(io) => io,
_ => std::io::Error::new(io::ErrorKind::Other, e),
}
}

fn package_associated_with_directory<'m>(
metadata: &'m cargo_metadata::Metadata,
dir: &Path,
) -> Result<&'m cargo_metadata::Package, io::Error> {
for pkg in metadata.workspace_packages() {
let crate_dir = pkg
.manifest_path
.parent()
.and_then(|p| p.canonicalize().ok());

if crate_dir.as_deref() == Some(dir) {
return Ok(pkg);
}
}

let msg = format!("\"{}\" doesn't point to a crate", dir.display());

Err(io::Error::new(io::ErrorKind::Other, msg))
}

/// Watches a model for changes, reloading it continually
pub struct Watcher {
_watcher: Box<dyn notify::Watcher>,
Expand Down

0 comments on commit 626e5fb

Please sign in to comment.