From cf672ed568f92a72c6592407c630f539ecdea224 Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sun, 2 Aug 2026 17:57:43 -0700 Subject: [PATCH] Prefer longest match in path dependency search --- src/directory.rs | 6 +++++- src/run.rs | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/directory.rs b/src/directory.rs index a52a4ce..ce84f3f 100644 --- a/src/directory.rs +++ b/src/directory.rs @@ -2,7 +2,7 @@ use serde::de::{Deserialize, Deserializer}; use serde_derive::Serialize; use std::borrow::Cow; use std::env; -use std::ffi::OsString; +use std::ffi::{OsStr, OsString}; use std::io; use std::path::{Path, PathBuf}; @@ -27,6 +27,10 @@ impl Directory { self.path.to_string_lossy() } + pub fn as_os_str(&self) -> &OsStr { + self.path.as_os_str() + } + pub fn join>(&self, tail: P) -> PathBuf { self.path.join(tail) } diff --git a/src/run.rs b/src/run.rs index 11c1593..7134cd8 100644 --- a/src/run.rs +++ b/src/run.rs @@ -11,6 +11,7 @@ use crate::normalize::{self, Context, Normalization, Variations}; use crate::path::CanonicalPath; use crate::{Expected, Runner, Test, features}; use serde_derive::Deserialize; +use std::cmp::Reverse; use std::collections::{BTreeMap as Map, BTreeSet as Set}; use std::env; use std::ffi::{OsStr, OsString}; @@ -164,6 +165,10 @@ impl Runner { ); } + // Sort by decreasing path length so that a linear scan can use the + // first match knowing it is the longest match. + path_dependencies.sort_by_key(|dep| Reverse(dep.normalized_path.as_os_str().len())); + let crate_name = &source_manifest.package.name; let project_dir = path!(target_dir / "tests" / "trybuild" / crate_name /); fs::create_dir_all(&project_dir)?;