mirror of
https://github.com/rust-lang/cargo
synced 2024-10-01 21:43:45 +00:00
auto merge of #83 : huonw/cargo/manifest-search, r=alexcrichton,alexcrichton
This commit is contained in:
commit
e8912bfc66
5
src/bin/cargo-build.rs
Normal file → Executable file
5
src/bin/cargo-build.rs
Normal file → Executable file
|
@ -16,7 +16,7 @@ use cargo::{execute_main_without_stdin};
|
||||||
use cargo::ops;
|
use cargo::ops;
|
||||||
use cargo::core::MultiShell;
|
use cargo::core::MultiShell;
|
||||||
use cargo::util::{CliResult, CliError};
|
use cargo::util::{CliResult, CliError};
|
||||||
use cargo::util::important_paths::find_project;
|
use cargo::util::important_paths::find_project_manifest;
|
||||||
|
|
||||||
#[deriving(PartialEq,Clone,Decodable,Encodable)]
|
#[deriving(PartialEq,Clone,Decodable,Encodable)]
|
||||||
pub struct Options {
|
pub struct Options {
|
||||||
|
@ -37,8 +37,7 @@ fn execute(options: Options, shell: &mut MultiShell) -> CliResult<Option<()>> {
|
||||||
|
|
||||||
let root = match options.manifest_path {
|
let root = match options.manifest_path {
|
||||||
Some(path) => Path::new(path),
|
Some(path) => Path::new(path),
|
||||||
None => try!(find_project(os::getcwd(), "Cargo.toml")
|
None => try!(find_project_manifest(&os::getcwd(), "Cargo.toml")
|
||||||
.map(|path| path.join("Cargo.toml"))
|
|
||||||
.map_err(|_| {
|
.map_err(|_| {
|
||||||
CliError::new("Could not find Cargo.toml in this \
|
CliError::new("Could not find Cargo.toml in this \
|
||||||
directory or any parent directory",
|
directory or any parent directory",
|
||||||
|
|
5
src/bin/cargo-test.rs
Normal file → Executable file
5
src/bin/cargo-test.rs
Normal file → Executable file
|
@ -16,7 +16,7 @@ use cargo::{execute_main_without_stdin};
|
||||||
use cargo::core::{MultiShell};
|
use cargo::core::{MultiShell};
|
||||||
use cargo::util;
|
use cargo::util;
|
||||||
use cargo::util::{CliResult, CliError};
|
use cargo::util::{CliResult, CliError};
|
||||||
use cargo::util::important_paths::find_project;
|
use cargo::util::important_paths::find_project_manifest;
|
||||||
|
|
||||||
#[deriving(PartialEq,Clone,Decodable)]
|
#[deriving(PartialEq,Clone,Decodable)]
|
||||||
struct Options {
|
struct Options {
|
||||||
|
@ -33,8 +33,7 @@ fn main() {
|
||||||
fn execute(options: Options, shell: &mut MultiShell) -> CliResult<Option<()>> {
|
fn execute(options: Options, shell: &mut MultiShell) -> CliResult<Option<()>> {
|
||||||
let root = match options.manifest_path {
|
let root = match options.manifest_path {
|
||||||
Some(path) => Path::new(path),
|
Some(path) => Path::new(path),
|
||||||
None => try!(find_project(os::getcwd(), "Cargo.toml")
|
None => try!(find_project_manifest(&os::getcwd(), "Cargo.toml")
|
||||||
.map(|path| path.join("Cargo.toml"))
|
|
||||||
.map_err(|_| {
|
.map_err(|_| {
|
||||||
CliError::new("Could not find Cargo.toml in this \
|
CliError::new("Could not find Cargo.toml in this \
|
||||||
directory or any parent directory",
|
directory or any parent directory",
|
||||||
|
|
2
src/bin/cargo.rs
Normal file → Executable file
2
src/bin/cargo.rs
Normal file → Executable file
|
@ -142,7 +142,7 @@ fn config_list(args: ConfigListFlags, _: &mut MultiShell) -> CliResult<Option<Co
|
||||||
}
|
}
|
||||||
|
|
||||||
fn locate_project(_: NoFlags, _: &mut MultiShell) -> CliResult<Option<ProjectLocation>> {
|
fn locate_project(_: NoFlags, _: &mut MultiShell) -> CliResult<Option<ProjectLocation>> {
|
||||||
let root = try!(find_project(os::getcwd(), "Cargo.toml").map_err(|e| {
|
let root = try!(find_project(&os::getcwd(), "Cargo.toml").map_err(|e| {
|
||||||
CliError::from_boxed(e, 1)
|
CliError::from_boxed(e, 1)
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use std::io::File;
|
use std::io::File;
|
||||||
use util;
|
use util;
|
||||||
use core::{Package,Manifest,SourceId};
|
use core::{Package,Manifest,SourceId};
|
||||||
use util::{CargoResult, human};
|
use util::{CargoResult, human, important_paths};
|
||||||
|
|
||||||
pub fn read_manifest(contents: &[u8], source_id: &SourceId)
|
pub fn read_manifest(contents: &[u8], source_id: &SourceId)
|
||||||
-> CargoResult<(Manifest, Vec<Path>)>
|
-> CargoResult<(Manifest, Vec<Path>)>
|
||||||
|
@ -24,7 +24,8 @@ pub fn read_package(path: &Path, source_id: &SourceId)
|
||||||
pub fn read_packages(path: &Path, source_id: &SourceId)
|
pub fn read_packages(path: &Path, source_id: &SourceId)
|
||||||
-> CargoResult<Vec<Package>>
|
-> CargoResult<Vec<Package>>
|
||||||
{
|
{
|
||||||
let (pkg, nested) = try!(read_package(&path.join("Cargo.toml"), source_id));
|
let manifest = try!(important_paths::find_project_manifest_exact(path, "Cargo.toml"));
|
||||||
|
let (pkg, nested) = try!(read_package(&manifest, source_id));
|
||||||
let mut ret = vec!(pkg);
|
let mut ret = vec!(pkg);
|
||||||
|
|
||||||
for p in nested.iter() {
|
for p in nested.iter() {
|
||||||
|
|
|
@ -1,15 +1,42 @@
|
||||||
use util::{CargoResult, human};
|
use util::{CargoResult, human};
|
||||||
|
|
||||||
pub fn find_project(pwd: Path, file: &str) -> CargoResult<Path> {
|
/// Iteratively search for `file` in `pwd` and its parents, returning
|
||||||
|
/// the path of the directory.
|
||||||
|
pub fn find_project(pwd: &Path, file: &str) -> CargoResult<Path> {
|
||||||
|
find_project_manifest(pwd, file)
|
||||||
|
.map(|mut p| {
|
||||||
|
// remove the file, leaving just the directory
|
||||||
|
p.pop();
|
||||||
|
p
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Iteratively search for `file` in `pwd` and its parents, returning
|
||||||
|
/// the path to the file.
|
||||||
|
pub fn find_project_manifest(pwd: &Path, file: &str) -> CargoResult<Path> {
|
||||||
let mut current = pwd.clone();
|
let mut current = pwd.clone();
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
if current.join(file.clone()).exists() {
|
let manifest = current.join(file);
|
||||||
return Ok(current)
|
if manifest.exists() {
|
||||||
|
return Ok(manifest)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !current.pop() { break; }
|
if !current.pop() { break; }
|
||||||
}
|
}
|
||||||
|
|
||||||
Err(human(format!("no manifest found in `{}`", pwd.display())))
|
Err(human(format!("Could not find `{}` in `{}` or any parent directory",
|
||||||
|
file, pwd.display())))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the path to the `file` in `pwd`, if it exists.
|
||||||
|
pub fn find_project_manifest_exact(pwd: &Path, file: &str) -> CargoResult<Path> {
|
||||||
|
let manifest = pwd.join(file);
|
||||||
|
|
||||||
|
if manifest.exists() {
|
||||||
|
Ok(manifest)
|
||||||
|
} else {
|
||||||
|
Err(human(format!("Could not find `{}` in `{}`",
|
||||||
|
file, pwd.display())))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -354,3 +354,26 @@ test!(nested_deps_recompile {
|
||||||
FRESH, bar.display(),
|
FRESH, bar.display(),
|
||||||
COMPILING, p.root().display())));
|
COMPILING, p.root().display())));
|
||||||
})
|
})
|
||||||
|
|
||||||
|
test!(error_message_for_missing_manifest {
|
||||||
|
let p = project("foo")
|
||||||
|
.file("Cargo.toml", r#"
|
||||||
|
[project]
|
||||||
|
|
||||||
|
name = "foo"
|
||||||
|
version = "0.5.0"
|
||||||
|
authors = ["wycats@example.com"]
|
||||||
|
|
||||||
|
[dependencies.bar]
|
||||||
|
|
||||||
|
path = "src/bar"
|
||||||
|
"#)
|
||||||
|
.file("src/bar/not-a-manifest", "");
|
||||||
|
|
||||||
|
assert_that(p.cargo_process("cargo-build"),
|
||||||
|
execs()
|
||||||
|
.with_status(101)
|
||||||
|
.with_stderr(format!("Could not find `Cargo.toml` in `{}`\n",
|
||||||
|
p.root().join_many(&["src", "bar"]).display())));
|
||||||
|
|
||||||
|
})
|
||||||
|
|
Loading…
Reference in a new issue