Skip to content

Commit 3962b74

Browse files
committed
Auto merge of #2993 - Turbo87:clap, r=jtgeibel
Use `clap` for CLI argument parsing This should make it easier to convert these binaries to clap subcommands in a follow-up PR. It also simplifies our argument parsing code and generates help messages and proper errors if the passed arguments don't match our expectations. r? `@jtgeibel`
2 parents 30bb5da + c1bc624 commit 3962b74

9 files changed

+246
-153
lines changed

Cargo.lock

Lines changed: 101 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ base64 = "0.13"
3434
cargo-registry-s3 = { path = "src/s3", version = "0.2.0" }
3535
chrono = { version = "0.4.0", features = ["serde"] }
3636
civet = "0.12.0-alpha.4"
37+
clap = "=3.0.0-beta.2"
3738
comrak = { version = "0.8", default-features = false }
3839

3940
conduit = "0.9.0-alpha.3"
@@ -50,7 +51,6 @@ ctrlc = { version = "3.0", features = ["termination"] }
5051
derive_deref = "1.1.1"
5152
diesel = { version = "1.4.0", features = ["postgres", "serde_json", "chrono", "r2d2"] }
5253
diesel_full_text_search = "1.0.0"
53-
docopt = "1.0"
5454
dotenv = "0.15"
5555
env_logger = "0.8"
5656
failure = "0.1.1"

src/bin/delete-crate.rs

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
// Purge all references to a crate from the database.
2-
//
3-
// Please be super sure you want to do this before running this.
4-
//
5-
// Usage:
6-
// cargo run --bin delete-crate crate-name
7-
81
#![warn(clippy::all, rust_2018_idioms)]
92

103
use cargo_registry::{db, models::Crate, schema::crates};
11-
use std::{
12-
env,
13-
io::{self, prelude::*},
14-
};
4+
use std::io::{self, prelude::*};
155

6+
use clap::Clap;
167
use diesel::prelude::*;
178

9+
#[derive(Clap, Debug)]
10+
#[clap(
11+
name = "delete-crate",
12+
about = "Purge all references to a crate from the database.\n\nPlease be super sure you want to do this before running this."
13+
)]
14+
struct Opts {
15+
/// Name of the crate
16+
crate_name: String,
17+
}
18+
1819
fn main() {
1920
let conn = db::connect_now().unwrap();
2021
conn.transaction::<_, diesel::result::Error, _>(|| {
@@ -25,18 +26,12 @@ fn main() {
2526
}
2627

2728
fn delete(conn: &PgConnection) {
28-
let name = match env::args().nth(1) {
29-
None => {
30-
println!("needs a crate-name argument");
31-
return;
32-
}
33-
Some(s) => s,
34-
};
35-
36-
let krate: Crate = Crate::by_name(&name).first(conn).unwrap();
29+
let opts: Opts = Opts::parse();
30+
31+
let krate: Crate = Crate::by_name(&opts.crate_name).first(conn).unwrap();
3732
print!(
3833
"Are you sure you want to delete {} ({}) [y/N]: ",
39-
name, krate.id
34+
opts.crate_name, krate.id
4035
);
4136
io::stdout().flush().unwrap();
4237
let mut line = String::new();

src/bin/delete-version.rs

Lines changed: 18 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
1-
// Purge all references to a crate's version from the database.
2-
//
3-
// Please be super sure you want to do this before running this.
4-
//
5-
// Usage:
6-
// cargo run --bin delete-version crate-name version-number
7-
81
#![warn(clippy::all, rust_2018_idioms)]
92

103
use cargo_registry::{
114
db,
125
models::{Crate, Version},
136
schema::versions,
147
};
15-
use std::{
16-
env,
17-
io::{self, prelude::*},
18-
};
8+
use std::io::{self, prelude::*};
199

10+
use clap::Clap;
2011
use diesel::prelude::*;
2112

13+
#[derive(Clap, Debug)]
14+
#[clap(
15+
name = "delete-version",
16+
about = "Purge all references to a crate's version from the database.\n\nPlease be super sure you want to do this before running this."
17+
)]
18+
struct Opts {
19+
/// Name of the crate
20+
crate_name: String,
21+
/// Version number that should be deleted
22+
version: String,
23+
}
24+
2225
fn main() {
2326
let conn = db::connect_now().unwrap();
2427
conn.transaction::<_, diesel::result::Error, _>(|| {
@@ -29,29 +32,16 @@ fn main() {
2932
}
3033

3134
fn delete(conn: &PgConnection) {
32-
let name = match env::args().nth(1) {
33-
None => {
34-
println!("needs a crate-name argument");
35-
return;
36-
}
37-
Some(s) => s,
38-
};
39-
let version = match env::args().nth(2) {
40-
None => {
41-
println!("needs a version argument");
42-
return;
43-
}
44-
Some(s) => s,
45-
};
35+
let opts: Opts = Opts::parse();
4636

47-
let krate: Crate = Crate::by_name(&name).first(conn).unwrap();
37+
let krate: Crate = Crate::by_name(&opts.crate_name).first(conn).unwrap();
4838
let v: Version = Version::belonging_to(&krate)
49-
.filter(versions::num.eq(&version))
39+
.filter(versions::num.eq(&opts.version))
5040
.first(conn)
5141
.unwrap();
5242
print!(
5343
"Are you sure you want to delete {}#{} ({}) [y/N]: ",
54-
name, version, v.id
44+
opts.crate_name, opts.version, v.id
5545
);
5646
io::stdout().flush().unwrap();
5747
let mut line = String::new();

src/bin/populate.rs

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
1-
// Populate a set of dummy download statistics for a specific version in the
2-
// database.
3-
//
4-
// Usage:
5-
// cargo run --bin populate version_id1 version_id2 ...
6-
71
#![warn(clippy::all, rust_2018_idioms)]
82

93
use cargo_registry::{db, schema::version_downloads};
10-
use std::env;
114

5+
use clap::Clap;
126
use diesel::prelude::*;
137
use rand::{thread_rng, Rng};
148

9+
#[derive(Clap, Debug)]
10+
#[clap(
11+
name = "populate",
12+
about = "Populate a set of dummy download statistics for a specific version in the database."
13+
)]
14+
struct Opts {
15+
#[clap(required = true)]
16+
version_ids: Vec<i32>,
17+
}
18+
1519
fn main() {
1620
let conn = db::connect_now().unwrap();
1721
conn.transaction(|| update(&conn)).unwrap();
@@ -20,10 +24,9 @@ fn main() {
2024
fn update(conn: &PgConnection) -> QueryResult<()> {
2125
use diesel::dsl::*;
2226

23-
let ids = env::args()
24-
.skip(1)
25-
.filter_map(|arg| arg.parse::<i32>().ok());
26-
for id in ids {
27+
let opts: Opts = Opts::parse();
28+
29+
for id in opts.version_ids {
2730
let mut rng = thread_rng();
2831
let mut dls = rng.gen_range(5_000i32, 10_000);
2932

0 commit comments

Comments
 (0)