@@ -22,10 +22,10 @@ use std::fs;
2222use std:: path:: { Path , PathBuf } ;
2323use std:: str:: FromStr ;
2424use tracing:: { debug, info, trace, warn} ;
25- use which:: which;
2625
2726use crate :: util:: get_setting;
2827use crate :: util:: get_exe_path;
28+ use crate :: util:: canonicalize_which;
2929
3030const DSC_RESOURCE_EXTENSIONS : [ & str ; 3 ] = [ ".dsc.resource.json" , ".dsc.resource.yaml" , ".dsc.resource.yml" ] ;
3131const DSC_EXTENSION_EXTENSIONS : [ & str ; 3 ] = [ ".dsc.extension.json" , ".dsc.extension.yaml" , ".dsc.extension.yml" ] ;
@@ -121,10 +121,11 @@ impl CommandDiscovery {
121121
122122 let dsc_resource_path = env:: var_os ( "DSC_RESOURCE_PATH" ) ;
123123 if resource_path_setting. allow_env_override && dsc_resource_path. is_some ( ) {
124- let value = dsc_resource_path. unwrap ( ) ;
125- debug ! ( "DSC_RESOURCE_PATH: {:?}" , value. to_string_lossy( ) ) ;
126- using_custom_path = true ;
127- paths. append ( & mut env:: split_paths ( & value) . collect :: < Vec < _ > > ( ) ) ;
124+ if let Some ( value) = dsc_resource_path {
125+ debug ! ( "DSC_RESOURCE_PATH: {:?}" , value. to_string_lossy( ) ) ;
126+ using_custom_path = true ;
127+ paths. append ( & mut env:: split_paths ( & value) . collect :: < Vec < _ > > ( ) ) ;
128+ }
128129 } else {
129130 for p in resource_path_setting. directories {
130131 let v = PathBuf :: from_str ( & p) ;
@@ -649,38 +650,38 @@ fn load_resource_manifest(path: &Path, manifest: &ResourceManifest) -> Result<Ds
649650
650651 let mut capabilities: Vec < Capability > = vec ! [ ] ;
651652 if let Some ( get) = & manifest. get {
652- verify_executable ( & manifest. resource_type , "get" , & get. executable ) ;
653+ verify_executable ( & manifest. resource_type , "get" , & get. executable , path . parent ( ) . unwrap ( ) ) ;
653654 capabilities. push ( Capability :: Get ) ;
654655 }
655656 if let Some ( set) = & manifest. set {
656- verify_executable ( & manifest. resource_type , "set" , & set. executable ) ;
657+ verify_executable ( & manifest. resource_type , "set" , & set. executable , path . parent ( ) . unwrap ( ) ) ;
657658 capabilities. push ( Capability :: Set ) ;
658659 if set. handles_exist == Some ( true ) {
659660 capabilities. push ( Capability :: SetHandlesExist ) ;
660661 }
661662 }
662663 if let Some ( what_if) = & manifest. what_if {
663- verify_executable ( & manifest. resource_type , "what_if" , & what_if. executable ) ;
664+ verify_executable ( & manifest. resource_type , "what_if" , & what_if. executable , path . parent ( ) . unwrap ( ) ) ;
664665 capabilities. push ( Capability :: WhatIf ) ;
665666 }
666667 if let Some ( test) = & manifest. test {
667- verify_executable ( & manifest. resource_type , "test" , & test. executable ) ;
668+ verify_executable ( & manifest. resource_type , "test" , & test. executable , path . parent ( ) . unwrap ( ) ) ;
668669 capabilities. push ( Capability :: Test ) ;
669670 }
670671 if let Some ( delete) = & manifest. delete {
671- verify_executable ( & manifest. resource_type , "delete" , & delete. executable ) ;
672+ verify_executable ( & manifest. resource_type , "delete" , & delete. executable , path . parent ( ) . unwrap ( ) ) ;
672673 capabilities. push ( Capability :: Delete ) ;
673674 }
674675 if let Some ( export) = & manifest. export {
675- verify_executable ( & manifest. resource_type , "export" , & export. executable ) ;
676+ verify_executable ( & manifest. resource_type , "export" , & export. executable , path . parent ( ) . unwrap ( ) ) ;
676677 capabilities. push ( Capability :: Export ) ;
677678 }
678679 if let Some ( resolve) = & manifest. resolve {
679- verify_executable ( & manifest. resource_type , "resolve" , & resolve. executable ) ;
680+ verify_executable ( & manifest. resource_type , "resolve" , & resolve. executable , path . parent ( ) . unwrap ( ) ) ;
680681 capabilities. push ( Capability :: Resolve ) ;
681682 }
682683 if let Some ( SchemaKind :: Command ( command) ) = & manifest. schema {
683- verify_executable ( & manifest. resource_type , "schema" , & command. executable ) ;
684+ verify_executable ( & manifest. resource_type , "schema" , & command. executable , path . parent ( ) . unwrap ( ) ) ;
684685 }
685686
686687 let resource = DscResource {
@@ -706,7 +707,7 @@ fn load_extension_manifest(path: &Path, manifest: &ExtensionManifest) -> Result<
706707
707708 let mut capabilities: Vec < dscextension:: Capability > = vec ! [ ] ;
708709 if let Some ( discover) = & manifest. discover {
709- verify_executable ( & manifest. r#type , "discover" , & discover. executable ) ;
710+ verify_executable ( & manifest. r#type , "discover" , & discover. executable , path . parent ( ) . unwrap ( ) ) ;
710711 capabilities. push ( dscextension:: Capability :: Discover ) ;
711712 }
712713
@@ -724,8 +725,8 @@ fn load_extension_manifest(path: &Path, manifest: &ExtensionManifest) -> Result<
724725 Ok ( extension)
725726}
726727
727- fn verify_executable ( resource : & str , operation : & str , executable : & str ) {
728- if which ( executable) . is_err ( ) {
728+ fn verify_executable ( resource : & str , operation : & str , executable : & str , directory : & Path ) {
729+ if canonicalize_which ( executable, Some ( directory . to_string_lossy ( ) . as_ref ( ) ) ) . is_err ( ) {
729730 warn ! ( "{}" , t!( "discovery.commandDiscovery.executableNotFound" , resource = resource, operation = operation, executable = executable) ) ;
730731 }
731732}
@@ -739,15 +740,15 @@ fn sort_adapters_based_on_lookup_table(unsorted_adapters: &BTreeMap<String, Vec<
739740 if let Some ( adapter_name) = lookup_table. get ( needed_resource) {
740741 if let Some ( resource_vec) = unsorted_adapters. get ( adapter_name) {
741742 debug ! ( "Lookup table found resource '{}' in adapter '{}'" , needed_resource, adapter_name) ;
742- result. insert ( adapter_name. to_string ( ) , resource_vec. clone ( ) ) ;
743+ result. insert ( adapter_name. clone ( ) , resource_vec. clone ( ) ) ;
743744 }
744745 }
745746 }
746747
747748 // now add remaining adapters
748749 for ( adapter_name, adapters) in unsorted_adapters {
749750 if !result. contains_key ( adapter_name) {
750- result. insert ( adapter_name. to_string ( ) , adapters. clone ( ) ) ;
751+ result. insert ( adapter_name. clone ( ) , adapters. clone ( ) ) ;
751752 }
752753 }
753754
@@ -761,8 +762,8 @@ fn add_resources_to_lookup_table(adapted_resources: &BTreeMap<String, Vec<DscRes
761762 let mut lookup_table_changed = false ;
762763 for ( resource_name, res_vec) in adapted_resources {
763764 if let Some ( adapter_name) = & res_vec[ 0 ] . require_adapter {
764- let new_value = adapter_name. to_string ( ) ;
765- let oldvalue = lookup_table. insert ( resource_name. to_string ( ) . to_lowercase ( ) , new_value. clone ( ) ) ;
765+ let new_value = adapter_name. clone ( ) ;
766+ let oldvalue = lookup_table. insert ( resource_name. clone ( ) . to_lowercase ( ) , new_value. clone ( ) ) ;
766767 if !lookup_table_changed && ( oldvalue. is_none ( ) || oldvalue. is_some_and ( |val| val != new_value) ) {
767768 lookup_table_changed = true ;
768769 }
0 commit comments