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

162 lines
5.0 KiB
Rust

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 std::{env, fs};
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())
3 years ago
.output()
.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(", ")
));
3 years ago
log(format!(
"Raw makedepends for package {} are:\n{:?}",
pkg,
rpcres.package.as_ref().unwrap().make_depends.join(", ")
));
}
// dep sorting
3 years ago
info("Sorting dependencies".to_string());
let sorted = crate::internal::sort(&rpcres.package.as_ref().unwrap().depends, options);
3 years ago
info("Sorting make dependencies".to_string());
3 years ago
let md_sorted =
crate::internal::sort(&rpcres.package.as_ref().unwrap().make_depends, options);
if verbosity >= 1 {
log(format!(
"Sorted dependencies for {} are:\n{:?}",
pkg, &sorted
));
3 years ago
log(format!(
"Sorted makedepends for {} are:\n{:?}",
pkg, &md_sorted
));
}
let newopts = Options {
verbosity,
noconfirm,
asdeps: true,
};
3 years ago
if !sorted.nf.is_empty() || !md_sorted.nf.is_empty() {
crash(
format!(
"Could not find dependencies {} for package {}, aborting",
sorted.nf.join(", "),
pkg
),
5,
);
}
if !noconfirm {
let p1 = prompt(
format!("Would you like to review {}'s PKGBUILD?", pkg),
3 years ago
false,
);
let editor = env::var("PAGER").unwrap_or_else(|_| "less".parse().unwrap());
if p1 {
3 years ago
Command::new(editor)
.arg(format!("{}/PKGBUILD", pkg))
.spawn()
.unwrap()
.wait()
.unwrap();
let p2 = prompt(format!("Would you still like to install {}?", pkg), true);
if !p2 {
3 years ago
fs::remove_dir_all(format!("{}/{}", cachedir, pkg)).unwrap();
crash("Not proceeding".to_string(), 6);
}
3 years ago
}
}
// dep installing
3 years ago
info("Moving on to install dependencies".to_string());
if !sorted.repo.is_empty() {
crate::operations::install(sorted.repo, newopts);
3 years ago
crate::operations::install(md_sorted.repo, newopts);
}
if !sorted.aur.is_empty() {
crate::operations::aur_install(sorted.aur, newopts);
3 years ago
crate::operations::aur_install(md_sorted.aur, newopts);
}
3 years ago
let mut makepkg_args = vec!["-rsic", "--skippgp"];
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) {
3 years ago
fs::remove_dir_all(format!("{}/{}", cachedir, pkg)).unwrap();
3 years ago
crash(
format!("Error encountered while installing {}, aborting", pkg),
7,
3 years ago
);
}
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
}