You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
amethyst/src/operations/aur_install.rs

138 lines
3.9 KiB
Rust

use std::env;
use std::env::set_current_dir;
use std::fs::remove_dir_all;
use std::path::Path;
3 years ago
use std::process::{Command, Stdio};
3 years ago
use crate::internal::rpc::rpcinfo;
3 years ago
use crate::internal::{crash, prompt};
use crate::{info, log, Options};
3 years ago
pub fn aur_install(a: Vec<String>, options: Options) {
let url = crate::internal::rpc::URL;
let cachedir = format!("{}/.cache/ame/", env::var("HOME").unwrap());
3 years ago
let verbosity = options.verbosity;
let noconfirm = options.noconfirm;
if verbosity >= 1 {
log(format!("Installing from AUR: {:?}", &a));
3 years ago
}
3 years ago
info(format!("Installing packages {} from the AUR", a.join(", ")));
for package in a {
let rpcres = rpcinfo(package);
if !rpcres.found {
break;
}
let pkg = &rpcres.package.as_ref().unwrap().name;
if verbosity >= 1 {
log(format!("Cloning {} into cachedir", pkg));
}
3 years ago
info("Cloning package source".to_string());
set_current_dir(Path::new(&cachedir)).unwrap();
Command::new("git")
.arg("clone")
.arg(format!("{}/{}", url, pkg))
3 years ago
.stdout(Stdio::null())
.status()
.expect("Something has gone wrong");
if verbosity >= 1 {
log(format!(
"Cloned {} into cachedir, moving on to resolving dependencies",
pkg
));
log(format!(
"Raw dependencies for package {} are:\n{:?}",
pkg,
rpcres.package.as_ref().unwrap().depends.join(", ")
));
}
// dep sorting
3 years ago
info("Sorting dependencies".to_string());
let sorted = crate::internal::sort(&rpcres.package.as_ref().unwrap().depends, options);
if verbosity >= 1 {
log(format!(
"Sorted dependencies for {} are:\n{:?}",
pkg, &sorted
));
}
let newopts = Options {
verbosity,
noconfirm,
asdeps: true,
};
if !sorted.nf.is_empty() {
crash(
format!(
"Could not find dependencies {} for package {}, aborting",
sorted.nf.join(", "),
pkg
),
1,
);
}
if !noconfirm {
3 years ago
let p = prompt(
format!("Would you like to view or edit {}'s PKGBUILD?", pkg),
3 years ago
false,
);
let editor = env::var("EDITOR").unwrap_or_else(|_| "nano".parse().unwrap());
3 years ago
if p {
Command::new(editor)
.arg(format!("{}/PKGBUILD", pkg))
.spawn()
.unwrap()
.wait()
.unwrap();
}
}
// dep installing
3 years ago
info("Moving on to install dependencies".to_string());
crate::operations::install(sorted.repo, newopts);
crate::operations::aur_install(sorted.aur, newopts);
let mut makepkg_args = vec!["-rsic", "--needed"];
if options.asdeps {
makepkg_args.push("--asdeps")
}
if options.noconfirm {
makepkg_args.push("--noconfirm")
}
// package building and installing
3 years ago
info("Building time!".to_string());
set_current_dir(format!("{}/{}", cachedir, pkg)).unwrap();
3 years ago
let out = Command::new("makepkg")
.args(&makepkg_args)
.status()
.expect("Something has gone wrong");
3 years ago
if out.code() != Some(0) {
crash(
format!("Error encountered while installing {}, aborting", pkg),
1,
);
}
3 years ago
set_current_dir(&cachedir).unwrap();
remove_dir_all(format!("{}/{}", cachedir, &pkg)).unwrap();
// pushes package to database
crate::database::add(rpcres.package.unwrap(), options);
}
3 years ago
}