27 个版本

新增 0.1.27 2024 年 8 月 24 日
0.1.26 2024 年 8 月 21 日
0.1.16 2024 年 6 月 15 日
0.1.15 2019 年 9 月 23 日
0.1.7 2019 年 8 月 26 日

174数据库接口 中排名

Download history 156/week @ 2024-06-15 1/week @ 2024-06-22 180/week @ 2024-07-27 362/week @ 2024-08-03 49/week @ 2024-08-10 823/week @ 2024-08-17

1,414 每月下载量
用于 mktool

ISC 许可证

200KB
3K SLoC

pkgsrc-rs

Build Status Downloads Crates.io Documentation

pkgsrc 包和 pkg_install pkgdb 的 Rust 接口。

该软件正在与 pm 一起开发,pm 是 pkgsrc 包管理器的 Rust 实现。所有处理底层 pkg_install 例程的代码都将放在这里。

示例

这是一个简单的 pkg_info(8) 实现,支持默认输出格式,即列出所有已安装的包及其单行注释。

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(())
}

状态

  • 已实现并验证了 pkg_match(),对大量匹配输入进行了验证。
  • 元数据处理存档中的 "+*" 文件,并能够验证存档中包含有效的包。
  • PkgDB 处理本地 pkg 数据库,目前支持基于常规文件的仓库,但具有灵活的支持未来 sqlite3-backed 仓库的能力。
  • 摘要处理 pkg_summary(5) 的解析和生成。

许可证

本项目采用 ISC 许可证。

测试/兼容性说明

生成依赖匹配列表。

sqlite3 /var/db/pkgin/pkgin.db 'SELECT remote_deps_dewey FROM remote_deps' | sort | uniq > pkgdeps.txt

生成包名列表

sqlite3 /var/db/pkgin/pkgin.db 'SELECT fullpkgname FROM remote_pkg' >pkgnames.txt

在 C 和 Rust 中实现以下算法并比较输出

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

作为额外的好处,C 版本生成 158,916,879 个匹配需要 55 秒,而 Rust 版本需要 42 秒。

依赖

~4–13MB
~170K SLoC