38 releases
| 0.4.2 | Aug 27, 2025 |
|---|---|
| 0.4.1 | Jan 14, 2025 |
| 0.4.0 | Oct 23, 2024 |
| 0.1.16 | Jun 15, 2024 |
| 0.1.15 | Sep 23, 2019 |
#128 in Data structures
1,591 downloads per month
Used in 3 crates
320KB
3.5K
SLoC
pkgsrc-rs
A Rust interface to the pkgsrc infrastructure, binary package archives, and the pkg_install pkgdb.
This is being developed alongside:
- mktool, a collection of tools that provide fast alternate implementations for various pkgsrc/mk scripts.
- bob, a pkgsrc package builder.
- pm, an exploration of what a binary package manager might look like (not currently being developed).
You should expect things to change over time as each interface adapts to better support these utilities, though I will still make sure to use semver versioning accordingly to avoid gratuitously breaking downstream utilities.
Example
This is a simple implementation of pkg_info(8) that supports the default
output format, i.e. list all currently installed packages and their single-line
comment.
use pkgsrc::{MetadataEntry, PkgDB};
use std::path::Path;
fn main() -> Result<(), std::io::Error> {
let pkgdb = PkgDB::open(Path::new("/var/db/pkg"))?;
for pkg in pkgdb {
let pkg = pkg?;
println!("{:20} {}",
pkg.pkgname(),
pkg.read_metadata(MetadataEntry::Comment)?
.trim()
);
}
Ok(())
}
Status
- pkg_match() is implemented and verified to be correct against a large input of matches.
- Metadata handles "+*" files contained in an archive and is able to verify that the archive contains a valid package.
- PkgDB handles local pkg databases, currently supporting the regular file-backed repository, but with flexible support for future sqlite3-backed repositories.
- Summary handles pkg_summary(5) parsing and generation.
MSRV
As a library I want to keep it to as old an MSRV as reasonable, and so the current requirements are:
edition = "2021"rust-version = "1.74.1"
as calculated by cargo msrv. The limiting factor for supporting even older
versions is serde. The plan is to keep the requirements to the minimum that
our dependencies require.
License
This project is licensed under the ISC license.
Testing/compatibility notes
Generate list of dependency matches.
sqlite3 /var/db/pkgin/pkgin.db 'SELECT remote_deps_dewey FROM remote_deps' | sort | uniq > pkgdeps.txt
Generate list of package names
sqlite3 /var/db/pkgin/pkgin.db 'SELECT fullpkgname FROM remote_pkg' >pkgnames.txt
Implement the following algorithm in both C and Rust and compare output
while read pattern; do
while read pkg; do
pkg_match "${pattern}" "${pkg}"
printf "%s\t%s\t%s", ${pattern}, ${pkg}, $? >> outfile
done < pkgnames.txt
done < pkgdeps.txt
As an added bonus, the C version took 55 seconds to generate 158,916,879 matches, whilst the Rust version took 42 seconds.
Dependencies
~3–15MB
~168K SLoC