@@ -500,6 +500,157 @@ fn install_location_precedence() {
500500 assert_has_installed_exe ( & t4, "foo" ) ;
501501}
502502
503+ #[ cargo_test]
504+ fn relative_install_location_without_trailing_slash ( ) {
505+ let p = project ( ) . file ( "src/main.rs" , "fn main() {}" ) . build ( ) ;
506+
507+ let root = paths:: root ( ) ;
508+ let root_t1 = root. join ( "t1" ) ;
509+ let p_path = p. root ( ) . to_path_buf ( ) ;
510+ let project_t1 = p_path. join ( "t1" ) ;
511+
512+ fs:: create_dir ( root. join ( ".cargo" ) ) . unwrap ( ) ;
513+ fs:: write (
514+ root. join ( ".cargo/config.toml" ) ,
515+ r#"
516+ [install]
517+ root = "t1"
518+ "# ,
519+ )
520+ . unwrap ( ) ;
521+
522+ let mut cmd = cargo_process ( "install --path ." ) ;
523+ cmd. cwd ( p. root ( ) ) ;
524+ cmd. with_stderr_data ( str![ [ r#"
525+ [WARNING] the `install.root` value `t1` defined in [ROOT]/.cargo/config.toml without a trailing slash is deprecated
526+ |
527+ = [NOTE] a future version of Cargo will treat it as relative to the configuration directory
528+ = [HELP] add a trailing slash (`t1/`) to adopt the correct behavior and silence this warning
529+ = [NOTE] see more at https://doc.rust-lang.org/cargo/reference/config.html#config-relative-paths
530+ [INSTALLING] foo v0.0.1 ([ROOT]/foo)
531+ [COMPILING] foo v0.0.1 ([ROOT]/foo)
532+ [FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
533+ [INSTALLING] [ROOT]/foo/t1/bin/foo[EXE]
534+ [INSTALLED] package `foo v0.0.1 ([ROOT]/foo)` (executable `foo[EXE]`)
535+ [WARNING] be sure to add `[ROOT]/foo/t1/bin` to your PATH to be able to run the installed binaries
536+
537+ "# ] ] )
538+ . run ( ) ;
539+
540+ // NOTE: the install location is relative to the CWD, not the config file
541+ assert_has_not_installed_exe ( & root_t1, "foo" ) ;
542+ assert_has_installed_exe ( & project_t1, "foo" ) ;
543+ }
544+
545+ #[ cargo_test]
546+ fn cli_root_argument_without_deprecation_warning ( ) {
547+ // Verify that using the --root CLI argument does not produce the deprecation warning.
548+ let p = project ( ) . file ( "src/main.rs" , "fn main() {}" ) . build ( ) ;
549+
550+ let root = paths:: root ( ) ;
551+ let root_t1 = root. join ( "t1" ) ;
552+ let p_path = p. root ( ) . to_path_buf ( ) ;
553+ let project_t1 = p_path. join ( "t1" ) ;
554+
555+ cargo_process ( "install --path . --root" )
556+ . arg ( "t1" )
557+ . cwd ( p. root ( ) )
558+ . with_stderr_data ( str![ [ r#"
559+ [INSTALLING] foo v0.0.1 ([ROOT]/foo)
560+ [COMPILING] foo v0.0.1 ([ROOT]/foo)
561+ [FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
562+ [INSTALLING] [ROOT]/foo/t1/bin/foo[EXE]
563+ [INSTALLED] package `foo v0.0.1 ([ROOT]/foo)` (executable `foo[EXE]`)
564+ [WARNING] be sure to add `[ROOT]/foo/t1/bin` to your PATH to be able to run the installed binaries
565+
566+ "# ] ] )
567+ . run ( ) ;
568+ assert_has_not_installed_exe ( & root_t1, "foo" ) ;
569+ assert_has_installed_exe ( & project_t1, "foo" ) ;
570+ }
571+
572+ #[ cargo_test]
573+ fn relative_install_location_with_trailing_slash ( ) {
574+ let p = project ( ) . file ( "src/main.rs" , "fn main() {}" ) . build ( ) ;
575+
576+ let root = paths:: root ( ) ;
577+ let root_t1 = root. join ( "t1" ) ;
578+ let p_path = p. root ( ) . to_path_buf ( ) ;
579+ let project_t1 = p_path. join ( "t1" ) ;
580+
581+ fs:: create_dir ( root. join ( ".cargo" ) ) . unwrap ( ) ;
582+ fs:: write (
583+ root. join ( ".cargo/config.toml" ) ,
584+ r#"
585+ [install]
586+ root = "t1/"
587+ "# ,
588+ )
589+ . unwrap ( ) ;
590+
591+ let mut cmd = cargo_process ( "install --path ." ) ;
592+ cmd. cwd ( p. root ( ) ) ;
593+ cmd. with_stderr_data ( str![ [ r#"
594+ [INSTALLING] foo v0.0.1 ([ROOT]/foo)
595+ [COMPILING] foo v0.0.1 ([ROOT]/foo)
596+ [FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
597+ [INSTALLING] [ROOT]/t1/bin/foo[EXE]
598+ [INSTALLED] package `foo v0.0.1 ([ROOT]/foo)` (executable `foo[EXE]`)
599+ [WARNING] be sure to add `[ROOT]/t1/bin` to your PATH to be able to run the installed binaries
600+
601+ "# ] ] )
602+ . run ( ) ;
603+
604+ assert_has_installed_exe ( & root_t1, "foo" ) ;
605+ assert_has_not_installed_exe ( & project_t1, "foo" ) ;
606+ }
607+
608+ #[ cargo_test]
609+ fn relative_install_location_with_path_set ( ) {
610+ // Test that when the absolute install path is in PATH, no warning is shown
611+ let p = project ( ) . file ( "src/main.rs" , "fn main() {}" ) . build ( ) ;
612+
613+ let root = paths:: root ( ) ;
614+ let p_path = p. root ( ) . to_path_buf ( ) ;
615+ let project_t1 = p_path. join ( "t1" ) ;
616+
617+ fs:: create_dir ( root. join ( ".cargo" ) ) . unwrap ( ) ;
618+ fs:: write (
619+ root. join ( ".cargo/config.toml" ) ,
620+ r#"
621+ [install]
622+ root = "t1"
623+ "# ,
624+ )
625+ . unwrap ( ) ;
626+
627+ // Add the absolute path to PATH environment variable
628+ let install_bin_path = project_t1. join ( "bin" ) ;
629+ let mut path = path ( ) ;
630+ path. push ( install_bin_path) ;
631+ let new_path = env:: join_paths ( path) . unwrap ( ) ;
632+
633+ let mut cmd = cargo_process ( "install --path ." ) ;
634+ cmd. cwd ( p. root ( ) ) ;
635+ cmd. env ( "PATH" , new_path) ;
636+ cmd. with_stderr_data ( str![ [ r#"
637+ [WARNING] the `install.root` value `t1` defined in [ROOT]/.cargo/config.toml without a trailing slash is deprecated
638+ |
639+ = [NOTE] a future version of Cargo will treat it as relative to the configuration directory
640+ = [HELP] add a trailing slash (`t1/`) to adopt the correct behavior and silence this warning
641+ = [NOTE] see more at https://doc.rust-lang.org/cargo/reference/config.html#config-relative-paths
642+ [INSTALLING] foo v0.0.1 ([ROOT]/foo)
643+ [COMPILING] foo v0.0.1 ([ROOT]/foo)
644+ [FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
645+ [INSTALLING] [ROOT]/foo/t1/bin/foo[EXE]
646+ [INSTALLED] package `foo v0.0.1 ([ROOT]/foo)` (executable `foo[EXE]`)
647+
648+ "# ] ] )
649+ . run ( ) ;
650+
651+ assert_has_installed_exe ( & project_t1, "foo" ) ;
652+ }
653+
503654#[ cargo_test]
504655fn install_path ( ) {
505656 let p = project ( ) . file ( "src/main.rs" , "fn main() {}" ) . build ( ) ;
0 commit comments