1- use std:: { env, path:: PathBuf } ;
1+ use std:: {
2+ env,
3+ hash:: { Hash as _, Hasher as _} ,
4+ path:: PathBuf ,
5+ } ;
26
37use anyhow:: { anyhow, Context , Result } ;
4- use cargo_metadata:: {
5- Metadata , MetadataCommand , Package , PackageName , Target , TargetKind ,
6- } ;
8+ use cargo_metadata:: { Metadata , MetadataCommand , Package , PackageName , Target , TargetKind } ;
79use clap:: Parser ;
810
911#[ derive( Parser , Debug ) ]
@@ -98,6 +100,8 @@ impl TryFrom<&TargetKind> for HermesTargetKind {
98100
99101pub struct Roots {
100102 pub workspace : PathBuf ,
103+ pub cargo_target_dir : PathBuf ,
104+ pub shadow_root : PathBuf ,
101105 pub roots : Vec < ( PackageName , HermesTargetKind , PathBuf ) > ,
102106}
103107
@@ -120,8 +124,12 @@ pub fn resolve_roots(args: &Args) -> Result<Roots> {
120124
121125 let selected_packages = resolve_packages ( & metadata, & args. workspace ) ?;
122126
123- let mut roots =
124- Roots { workspace : metadata. workspace_root . as_std_path ( ) . to_owned ( ) , roots : Vec :: new ( ) } ;
127+ let mut roots = Roots {
128+ workspace : metadata. workspace_root . as_std_path ( ) . to_owned ( ) ,
129+ cargo_target_dir : metadata. target_directory . as_std_path ( ) . to_owned ( ) ,
130+ shadow_root : resolve_shadow_path ( & metadata) ,
131+ roots : Vec :: new ( ) ,
132+ } ;
125133
126134 for package in selected_packages {
127135 log:: trace!( "Scanning package: {}" , package. name) ;
@@ -145,6 +153,22 @@ pub fn resolve_roots(args: &Args) -> Result<Roots> {
145153 Ok ( roots)
146154}
147155
156+ fn resolve_shadow_path ( metadata : & Metadata ) -> PathBuf {
157+ // NOTE: Automatically handles `CARGO_TARGET_DIR` env var.
158+ let target_dir = metadata. target_directory . as_std_path ( ) ;
159+
160+ // Hash the path to the workspace root to avoid collisions between different
161+ // workspaces using the same target directory.
162+ let workspace_root_hash = {
163+ let mut hasher = std:: hash:: DefaultHasher :: new ( ) ;
164+ hasher. write ( b"hermes_shadow_salt" ) ;
165+ metadata. workspace_root . hash ( & mut hasher) ;
166+ hasher. finish ( )
167+ } ;
168+
169+ target_dir. join ( format ! ( "hermes_shadow_{workspace_root_hash}" ) )
170+ }
171+
148172/// Resolves which packages to process based on workspace flags and CWD.
149173fn resolve_packages < ' a > (
150174 metadata : & ' a Metadata ,
0 commit comments