From 82a626b7d410d18f62ad2c2670b3bc5ea52bb3b4 Mon Sep 17 00:00:00 2001 From: Yorhel Date: Sat, 11 Dec 2021 16:18:05 +0100 Subject: [PATCH] indexer+www: Support Alpine Linux repos --- indexer/src/main.rs | 15 ++++++ indexer/src/sys_alpine.rs | 99 ++++++++++++++++++++++++++++++++++++++ www/images/alpine.png | Bin 0 -> 903 bytes www/man.css | 1 + 4 files changed, 115 insertions(+) create mode 100644 indexer/src/sys_alpine.rs create mode 100644 www/images/alpine.png diff --git a/indexer/src/main.rs b/indexer/src/main.rs index 5b39092..f8c1933 100644 --- a/indexer/src/main.rs +++ b/indexer/src/main.rs @@ -7,6 +7,7 @@ mod archread; mod man; mod open; mod pkg; +mod sys_alpine; mod sys_arch; mod sys_deb; mod sys_freebsd1; @@ -41,6 +42,12 @@ fn main() { (@arg arch: --arch +takes_value "Architecture") (@arg FILE: +required "Package file") ) + (@subcommand alpine => + (about: "Index an Alpine Linux repository") + (@arg sys: --sys +required +takes_value "System short-name") + (@arg mirror: --mirror +required +takes_value "Mirror URL") + (@arg repo: --repo +required +takes_value "Repository name") + ) (@subcommand arch => (about: "Index an Arch Linux repository") (@arg sys: --sys +required +takes_value "System short-name") @@ -127,6 +134,14 @@ fn main() { }); } + if let Some(matches) = arg.subcommand_matches("alpine") { + let sys = sysbyshort(&mut db, matches.value_of("sys").unwrap()); + sys_alpine::sync(&mut db, sys, + matches.value_of("mirror").unwrap(), + matches.value_of("repo").unwrap() + ); + } + if let Some(matches) = arg.subcommand_matches("arch") { let sys = sysbyshort(&mut db, matches.value_of("sys").unwrap()); sys_arch::sync(&mut db, sys, diff --git a/indexer/src/sys_alpine.rs b/indexer/src/sys_alpine.rs new file mode 100644 index 0000000..241ca3e --- /dev/null +++ b/indexer/src/sys_alpine.rs @@ -0,0 +1,99 @@ +use std::str::FromStr; +use std::io::{Read,BufRead,BufReader}; +use postgres; + +use crate::archive; +use crate::open; +use crate::pkg; + +// https://git.alpinelinux.org/apk-tools/tree/doc/apk-repositories.5.scd +// https://git.alpinelinux.org/apk-tools/tree/src/package.c#n874 (apk_pkg_write_index_entry) + +pub fn read_index(pg: &mut T, sys: i32, mirror: &str, repo: &str, lst: R) { + let rd = BufReader::new(lst); + + let mut name = None; + let mut version = None; + let mut builddate = None; + let mut arch = None; + let mut lineno: u32 = 0; + + for line in rd.lines() { + lineno += 1; + let line = match line { + Err(e) => { error!("Can't read package index: {}", e); return }, + Ok(x) => x, + }; + + if line.starts_with("P:") { + name = Some(line[2..].to_string()); + } else if line.starts_with("V:") { + version = Some(line[2..].to_string()); + } else if line.starts_with("t:") { + builddate = i64::from_str(&line[2..]).ok(); + } else if line.starts_with("A:") { + arch = Some(line[2..].to_string()); + } + if line != "" { + continue; + } + + if name.is_none() || version.is_none() { + warn!("Package without name or version on line {}", lineno); + return; + } + + let pname = name.as_ref().unwrap(); + let pver = version.as_ref().unwrap(); + if pname == "man-pages" || pname.ends_with("-doc") { + let p = format!("{}/{}/x86_64/{}-{}.apk", mirror, repo, pname, pver); + pkg::pkg(pg, pkg::PkgOpt{ + force: false, + sys: sys, + cat: repo, + pkg: pname, + ver: pver, + date: builddate.map(pkg::Date::Found).unwrap_or(pkg::Date::Max), + arch: arch.as_deref(), + file: open::Path{ + path: &p, + cache: false, + canbelocal: false, + }, + }); + } + + name = None; + version = None; + builddate = None; + arch = None; + } +} + + +pub fn sync(pg: &mut T, sys: i32, mirror: &str, repo: &str) { + info!("Reading packages from {} {}", mirror, repo); + + let path = format!("{}/{}/x86_64/APKINDEX.tar.gz", mirror, repo); + let path = open::Path{ path: &path, cache: true, canbelocal: false }; + let mut index = match path.open() { + Err(e) => { error!("Can't read package index: {}", e); return }, + Ok(x) => x, + }; + + let ent = match archive::Archive::open_archive(&mut index) { + Err(e) => { error!("Can't read package index: {}", e); return }, + Ok(x) => x, + }; + + let r = archive::walk(ent, |x| { + if x.path() == Some("APKINDEX") { + read_index(pg, sys, mirror, repo, x); + } + Ok(true) + }); + + if let Err(e) = r { + error!("Error reading package index: {}", e); + } +} diff --git a/www/images/alpine.png b/www/images/alpine.png new file mode 100644 index 0000000000000000000000000000000000000000..ccc839be2c4714d9f0c875273112bef41c03023d GIT binary patch literal 903 zcmV;219<$2P)g}DXx3j#)`TF|g=jwQkq2J=>?eFn!hMdOC(|L}f`~3WSkE6N4 z%IfUyVttmx%hKWG=k)dVdXJ*X&(^%d%;@XwT6mI4Zj7a{yuQZHZ-<@3%F?8;y!`zA z^!4|_$k4*c(R`4kZH1fS<>{iXyY=?>ft02uUxLQX)aB>vpscy}_xOdEsq5|U=IHB= zp04@%`k$=1$j;R`W`?1yy42X-;^pX5bda#R#AAM!;pFI%p|F6HruUoI3;+ND-AP12 zRCobm7zzNuxEvb+00BS%J01XF|6R2J(uYtSP;w{?M{Ga1z>(nFB5@&iLup)SwGLx( zWzABY$CY>U2oVo4OeNtdjUyL4l{}P+54EvL59<-YKmdSKyO*_X+up5h+wJ?GyU9%S zwU_vhW>jG`X>(@Fzr=O zWNUpbj9FVTb-JJHqd#Vs^u&?JOw>+ttar+KG5^^)tuLhMiBncC*}jEd=LF8Yf^(c`uH`BC z7Q9LFrbAA&J#H;`%-lbSx4@4*K0$ik_y`bbo&zsKTED*Gk6~QG?{xGd@Oh5}-a`k! zzNhM|G