Skip to content

Commit

Permalink
Auto merge of #5029 - matklad:new-defaults-to-bin, r=withoutboats
Browse files Browse the repository at this point in the history
New defaults to bin

So this switches `cargo new` default from `--lib` to `--bin`, as discussed on IRC.

The first two commits are just refactorings, and the last one actually flips the switch. Surprisingly enough, no tests need to be modified it seems!

r? @withoutboats
  • Loading branch information
bors committed Feb 13, 2018
2 parents 2d42bcf + 9cb10e6 commit 5891aec
Show file tree
Hide file tree
Showing 5 changed files with 56 additions and 57 deletions.
17 changes: 7 additions & 10 deletions src/bin/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ Options:
control system (git, hg, pijul, or fossil) or do not
initialize any version control at all (none), overriding
a global configuration.
--bin Use a binary (application) template
--lib Use a library template [default]
--bin Use a binary (application) template [default]
--lib Use a library template
--name NAME Set the resulting package name
-v, --verbose ... Use verbose output (-vv very verbose/build.rs output)
-q, --quiet No output printed to stdout
Expand All @@ -56,17 +56,14 @@ pub fn execute(options: Options, config: &mut Config) -> CliResult {

let path = &arg_path.unwrap_or_else(|| String::from("."));
let opts = ops::NewOptions::new(flag_vcs,
flag_bin,
flag_lib,
path,
flag_name.as_ref().map(|s| s.as_ref()));
flag_bin,
flag_lib,
path,
flag_name.as_ref().map(|s| s.as_ref()))?;

let opts_lib = opts.lib;
ops::init(&opts, config)?;

config.shell().status("Created", format!("{} project",
if opts_lib { "library" }
else {"binary (application)"}))?;
config.shell().status("Created", format!("{} project", opts.kind))?;

Ok(())
}
Expand Down
12 changes: 4 additions & 8 deletions src/bin/new.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,8 @@ Options:
control system (git, hg, pijul, or fossil) or do not
initialize any version control at all (none), overriding
a global configuration.
--bin Use a binary (application) template
--lib Use a library template [default]
--bin Use a binary (application) template [default]
--lib Use a library template
--name NAME Set the resulting package name, defaults to the value of <path>
-v, --verbose ... Use verbose output (-vv very verbose/build.rs output)
-q, --quiet No output printed to stdout
Expand All @@ -58,15 +58,11 @@ pub fn execute(options: Options, config: &mut Config) -> CliResult {
flag_bin,
flag_lib,
&arg_path,
flag_name.as_ref().map(|s| s.as_ref()));
flag_name.as_ref().map(|s| s.as_ref()))?;

let opts_lib = opts.lib;
ops::new(&opts, config)?;

config.shell().status("Created", format!("{} `{}` project",
if opts_lib { "library" }
else {"binary (application)"},
arg_path))?;
config.shell().status("Created", format!("{} `{}` project", opts.kind, arg_path))?;

Ok(())
}
Expand Down
76 changes: 42 additions & 34 deletions src/cargo/ops/cargo_new.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use std::collections::BTreeMap;
use std::env;
use std::fs;
use std::fmt;
use std::path::Path;

use serde::{Deserialize, Deserializer};
Expand All @@ -23,12 +24,32 @@ pub enum VersionControl { Git, Hg, Pijul, Fossil, NoVcs }
#[derive(Debug)]
pub struct NewOptions<'a> {
pub version_control: Option<VersionControl>,
pub bin: bool,
pub lib: bool,
pub kind: NewProjectKind,
pub path: &'a str,
pub name: Option<&'a str>,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum NewProjectKind {
Bin,
Lib,
}

impl NewProjectKind {
fn is_bin(&self) -> bool {
*self == NewProjectKind::Bin
}
}

impl fmt::Display for NewProjectKind {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
NewProjectKind::Bin => "binary (application)",
NewProjectKind::Lib => "library",
}.fmt(f)
}
}

struct SourceFileInformation {
relative_path: String,
target_name: String,
Expand Down Expand Up @@ -62,26 +83,21 @@ impl<'de> Deserialize<'de> for VersionControl {

impl<'a> NewOptions<'a> {
pub fn new(version_control: Option<VersionControl>,
bin: bool,
lib: bool,
path: &'a str,
name: Option<&'a str>) -> NewOptions<'a> {

// default to lib
let is_lib = if !bin {
true
}
else {
lib
bin: bool,
lib: bool,
path: &'a str,
name: Option<&'a str>) -> CargoResult<NewOptions<'a>> {

let kind = match (bin, lib) {
(true, true) => bail!("can't specify both lib and binary outputs"),
(true, false) => NewProjectKind::Bin,
(false, true) => NewProjectKind::Lib,
// default to bin
(false, false) => NewProjectKind::Bin,
};

NewOptions {
version_control: version_control,
bin: bin,
lib: is_lib,
path: path,
name: name,
}
let opts = NewOptions { version_control, kind, path, name };
Ok(opts)
}
}

Expand Down Expand Up @@ -127,7 +143,7 @@ fn check_name(name: &str, opts: &NewOptions) -> CargoResult<()> {
"super", "test", "trait", "true", "type", "typeof",
"unsafe", "unsized", "use", "virtual", "where",
"while", "yield"];
if blacklist.contains(&name) || (opts.bin && is_bad_artifact_name(name)) {
if blacklist.contains(&name) || (opts.kind.is_bin() && is_bad_artifact_name(name)) {
bail!("The name `{}` cannot be used as a crate name{}",
name,
name_help)
Expand Down Expand Up @@ -269,19 +285,15 @@ pub fn new(opts: &NewOptions, config: &Config) -> CargoResult<()> {
)
}

if opts.lib && opts.bin {
bail!("can't specify both lib and binary outputs")
}

let name = get_name(&path, opts)?;
check_name(name, opts)?;

let mkopts = MkOptions {
version_control: opts.version_control,
path: &path,
name: name,
source_files: vec![plan_new_source_file(opts.bin, name.to_string())],
bin: opts.bin,
source_files: vec![plan_new_source_file(opts.kind.is_bin(), name.to_string())],
bin: opts.kind.is_bin(),
};

mk(config, &mkopts).chain_err(|| {
Expand All @@ -299,10 +311,6 @@ pub fn init(opts: &NewOptions, config: &Config) -> CargoResult<()> {
bail!("`cargo init` cannot be run on existing Cargo projects")
}

if opts.lib && opts.bin {
bail!("can't specify both lib and binary outputs");
}

let name = get_name(&path, opts)?;
check_name(name, opts)?;

Expand All @@ -311,7 +319,7 @@ pub fn init(opts: &NewOptions, config: &Config) -> CargoResult<()> {
detect_source_paths_and_types(&path, name, &mut src_paths_types)?;

if src_paths_types.is_empty() {
src_paths_types.push(plan_new_source_file(opts.bin, name.to_string()));
src_paths_types.push(plan_new_source_file(opts.kind.is_bin(), name.to_string()));
} else {
// --bin option may be ignored if lib.rs or src/lib.rs present
// Maybe when doing `cargo init --bin` inside a library project stub,
Expand Down Expand Up @@ -353,9 +361,9 @@ pub fn init(opts: &NewOptions, config: &Config) -> CargoResult<()> {
}

let mkopts = MkOptions {
version_control: version_control,
version_control,
path: &path,
name: name,
name,
bin: src_paths_types.iter().any(|x|x.bin),
source_files: src_paths_types,
};
Expand Down
2 changes: 1 addition & 1 deletion src/doc/src/getting-started/first-steps.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ $ cargo new hello_world --bin
```

We’re passing `--bin` because we’re making a binary program: if we
were making a library, we’d leave it off.
were making a library, we’d pass `--lib`.

Let’s check out what Cargo has generated for us:

Expand Down
6 changes: 2 additions & 4 deletions src/doc/src/guide/creating-a-new-project.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ $ cargo new hello_world --bin
```

We’re passing `--bin` because we’re making a binary program: if we
were making a library, we’d leave it off. This also initializes a new `git`
were making a library, we’d pass `--lib`. This also initializes a new `git`
repository by default. If you don't want it to do that, pass `--vcs none`.

Let’s check out what Cargo has generated for us:
Expand All @@ -23,9 +23,7 @@ $ tree .
1 directory, 2 files
```

If we had just used `cargo new hello_world` without the `--bin` flag, then
we would have a `lib.rs` instead of a `main.rs`. For now, however, this is all
we need to get started. First, let’s check out `Cargo.toml`:
Let’s take a closer look at `Cargo.toml`:

```toml
[package]
Expand Down

0 comments on commit 5891aec

Please sign in to comment.