More flake support

This commit is contained in:
Victor Fuentes 2022-09-04 20:39:41 -04:00
parent 6dbd2726e4
commit e3b80a820e
No known key found for this signature in database
GPG Key ID: 0A88B68D6A9ACAE0
9 changed files with 148 additions and 143 deletions

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
<g fill="#2e3436">
<path d="m 9.492188 0.140625 c -0.851563 -0.1601562 -1.722657 -0.1796875 -2.574219 -0.0664062 c -1.703125 0.2343752 -3.328125 1.0078122 -4.601563 2.2929692 c -2.546875 2.566406 -3.050781 6.542968 -1.230468 9.664062 c 1.824218 3.125 5.527343 4.636719 9.015624 3.6875 c 3.492188 -0.953125 5.910157 -4.136719 5.894532 -7.753906 c -0.003906 -0.550782 -0.453125 -0.996094 -1.003906 -0.996094 c -0.550782 0.003906 -0.996094 0.453125 -0.996094 1.007812 c 0.011718 2.71875 -1.792969 5.097657 -4.417969 5.8125 c -2.625 0.714844 -5.394531 -0.414062 -6.761719 -2.765624 c -1.371094 -2.351563 -0.996094 -5.316407 0.917969 -7.246094 c 1.917969 -1.933594 4.878906 -2.335938 7.238281 -0.988282 c 0.480469 0.277344 1.09375 0.109376 1.367188 -0.371093 c 0.273437 -0.480469 0.105468 -1.089844 -0.375 -1.363281 c -0.785156 -0.449219 -1.621094 -0.753907 -2.472656 -0.914063 z m 0 0"/>
<path d="m 15.753906 3.660156 c 0.175782 -0.199218 0.261719 -0.460937 0.246094 -0.726562 c -0.019531 -0.265625 -0.140625 -0.511719 -0.339844 -0.6875 c -0.199218 -0.175782 -0.460937 -0.261719 -0.726562 -0.246094 c -0.265625 0.019531 -0.511719 0.140625 -0.6875 0.339844 l -6.296875 7.195312 l -2.242188 -2.242187 c -0.390625 -0.390625 -1.023437 -0.390625 -1.414062 0 c -0.1875 0.1875 -0.292969 0.441406 -0.292969 0.707031 s 0.105469 0.519531 0.292969 0.707031 l 3 3 c 0.195312 0.195313 0.464843 0.304688 0.742187 0.292969 c 0.273438 -0.007812 0.535156 -0.132812 0.71875 -0.339844 z m 0 0"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -82,40 +82,42 @@ fn main() {
}
},
SubCommands::Channel { rebuild: dorebuild, arguments } => {
match dorebuild {
true => match rebuild(arguments) {
Ok(_) => (),
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
}
},
false => match channel() {
Ok(_) => (),
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
match channel() {
Ok(_) => {
if dorebuild {
match rebuild(arguments) {
Ok(_) => (),
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
}
}
}
},
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
}
}
},
SubCommands::Flake { rebuild: dorebuild, flakepath, arguments } => {
match dorebuild {
true => match rebuild(arguments) {
Ok(_) => (),
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
match flake(&flakepath) {
Ok(_) => {
if dorebuild {
match rebuild(arguments) {
Ok(_) => (),
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
}
}
}
},
false => match flake(&flakepath) {
Ok(_) => (),
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
}
},
}
Err(err) => {
eprintln!("{}", err);
std::process::exit(1);
}
}
}
}
}
@ -164,7 +166,7 @@ fn channel() -> Result<(), Box<dyn Error>> {
fn flake(path: &str) -> Result<(), Box<dyn Error>> {
let mut cmd = Command::new("nix")
.arg("flake")
.arg("upgrade")
.arg("update")
.arg(path)
.spawn()?;
let x = cmd.wait()?;

View File

@ -1,10 +1,12 @@
use adw::gio;
use nix_software_center::ui::window::AppModel;
use relm4::*;
use nix_software_center::config::PKGDATADIR;
fn main() {
pretty_env_logger::init();
let res = gio::Resource::load("@PKGDATA_DIR@".to_string() + "/resources.gresource").unwrap();
gio::resources_register(&res);
if let Ok(res) = gio::Resource::load(PKGDATADIR.to_string() + "/resources.gresource") {
gio::resources_register(&res);
}
let app = RelmApp::new("dev.vlinkz.NixSoftwareCenter");
let application = app.app.clone();
app.run::<AppModel>(application);

View File

@ -11,7 +11,9 @@ resources = gnome.compile_resources(
'resources',
'resources.gresource.xml',
gresource_bundle: true,
source_dir: meson.current_build_dir()
source_dir: meson.current_build_dir(),
install: true,
install_dir: pkgdatadir,
)
config = configure_file(

View File

@ -11,6 +11,8 @@ use std::{
process::Command,
};
use crate::ui::window::{SystemPkgs, UserPkgs};
#[derive(Serialize, Deserialize, Debug)]
struct NewPackageBase {
packages: HashMap<String, NewPackage>,
@ -21,11 +23,20 @@ struct NewPackage {
version: IString,
}
pub fn checkcache() -> Result<(), Box<dyn Error>> {
// setuplegacypkgscache().unwrap();
// setupupdatecache().unwrap();
// setupnewestver().unwrap();
setupflakepkgscache()?;
pub fn checkcache(syspkgs: SystemPkgs, userpkgs: UserPkgs) -> Result<(), Box<dyn Error>> {
match syspkgs {
SystemPkgs::Legacy => {
setuplegacypkgscache().unwrap();
setupupdatecache().unwrap();
setupnewestver().unwrap();
}
SystemPkgs::Flake => {
setupflakepkgscache()?;
}
}
if userpkgs == UserPkgs::Profile {
setupprofilepkgscache()?;
}
Ok(())
}
@ -172,13 +183,15 @@ fn setupflakepkgscache() -> Result<(), Box<dyn Error>> {
if Path::new(format!("{}/chnver.txt", &cachedir).as_str()).exists() {
fs::remove_file(format!("{}/chnver.txt", &cachedir).as_str())?;
}
let vout = Command::new("nixos-version")
.arg("--json")
.output()?;
let vout = Command::new("nixos-version").arg("--json").output()?;
let versiondata: Value = serde_json::from_str(&String::from_utf8_lossy(&vout.stdout))?;
let rev = versiondata.get("nixpkgsRevision").unwrap().as_str().unwrap();
let rev = versiondata
.get("nixpkgsRevision")
.unwrap()
.as_str()
.unwrap();
let dlver = versiondata.get("nixosVersion").unwrap().as_str().unwrap();
let mut relver = dlver.split('.').collect::<Vec<&str>>()[0..2].join(".");
@ -214,23 +227,13 @@ fn setupflakepkgscache() -> Result<(), Box<dyn Error>> {
Ok(())
}
fn writeprofilepkgs(outfile: &str) -> Result<(), Box<dyn Error>> {
let output = Command::new("nix")
.arg("search")
.arg("nixpkgs")
.arg("--json")
.output()?;
let mut file = fs::File::create(outfile)?;
file.write_all(&output.stdout)?;
Ok(())
}
if !Path::new(&format!("{}/flakever.txt", &cachedir)).exists() {
let mut sysver = fs::File::create(format!("{}/flakever.txt", &cachedir))?;
sysver.write_all(rev.as_bytes())?;
writesyspkgs(&format!("{}/syspackages.json", &cachedir))?;
} else {
let oldver = fs::read_to_string(&Path::new(format!("{}/flakever.txt", &cachedir).as_str()))?;
let oldver =
fs::read_to_string(&Path::new(format!("{}/flakever.txt", &cachedir).as_str()))?;
let sysver = rev;
if oldver != sysver {
println!("OLD FLAKEVER: {}, != NEW: {}", oldver, sysver);
@ -244,41 +247,6 @@ fn setupflakepkgscache() -> Result<(), Box<dyn Error>> {
writesyspkgs(&format!("{}/syspackages.json", &cachedir))?;
}
// Check nix profile nixpkgs version
let client = reqwest::blocking::Client::builder()
.user_agent("request")
.build()?;
let response = client.get("https://api.github.com/repos/NixOS/nixpkgs/commits/nixpkgs-unstable").send()?;
if response.status().is_success() {
let profilerevjson = response.text()?;
let profilerevdata: Value = serde_json::from_str(&profilerevjson)?;
let profilerev = profilerevdata.get("sha").unwrap().as_str().unwrap();
println!("PROFILE REV {}", profilerev);
if !Path::new(&format!("{}/profilever.txt", &cachedir)).exists() {
let mut sysver = fs::File::create(format!("{}/profilever.txt", &cachedir))?;
sysver.write_all(profilerev.as_bytes())?;
writeprofilepkgs(&format!("{}/profilepackages.json", &cachedir))?;
} else {
let oldver = fs::read_to_string(&Path::new(format!("{}/profilever.txt", &cachedir).as_str()))?;
let sysver = profilerev;
if oldver != sysver {
println!("OLD PROFILEVER: {}, != NEW: {}", oldver, sysver);
let mut sysver = fs::File::create(format!("{}/profilever.txt", &cachedir))?;
sysver.write_all(profilerev.as_bytes())?;
writeprofilepkgs(&format!("{}/profilepackages.json", &cachedir))?;
} else {
println!("PROFILEVER UP TO DATE");
}
}
}
if !Path::new(&format!("{}/profilepackages.json", &cachedir)).exists() {
writeprofilepkgs(&format!("{}/profilepackages.json", &cachedir))?;
}
// Check newest nixpkgs version
let revurl = format!("https://channels.nixos.org/nixos-{}/git-revision", relver);
let response = reqwest::blocking::get(revurl)?;
@ -295,55 +263,81 @@ fn setupflakepkgscache() -> Result<(), Box<dyn Error>> {
dl = true;
}
let mut sysver = fs::File::create(format!("{}/newver.txt", &cachedir))?;
sysver.write_all(newrev.as_bytes())?;
// if !Path::new(&format!("{}/newver.txt", &cachedir)).exists() {
// }
sysver.write_all(newrev.as_bytes())?;
}
// if Path::new(format!("{}/chnver.txt", &cachedir).as_str()).exists()
// && fs::read_to_string(&Path::new(format!("{}/chnver.txt", &cachedir).as_str()))? == dlver
// && Path::new(format!("{}/packages.json", &cachedir).as_str()).exists()
// {
// return Ok(());
// } else {
// let oldver = fs::read_to_string(&Path::new(format!("{}/chnver.txt", &cachedir).as_str()))?;
// let sysver = &dlver;
// // Change to debug msg
// println!("OLD: {}, != NEW: {}", oldver, sysver);
// }
// if Path::new(format!("{}/chnver.txt", &cachedir).as_str()).exists() {
// fs::remove_file(format!("{}/chnver.txt", &cachedir).as_str())?;
// }
// let mut sysver = fs::File::create(format!("{}/chnver.txt", &cachedir))?;
// sysver.write_all(dlver.as_bytes())?;
let outfile = format!("{}/packages.json", &cachedir);
if dl {
if dl {
dlfile(&url, &outfile)?;
}
Ok(())
}
fn setupprofilepkgscache() -> Result<(), Box<dyn Error>> {
let cachedir = format!("{}/.cache/nix-software-center", env::var("HOME")?);
fn writeprofilepkgs(outfile: &str) -> Result<(), Box<dyn Error>> {
let output = Command::new("nix")
.arg("search")
.arg("nixpkgs")
.arg("--json")
.output()?;
let mut file = fs::File::create(outfile)?;
file.write_all(&output.stdout)?;
Ok(())
}
// Check nix profile nixpkgs version
let client = reqwest::blocking::Client::builder()
.user_agent("request")
.build()?;
let response = client
.get("https://api.github.com/repos/NixOS/nixpkgs/commits/nixpkgs-unstable")
.send()?;
if response.status().is_success() {
let profilerevjson = response.text()?;
let profilerevdata: Value = serde_json::from_str(&profilerevjson)?;
let profilerev = profilerevdata.get("sha").unwrap().as_str().unwrap();
println!("PROFILE REV {}", profilerev);
if !Path::new(&format!("{}/profilever.txt", &cachedir)).exists() {
let mut sysver = fs::File::create(format!("{}/profilever.txt", &cachedir))?;
sysver.write_all(profilerev.as_bytes())?;
writeprofilepkgs(&format!("{}/profilepackages.json", &cachedir))?;
} else {
let oldver =
fs::read_to_string(&Path::new(format!("{}/profilever.txt", &cachedir).as_str()))?;
let sysver = profilerev;
if oldver != sysver {
println!("OLD PROFILEVER: {}, != NEW: {}", oldver, sysver);
let mut sysver = fs::File::create(format!("{}/profilever.txt", &cachedir))?;
sysver.write_all(profilerev.as_bytes())?;
writeprofilepkgs(&format!("{}/profilepackages.json", &cachedir))?;
} else {
println!("PROFILEVER UP TO DATE");
}
}
}
if !Path::new(&format!("{}/profilepackages.json", &cachedir)).exists() {
writeprofilepkgs(&format!("{}/profilepackages.json", &cachedir))?;
}
Ok(())
}
// nix-instantiate --eval -E '(builtins.getFlake "/home/victor/nix").inputs.nixpkgs.outPath'
// nix-env -f /nix/store/sjmq1gphj1arbzf4aqqnygd9pf4hkfkf-source -qa --json > packages.json
fn setupupdatecache() -> Result<(), Box<dyn Error>> {
let vout = Command::new("nix-instantiate")
.arg("-I")
.arg("nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos")
.arg("<nixpkgs/lib>")
.arg("-A")
.arg("version")
.arg("--eval")
.arg("--json")
.output()?;
.arg("-I")
.arg("nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos")
.arg("<nixpkgs/lib>")
.arg("-A")
.arg("version")
.arg("--eval")
.arg("--json")
.output()?;
let dlver = String::from_utf8_lossy(&vout.stdout)
.to_string()
.replace('"', "");
let dlver = String::from_utf8_lossy(&vout.stdout)
.to_string()
.replace('"', "");
// let dlver = fs::read_to_string("/run/current-system/nixos-version")?;
let mut relver = dlver.split('.').collect::<Vec<&str>>().join(".")[0..5].to_string();

View File

@ -2,5 +2,6 @@
<gresources>
<gresource prefix="/dev/vlinkz/NixSoftwareCenter/">
<file preprocess="xml-stripblanks" alias="icons/scalable/emblems/compass-symbolic.svg">../data/icons/compass-symbolic.svg</file>
<file preprocess="xml-stripblanks" alias="icons/scalable/emblems/selection-mode-symbolic.svg">../data/icons/selection-mode-symbolic.svg</file>
</gresource>
</gresources>

View File

@ -110,7 +110,10 @@ impl Worker for UpdateAsyncHandler {
let syspkgs = self.syspkgs.clone();
relm4::spawn(async move {
println!("STARTED");
let result = runcmd(NscCmd::Rebuild, systenconfig, flakeargs, syspkgs).await;
let result = match syspkgs {
SystemPkgs::Legacy => runcmd(NscCmd::Rebuild, systenconfig, flakeargs, syspkgs).await,
SystemPkgs::Flake => runcmd(NscCmd::All, systenconfig, flakeargs, syspkgs).await,
};
match result {
Ok(true) => {
println!("REBUILD DONE");
@ -150,24 +153,14 @@ impl Worker for UpdateAsyncHandler {
let userpkgs = self.userpkgs.clone();
relm4::spawn(async move {
println!("STARTED");
// if syspkgs == SystemPkgs::Flake {
// if let Some(fa) = &flakeargs {
// match updateflake(fa.split('#').collect::<Vec<_>>().first().unwrap().to_string()).await {
// Ok(true) => {
// println!("FLAKE DONE");
// }
// _ => {
// println!("FLAKE FAILED");
// sender.output(UpdatePageMsg::FailedWorking);
// }
// }
// }
// }
let result = runcmd(NscCmd::All, systemconfig, flakeargs, syspkgs).await;
match result {
Ok(true) => {
println!("ALL pkexec DONE");
match updateenv().await {
match match userpkgs {
UserPkgs::Env => updateenv().await,
UserPkgs::Profile => updateprofile().await,
} {
Ok(true) => {
println!("ALL DONE");
sender.output(UpdatePageMsg::DoneWorking);
@ -251,7 +244,7 @@ async fn runcmd(
.args(&rebuildargs)
.stderr(Stdio::piped())
.spawn()?,
SystemPkgs::Flake => tokio::process::Command::new("pkexec")
SystemPkgs::Flake => { println!("ALL FLAKE UPDATE!!!!!!!!!!!!!!!!!!!!!!"); tokio::process::Command::new("pkexec")
.arg(&exe)
.arg("flake")
.arg("--rebuild")
@ -261,7 +254,7 @@ async fn runcmd(
.arg("switch")
.args(&rebuildargs)
.stderr(Stdio::piped())
.spawn()?,
.spawn()? },
},
};

View File

@ -489,6 +489,8 @@ impl Component for AppModel {
searchvs.set_name(Some("search"));
updatesvs.set_name(Some("updates"));
frontvs.set_icon_name(Some("compass"));
installedvs.set_icon_name(Some("selection-mode"));
updatesvs.set_icon_name(Some("emblem-synchronizing-symbolic"));
ComponentParts { model, widgets }
}

View File

@ -41,8 +41,10 @@ impl Worker for WindowAsyncHandler {
match msg {
WindowAsyncHandlerMsg::CheckCache(cr, syspkgs, userpkgs) => {
println!("CHECK CACHE");
let syspkgs2 = syspkgs.clone();
let userpkgs2 = userpkgs.clone();
relm4::spawn(async move {
match checkcache() {
match checkcache(syspkgs2, userpkgs2) {
Ok(_) => {}
Err(_) => {
println!("FAILED TO CHECK CACHE");