Compare commits
1 Commits
master
...
more-packa
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ec50d9c6b1 |
24
LICENSE
24
LICENSE
@@ -1,24 +0,0 @@
|
||||
This is free and unencumbered software released into the public domain.
|
||||
|
||||
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||
distribute this software, either in source code form or as a compiled
|
||||
binary, for any purpose, commercial or non-commercial, and by any
|
||||
means.
|
||||
|
||||
In jurisdictions that recognize copyright laws, the author or authors
|
||||
of this software dedicate any and all copyright interest in the
|
||||
software to the public domain. We make this dedication for the benefit
|
||||
of the public at large and to the detriment of our heirs and
|
||||
successors. We intend this dedication to be an overt act of
|
||||
relinquishment in perpetuity of all present and future rights to this
|
||||
software under copyright law.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
For more information, please refer to <http://unlicense.org>
|
||||
@@ -2,7 +2,6 @@ use super::{std, help, PackageManager};
|
||||
use management::Management;
|
||||
use std::process::Command;
|
||||
/// A struct to hold parsed arg data.
|
||||
// TODO?: update to take mutltiple terms?
|
||||
#[derive(Debug)]
|
||||
pub struct Config {
|
||||
pub action: Management,
|
||||
@@ -26,48 +25,54 @@ impl Config {
|
||||
Management::CompleteClear => pac.complete_cache_clear,
|
||||
};
|
||||
|
||||
// takes `Option(Vec<&str>)` and returns `Vec<&str>` if `Some(_)`
|
||||
// If `None`, tell user and exit.
|
||||
let mut prog = get.unwrap_or_else(|| {
|
||||
println!("Sorry, your package manager does not support this action");
|
||||
std::process::exit(0)
|
||||
});
|
||||
// takes `Some(Vec<&str>)` and returns `Vec<&str>`
|
||||
// checks to make sure the package manager supports the action
|
||||
let mut prog = match get {
|
||||
None => {
|
||||
println!("Sorry, your package manager does not support this action");
|
||||
std::process::exit(0)
|
||||
},
|
||||
Some(vec) => vec,
|
||||
};
|
||||
|
||||
//Pop's from the front of the `Vec<&str>`, which should always be the command name
|
||||
let command = prog.remove(0);
|
||||
|
||||
// Tuple match, `prog.first()` returns an `Option<T>` on the first element of
|
||||
// a Vec, `self.term` is also an `Option<T>` so this checks both for `Some`/`None`
|
||||
// and formats the program call as needed
|
||||
// and formats the program as needed
|
||||
match (prog.first(), &self.term) {
|
||||
(None, &None) => {
|
||||
let mut child = Command::new(&command).spawn().expect(
|
||||
"Failed to open package manager",
|
||||
"Failed to open package manager"
|
||||
);
|
||||
child.wait().expect("Failed to wait on package manager");
|
||||
}
|
||||
},
|
||||
(None, &Some(ref term)) => {
|
||||
let mut child = Command::new(&command).arg(term).spawn().expect(
|
||||
"Failed to open package manager",
|
||||
);
|
||||
let mut child = Command::new(&command)
|
||||
.arg(term)
|
||||
.spawn()
|
||||
.expect("Failed to open package manager");
|
||||
child.wait().expect("Failed to wait on package manager");
|
||||
}
|
||||
},
|
||||
(Some(_), &None) => {
|
||||
for arg in &prog {
|
||||
let mut child = Command::new(&command).arg(arg).spawn().expect(
|
||||
"Failed to open package manager",
|
||||
);
|
||||
let mut child =Command::new(&command)
|
||||
.arg(arg)
|
||||
.spawn()
|
||||
.expect("Failed to open package manager");
|
||||
child.wait().expect("Failed to wait on child");
|
||||
}
|
||||
}
|
||||
},
|
||||
(Some(_), &Some(ref term)) => {
|
||||
for arg in &prog {
|
||||
let mut child = Command::new(&command).arg(arg).arg(term).spawn().expect(
|
||||
"Failed to open package manager",
|
||||
);
|
||||
let mut child = Command::new(&command)
|
||||
.arg(arg)
|
||||
.arg(term)
|
||||
.spawn()
|
||||
.expect("Failed to open package manager");
|
||||
child.wait().expect("Failed to wait on child");
|
||||
}
|
||||
}
|
||||
},
|
||||
}
|
||||
}
|
||||
/// Creates a `Config` from passed arguments, parses the `Management` enum
|
||||
|
||||
25
src/main.rs
25
src/main.rs
@@ -9,41 +9,31 @@ use config::Config;
|
||||
use std::io;
|
||||
use std::path::PathBuf;
|
||||
|
||||
/// Takes user input. `io::Result<T>` returns either `Ok(T)`
|
||||
/// or `Err(io::Error)` Error handling is common on inputs so brevity
|
||||
/// is nice.
|
||||
fn input() -> io::Result<String> {
|
||||
fn input() -> Result<String, io::Error> {
|
||||
let mut val = String::new();
|
||||
io::stdin().read_line(&mut val)?;
|
||||
Ok(val)
|
||||
}
|
||||
|
||||
fn main() {
|
||||
//pulls in the args passed and stores them in a `Config` struct
|
||||
let config = Config::new();
|
||||
|
||||
//Sets a path to `~/.config/rux/`
|
||||
let mut ruxconf = std::env::home_dir().unwrap_or_else(|| PathBuf::new());
|
||||
let mut ruxconf = std::env::home_dir().unwrap_or_else(|| {
|
||||
PathBuf::new()
|
||||
});
|
||||
ruxconf.push(".config/rux/rux.conf");
|
||||
|
||||
// Checks if `~/.config/rux/rux.conf` exists and skips loading any
|
||||
// other package manager and searching for them.
|
||||
if ruxconf.is_file() {
|
||||
let pac = read_default(ruxconf).unwrap_or_else(|err| {
|
||||
eprintln!("{:?}", err);
|
||||
std::process::exit(1)
|
||||
});
|
||||
});
|
||||
config.run(pac);
|
||||
std::process::exit(0);
|
||||
}
|
||||
|
||||
// Loads all PackageManagers into a Vec to search through
|
||||
let managers = PackageManager::all();
|
||||
|
||||
// Iterates through the `Vec<PackageManager>` until it finds a match,
|
||||
// asks the user if they want to use that manager, and if they want to
|
||||
// set it as default to ALWAYS use that manager. Finally sends all the
|
||||
// needed information to run the package manager
|
||||
let mut found: bool = false;
|
||||
for prog in managers {
|
||||
if found {
|
||||
@@ -61,7 +51,10 @@ fn main() {
|
||||
println!("Would you like to set {} as default? [y/N]", prog.name);
|
||||
if input().unwrap().trim().to_lowercase() == "y" {
|
||||
prog.set_default().unwrap_or_else(|err| {
|
||||
println!("An error occurred trying to set default {:?}", err.kind())
|
||||
println!(
|
||||
"An error occursed trying to set default {:?}",
|
||||
err.kind()
|
||||
)
|
||||
});
|
||||
}
|
||||
config.run(prog);
|
||||
|
||||
@@ -12,7 +12,7 @@ pub struct PackageManager<'a> {
|
||||
pub name: &'a str,
|
||||
pub search: Option<Vec<&'a str>>,
|
||||
pub install: Option<Vec<&'a str>>,
|
||||
pub uninstall: Option<Vec<&'a str>>,
|
||||
pub uninstall: Option<Vec<&'a str>>,
|
||||
pub sup: Option<Vec<&'a str>>,
|
||||
pub purge: Option<Vec<&'a str>>,
|
||||
pub update: Option<Vec<&'a str>>,
|
||||
@@ -60,7 +60,7 @@ impl<'a> PackageManager<'a> {
|
||||
name: "apt",
|
||||
search: Some(vec!["apt", "search"]),
|
||||
install: Some(vec!["apt", "install"]),
|
||||
uninstall: Some(vec!["apt", "remove"]),
|
||||
uninstall:Some(vec!["apt", "remove"]),
|
||||
sup: Some(vec!["apt", "update", "upgrade"]),
|
||||
purge: Some(vec!["apt", "purge"]),
|
||||
upgrade: Some(vec!["apt", "upgrade"]),
|
||||
@@ -86,33 +86,112 @@ impl<'a> PackageManager<'a> {
|
||||
exe: PathBuf::from("bin/xbps-install"),
|
||||
}
|
||||
}
|
||||
// Allows setting the default `rux.conf` in folder `.config/rux/` in the
|
||||
// user's home directory. Will ask once per user, including sudo.
|
||||
pub fn brew() -> PackageManager<'a> {
|
||||
PackageManager{
|
||||
name: "brew",
|
||||
search: Some(vec!["brew", "search"]),
|
||||
install: Some(vec!["brew", "install"]),
|
||||
uninstall: Some(vec!["brew", "uninstall"]),
|
||||
sup: Some(vec!["brew", "update", "upgrade"]),
|
||||
purge: Some(vec!["brew", "remove"]),
|
||||
upgrade: Some(vec!["brew", "upgrade"]),
|
||||
update: Some(vec!["brew", "update"]),
|
||||
cache_clear: Some(vec!["brew", "cleanup"]),
|
||||
complete_cache_clear: None,
|
||||
exe: PathBuf::from("/bin/brew/"),
|
||||
}
|
||||
}
|
||||
pub fn dnf() -> PackageManager<'a> {
|
||||
PackageManager{
|
||||
name: "dnf",
|
||||
search: Some(vec!["dnf", "search"]),
|
||||
install: Some(vec!["dnf", "install"]),
|
||||
uninstall: Some(vec!["dnf", "remove"]),
|
||||
sup: Some(vec!["dnf", "--refresh upgrade"]),
|
||||
purge: Some(vec!["dnf", "autoremove"]),
|
||||
upgrade: Some(vec!["dnf", "upgrade"]),
|
||||
update: Some(vec!["dnf", "--refresh check-update"]),
|
||||
cache_clear: Some(vec!["dnf", "clean all"]),
|
||||
complete_cache_clear: None,
|
||||
exe: PathBuf::from("/bin/dnf"),
|
||||
}
|
||||
}
|
||||
pub fn eopkg() -> PackageManager<'a> {
|
||||
PackageManager{
|
||||
name: "eopkg",
|
||||
search: Some(vec!["eopkg", "sr"]),
|
||||
install: Some(vec!["eopkg", "it"]),
|
||||
uninstall: Some(vec!["eopkg", "rm"]),
|
||||
sup: Some(vec!["eopkg", "up"]),
|
||||
purge: Some(vec!["eopkg", "rm --purge"]),
|
||||
upgrade: Some(vec!["eopkg", "up"]),
|
||||
update: Some(vec!["eopkg", "ur"]),
|
||||
cache_clear: Some(vec!["eopkg", "dc"]),
|
||||
complete_cache_clear: None,
|
||||
exe: PathBuf::from("/bin/eopkg"),
|
||||
}
|
||||
}
|
||||
pub fn yum() -> PackageManager<'a> {
|
||||
PackageManager{
|
||||
name: "yum",
|
||||
search: Some(vec!["yum", "search"]),
|
||||
install: Some(vec!["yum", "install"]),
|
||||
uninstall: Some(vec!["yum", "remove"]),
|
||||
sup: Some(vec!["yum", "check-update", "update"]),
|
||||
purge: Some(vec!["yum", "remove"]),
|
||||
upgrade: Some(vec!["yum", "update"]),
|
||||
update: Some(vec!["yum", "check-update"]),
|
||||
cache_clear: Some(vec!["yum", "autoremove"]),
|
||||
complete_cache_clear: None,
|
||||
exe: PathBuf::from("/bin/yum"),
|
||||
}
|
||||
}
|
||||
/* Template to copy paste the bare minimum
|
||||
pub fn name() -> PackageManager<'a> {
|
||||
PackageManager{
|
||||
name: "",
|
||||
search: Some(vec![]),
|
||||
install: Some(vec![]),
|
||||
uninstall: Some(vec![]),
|
||||
sup: Some(vec![]),
|
||||
purge: Some(vec![]),
|
||||
upgrade: Some(vec![]),
|
||||
update: Some(vec![]),
|
||||
cache_clear: Some(vec![]),
|
||||
complete_cache_clear: Some(vec![]),
|
||||
exe: PathBuf::from(""),
|
||||
}
|
||||
}
|
||||
*/
|
||||
// Allows setting the default in rux.conf
|
||||
pub fn set_default(&self) -> std::io::Result<()> {
|
||||
let conf = env::home_dir().unwrap_or_else(|| {
|
||||
println!("Could not find home directory. Default cannot be saved properly!");
|
||||
std::process::exit(1)
|
||||
let mut home = match env::home_dir() {
|
||||
Some(path) => path,
|
||||
None => {
|
||||
println!("Could not find home! Default cannot set properly!");
|
||||
std::process::exit(1)
|
||||
}
|
||||
};
|
||||
home.push(".config/rux/");
|
||||
fs::create_dir_all(&home).unwrap_or_else(|why| {
|
||||
println!("! {:?}", why.kind());
|
||||
});
|
||||
|
||||
let conf = conf.join(".config").join("rux");
|
||||
fs::create_dir_all(&conf).unwrap_or_else(|err| {
|
||||
println!("Error setting default: {}", err);
|
||||
return ();
|
||||
});
|
||||
let conf = conf.join("rux.conf");
|
||||
|
||||
let mut file = File::create(conf)?;
|
||||
home.push("rux.conf");
|
||||
let mut file = File::create(home)?;
|
||||
file.write_all(self.name.as_bytes())?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn all() -> Vec<PackageManager<'a>> {
|
||||
let pacmatic = PackageManager::pacmatic();
|
||||
let pacman = PackageManager::pacman();
|
||||
let aptget = PackageManager::apt();
|
||||
let xbps = PackageManager::xbps();
|
||||
let brew = PackageManager::brew();
|
||||
let dnf = PackageManager::dnf();
|
||||
let eopkg = PackageManager::eopkg();
|
||||
let yum = PackageManager::yum();
|
||||
|
||||
vec![pacmatic, pacman, aptget, xbps]
|
||||
vec![pacmatic, pacman, aptget, xbps, brew, dnf, eopkg, yum]
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user