@@ -19,18 +19,17 @@ use tempfile::Builder as TempFileBuilder;
19
19
/// error message.
20
20
pub fn join_paths < T : AsRef < OsStr > > ( paths : & [ T ] , env : & str ) -> Result < OsString > {
21
21
env:: join_paths ( paths. iter ( ) ) . with_context ( || {
22
- let paths = paths. iter ( )
23
- . map ( |s| s. as_ref ( ) . to_string_lossy ( ) )
24
- . map ( |s| format ! ( " \" {s}\" " ) )
25
- . collect :: < Vec < String > > ( )
26
- . join ( ",\n " ) ;
27
-
28
- format ! (
29
- "failed to join paths from `${env}` together\n \
30
- If you set `${env}` manually, check if it contains an unterminated quote character \
31
- or path separators (usually `:` or `;`). Please avoid using them. \
32
- Otherwise, check if any of paths listed below contain one of those characters:\n {paths}"
33
- )
22
+ let mut message = format ! (
23
+ "failed to join paths from `${env}` together\n \n \
24
+ Check if any of path segments listed below contain an \
25
+ unterminated quote character or path separator:"
26
+ ) ;
27
+ for path in paths {
28
+ use std:: fmt:: Write ;
29
+ write ! ( & mut message, "\n {:?}" , Path :: new( path) ) . unwrap ( ) ;
30
+ }
31
+
32
+ message
34
33
} )
35
34
}
36
35
@@ -745,3 +744,44 @@ fn exclude_from_time_machine(path: &Path) {
745
744
// Errors are ignored, since it's an optional feature and failure
746
745
// doesn't prevent Cargo from working
747
746
}
747
+
748
+ #[ cfg( test) ]
749
+ mod tests {
750
+ use super :: join_paths;
751
+
752
+ #[ test]
753
+ fn join_paths_lists_paths_on_error ( ) {
754
+ let valid_paths = vec ! [ "/testing/one" , "/testing/two" ] ;
755
+ // does not fail on valid input
756
+ let _joined = join_paths ( & valid_paths, "TESTING1" ) . unwrap ( ) ;
757
+
758
+ #[ cfg( unix) ]
759
+ {
760
+ let invalid_paths = vec ! [ "/testing/one" , "/testing/t:wo/three" ] ;
761
+ let err = join_paths ( & invalid_paths, "TESTING2" ) . unwrap_err ( ) ;
762
+ assert_eq ! (
763
+ err. to_string( ) ,
764
+ "failed to join paths from `$TESTING2` together\n \n \
765
+ Check if any of path segments listed below contain an \
766
+ unterminated quote character or path separator:\
767
+ \n \" /testing/one\" \
768
+ \n \" /testing/t:wo/three\" \
769
+ "
770
+ ) ;
771
+ }
772
+ #[ cfg( windows) ]
773
+ {
774
+ let invalid_paths = vec ! [ "/testing/one" , "/testing/t\" wo/three" ] ;
775
+ let err = join_paths ( & invalid_paths, "TESTING2" ) . unwrap_err ( ) ;
776
+ assert_eq ! (
777
+ err. to_string( ) ,
778
+ "failed to join paths from `$TESTING2` together\n \n \
779
+ Check if any of path segments listed below contain an \
780
+ unterminated quote character or path separator:\
781
+ \n \" /testing/one\" \
782
+ \n \" /testing/t\\ \" wo/three\" \
783
+ "
784
+ ) ;
785
+ }
786
+ }
787
+ }
0 commit comments