36 releases

0.4.0 Oct 23, 2024
0.3.1 Oct 14, 2024
0.2.0 Oct 6, 2024
0.1.32 Sep 13, 2024
0.1.7 Aug 26, 2019

#94 in Operating systems


Used in 3 crates

ISC license

315KB
3.5K SLoC

pkgsrc-rs

Downloads Crates.io Documentation

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.

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

~4–13MB
~175K SLoC