difftreelog
refactor replace clap with structopt
in: trunk
6 files changed
Cargo.lockdiffbeforeafterboth--- a/Cargo.lock
+++ b/Cargo.lock
@@ -327,44 +327,12 @@
"atty",
"bitflags",
"strsim 0.8.0",
- "textwrap 0.11.0",
- "unicode-width",
- "vec_map",
-]
-
-[[package]]
-name = "clap"
-version = "3.0.0-beta.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4bd1061998a501ee7d4b6d449020df3266ca3124b941ec56cf2005c3779ca142"
-dependencies = [
- "atty",
- "bitflags",
- "clap_derive",
- "indexmap",
- "lazy_static",
- "os_str_bytes",
- "strsim 0.10.0",
- "termcolor",
- "textwrap 0.12.1",
+ "textwrap",
"unicode-width",
"vec_map",
]
[[package]]
-name = "clap_derive"
-version = "3.0.0-beta.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "370f715b81112975b1b69db93e0b56ea4cd4e5002ac43b2da8474106a54096a1"
-dependencies = [
- "heck",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn",
-]
-
-[[package]]
name = "cookie-factory"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -478,7 +446,6 @@
"anyhow",
"base64",
"chrono",
- "clap 3.0.0-beta.2",
"env_logger",
"hostname",
"log",
@@ -487,6 +454,7 @@
"peg",
"serde",
"serde_json",
+ "structopt",
"tempfile",
"time 0.3.2",
"z85",
@@ -597,12 +565,6 @@
]
[[package]]
-name = "hashbrown"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
-
-[[package]]
name = "heck"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -726,16 +688,6 @@
]
[[package]]
-name = "indexmap"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2"
-dependencies = [
- "autocfg 1.0.1",
- "hashbrown",
-]
-
-[[package]]
name = "instant"
version = "0.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -955,12 +907,6 @@
checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5"
[[package]]
-name = "os_str_bytes"
-version = "2.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2ac6fe3538f701e339953a3ebbe4f39941aababa8a3f6964635b24ab526daeac"
-
-[[package]]
name = "ouroboros"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1154,9 +1100,9 @@
[[package]]
name = "rand"
-version = "0.8.3"
+version = "0.8.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e"
+checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
dependencies = [
"libc",
"rand_chacha 0.3.0",
@@ -1458,7 +1404,7 @@
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf9d950ef167e25e0bdb073cf1d68e9ad2795ac826f2f3f59647817cf23c0bfa"
dependencies = [
- "clap 2.33.3",
+ "clap",
"lazy_static",
"structopt-derive",
]
@@ -1519,7 +1465,7 @@
dependencies = [
"cfg-if",
"libc",
- "rand 0.8.3",
+ "rand 0.8.4",
"redox_syscall",
"remove_dir_all",
"winapi",
@@ -1539,15 +1485,6 @@
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "203008d98caf094106cfaba70acfed15e18ed3ddb7d94e49baec153a2b462789"
dependencies = [
"unicode-width",
]
Cargo.tomldiffbeforeafterboth--- a/Cargo.toml
+++ b/Cargo.toml
@@ -7,7 +7,6 @@
[dependencies]
anyhow = "1.0"
-clap = { version = "3.0.0-beta.2", features = ["derive", "suggestions", "color"] }
log = "0.4.14"
env_logger = "0.9.0"
serde = { version = "1.0", features = ["derive"] }
@@ -23,6 +22,7 @@
base64 = "0.13.0"
chrono = { version = "0.4.19", features = ["serde"] }
z85 = "3.0.3"
+structopt = "0.3.23"
[workspace]
members = ["crates/nixlike", "cmds/install-secrets"]
src/cmds/build_systems.rsdiffbeforeafterboth--- a/src/cmds/build_systems.rs
+++ b/src/cmds/build_systems.rs
@@ -2,28 +2,27 @@
use crate::{command::CommandExt, host::Config, nix::SYSTEMS_ATTRIBUTE};
use anyhow::Result;
-use clap::Clap;
use log::info;
+use structopt::StructOpt;
-#[derive(Clap)]
-#[clap(group = clap::ArgGroup::new("target"))]
+#[derive(StructOpt)]
pub struct BuildSystems {
/// --builders arg for nix
- #[clap(long)]
+ #[structopt(long)]
builders: Option<String>,
/// Jobs to run locally
- #[clap(long)]
+ #[structopt(long)]
jobs: Option<usize>,
/// Do not continue on error
- #[clap(long)]
+ #[structopt(long)]
fail_fast: bool,
- #[clap(long)]
+ #[structopt(long)]
privileged_build: bool,
- #[clap(subcommand)]
+ #[structopt(subcommand)]
subcommand: Option<Subcommand>,
}
-#[derive(Clap)]
+#[derive(StructOpt)]
enum Subcommand {
/// Switch to built system until reboot
Test,
src/cmds/secrets/mod.rsdiffbeforeafterboth--- a/src/cmds/secrets/mod.rs
+++ b/src/cmds/secrets/mod.rs
@@ -1,9 +1,9 @@
use crate::{fleetdata::FleetSecret, host::Config};
use anyhow::{bail, Result};
-use clap::Clap;
use std::io::{self, Cursor, Read};
+use structopt::StructOpt;
-#[derive(Clap)]
+#[derive(StructOpt)]
pub enum Secrets {
/// Force load keys for all defined hosts
ForceKeys,
@@ -14,9 +14,9 @@
/// Secret owners
machines: Vec<String>,
/// Override secret if already present
- #[clap(long)]
+ #[structopt(long)]
force: bool,
- #[clap(long)]
+ #[structopt(long)]
public: Option<String>,
},
}
src/host.rsdiffbeforeafterboth1use std::{2 cell::{Ref, RefCell, RefMut},3 env::current_dir,4 ffi::{OsStr, OsString},5 ops::Deref,6 path::PathBuf,7 process::Command,8 sync::Arc,9};1011use anyhow::Result;12use clap::Clap;1314use crate::{command::CommandExt, fleetdata::FleetData};1516pub struct FleetConfigInternals {17 pub directory: PathBuf,18 pub opts: FleetOpts,19 pub data: RefCell<FleetData>,20}2122#[derive(Clone)]23pub struct Config(Arc<FleetConfigInternals>);2425impl Deref for Config {26 type Target = FleetConfigInternals;2728 fn deref(&self) -> &Self::Target {29 &self.030 }31}3233impl Config {34 pub fn should_skip(&self, host: &str) -> bool {35 if !self.opts.skip.is_empty() {36 self.opts.skip.iter().any(|h| h as &str == host)37 } else if !self.opts.only.is_empty() {38 !self.opts.only.iter().any(|h| h as &str == host)39 } else {40 false41 }42 }43 pub fn is_local(&self, host: &str) -> bool {44 self.opts.localhost.as_ref().map(|s| s as &str) == Some(host)45 }4647 pub fn command_on(&self, host: &str, program: impl AsRef<OsStr>, sudo: bool) -> Command {48 if self.is_local(host) {49 if sudo {50 let mut cmd = Command::new("sudo");51 cmd.arg(program);52 cmd53 } else {54 Command::new(program)55 }56 } else {57 let mut cmd = Command::new("ssh");58 cmd.arg(host).arg("--");59 if sudo {60 cmd.arg("sudo");61 }62 cmd.arg(program);63 cmd64 }65 }6667 pub fn full_attr_name(&self, attr_name: &str) -> OsString {68 let mut str = self.directory.as_os_str().to_owned();69 str.push("#");70 str.push(attr_name);71 str72 }7374 pub fn list_hosts(&self) -> Result<Vec<String>> {75 Command::new("nix")76 .arg("eval")77 .arg(self.full_attr_name("fleetConfigurations.default.configuredHosts"))78 .args(&["--apply", "builtins.attrNames", "--json", "--show-trace"])79 .inherit_stdio()80 .run_json()81 }8283 pub fn data(&self) -> Ref<FleetData> {84 self.data.borrow()85 }86 pub fn data_mut(&self) -> RefMut<FleetData> {87 self.data.borrow_mut()88 }8990 pub fn save(&self) -> Result<()> {91 let mut fleet_data_path = self.directory.clone();92 fleet_data_path.push("fleet.nix");93 let data = nixlike::serialize(&self.data() as &FleetData)?;94 std::fs::write(95 fleet_data_path,96 format!(97 "# This file contains fleet state and shouldn't be edited by hand\n\n{}\n",98 data99 ),100 )?;101 Ok(())102 }103}104105#[derive(Clap, Clone)]106#[clap(group = clap::ArgGroup::new("target_hosts"))]107pub struct FleetOpts {108 /// All hosts except those would be skipped109 #[clap(long, number_of_values = 1, group = "target_hosts")]110 only: Vec<String>,111112 /// Hosts to skip113 #[clap(long, number_of_values = 1, group = "target_hosts")]114 skip: Vec<String>,115116 /// Host, which should be threaten as current machine117 #[clap(long)]118 pub localhost: Option<String>,119}120121impl FleetOpts {122 pub fn build(mut self) -> Result<Config> {123 if self.localhost.is_none() {124 self.localhost125 .replace(hostname::get().unwrap().to_str().unwrap().to_owned());126 }127 let directory = current_dir()?;128129 let mut fleet_data_path = directory.clone();130 fleet_data_path.push("fleet.nix");131 let bytes = std::fs::read_to_string(fleet_data_path)?;132 let data = nixlike::parse_str(&bytes)?;133134 Ok(Config(Arc::new(FleetConfigInternals {135 opts: self,136 directory,137 data,138 })))139 }140}src/main.rsdiffbeforeafterboth--- a/src/main.rs
+++ b/src/main.rs
@@ -8,13 +8,13 @@
mod fleetdata;
use anyhow::Result;
-use clap::Clap;
+use structopt::StructOpt;
use cmds::{build_systems::BuildSystems, secrets::Secrets};
use host::{Config, FleetOpts};
-#[derive(Clap)]
-#[clap(version = "1.0", author = "CertainLach <iam@lach.pw>")]
+#[derive(StructOpt)]
+#[structopt(version = "1.0", author = "CertainLach <iam@lach.pw>")]
enum Opts {
/// Prepare systems for deployments
BuildSystems(BuildSystems),
@@ -22,11 +22,11 @@
Secrets(Secrets),
}
-#[derive(Clap)]
+#[derive(StructOpt)]
struct RootOpts {
- #[clap(flatten)]
+ #[structopt(flatten)]
fleet_opts: FleetOpts,
- #[clap(subcommand)]
+ #[structopt(subcommand)]
command: Opts,
}
@@ -42,7 +42,7 @@
env_logger::Builder::new()
.filter_level(log::LevelFilter::Info)
.init();
- let opts = RootOpts::parse();
+ let opts = RootOpts::from_args();
let config = opts.fleet_opts.build()?;
match run_command(&config, opts.command) {