diff --git a/src/cargo/ops/cargo_install.rs b/src/cargo/ops/cargo_install.rs index 10dd8e091c6..8965b89480b 100644 --- a/src/cargo/ops/cargo_install.rs +++ b/src/cargo/ops/cargo_install.rs @@ -212,11 +212,19 @@ fn install_one( src.path().display() ); } else { - bail!( - "`{}` does not contain a Cargo.toml file. \ + if src.path().join("cargo.toml").exists() { + bail!( + "`{}` does not contain a Cargo.toml file, but found cargo.toml please try to rename it to Cargo.toml. \ --path must point to a directory containing a Cargo.toml file.", - src.path().display() - ) + src.path().display() + ) + } else { + bail!( + "`{}` does not contain a Cargo.toml file. \ + --path must point to a directory containing a Cargo.toml file.", + src.path().display() + ) + } } } select_pkg( diff --git a/src/cargo/ops/cargo_read_manifest.rs b/src/cargo/ops/cargo_read_manifest.rs index 732ef39d613..d55208b88f1 100644 --- a/src/cargo/ops/cargo_read_manifest.rs +++ b/src/cargo/ops/cargo_read_manifest.rs @@ -88,10 +88,19 @@ pub fn read_packages( if all_packages.is_empty() { match errors.pop() { Some(err) => Err(err), - None => Err(anyhow::format_err!( - "Could not find Cargo.toml in `{}`", + None => { + if find_project_manifest_exact(path, "cargo.toml").is_ok() { + Err(anyhow::format_err!( + "Could not find Cargo.toml in `{}`, but found cargo.toml please try to rename it to Cargo.toml", path.display() - )), + )) + } else { + Err(anyhow::format_err!( + "Could not find Cargo.toml in `{}`", + path.display() + )) + } + } } } else { Ok(all_packages.into_iter().map(|(_, v)| v).collect()) diff --git a/src/cargo/util/important_paths.rs b/src/cargo/util/important_paths.rs index 4d34519c2ba..224c4ab8b86 100644 --- a/src/cargo/util/important_paths.rs +++ b/src/cargo/util/important_paths.rs @@ -4,19 +4,33 @@ use std::path::{Path, PathBuf}; /// Finds the root `Cargo.toml`. pub fn find_root_manifest_for_wd(cwd: &Path) -> CargoResult { - let file = "Cargo.toml"; + let valid_cargo_toml_file_name = "Cargo.toml"; + let invalid_cargo_toml_file_name = "cargo.toml"; + let mut invalid_cargo_toml_path_exists = false; + for current in paths::ancestors(cwd, None) { - let manifest = current.join(file); + let manifest = current.join(valid_cargo_toml_file_name); if manifest.exists() { return Ok(manifest); } + if current.join(invalid_cargo_toml_file_name).exists() { + invalid_cargo_toml_path_exists = true; + } } - anyhow::bail!( - "could not find `{}` in `{}` or any parent directory", - file, + if invalid_cargo_toml_path_exists { + anyhow::bail!( + "could not find `{}` in `{}` or any parent directory, but found cargo.toml please try to rename it to Cargo.toml", + valid_cargo_toml_file_name, cwd.display() ) + } else { + anyhow::bail!( + "could not find `{}` in `{}` or any parent directory", + valid_cargo_toml_file_name, + cwd.display() + ) + } } /// Returns the path to the `file` in `pwd`, if it exists. diff --git a/tests/testsuite/build.rs b/tests/testsuite/build.rs index fc11e666df0..0948ac1dad7 100644 --- a/tests/testsuite/build.rs +++ b/tests/testsuite/build.rs @@ -561,6 +561,24 @@ fn cargo_compile_without_manifest() { .run(); } +#[cargo_test] +#[cfg(target_os = "linux")] +fn cargo_compile_with_lowercase_cargo_toml() { + let p = project() + .no_manifest() + .file("cargo.toml", &basic_manifest("foo", "0.1.0")) + .file("src/lib.rs", &main_file(r#""i am foo""#, &[])) + .build(); + + p.cargo("build") + .with_status(101) + .with_stderr( + "[ERROR] could not find `Cargo.toml` in `[..]` or any parent directory, \ + but found cargo.toml please try to rename it to Cargo.toml", + ) + .run(); +} + #[cargo_test] fn cargo_compile_with_invalid_code() { let p = project() diff --git a/tests/testsuite/install.rs b/tests/testsuite/install.rs index c2d3eef6fe4..dfb5f96f19a 100644 --- a/tests/testsuite/install.rs +++ b/tests/testsuite/install.rs @@ -399,6 +399,23 @@ fn install_target_dir() { assert!(path.exists()); } +#[cargo_test] +#[cfg(target_os = "linux")] +fn install_path_with_lowercase_cargo_toml() { + let toml = paths::root().join("cargo.toml"); + fs::write(toml, "").unwrap(); + + cargo_process("install --path .") + .with_status(101) + .with_stderr( + "\ +[ERROR] `[CWD]` does not contain a Cargo.toml file, \ +but found cargo.toml please try to rename it to Cargo.toml. --path must point to a directory containing a Cargo.toml file. +", + ) + .run(); +} + #[cargo_test] fn multiple_crates_error() { let p = git::repo(&paths::root().join("foo")) @@ -760,6 +777,26 @@ fn git_repo() { assert_has_installed_exe(cargo_home(), "foo"); } +#[cargo_test] +#[cfg(target_os = "linux")] +fn git_repo_with_lowercase_cargo_toml() { + let p = git::repo(&paths::root().join("foo")) + .file("cargo.toml", &basic_manifest("foo", "0.1.0")) + .file("src/main.rs", "fn main() {}") + .build(); + + cargo_process("install --git") + .arg(p.url().to_string()) + .with_status(101) + .with_stderr( + "\ +[UPDATING] git repository [..] +[ERROR] Could not find Cargo.toml in `[..]`, but found cargo.toml please try to rename it to Cargo.toml +", + ) + .run(); +} + #[cargo_test] fn list() { pkg("foo", "0.0.1");