Add link generation to bootstrap command
This commit is contained in:
parent
d190050798
commit
1af14e7ff7
@ -1,5 +1,5 @@
|
|||||||
use super::{Cmd, ECHO, FALSE, HEAD, HOSTNAME, SHITBOX, SLEEP, TRUE};
|
use super::{Cmd, ECHO, FALSE, HEAD, HOSTNAME, SHITBOX, SLEEP, TRUE};
|
||||||
use clap::{value_parser, Arg, ArgAction, ArgMatches, Command};
|
use clap::{Arg, ArgAction, ArgMatches, Command};
|
||||||
use clap_complete::{generate_to, shells, Generator};
|
use clap_complete::{generate_to, shells, Generator};
|
||||||
use clap_complete_nushell::Nushell;
|
use clap_complete_nushell::Nushell;
|
||||||
use clap_mangen::Man;
|
use clap_mangen::Man;
|
||||||
@ -47,8 +47,7 @@ impl Cmd for Bootstrap {
|
|||||||
)
|
)
|
||||||
.short('u')
|
.short('u')
|
||||||
.long("usr")
|
.long("usr")
|
||||||
.default_value("true")
|
.action(ArgAction::SetTrue),
|
||||||
.value_parser(value_parser!(bool)),
|
|
||||||
])
|
])
|
||||||
.subcommands([
|
.subcommands([
|
||||||
Command::new("all").about("Install everything"),
|
Command::new("all").about("Install everything"),
|
||||||
@ -108,7 +107,11 @@ impl Cmd for Bootstrap {
|
|||||||
&BOOTSTRAP, &ECHO, &FALSE, &HEAD, &HOSTNAME, &TRUE, &SLEEP, &SHITBOX,
|
&BOOTSTRAP, &ECHO, &FALSE, &HEAD, &HOSTNAME, &TRUE, &SLEEP, &SHITBOX,
|
||||||
],
|
],
|
||||||
};
|
};
|
||||||
|
let usr = matches.get_flag("usr");
|
||||||
match matches.subcommand() {
|
match matches.subcommand() {
|
||||||
|
Some(("links", matches)) => {
|
||||||
|
commands.links(prefix, usr, matches)?;
|
||||||
|
}
|
||||||
Some(("manpages", _matches)) => {
|
Some(("manpages", _matches)) => {
|
||||||
commands.manpages(prefix)?;
|
commands.manpages(prefix)?;
|
||||||
}
|
}
|
||||||
@ -210,40 +213,13 @@ impl<'a> Commands<'a> {
|
|||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
fn links(&self, prefix: &str, usr: bool, cmd: &ArgMatches) -> Result<(), Box<dyn Error>> {
|
||||||
fn get_path(prefix: &str, name: &str, usr: bool) -> Option<PathBuf> {
|
println!("Generating links:");
|
||||||
let mut path = PathBuf::from(prefix);
|
let soft = cmd.get_flag("soft");
|
||||||
let binpath = match name {
|
self.items
|
||||||
"bootstrap" => Bootstrap::path(),
|
.iter()
|
||||||
"echo" => Echo::path(),
|
.try_for_each(|cmd| cmd.link(prefix, usr, soft))?;
|
||||||
"false" => False::path(),
|
Ok(())
|
||||||
"head" => Head::path(),
|
|
||||||
"hostname" => Hostname::path(),
|
|
||||||
"true" => True::path(),
|
|
||||||
"sleep" => Sleep::path(),
|
|
||||||
"shitbox" => Shitbox::path(),
|
|
||||||
_ => todo!(),
|
|
||||||
};
|
|
||||||
match binpath {
|
|
||||||
Some(crate::Path::Bin) => path.push("bin"),
|
|
||||||
Some(crate::Path::Sbin) => path.push("sbin"),
|
|
||||||
Some(crate::Path::UsrBin) => {
|
|
||||||
if usr {
|
|
||||||
path.push("usr");
|
|
||||||
}
|
|
||||||
path.push("bin");
|
|
||||||
}
|
|
||||||
Some(crate::Path::UsrSbin) => {
|
|
||||||
if usr {
|
|
||||||
path.push("usr");
|
|
||||||
}
|
|
||||||
path.push("sbin");
|
|
||||||
}
|
|
||||||
None => return None,
|
|
||||||
}
|
}
|
||||||
path.push(name);
|
|
||||||
Some(path)
|
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
use clap::ArgMatches;
|
use clap::ArgMatches;
|
||||||
use std::error::Error;
|
use std::{error::Error, fs, os::unix::fs::symlink, path::PathBuf};
|
||||||
|
|
||||||
pub mod bootstrap;
|
pub mod bootstrap;
|
||||||
mod cat;
|
mod cat;
|
||||||
@ -34,10 +34,68 @@ pub use {
|
|||||||
shitbox::{Shitbox, SHITBOX},
|
shitbox::{Shitbox, SHITBOX},
|
||||||
sleep::{Sleep, SLEEP},
|
sleep::{Sleep, SLEEP},
|
||||||
};
|
};
|
||||||
|
|
||||||
pub trait Cmd {
|
pub trait Cmd {
|
||||||
fn name(&self) -> &str;
|
fn name(&self) -> &str;
|
||||||
fn cli(&self) -> clap::Command;
|
fn cli(&self) -> clap::Command;
|
||||||
fn run(&self, matches: Option<&ArgMatches>) -> Result<(), Box<dyn Error>>;
|
fn run(&self, matches: Option<&ArgMatches>) -> Result<(), Box<dyn Error>>;
|
||||||
fn path(&self) -> Option<crate::Path>;
|
fn path(&self) -> Option<crate::Path>;
|
||||||
|
|
||||||
|
fn linkpath(&self, prefix: &str, usr: bool) -> Option<PathBuf> {
|
||||||
|
let mut path = PathBuf::from(prefix);
|
||||||
|
let binpath = self.path();
|
||||||
|
match binpath {
|
||||||
|
Some(crate::Path::Bin) => path.push("bin"),
|
||||||
|
Some(crate::Path::Sbin) => path.push("sbin"),
|
||||||
|
Some(crate::Path::UsrBin) => {
|
||||||
|
if usr {
|
||||||
|
path.push("usr");
|
||||||
|
}
|
||||||
|
path.push("bin");
|
||||||
|
}
|
||||||
|
Some(crate::Path::UsrSbin) => {
|
||||||
|
if usr {
|
||||||
|
path.push("usr");
|
||||||
|
}
|
||||||
|
path.push("sbin");
|
||||||
|
}
|
||||||
|
None => return None,
|
||||||
|
}
|
||||||
|
path.push(self.name());
|
||||||
|
Some(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn link(&self, prefix: &str, usr: bool, soft: bool) -> Result<(), Box<dyn Error>> {
|
||||||
|
if let Some(linkpath) = self.linkpath(prefix, usr) {
|
||||||
|
if soft {
|
||||||
|
let binpath = match self.path().unwrap() {
|
||||||
|
crate::Path::Bin => "shitbox",
|
||||||
|
crate::Path::Sbin => "../bin/shitbox",
|
||||||
|
crate::Path::UsrBin => {
|
||||||
|
if usr {
|
||||||
|
"../../bin/shitbox"
|
||||||
|
} else {
|
||||||
|
"shitbox"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
crate::Path::UsrSbin => {
|
||||||
|
if usr {
|
||||||
|
"../../bin/shitbox"
|
||||||
|
} else {
|
||||||
|
"../bin/shitbox"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
symlink(binpath, linkpath)?;
|
||||||
|
} else {
|
||||||
|
let mut binpath = PathBuf::from(prefix);
|
||||||
|
if usr {
|
||||||
|
binpath.push("usr");
|
||||||
|
}
|
||||||
|
binpath.push("bin");
|
||||||
|
binpath.push("shitbox");
|
||||||
|
fs::hard_link(binpath, linkpath)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user