Skip to content

Commit 01cdee4

Browse files
committed
Auto merge of #3011 - Turbo87:crates-admin, r=jtgeibel
Implement `crates-admin` binary This PR resolves #1504 by adding a new `crates-admin` binary, that combines a lot of the previously separate binaries as subcommands. I would recommend to review commit-by-commit :) r? `@jtgeibel`
2 parents a66f6e9 + 9aa026c commit 01cdee4

14 files changed

+95
-78
lines changed

script/ci/prune-cache.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ du -hs target/debug
1212

1313
crate_name="cargo-registry"
1414
test_name="all"
15-
bin_names="background-worker delete-crate delete-version enqueue-job monitor populate render-readmes server test-pagerduty transfer-crates verify-token"
15+
bin_names="background-worker crates-admin enqueue-job monitor server"
1616

1717
normalized_crate_name=${crate_name//-/_}
1818
rm -vf target/debug/$normalized_crate_name-*

src/bin/delete-crate.rs renamed to src/admin/delete_crate.rs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,29 @@
1-
#![warn(clippy::all, rust_2018_idioms)]
2-
3-
use cargo_registry::{db, models::Crate, schema::crates};
1+
use crate::{admin::dialoguer, db, models::Crate, schema::crates};
42

53
use clap::Clap;
64
use diesel::prelude::*;
75

8-
mod dialoguer;
9-
106
#[derive(Clap, Debug)]
117
#[clap(
128
name = "delete-crate",
13-
about = "Purge all references to a crate from the database.\n\nPlease be super sure you want to do this before running this."
9+
about = "Purge all references to a crate from the database.",
10+
after_help = "Please be super sure you want to do this before running this!"
1411
)]
15-
struct Opts {
12+
pub struct Opts {
1613
/// Name of the crate
1714
crate_name: String,
1815
}
1916

20-
fn main() {
17+
pub fn run(opts: Opts) {
2118
let conn = db::connect_now().unwrap();
2219
conn.transaction::<_, diesel::result::Error, _>(|| {
23-
delete(&conn);
20+
delete(opts, &conn);
2421
Ok(())
2522
})
2623
.unwrap()
2724
}
2825

29-
fn delete(conn: &PgConnection) {
30-
let opts: Opts = Opts::parse();
31-
26+
fn delete(opts: Opts, conn: &PgConnection) {
3227
let krate: Crate = Crate::by_name(&opts.crate_name).first(conn).unwrap();
3328

3429
let prompt = format!(

src/bin/delete-version.rs renamed to src/admin/delete_version.rs

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
#![warn(clippy::all, rust_2018_idioms)]
2-
3-
use cargo_registry::{
1+
use crate::{
2+
admin::dialoguer,
43
db,
54
models::{Crate, Version},
65
schema::versions,
@@ -9,32 +8,29 @@ use cargo_registry::{
98
use clap::Clap;
109
use diesel::prelude::*;
1110

12-
mod dialoguer;
13-
1411
#[derive(Clap, Debug)]
1512
#[clap(
1613
name = "delete-version",
17-
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."
14+
about = "Purge all references to a crate's version from the database.",
15+
after_help = "Please be super sure you want to do this before running this!"
1816
)]
19-
struct Opts {
17+
pub struct Opts {
2018
/// Name of the crate
2119
crate_name: String,
2220
/// Version number that should be deleted
2321
version: String,
2422
}
2523

26-
fn main() {
24+
pub fn run(opts: Opts) {
2725
let conn = db::connect_now().unwrap();
2826
conn.transaction::<_, diesel::result::Error, _>(|| {
29-
delete(&conn);
27+
delete(opts, &conn);
3028
Ok(())
3129
})
3230
.unwrap()
3331
}
3432

35-
fn delete(conn: &PgConnection) {
36-
let opts: Opts = Opts::parse();
37-
33+
fn delete(opts: Opts, conn: &PgConnection) {
3834
let krate: Crate = Crate::by_name(&opts.crate_name).first(conn).unwrap();
3935
let v: Version = Version::belonging_to(&krate)
4036
.filter(versions::num.eq(&opts.version))

src/bin/dialoguer/mod.rs renamed to src/admin/dialoguer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ pub fn confirm(msg: &str) -> bool {
1010
}
1111

1212
#[derive(Debug, Copy, Clone)]
13-
pub struct CustomTheme;
13+
struct CustomTheme;
1414

1515
impl Theme for CustomTheme {
1616
fn format_confirm_prompt(

src/admin/mod.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
pub mod delete_crate;
2+
pub mod delete_version;
3+
pub mod dialoguer;
4+
pub mod on_call;
5+
pub mod populate;
6+
pub mod render_readmes;
7+
pub mod test_pagerduty;
8+
pub mod transfer_crates;
9+
pub mod verify_token;
File renamed without changes.

src/bin/populate.rs renamed to src/admin/populate.rs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
#![warn(clippy::all, rust_2018_idioms)]
2-
3-
use cargo_registry::{db, schema::version_downloads};
1+
use crate::{db, schema::version_downloads};
42

53
use clap::Clap;
64
use diesel::prelude::*;
@@ -11,21 +9,19 @@ use rand::{thread_rng, Rng};
119
name = "populate",
1210
about = "Populate a set of dummy download statistics for a specific version in the database."
1311
)]
14-
struct Opts {
12+
pub struct Opts {
1513
#[clap(required = true)]
1614
version_ids: Vec<i32>,
1715
}
1816

19-
fn main() {
17+
pub fn run(opts: Opts) {
2018
let conn = db::connect_now().unwrap();
21-
conn.transaction(|| update(&conn)).unwrap();
19+
conn.transaction(|| update(opts, &conn)).unwrap();
2220
}
2321

24-
fn update(conn: &PgConnection) -> QueryResult<()> {
22+
fn update(opts: Opts, conn: &PgConnection) -> QueryResult<()> {
2523
use diesel::dsl::*;
2624

27-
let opts: Opts = Opts::parse();
28-
2925
for id in opts.version_ids {
3026
let mut rng = thread_rng();
3127
let mut dls = rng.gen_range(5_000i32, 10_000);

src/bin/render-readmes.rs renamed to src/admin/render_readmes.rs

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
#![warn(clippy::all, rust_2018_idioms)]
2-
3-
#[macro_use]
4-
extern crate serde;
5-
6-
use cargo_registry::{
1+
use crate::{
72
db,
83
models::Version,
94
render::readme_to_html,
@@ -25,11 +20,10 @@ const CACHE_CONTROL_README: &str = "public,max-age=604800";
2520
#[clap(
2621
name = "render-readmes",
2722
about = "Iterates over every crate versions ever uploaded and (re-)renders their \
28-
readme using the readme renderer from the cargo_registry crate.\n\
29-
\n\
30-
Warning: this can take a lot of time."
23+
readme using the readme renderer from the cargo_registry crate.",
24+
after_help = "Warning: this can take a lot of time."
3125
)]
32-
struct Opts {
26+
pub struct Opts {
3327
/// How many versions should be queried and processed at a time.
3428
#[clap(long, default_value = "25")]
3529
page_size: usize,
@@ -43,9 +37,7 @@ struct Opts {
4337
crate_name: Option<String>,
4438
}
4539

46-
fn main() {
47-
let opts: Opts = Opts::parse();
48-
40+
pub fn run(opts: Opts) {
4941
let config = Config::default();
5042
let conn = db::connect_now().unwrap();
5143

src/bin/test-pagerduty.rs renamed to src/admin/test_pagerduty.rs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
1-
#![warn(clippy::all, rust_2018_idioms)]
2-
3-
mod on_call;
4-
51
use anyhow::Result;
62
use clap::Clap;
73
use failure::_core::str::FromStr;
84

9-
#[derive(Debug)]
10-
enum EventType {
5+
use crate::admin::on_call;
6+
7+
#[derive(Debug, Copy, Clone)]
8+
pub enum EventType {
119
Trigger,
1210
Acknowledge,
1311
Resolve,
@@ -28,15 +26,13 @@ impl FromStr for EventType {
2826

2927
#[derive(Clap, Debug)]
3028
#[clap(name = "test-pagerduty", about = "Send a test event to pagerduty")]
31-
struct Opts {
29+
pub struct Opts {
3230
#[clap(possible_values = &["trigger", "acknowledge", "resolve"])]
3331
event_type: EventType,
3432
description: Option<String>,
3533
}
3634

37-
fn main() -> Result<()> {
38-
let opts: Opts = Opts::parse();
39-
35+
pub fn run(opts: Opts) -> Result<()> {
4036
let event = match opts.event_type {
4137
EventType::Trigger => on_call::Event::Trigger {
4238
incident_key: Some("test".into()),

src/bin/transfer-crates.rs renamed to src/admin/transfer_crates.rs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
#![warn(clippy::all, rust_2018_idioms)]
2-
3-
use cargo_registry::{
1+
use crate::{
2+
admin::dialoguer,
43
db,
54
models::{Crate, OwnerKind, User},
65
schema::{crate_owners, crates, users},
@@ -10,32 +9,28 @@ use std::process::exit;
109
use clap::Clap;
1110
use diesel::prelude::*;
1211

13-
mod dialoguer;
14-
1512
#[derive(Clap, Debug)]
1613
#[clap(
1714
name = "transfer-crates",
1815
about = "Transfer all crates from one user to another."
1916
)]
20-
struct Opts {
17+
pub struct Opts {
2118
/// GitHub login of the "from" user
2219
from_user: String,
2320
/// GitHub login of the "to" user
2421
to_user: String,
2522
}
2623

27-
fn main() {
24+
pub fn run(opts: Opts) {
2825
let conn = db::connect_now().unwrap();
2926
conn.transaction::<_, diesel::result::Error, _>(|| {
30-
transfer(&conn);
27+
transfer(opts, &conn);
3128
Ok(())
3229
})
3330
.unwrap()
3431
}
3532

36-
fn transfer(conn: &PgConnection) {
37-
let opts: Opts = Opts::parse();
38-
33+
fn transfer(opts: Opts, conn: &PgConnection) {
3934
let from: User = users::table
4035
.filter(users::gh_login.eq(opts.from_user))
4136
.first(conn)

src/bin/verify-token.rs renamed to src/admin/verify_token.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,20 @@
1-
use cargo_registry::{db, models::User, util::errors::AppResult};
1+
use crate::{db, models::User, util::errors::AppResult};
22

33
use clap::Clap;
44

55
#[derive(Clap, Debug)]
66
#[clap(
77
name = "verify-token",
8-
about = "Look up a username by API token. Used by staff to verify someone's identity \
8+
about = "Look up a username by API token.",
9+
long_about = "Look up a username by API token. Used by staff to verify someone's identity \
910
by having an API token given. If an error occurs, including being unable to \
1011
find a user with that API token, the error will be displayed."
1112
)]
12-
struct Opts {
13+
pub struct Opts {
1314
api_token: String,
1415
}
1516

16-
fn main() -> AppResult<()> {
17-
let opts: Opts = Opts::parse();
18-
17+
pub fn run(opts: Opts) -> AppResult<()> {
1918
let conn = db::connect_now()?;
2019
let user = User::find_by_api_token(&conn, &opts.api_token)?;
2120
println!("The token belongs to user {}", user.gh_login);

src/bin/crates-admin.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
#![warn(clippy::all, rust_2018_idioms)]
2+
3+
use cargo_registry::admin::{
4+
delete_crate, delete_version, populate, render_readmes, test_pagerduty, transfer_crates,
5+
verify_token,
6+
};
7+
8+
use clap::Clap;
9+
10+
#[derive(Clap, Debug)]
11+
#[clap(name = "crates-admin")]
12+
struct Opts {
13+
#[clap(subcommand)]
14+
command: SubCommand,
15+
}
16+
17+
#[derive(Clap, Debug)]
18+
enum SubCommand {
19+
DeleteCrate(delete_crate::Opts),
20+
DeleteVersion(delete_version::Opts),
21+
Populate(populate::Opts),
22+
RenderReadmes(render_readmes::Opts),
23+
TestPagerduty(test_pagerduty::Opts),
24+
TransferCrates(transfer_crates::Opts),
25+
VerifyToken(verify_token::Opts),
26+
}
27+
28+
fn main() {
29+
let opts: Opts = Opts::parse();
30+
31+
match opts.command {
32+
SubCommand::DeleteCrate(opts) => delete_crate::run(opts),
33+
SubCommand::DeleteVersion(opts) => delete_version::run(opts),
34+
SubCommand::Populate(opts) => populate::run(opts),
35+
SubCommand::RenderReadmes(opts) => render_readmes::run(opts),
36+
SubCommand::TestPagerduty(opts) => test_pagerduty::run(opts).unwrap(),
37+
SubCommand::TransferCrates(opts) => transfer_crates::run(opts),
38+
SubCommand::VerifyToken(opts) => verify_token::run(opts).unwrap(),
39+
}
40+
}

src/bin/monitor.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,8 @@
66
77
#![warn(clippy::all, rust_2018_idioms)]
88

9-
mod on_call;
10-
119
use anyhow::Result;
12-
use cargo_registry::{db, schema::*};
10+
use cargo_registry::{admin::on_call, db, schema::*};
1311
use diesel::prelude::*;
1412

1513
fn main() -> Result<()> {

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ use jemallocator::Jemalloc;
3030
#[global_allocator]
3131
static ALLOC: Jemalloc = Jemalloc;
3232

33+
pub mod admin;
3334
mod app;
3435
pub mod background_jobs;
3536
pub mod boot;

0 commit comments

Comments
 (0)