Crates.io | pkgsrc |
lib.rs | pkgsrc |
version | 0.4.2 |
created_at | 2019-08-12 15:37:42.776675+00 |
updated_at | 2025-08-27 11:00:58.263233+00 |
description | Library for interacting with a pkgsrc installation |
homepage | https://github.com/jperkin/pkgsrc-rs |
repository | https://github.com/jperkin/pkgsrc-rs |
max_upload_size | |
id | 156152 |
size | 1,386,465 |
A Rust interface to the pkgsrc infrastructure, binary package archives, and the pkg_install pkgdb.
This is being developed alongside:
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.
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(())
}
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.
This project is licensed under the ISC license.
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.