rust: refactor

This commit is contained in:
Ryan Mulligan 2023-08-12 14:08:04 -07:00
parent d8dffc166b
commit 10333058f9
4 changed files with 108 additions and 124 deletions

48
rust/src/github.rs Normal file
View File

@ -0,0 +1,48 @@
use crate::nix;
fn token() -> Option<String> {
if let Ok(token) = std::env::var("GH_TOKEN") {
return Some(token);
}
if let Ok(token) = std::env::var("GITHUB_TOKEN") {
return Some(token);
}
None
}
pub fn latest_release(github: &Github) -> Result<json::JsonValue, &'static str> {
let mut request = ureq::get(&format!(
"https://api.github.com/repos/{}/{}/releases/latest",
github.owner, github.repo,
))
.set("Accept", "application/vnd.github+json")
.set("X-GitHub-Api-Version", "2022-11-28");
if let Some(token) = token() {
request = request.set("Authorization", &format!("Bearer {}", token));
}
let body = request.call().unwrap().into_string().unwrap();
if let json::JsonValue::Object(response) = json::parse(&body).unwrap() {
return Ok(response["tag_name"].clone());
}
Err("Couldn't find")
}
pub struct Github {
pub owner: String,
pub repo: String,
}
pub fn from(attr_path: &String) -> Option<Github> {
let url = nix::eval("master", attr_path, "(drv: drv.src.url)").unwrap();
if !url.contains("github") {
return None;
}
let owner = nix::eval("master", attr_path, "(drv: drv.src.owner)").unwrap();
let repo = nix::eval("master", attr_path, "(drv: drv.src.repo)").unwrap();
Some(Github {
owner: owner.to_string(),
repo: repo.to_string(),
})
}

View File

@ -1,132 +1,26 @@
mod github;
mod nix;
mod repology;
use chrono::offset::Utc;
use diesel::prelude::*;
use nixpkgs_update::models::*;
use nixpkgs_update::*;
use std::process::Command;
fn fetch_repology(project_name: &String) -> Result<json::JsonValue, &'static str> {
let body = ureq::get(&format!(
"https://repology.org/api/v1/project/{}",
project_name
))
.call()
.unwrap()
.into_string()
.unwrap();
let json = json::parse(&body).unwrap();
if let json::JsonValue::Array(projects) = json {
for project in projects {
if let json::JsonValue::Object(project_repo) = project {
if project_repo["status"] == "newest" {
return Ok(project_repo.get("version").unwrap().clone());
}
}
}
}
Err("Couldn't find")
fn version_in_nixpkgs_branch(branch: &str, attr_path: &String) -> Option<String> {
nix::eval(branch, attr_path, "(drv: drv.version)")
}
fn github_token() -> Option<String> {
if let Ok(token) = std::env::var("GH_TOKEN") {
return Some(token);
}
if let Ok(token) = std::env::var("GITHUB_TOKEN") {
return Some(token);
}
None
fn version_in_nixpkgs_master(attr_path: &String) -> Option<String> {
version_in_nixpkgs_branch("master", attr_path)
}
fn fetch_github_latest_release(github: &Github) -> Result<json::JsonValue, &'static str> {
let mut request = ureq::get(&format!(
"https://api.github.com/repos/{}/{}/releases/latest",
github.owner, github.repo,
))
.set("Accept", "application/vnd.github+json")
.set("X-GitHub-Api-Version", "2022-11-28");
if let Some(token) = github_token() {
request = request.set("Authorization", &format!("Bearer {}", token));
}
let body = request.call().unwrap().into_string().unwrap();
if let json::JsonValue::Object(response) = json::parse(&body).unwrap() {
return Ok(response["tag_name"].clone());
}
Err("Couldn't find")
fn version_in_nixpkgs_staging(attr_path: &String) -> Option<String> {
version_in_nixpkgs_branch("staging", attr_path)
}
fn version_in_nixpkgs_branch(branch: &str, attr_path: &String) -> String {
let output = Command::new("nix")
.arg("eval")
.arg("--raw")
.arg("--refresh")
.arg(&format!("github:nixos/nixpkgs/{}#{}", branch, attr_path))
.arg("--apply")
.arg("(drv: drv.version)")
.output()
.expect(&format!("Failed to execute nix eval {}", attr_path));
String::from_utf8_lossy(&output.stdout).to_string()
}
fn version_in_nixpkgs_master(attr_path: &String) -> String {
version_in_nixpkgs_branch("master", &attr_path)
}
fn version_in_nixpkgs_staging(attr_path: &String) -> String {
version_in_nixpkgs_branch("staging", &attr_path)
}
fn version_in_nixpkgs_staging_next(attr_path: &String) -> String {
version_in_nixpkgs_branch("staging-next", &attr_path)
}
struct Github {
owner: String,
repo: String,
}
fn maybe_github(attr_path: &String) -> Option<Github> {
let output = Command::new("nix")
.arg("eval")
.arg("--raw")
.arg("--refresh")
.arg(&format!("github:nixos/nixpkgs/master#{}", attr_path))
.arg("--apply")
.arg("(drv: drv.src.url)")
.output()
.expect(&format!("Failed to execute nix eval for {}", attr_path));
if !String::from_utf8_lossy(&output.stdout).contains("github") {
return None;
}
let output = Command::new("nix")
.arg("eval")
.arg("--raw")
.arg("--refresh")
.arg(&format!("github:nixos/nixpkgs/master#{}", attr_path))
.arg("--apply")
.arg("(drv: drv.src.owner)")
.output()
.expect(&format!("Failed to execute nix eval for {}", attr_path));
let owner = String::from_utf8_lossy(&output.stdout);
let output = Command::new("nix")
.arg("eval")
.arg("--raw")
.arg("--refresh")
.arg(&format!("github:nixos/nixpkgs/master#{}", attr_path))
.arg("--apply")
.arg("(drv: drv.src.repo)")
.output()
.expect(&format!("Failed to execute nix eval for {}", attr_path));
let repo = String::from_utf8_lossy(&output.stdout);
return Some(Github {
owner: owner.to_string(),
repo: repo.to_string(),
});
fn version_in_nixpkgs_staging_next(attr_path: &String) -> Option<String> {
version_in_nixpkgs_branch("staging-next", attr_path)
}
fn main() {
@ -139,17 +33,21 @@ fn main() {
for package in results {
println!("{} {}", package.id, package.attr_path);
let result: String = fetch_repology(&package.attr_path).unwrap().to_string();
let result: String = repology::latest_version(&package.attr_path)
.unwrap()
.to_string();
println!("newest repology version {}", result);
let version_in_nixpkgs_master: String = version_in_nixpkgs_master(&package.attr_path);
let version_in_nixpkgs_master: String =
version_in_nixpkgs_master(&package.attr_path).unwrap();
println!("nixpkgs master version {}", version_in_nixpkgs_master);
let version_in_nixpkgs_staging: String = version_in_nixpkgs_staging(&package.attr_path);
let version_in_nixpkgs_staging: String =
version_in_nixpkgs_staging(&package.attr_path).unwrap();
println!("nixpkgs staging version {}", version_in_nixpkgs_staging);
let version_in_nixpkgs_staging_next: String =
version_in_nixpkgs_staging_next(&package.attr_path);
version_in_nixpkgs_staging_next(&package.attr_path).unwrap();
println!(
"nixpkgs staging_next version {}",
version_in_nixpkgs_staging_next
@ -170,10 +68,10 @@ fn main() {
.execute(connection)
.unwrap();
if let Some(github) = maybe_github(&package.attr_path) {
if let Some(github) = github::from(&package.attr_path) {
println!("found github for {}", package.attr_path);
let vgithub: String = fetch_github_latest_release(&github).unwrap().to_string();
let vgithub: String = github::latest_release(&github).unwrap().to_string();
println!("version github {}", vgithub);
let now = Some(Utc::now().naive_utc());
diesel::update(packages.find(&package.id))

16
rust/src/nix.rs Normal file
View File

@ -0,0 +1,16 @@
use std::process::Command;
pub fn eval(branch: &str, attr_path: &String, apply: &str) -> Option<String> {
let output = Command::new("nix")
.arg("eval")
.arg("--raw")
.arg("--refresh")
.arg(&format!("github:nixos/nixpkgs/{}#{}", branch, attr_path))
.arg("--apply")
.arg(apply)
.output();
match output {
Ok(output) => Some(String::from_utf8_lossy(&output.stdout).to_string()),
Err(_) => None,
}
}

22
rust/src/repology.rs Normal file
View File

@ -0,0 +1,22 @@
pub fn latest_version(project_name: &String) -> Result<json::JsonValue, &'static str> {
let body = ureq::get(&format!(
"https://repology.org/api/v1/project/{}",
project_name
))
.set("User-Agent", "nixpkgs-update")
.call()
.unwrap()
.into_string()
.unwrap();
let json = json::parse(&body).unwrap();
if let json::JsonValue::Array(projects) = json {
for project in projects {
if let json::JsonValue::Object(project_repo) = project {
if project_repo["status"] == "newest" {
return Ok(project_repo.get("version").unwrap().clone());
}
}
}
}
Err("Couldn't find")
}