Speed up profile package caching

This commit is contained in:
Victor Fuentes 2022-09-27 13:33:55 -04:00
parent 4885808331
commit 8e12aef3f6
No known key found for this signature in database
GPG Key ID: 0A88B68D6A9ACAE0
2 changed files with 62 additions and 27 deletions

View File

@ -145,7 +145,7 @@ fn getlatestpkgs() -> Result<(), Box<dyn Error>> {
info!("Relver {}", relver);
let url = format!(
"https://channels.nixos.org/nixos-{}/packages.json.br",
relver
relver.trim()
);
// Check newest nixpkgs version
@ -178,6 +178,7 @@ fn getlatestpkgs() -> Result<(), Box<dyn Error>> {
}
fn setuplegacypkgscache() -> Result<(), Box<dyn Error>> {
info!("Setting up legacy package cache");
let vout = Command::new("nix-instantiate")
.arg("-I")
.arg("nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos")
@ -190,9 +191,13 @@ fn setuplegacypkgscache() -> Result<(), Box<dyn Error>> {
let dlver = String::from_utf8_lossy(&vout.stdout)
.to_string()
.replace('"', "");
.replace('"', "")
.trim()
.to_string();
let mut relver = dlver.split('.').collect::<Vec<&str>>().join(".")[0..5].to_string();
let mut relver = dlver.split('.').collect::<Vec<&str>>().join(".")[0..5]
.trim()
.to_string();
if dlver.len() >= 8 && &dlver[5..8] == "pre" {
relver = "unstable".to_string();
@ -202,7 +207,8 @@ fn setuplegacypkgscache() -> Result<(), Box<dyn Error>> {
fs::create_dir_all(&cachedir).expect("Failed to create cache directory");
let url = format!(
"https://releases.nixos.org/nixos/{}/nixos-{}/packages.json.br",
relver, dlver
relver.trim(),
dlver.trim()
);
let cachedir = format!("{}/.cache/nix-software-center", env::var("HOME")?);
@ -216,14 +222,15 @@ fn setuplegacypkgscache() -> Result<(), Box<dyn Error>> {
}
if Path::new(format!("{}/chnver.txt", &cachedir).as_str()).exists()
&& fs::read_to_string(&Path::new(format!("{}/chnver.txt", &cachedir).as_str()))? == dlver
&& fs::read_to_string(&Path::new(format!("{}/chnver.txt", &cachedir).as_str()))?.trim()
== 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;
info!("OLD: {}, != NEW: {}", oldver, sysver);
info!("OLD: {}, != NEW: {}", oldver.trim(), sysver.trim());
}
if Path::new(format!("{}/chnver.txt", &cachedir).as_str()).exists() {
fs::remove_file(format!("{}/chnver.txt", &cachedir).as_str())?;
@ -236,6 +243,7 @@ fn setuplegacypkgscache() -> Result<(), Box<dyn Error>> {
}
fn setupflakepkgscache(config: NscConfig) -> Result<(), Box<dyn Error>> {
info!("Setting up flake cache");
let cachedir = format!("{}/.cache/nix-software-center", env::var("HOME")?);
// First remove legacy files
@ -250,7 +258,7 @@ fn setupflakepkgscache(config: NscConfig) -> Result<(), Box<dyn Error>> {
.get("nixpkgsRevision")
.unwrap()
.as_str()
.unwrap();
.unwrap_or("unknown");
let dlver = versiondata.get("nixosVersion").unwrap().as_str().unwrap();
let mut relver = dlver.split('.').collect::<Vec<&str>>()[0..2].join(".");
@ -261,7 +269,7 @@ fn setupflakepkgscache(config: NscConfig) -> Result<(), Box<dyn Error>> {
fs::create_dir_all(&cachedir).expect("Failed to create cache directory");
let url = format!(
"https://channels.nixos.org/nixos-{}/packages.json.br",
relver
relver.trim()
);
fn writesyspkgs(outfile: &str, inputpath: &str) -> Result<(), Box<dyn Error>> {
@ -332,17 +340,30 @@ fn setupflakepkgscache(config: NscConfig) -> Result<(), Box<dyn Error>> {
}
fn setupprofilepkgscache() -> Result<(), Box<dyn Error>> {
info!("Setting up profile package cache");
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(())
// First remove legacy files
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 versiondata: Value = serde_json::from_str(&String::from_utf8_lossy(&vout.stdout))?;
let dlver = versiondata.get("nixosVersion").unwrap().as_str().unwrap();
let mut relver = dlver.split('.').collect::<Vec<&str>>()[0..2].join(".");
if relver == "22.11" {
relver = "unstable".to_string();
}
fs::create_dir_all(&cachedir).expect("Failed to create cache directory");
let url = format!(
"https://channels.nixos.org/nixpkgs-{}/packages.json.br",
relver.trim()
);
// Check nix profile nixpkgs version
let client = reqwest::blocking::Client::builder()
.user_agent("request")
@ -359,7 +380,8 @@ fn setupprofilepkgscache() -> Result<(), Box<dyn Error>> {
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))?;
dlfile(&url, &format!("{}/profilepackages.json", &cachedir))?;
// writeprofilepkgs(&format!("{}/profilepackages.json", &cachedir))?;
} else {
let oldver =
fs::read_to_string(&Path::new(format!("{}/profilever.txt", &cachedir).as_str()))?;
@ -368,29 +390,33 @@ fn setupprofilepkgscache() -> Result<(), Box<dyn Error>> {
info!("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))?;
dlfile(&url, &format!("{}/profilepackages.json", &cachedir))?;
// writeprofilepkgs(&format!("{}/profilepackages.json", &cachedir))?;
} else {
info!("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/user/nix").inputs.nixpkgs.outPath'
// nix-env -f /nix/store/sjmq1gphj1arbzf4aqqnygd9pf4hkfkf-source -qa --json > packages.json
fn setupupdatecache() -> Result<(), Box<dyn Error>> {
info!("Setting up update cache");
let output = Command::new("nix-instantiate")
.arg("--eval")
.arg("-E")
.arg("with import <nixpkgs> {}; pkgs.lib.version")
.output()?;
let dlver = String::from_utf8(output.stdout)?.replace("\"", "");
let dlver = String::from_utf8(output.stdout)?
.replace("\"", "")
.trim()
.to_string();
let mut relver = dlver.split('.').collect::<Vec<&str>>().join(".")[0..5].to_string();
let mut relver = dlver.split('.').collect::<Vec<&str>>().join(".")[0..5]
.trim()
.to_string();
if dlver.len() >= 8 && &dlver[5..8] == "pre" {
relver = "unstable".to_string();
@ -400,7 +426,8 @@ fn setupupdatecache() -> Result<(), Box<dyn Error>> {
fs::create_dir_all(&cachedir).expect("Failed to create cache directory");
let url = format!(
"https://releases.nixos.org/nixos/{}/nixos-{}/packages.json.br",
relver, dlver
relver.trim(),
dlver.trim()
);
let cachedir = format!("{}/.cache/nix-software-center", env::var("HOME")?);
@ -414,14 +441,15 @@ fn setupupdatecache() -> Result<(), Box<dyn Error>> {
}
if Path::new(format!("{}/sysver.txt", &cachedir).as_str()).exists()
&& fs::read_to_string(&Path::new(format!("{}/sysver.txt", &cachedir).as_str()))? == dlver
&& fs::read_to_string(&Path::new(format!("{}/sysver.txt", &cachedir).as_str()))?.trim()
== dlver
&& Path::new(format!("{}/syspackages.json", &cachedir).as_str()).exists()
{
return Ok(());
} else {
let oldver = fs::read_to_string(&Path::new(format!("{}/sysver.txt", &cachedir).as_str()))?;
let sysver = &dlver;
info!("OLD: {}, != NEW: {}", oldver, sysver);
info!("OLD: {}, != NEW: {}", oldver.trim(), sysver.trim());
}
if Path::new(format!("{}/sysver.txt", &cachedir).as_str()).exists() {
fs::remove_file(format!("{}/sysver.txt", &cachedir).as_str())?;
@ -522,5 +550,6 @@ fn dlfile(url: &str, path: &str) -> Result<(), Box<dyn Error>> {
}
}
}
trace!("Finished downloading {} -> {}", url, path);
Ok(())
}

View File

@ -165,11 +165,14 @@ struct FlakeJson {
}
pub async fn readpkgs() -> Result<HashMap<String, Package>, Box<dyn Error + Send + Sync>> {
info!("Reading package list");
let cachedir = format!("{}/.cache/nix-software-center/", env::var("HOME")?);
let cachefile = format!("{}/packages.json", cachedir);
let file = File::open(cachefile)?;
let reader = BufReader::new(file);
trace!("Reading packages.json");
let pkgbase: PackageBase = simd_json::serde::from_reader(reader)?;
trace!("Finished reading packages.json");
let mut pkgs = pkgbase.packages;
debug!("APPDATADIR {}", APPINFO);
let appdata = File::open(&format!("{}/xmls/nixos_x86_64_linux.yml.gz", APPINFO))?;
@ -192,6 +195,7 @@ pub async fn readpkgs() -> Result<HashMap<String, Package>, Box<dyn Error + Sen
}
pub fn readlegacysyspkgs() -> Result<HashMap<String, String>, Box<dyn Error + Send + Sync>> {
info!("Reading legacy system package list");
let cachedir = format!("{}/.cache/nix-software-center/", env::var("HOME")?);
let cachefile = format!("{}/syspackages.json", cachedir);
if let Ok(f) = fs::read_to_string(&cachefile) {
@ -206,6 +210,7 @@ pub fn readlegacysyspkgs() -> Result<HashMap<String, String>, Box<dyn Error + S
}
pub fn readflakesyspkgs() -> Result<HashMap<String, String>, Box<dyn Error + Send + Sync>> {
info!("Reading flake system package list");
let cachedir = format!("{}/.cache/nix-software-center/", env::var("HOME")?);
let cachefile = format!("{}/syspackages.json", cachedir);
if let Ok(f) = fs::read_to_string(&cachefile) {
@ -221,6 +226,7 @@ pub fn readflakesyspkgs() -> Result<HashMap<String, String>, Box<dyn Error + Se
}
pub fn readprofilepkgs() -> Result<HashMap<String, String>, Box<dyn Error + Send + Sync>> {
info!("Reading profile package list");
let cachedir = format!("{}/.cache/nix-software-center/", env::var("HOME")?);
let cachefile = format!("{}/profilepackages.json", cachedir);
if let Ok(f) = fs::read_to_string(&cachefile) {