Skip to content

Commit b343893

Browse files
breaking: Allow cargo-chef to fetch dependencies when computing the package graph
1 parent 34d8085 commit b343893

5 files changed

Lines changed: 213 additions & 132 deletions

File tree

Cargo.lock

Lines changed: 138 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ cargo-manifest = "0.18.1"
3232
fs-err = "2.5.0"
3333
toml = { version = "0.8", features = ["preserve_order"] }
3434
expect-test = "1.1.0"
35-
cargo_metadata = "0.15"
35+
guppy = "0.15"
3636

3737
[dev-dependencies]
3838
assert_cmd = "2"

src/skeleton/mod.rs

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ use crate::skeleton::target::{Target, TargetKind};
66
use crate::OptimisationProfile;
77
use anyhow::Context;
88
use cargo_manifest::Product;
9-
use cargo_metadata::Metadata;
109
use fs_err as fs;
1110
use globwalk::GlobWalkerBuilder;
11+
use guppy::graph::PackageGraph;
1212
use pathdiff::diff_paths;
1313
use serde::{Deserialize, Serialize};
1414
use std::path::{Path, PathBuf};
@@ -47,13 +47,13 @@ impl Skeleton {
4747
base_path: P,
4848
member: Option<String>,
4949
) -> Result<Self, anyhow::Error> {
50-
let metadata = extract_cargo_metadata(base_path.as_ref())?;
50+
let graph = extract_package_graph(base_path.as_ref())?;
5151

5252
// Read relevant files from the filesystem
5353
let config_file = read::config(&base_path)?;
54-
let mut manifests = read::manifests(&base_path, &metadata)?;
54+
let mut manifests = read::manifests(&base_path, &graph)?;
5555
if let Some(member) = member {
56-
ignore_all_members_except(&mut manifests, &metadata, member);
56+
ignore_all_members_except(&mut manifests, &graph, member);
5757
}
5858

5959
let mut lock_file = read::lockfile(&base_path)?;
@@ -311,12 +311,10 @@ fn serialize_manifests(manifests: Vec<ParsedManifest>) -> Result<Vec<Manifest>,
311311
Ok(serialised_manifests)
312312
}
313313

314-
fn extract_cargo_metadata(path: &Path) -> Result<cargo_metadata::Metadata, anyhow::Error> {
315-
let mut cmd = cargo_metadata::MetadataCommand::new();
314+
fn extract_package_graph(path: &Path) -> Result<PackageGraph, anyhow::Error> {
315+
let mut cmd = guppy::MetadataCommand::new();
316316
cmd.current_dir(path);
317-
cmd.no_deps();
318-
319-
cmd.exec().context("Cannot extract Cargo metadata")
317+
cmd.build_graph().context("Cannot extract package graph")
320318
}
321319

322320
/// If the top-level `Cargo.toml` has a `members` field, replace it with
@@ -326,7 +324,7 @@ fn extract_cargo_metadata(path: &Path) -> Result<cargo_metadata::Metadata, anyho
326324
/// with a modified `members` field and has no effect on cooking the final recipe.
327325
fn ignore_all_members_except(
328326
manifests: &mut [ParsedManifest],
329-
metadata: &Metadata,
327+
graph: &PackageGraph,
330328
member: String,
331329
) {
332330
let workspace_toml = manifests
@@ -335,15 +333,12 @@ fn ignore_all_members_except(
335333

336334
if let Some(workspace) = workspace_toml.and_then(|toml| toml.contents.get_mut("workspace")) {
337335
if let Some(members) = workspace.get_mut("members") {
338-
let workspace_root = &metadata.workspace_root;
339-
let workspace_packages = metadata.workspace_packages();
336+
let ws = graph.workspace();
337+
let workspace_root = ws.root();
340338

341-
if let Some(pkg) = workspace_packages
342-
.into_iter()
343-
.find(|pkg| pkg.name == member)
344-
{
339+
if let Ok(pkg) = ws.member_by_name(&member) {
345340
// Make this a relative path to the workspace, and remove the `Cargo.toml` child.
346-
let member_cargo_path = diff_paths(pkg.manifest_path.as_os_str(), workspace_root);
341+
let member_cargo_path = diff_paths(pkg.manifest_path(), workspace_root);
347342
let member_workspace_path = member_cargo_path
348343
.as_ref()
349344
.and_then(|path| path.parent())

0 commit comments

Comments
 (0)