4 个版本 (破坏性更新)

0.4.0 2023 年 11 月 18 日
0.3.0 2023 年 6 月 11 日
0.2.0 2023 年 6 月 1 日
0.1.0 2023 年 4 月 4 日

#833Unix API

每月 36 次下载

LGPL-3.0 或更新

125KB
2K SLoC

alpm-types

Arch Linux 包管理类型。

提供的类型及其实现的特性和属性可用于与包管理相关的应用程序(例如包管理器、仓库管理器、专用解析器和文件规范等),这些应用程序处理基于 libalpm 的包。

该库力求作为一个叶子库提供所有底层类型,以便在应用程序之间共享,并且不需要任何应用程序自己实现。

文档

示例

系统

已知的 CPU 架构由 Architecture 枚举表示。您可以从字符串创建成员等。

use std::str::FromStr;
use alpm_types::Architecture;

assert_eq!(Architecture::from_str("aarch64"), Ok(Architecture::Aarch64));

校验和

校验和为支持的算法集以通用方式实现

  • Blake2b512
  • Md5警告:强烈不建议使用此算法,因为它在密码学上是不安全的)
  • Sha1警告:强烈不建议使用此算法,因为它在密码学上是不安全的)
  • Sha224
  • Sha256
  • Sha384
  • Sha512

注意:与 makepkg/pacman 不同,该库不支持使用非标准的 CRC-32(在不同库中具有不同的实现)和密码学上不安全的 cksum-style。

上述算法在 crate 的 digests 模块中重新导出,因此用户无需添加 blake2md-5sha1sha2 crate,而只需依赖 alpm-types

use std::str::FromStr;
use alpm_types::{digests::Blake2b512, Checksum};

let checksum = Checksum::<Blake2b512>::calculate_from("foo\n");

let digest = vec![
    210, 2, 215, 149, 29, 242, 196, 183, 17, 202, 68, 180, 188, 201, 215, 179, 99, 250, 66,
    82, 18, 126, 5, 140, 26, 145, 14, 192, 91, 108, 208, 56, 215, 28, 194, 18, 33, 192, 49,
    192, 53, 159, 153, 62, 116, 107, 7, 245, 150, 92, 248, 197, 195, 116, 106, 88, 51, 122,
    217, 171, 101, 39, 142, 119,
];
assert_eq!(checksum.inner(), digest);
assert_eq!(
    format!("{}", checksum),
    "d202d7951df2c4b711ca44b4bcc9d7b363fa4252127e058c1a910ec05b6cd038d71cc21221c031c0359f993e746b07f5965cf8c5c3746a58337ad9ab65278e77",
);

// create checksum from hex string
let checksum = Checksum::<Blake2b512>::from_str("d202d7951df2c4b711ca44b4bcc9d7b363fa4252127e058c1a910ec05b6cd038d71cc21221c031c0359f993e746b07f5965cf8c5c3746a58337ad9ab65278e77").unwrap();
assert_eq!(checksum.inner(), digest);

日期

使用 BuildDate 结构体表示包构建的日期,该结构体以自纪元以来的秒跟踪此信息。

除了可以从 i64 或 str 创建 BuildDate 之外,还可以从 DateTime<Utc> 创建。

use time::OffsetDateTime;
use alpm_types::BuildDate;

let datetime: BuildDate = OffsetDateTime::from_unix_timestamp(1).unwrap().into();
assert_eq!(BuildDate::new(1), datetime);

环境

构建环境中的可用选项使用 BuildEnv 跟踪。

use alpm_types::BuildEnv;

let option = BuildEnv::new("foo").unwrap();
assert_eq!(option.on(), true);
assert_eq!(option.name(), "foo");

安装到环境中的软件包可以使用 Installed 描述。

use alpm_types::Installed;

assert!(Installed::new("foo-1:1.0.0-1-any").is_ok());
assert!(Installed::new("foo-1:1.0.0-1-foo").is_err());
assert!(Installed::new("foo-1:1.0.0-any").is_err());

用于打包的选项使用 PackageOption 跟踪。

use alpm_types::PackageOption;

let option = PackageOption::new("foo").unwrap();
assert_eq!(option.on(), true);
assert_eq!(option.name(), "foo");

大小

软件包的压缩大小由 CompressedSize 表示,它跟踪字节数量,也可以从 str 创建。

use alpm_types::CompressedSize;
use std::str::FromStr;

assert_eq!(CompressedSize::from_str("1"), Ok(CompressedSize(1)));

软件包的安装大小由 InstalledSize 表示,它跟踪字节数量,也可以从 str 创建。

use alpm_types::InstalledSize;
use std::str::FromStr;

assert_eq!(InstalledSize::from_str("1"), Ok(InstalledSize(1)));

名称

软件包的名称限制在特定字符集。您可以直接或从 str 创建 Name,这将返回一个 Result。

use std::str::FromStr;
use alpm_types::{Error, Name};

assert_eq!(Name::from_str("[email protected]_+"), Name::new("[email protected]_+".to_string()));
assert_eq!(Name::from_str(".foo"), Err(Error::InvalidName(".foo".to_string())));

路径

软件包构建环境的构建目录可以使用 BuildDir 描述。

use alpm_types::BuildDir;

let builddir = BuildDir::new("/build").unwrap();
assert_eq!("/build", format!("{}", builddir));

软件包构建环境的起始目录可以使用 StartDir 描述。

use alpm_types::StartDir;

let startdir = StartDir::new("/start").unwrap();
assert_eq!("/start", format!("{}", startdir));

Pkg

软件包的作者使用 Packager 类型标识,该类型描述用户 ID(名称和有效电子邮件地址)。

use std::str::FromStr;
use alpm_types::Packager;

let packager = Packager::new("Foobar McFooface <[email protected]>").unwrap();
assert_eq!("Foobar McFooface", packager.name());
assert_eq!("[email protected]", packager.email().to_string());

使用 PkgType 枚举区分软件包类型。其变体可以从 str 构造。

use std::str::FromStr;
use alpm_types::PkgType;

assert_eq!(PkgType::from_str("pkg"), Ok(PkgType::Package));

软件包的源可以使用 Source 描述(由可选的 FilenameSourceLocation 组成)。

use alpm_types::{Filename, Source, SourceLocation};

let source = Source::new("foopkg-1.2.3.tar.gz::https://example.com/download").unwrap();

assert_eq!(source.filename.unwrap(), Filename::new("foopkg-1.2.3.tar.gz".to_string()).unwrap());
let SourceLocation::Url(url) = source.location else { panic!() };

版本

构建工具的版本和 CPU 架构使用 BuildToolVer 跟踪。

use alpm_types::BuildToolVer;

let buildtoolver = BuildToolVer::new("1.0.0-1-any").unwrap();

assert_eq!("1.0.0-1-any", format!("{}", buildtoolver));

复合类型的模式(例如,用于描述 .BUILDINFO.PKGINFO 文件)需要模式版本来为其功能进行版本控制。这就是 SchemaVersion 的用途。

use std::str::FromStr;
use alpm_types::SchemaVersion;

let version = SchemaVersion::new("1.0.0").unwrap();

assert_eq!("1.0.0", format!("{}", version));

软件包版本的处理由 Version 类型(由可选的 EpochPkgver 和可选的 Pkgrel 组成)覆盖。它的 vercmp() 方法实现与 libalpm/pacman 的 vercmp 兼容。

use std::str::FromStr;
use alpm_types::Version;

let version = Version::new("1.0.0").unwrap();

assert_eq!("1.0.0", format!("{}", version));

let version_a = Version::new("1.0.0").unwrap();
let version_b = Version::new("1.1.0").unwrap();

assert_eq!(Version::vercmp(&version_a, &version_b), -1);

// create a Version that is guaranteed to have a Pkgrel
assert!(Version::with_pkgrel("1.0.0-1").is_ok());
assert!(Version::with_pkgrel("1.0.0").is_err());

可以使用 VersionComparisonVersionRequirement 进行版本比较。

use std::str::FromStr;
use alpm_types::{Version, VersionComparison, VersionRequirement};

let requirement = VersionRequirement::new(">=1.5-1").unwrap();
assert_eq!(requirement.comparison, VersionComparison::GreaterOrEqual);
assert_eq!(requirement.version, Version::new("1.5-1").unwrap());
assert!(requirement.is_satisfied_by(&Version::new("1.5-3").unwrap()));

贡献

请参阅贡献指南,了解如何为此项目做出贡献。

许可证

本项目根据LGPL-3.0-or-later 许可证条款授权。

依赖

~4.5–6.5MB
~149K SLoC