Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Detect incorrectly named cargo.toml #9607

Merged
merged 4 commits into from
Jun 22, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions src/cargo/ops/cargo_install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
15 changes: 12 additions & 3 deletions src/cargo/ops/cargo_read_manifest.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down
24 changes: 19 additions & 5 deletions src/cargo/util/important_paths.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,33 @@ use std::path::{Path, PathBuf};

/// Finds the root `Cargo.toml`.
pub fn find_root_manifest_for_wd(cwd: &Path) -> CargoResult<PathBuf> {
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.
Expand Down
18 changes: 18 additions & 0 deletions tests/testsuite/build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
37 changes: 37 additions & 0 deletions tests/testsuite/install.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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"))
Expand Down Expand Up @@ -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");
Expand Down