1 Commits

Author SHA1 Message Date
Beefki
ec50d9c6b1 Probably wrong file locations, but mostly complete 2017-10-26 01:15:04 -05:00
4 changed files with 134 additions and 81 deletions

24
LICENSE
View File

@@ -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>

View File

@@ -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

View File

@@ -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);

View File

@@ -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]
}
}