mirror of
https://github.com/ryantm/nixpkgs-update.git
synced 2024-10-05 18:08:04 +03:00
rust: refactor
This commit is contained in:
parent
d8dffc166b
commit
10333058f9
48
rust/src/github.rs
Normal file
48
rust/src/github.rs
Normal 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(),
|
||||
})
|
||||
}
|
146
rust/src/main.rs
146
rust/src/main.rs
@ -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
16
rust/src/nix.rs
Normal 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
22
rust/src/repology.rs
Normal 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")
|
||||
}
|
Loading…
Reference in New Issue
Block a user