rpm/lib.rs
1//! # rpm-rs
2//!
3//! A library providing API to parse rpms as well as
4//! creating rpms from individual files.
5//!
6//! # Example
7//!
8//! ```
9//! # #[cfg(feature = "signature-pgp")]
10//! use rpm::{
11//! signature::pgp::{
12//! Signer,
13//! Verifier
14//! },
15//! };
16//! use std::str::FromStr;
17//!
18//! # fn main() -> Result<(), Box<dyn std::error::Error>> {
19//! # let _ = env_logger::Builder::new().filter_level(log::LevelFilter::Trace).is_test(true).try_init();
20//! # #[cfg(feature = "signature-pgp")]
21//! # {
22//! let raw_secret_key = std::fs::read("./test_assets/secret_key.asc")?;
23//! // It's recommended to use timestamp of last commit in your VCS
24//! let source_date = 1_600_000_000;
25//! let pkg = rpm::PackageBuilder::new("test", "1.0.0", "MIT", "x86_64", "some awesome package")
26//! .compression(rpm::CompressionType::Gzip)
27//! .with_file(
28//! "./test_assets/awesome.toml",
29//! rpm::FileOptions::new("/etc/awesome/config.toml").is_config(),
30//! )?
31//! // file mode is inherited from source file
32//! .with_file(
33//! "./test_assets/awesome.py",
34//! rpm::FileOptions::new("/usr/bin/awesome"),
35//! )?
36//! .with_file(
37//! "./test_assets/awesome.toml",
38//! // you can set a custom mode and custom user too
39//! rpm::FileOptions::new("/etc/awesome/second.toml")
40//! .mode(rpm::FileMode::regular(0o644))
41//! .user("hugo"),
42//! )?
43//! .pre_install_script("echo preinst")
44//! // If you don't need reproducible builds,
45//! // you can remove the following line
46//! .source_date(source_date)
47//! .build_host(gethostname::gethostname().to_str().unwrap_or("host"))
48//! .add_changelog_entry(
49//! "Max Mustermann <max@example.com> - 0.1-29",
50//! "- was awesome, eh?",
51//! chrono::DateTime::parse_from_rfc2822("Wed, 19 Apr 2023 23:16:09 GMT")
52//! .expect("Date 1 is correct. qed"),
53//! )
54//! .add_changelog_entry(
55//! "Charlie Yom <test2@example.com> - 0.1-28",
56//! "- yeah, it was",
57//! // Raw timestamp for 1996-08-14 05:20:00
58//! 840_000_000,
59//! )
60//! .requires(rpm::Dependency::any("wget"))
61//! .vendor("corporation or individual")
62//! .url("www.github.com/repo")
63//! .vcs("git:repo=example_repo:branch=example_branch:sha=example_sha")
64//! .build_and_sign(Signer::load_from_asc_bytes(&raw_secret_key)?)?;
65//! let mut f = std::fs::File::create("/tmp/awesome.rpm")?;
66//! pkg.write(&mut f)?;
67//!
68//! // reading
69//! let raw_pub_key = std::fs::read("test_assets/public_key.asc")?;
70//! let pkg = rpm::Package::open("/tmp/awesome.rpm")?;
71//! // verifying
72//! pkg.verify_signature(Verifier::load_from_asc_bytes(&raw_pub_key)?)?;
73//! # }
74//! # Ok(())
75//! # }
76//! ```
77
78#![allow(unknown_lints, clippy::uninlined_format_args)]
79
80mod errors;
81pub use crate::errors::*;
82
83pub(crate) mod constants;
84pub use crate::constants::*;
85
86mod rpm;
87pub use crate::rpm::*;
88
89#[cfg(test)]
90mod tests;