#![allow(clippy::too_many_arguments)]
use std::cmp::Ordering;
use std::io::{BufReader, Cursor};
use std::path::PathBuf;
use pyo3::exceptions::{PyIOError, PyRuntimeError, PyValueError};
use pyo3::prelude::*;
use pyo3::types::{PyDict, PyType};
fn to_pyerr(e: crate::Error) -> PyErr {
match e {
crate::Error::Io(io_err) => PyIOError::new_err(io_err.to_string()),
crate::Error::Hex(_)
| crate::Error::InvalidDestinationPath { .. }
| crate::Error::InvalidCapabilities { .. }
| crate::Error::InvalidFileOptions { .. }
| crate::Error::InvalidFileMode { .. }
| crate::Error::InvalidDigestLength { .. }
| crate::Error::InvalidControlChar { .. }
| crate::Error::InvalidCharacters { .. }
| crate::Error::InvalidFileCaps(_)
| crate::Error::TimestampConv(_)
| crate::Error::UnknownCompressorType(_)
| crate::Error::UnsupportedCompressorType(_)
| crate::Error::UnsupportedDigestAlgorithm(_)
| crate::Error::BuilderReuse => PyValueError::new_err(e.to_string()),
other => PyRuntimeError::new_err(other.to_string()),
}
}
#[pyclass(name = "DigestAlgorithm", from_py_object)]
#[derive(Clone)]
pub struct PyDigestAlgorithm(pub(crate) crate::DigestAlgorithm);
#[allow(non_snake_case)]
#[pymethods]
impl PyDigestAlgorithm {
#[classattr]
fn MD5() -> Self {
Self(crate::DigestAlgorithm::Md5)
}
#[classattr]
fn SHA2_224() -> Self {
Self(crate::DigestAlgorithm::Sha2_224)
}
#[classattr]
fn SHA2_256() -> Self {
Self(crate::DigestAlgorithm::Sha2_256)
}
#[classattr]
fn SHA2_384() -> Self {
Self(crate::DigestAlgorithm::Sha2_384)
}
#[classattr]
fn SHA2_512() -> Self {
Self(crate::DigestAlgorithm::Sha2_512)
}
#[classattr]
fn SHA3_256() -> Self {
Self(crate::DigestAlgorithm::Sha3_256)
}
#[classattr]
fn SHA3_512() -> Self {
Self(crate::DigestAlgorithm::Sha3_512)
}
fn __repr__(&self) -> String {
format!("DigestAlgorithm.{:?}", self.0)
}
fn __str__(&self) -> String {
format!("{:?}", self.0)
}
fn __eq__(&self, other: &PyDigestAlgorithm) -> bool {
self.0 == other.0
}
#[getter]
fn value(&self) -> u32 {
self.0 as u32
}
}
#[pyclass(name = "FileType", eq, eq_int, hash, frozen, from_py_object)]
#[derive(Clone, PartialEq, Hash)]
pub enum PyFileType {
Regular,
Dir,
SymbolicLink,
Other,
}
#[pymethods]
impl PyFileType {
fn __repr__(&self) -> &str {
match self {
PyFileType::Regular => "FileType.Regular",
PyFileType::Dir => "FileType.Dir",
PyFileType::SymbolicLink => "FileType.SymbolicLink",
PyFileType::Other => "FileType.Other",
}
}
}
impl From<crate::FileType> for PyFileType {
fn from(ft: crate::FileType) -> Self {
match ft {
crate::FileType::Regular => PyFileType::Regular,
crate::FileType::Dir => PyFileType::Dir,
crate::FileType::SymbolicLink => PyFileType::SymbolicLink,
crate::FileType::Other => PyFileType::Other,
}
}
}
#[pyclass(name = "FileMode", from_py_object)]
#[derive(Clone)]
pub struct PyFileMode(pub(crate) crate::FileMode);
#[pymethods]
impl PyFileMode {
fn __repr__(&self) -> String {
format!("{:?}", self.0)
}
#[getter]
fn raw_mode(&self) -> u16 {
self.0.raw_mode()
}
#[getter]
fn permissions(&self) -> u16 {
self.0.permissions()
}
#[getter]
fn file_type(&self) -> PyFileType {
self.0.file_type().into()
}
}
#[pyclass(name = "FileDigest", from_py_object)]
#[derive(Clone)]
pub struct PyFileDigest(pub(crate) crate::FileDigest);
#[pymethods]
impl PyFileDigest {
fn __repr__(&self) -> String {
format!(
"FileDigest(algo={:?}, digest={})",
self.0.algo,
self.0.as_hex()
)
}
fn __str__(&self) -> String {
self.0.as_hex().to_string()
}
#[getter]
fn digest(&self) -> &str {
self.0.as_hex()
}
#[getter]
fn algorithm(&self) -> PyDigestAlgorithm {
PyDigestAlgorithm(self.0.algo)
}
}
#[pyclass(name = "FileOwnership", from_py_object)]
#[derive(Clone)]
pub struct PyFileOwnership(pub(crate) crate::FileOwnership);
#[pymethods]
impl PyFileOwnership {
fn __repr__(&self) -> String {
format!(
"FileOwnership(user={:?}, group={:?})",
self.0.user, self.0.group
)
}
#[getter]
fn user(&self) -> &str {
&self.0.user
}
#[getter]
fn group(&self) -> &str {
&self.0.group
}
}
#[pyclass(name = "FileEntry", from_py_object)]
#[derive(Clone)]
pub struct PyFileEntry(pub(crate) crate::FileEntry);
#[pymethods]
impl PyFileEntry {
fn __repr__(&self) -> String {
format!("FileEntry({:?})", self.0.path.display().to_string())
}
#[getter]
fn path(&self) -> String {
self.0.path.display().to_string()
}
#[getter]
fn mode(&self) -> PyFileMode {
PyFileMode(self.0.mode)
}
#[getter]
fn ownership(&self) -> PyFileOwnership {
PyFileOwnership(self.0.ownership.clone())
}
#[getter]
fn modified_at(&self) -> u32 {
self.0.modified_at.0
}
#[getter]
fn size(&self) -> usize {
self.0.size
}
#[getter]
fn flags(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {
let cls = py.import("rpm_rs")?.getattr("FileFlags")?;
Ok(cls.call1((self.0.flags.bits(),))?.into())
}
#[getter]
fn digest(&self) -> Option<PyFileDigest> {
self.0.digest.clone().map(PyFileDigest)
}
#[getter]
fn caps(&self) -> Option<String> {
self.0.caps.clone()
}
#[getter]
fn linkto(&self) -> Option<&str> {
self.0.linkto.as_deref()
}
#[getter]
fn ima_signature(&self) -> Option<String> {
self.0.ima_signature.clone()
}
}
#[pyclass(name = "ChangelogEntry", from_py_object)]
#[derive(Clone)]
pub struct PyChangelogEntry(pub(crate) crate::ChangelogEntry);
#[pymethods]
impl PyChangelogEntry {
fn __repr__(&self) -> String {
format!("ChangelogEntry(name={:?})", self.0.name)
}
#[getter]
fn name(&self) -> &str {
&self.0.name
}
#[getter]
fn timestamp(&self) -> u64 {
self.0.timestamp
}
#[getter]
fn description(&self) -> &str {
&self.0.description
}
}
#[pyclass(name = "Dependency")]
pub struct PyDependency(crate::Dependency);
impl From<crate::Dependency> for PyDependency {
fn from(d: crate::Dependency) -> Self {
PyDependency(d)
}
}
#[pymethods]
impl PyDependency {
fn __repr__(&self) -> String {
format!(
"Dependency(name={:?}, version={:?})",
self.0.name, self.0.version
)
}
fn __str__(&self) -> String {
self.0.to_string()
}
#[getter]
fn name(&self) -> &str {
&self.0.name
}
#[getter]
fn version(&self) -> &str {
&self.0.version
}
#[getter]
fn flags(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {
let cls = py.import("rpm_rs")?.getattr("DependencyFlags")?;
Ok(cls.call1((self.0.flags.bits(),))?.into())
}
}
#[pyclass(name = "Scriptlet")]
pub struct PyScriptlet(crate::Scriptlet);
impl From<crate::Scriptlet> for PyScriptlet {
fn from(s: crate::Scriptlet) -> Self {
PyScriptlet(s)
}
}
#[pymethods]
impl PyScriptlet {
fn __repr__(&self) -> String {
format!("Scriptlet(program={:?})", self.0.program)
}
#[getter]
fn script(&self) -> &str {
&self.0.script
}
#[getter]
fn flags(&self, py: Python<'_>) -> PyResult<Option<Py<PyAny>>> {
match self.0.flags {
Some(f) => {
let cls = py.import("rpm_rs")?.getattr("ScriptletFlags")?;
Ok(Some(cls.call1((f.bits(),))?.into()))
}
None => Ok(None),
}
}
#[getter]
fn program(&self) -> Option<Vec<String>> {
self.0.program.clone()
}
}
#[pyclass(name = "Evr", eq, ord, from_py_object)]
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct PyEvr(crate::Evr<'static>);
impl<'a> From<crate::Evr<'a>> for PyEvr {
fn from(e: crate::Evr<'a>) -> Self {
let (epoch, version, release) = e.values();
PyEvr(crate::Evr::new(
epoch.to_owned(),
version.to_owned(),
release.to_owned(),
))
}
}
#[pymethods]
impl PyEvr {
#[new]
fn new(epoch: &str, version: &str, release: &str) -> Self {
PyEvr(crate::Evr::new(
epoch.to_owned(),
version.to_owned(),
release.to_owned(),
))
}
#[classmethod]
fn parse(_cls: &Bound<'_, PyType>, evr: &str) -> Self {
let (epoch, version, release) = crate::Evr::parse_values(evr);
PyEvr(crate::Evr::new(
epoch.to_owned(),
version.to_owned(),
release.to_owned(),
))
}
fn __repr__(&self) -> String {
format!(
"Evr(epoch={:?}, version={:?}, release={:?})",
self.0.epoch(),
self.0.version(),
self.0.release(),
)
}
fn __str__(&self) -> String {
self.0.to_string()
}
#[getter]
fn epoch(&self) -> &str {
self.0.epoch()
}
#[getter]
fn version(&self) -> &str {
self.0.version()
}
#[getter]
fn release(&self) -> &str {
self.0.release()
}
fn as_normalized_form(&self) -> String {
self.0.as_normalized_form()
}
}
#[pyclass(name = "Nevra", eq, ord, from_py_object)]
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord)]
pub struct PyNevra(crate::Nevra<'static>);
impl<'a> From<crate::Nevra<'a>> for PyNevra {
fn from(n: crate::Nevra<'a>) -> Self {
let (name, epoch, version, release, arch) = n.values();
PyNevra(crate::Nevra::new(
name.to_owned(),
epoch.to_owned(),
version.to_owned(),
release.to_owned(),
arch.to_owned(),
))
}
}
#[pymethods]
impl PyNevra {
#[new]
fn new(name: &str, epoch: &str, version: &str, release: &str, arch: &str) -> Self {
PyNevra(crate::Nevra::new(
name.to_owned(),
epoch.to_owned(),
version.to_owned(),
release.to_owned(),
arch.to_owned(),
))
}
#[classmethod]
fn parse(_cls: &Bound<'_, PyType>, nevra: &str) -> Self {
let (name, epoch, version, release, arch) = crate::Nevra::parse_values(nevra);
PyNevra(crate::Nevra::new(
name.to_owned(),
epoch.to_owned(),
version.to_owned(),
release.to_owned(),
arch.to_owned(),
))
}
fn __repr__(&self) -> String {
format!(
"Nevra(name={:?}, epoch={:?}, version={:?}, release={:?}, arch={:?})",
self.0.name(),
self.0.epoch(),
self.0.version(),
self.0.release(),
self.0.arch(),
)
}
fn __str__(&self) -> String {
self.0.to_string()
}
#[getter]
fn name(&self) -> &str {
self.0.name()
}
#[getter]
fn epoch(&self) -> &str {
self.0.epoch()
}
#[getter]
fn version(&self) -> &str {
self.0.version()
}
#[getter]
fn release(&self) -> &str {
self.0.release()
}
#[getter]
fn arch(&self) -> &str {
self.0.arch()
}
fn evr(&self) -> PyEvr {
PyEvr(crate::Evr::new(
self.0.epoch().to_owned(),
self.0.version().to_owned(),
self.0.release().to_owned(),
))
}
fn as_normalized_form(&self) -> String {
self.0.as_normalized_form()
}
fn nvra(&self) -> String {
self.0.nvra()
}
}
enum HeaderInner {
Main(crate::Header<crate::IndexTag>),
Signature(crate::Header<crate::IndexSignatureTag>),
}
#[pyclass(name = "Header")]
pub struct PyHeader(HeaderInner);
#[pymethods]
impl PyHeader {
fn entry_is_present(&self, tag: u32) -> bool {
match &self.0 {
HeaderInner::Main(h) => h.entry_is_present(tag),
HeaderInner::Signature(h) => h.entry_is_present(tag),
}
}
fn entry(&self, tag: u32, py: Python<'_>) -> PyResult<Py<PyAny>> {
let data = match &self.0 {
HeaderInner::Main(h) => h.entry(tag),
HeaderInner::Signature(h) => h.entry(tag),
}
.map_err(to_pyerr)?;
index_data_to_py(py, data)
}
fn get_all_entries(&self, py: Python<'_>) -> PyResult<Py<PyAny>> {
let entries = match &self.0 {
HeaderInner::Main(h) => h.get_all_entries(),
HeaderInner::Signature(h) => h.get_all_entries(),
}
.map_err(to_pyerr)?;
let dict = PyDict::new(py);
for (tag, data) in entries {
dict.set_item(tag, index_data_to_py(py, data)?)?;
}
Ok(dict.into_any().unbind())
}
}
#[pyclass(name = "PackageMetadata")]
pub struct PyPackageMetadata(pub(crate) crate::PackageMetadata);
#[pymethods]
impl PyPackageMetadata {
#[staticmethod]
fn open(path: PathBuf) -> PyResult<Self> {
crate::PackageMetadata::open(path)
.map(PyPackageMetadata)
.map_err(to_pyerr)
}
#[staticmethod]
fn from_bytes(data: &[u8]) -> PyResult<Self> {
let mut cursor = BufReader::new(Cursor::new(data));
crate::PackageMetadata::parse(&mut cursor)
.map(PyPackageMetadata)
.map_err(to_pyerr)
}
fn to_bytes(&self) -> PyResult<Vec<u8>> {
let mut buf = Vec::new();
self.0.write(&mut buf).map_err(to_pyerr)?;
Ok(buf)
}
#[getter]
fn header(&self) -> PyHeader {
PyHeader(HeaderInner::Main(self.0.header.clone()))
}
#[getter]
fn signature(&self) -> PyHeader {
PyHeader(HeaderInner::Signature(self.0.signature.clone()))
}
#[getter]
fn name(&self) -> PyResult<String> {
self.0.get_name().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn epoch(&self) -> PyResult<u32> {
self.0.get_epoch().map_err(to_pyerr)
}
#[getter]
fn version(&self) -> PyResult<String> {
self.0.get_version().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn release(&self) -> PyResult<String> {
self.0.get_release().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn arch(&self) -> PyResult<String> {
self.0.get_arch().map(str::to_owned).map_err(to_pyerr)
}
fn nevra(&self) -> PyResult<PyNevra> {
self.0.get_nevra().map(PyNevra::from).map_err(to_pyerr)
}
#[getter]
fn summary(&self) -> PyResult<String> {
self.0.get_summary().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn description(&self) -> PyResult<String> {
self.0
.get_description()
.map(str::to_owned)
.map_err(to_pyerr)
}
#[getter]
fn license(&self) -> PyResult<String> {
self.0.get_license().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn vendor(&self) -> PyResult<String> {
self.0.get_vendor().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn url(&self) -> PyResult<String> {
self.0.get_url().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn vcs(&self) -> PyResult<String> {
self.0.get_vcs().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn group(&self) -> PyResult<String> {
self.0.get_group().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn packager(&self) -> PyResult<String> {
self.0.get_packager().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn build_time(&self) -> PyResult<u64> {
self.0.get_build_time().map_err(to_pyerr)
}
#[getter]
fn build_host(&self) -> PyResult<String> {
self.0.get_build_host().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn cookie(&self) -> PyResult<String> {
self.0.get_cookie().map(str::to_owned).map_err(to_pyerr)
}
#[getter]
fn source_rpm(&self) -> PyResult<String> {
self.0.get_source_rpm().map(str::to_owned).map_err(to_pyerr)
}
fn is_source_package(&self) -> bool {
self.0.is_source_package()
}
#[getter]
fn installed_size(&self) -> PyResult<u64> {
self.0.get_installed_size().map_err(to_pyerr)
}
#[getter]
fn payload_compressor(&self) -> PyResult<String> {
self.0
.get_payload_compressor()
.map(|c| format!("{:?}", c))
.map_err(to_pyerr)
}
#[getter]
fn file_digest_algorithm(&self) -> PyResult<PyDigestAlgorithm> {
self.0
.get_file_digest_algorithm()
.map(PyDigestAlgorithm)
.map_err(to_pyerr)
}
fn pre_install_script(&self) -> PyResult<PyScriptlet> {
self.0
.get_pre_install_script()
.map(PyScriptlet::from)
.map_err(to_pyerr)
}
fn post_install_script(&self) -> PyResult<PyScriptlet> {
self.0
.get_post_install_script()
.map(PyScriptlet::from)
.map_err(to_pyerr)
}
fn pre_uninstall_script(&self) -> PyResult<PyScriptlet> {
self.0
.get_pre_uninstall_script()
.map(PyScriptlet::from)
.map_err(to_pyerr)
}
fn post_uninstall_script(&self) -> PyResult<PyScriptlet> {
self.0
.get_post_uninstall_script()
.map(PyScriptlet::from)
.map_err(to_pyerr)
}
fn pre_trans_script(&self) -> PyResult<PyScriptlet> {
self.0
.get_pre_trans_script()
.map(PyScriptlet::from)
.map_err(to_pyerr)
}
fn post_trans_script(&self) -> PyResult<PyScriptlet> {
self.0
.get_post_trans_script()
.map(PyScriptlet::from)
.map_err(to_pyerr)
}
fn pre_untrans_script(&self) -> PyResult<PyScriptlet> {
self.0
.get_pre_untrans_script()
.map(PyScriptlet::from)
.map_err(to_pyerr)
}
fn post_untrans_script(&self) -> PyResult<PyScriptlet> {
self.0
.get_post_untrans_script()
.map(PyScriptlet::from)
.map_err(to_pyerr)
}
fn provides(&self) -> PyResult<Vec<PyDependency>> {
self.0
.get_provides()
.map(|v| v.into_iter().map(PyDependency::from).collect())
.map_err(to_pyerr)
}
fn requires(&self) -> PyResult<Vec<PyDependency>> {
self.0
.get_requires()
.map(|v| v.into_iter().map(PyDependency::from).collect())
.map_err(to_pyerr)
}
fn conflicts(&self) -> PyResult<Vec<PyDependency>> {
self.0
.get_conflicts()
.map(|v| v.into_iter().map(PyDependency::from).collect())
.map_err(to_pyerr)
}
fn obsoletes(&self) -> PyResult<Vec<PyDependency>> {
self.0
.get_obsoletes()
.map(|v| v.into_iter().map(PyDependency::from).collect())
.map_err(to_pyerr)
}
fn recommends(&self) -> PyResult<Vec<PyDependency>> {
self.0
.get_recommends()
.map(|v| v.into_iter().map(PyDependency::from).collect())
.map_err(to_pyerr)
}
fn suggests(&self) -> PyResult<Vec<PyDependency>> {
self.0
.get_suggests()
.map(|v| v.into_iter().map(PyDependency::from).collect())
.map_err(to_pyerr)
}
fn enhances(&self) -> PyResult<Vec<PyDependency>> {
self.0
.get_enhances()
.map(|v| v.into_iter().map(PyDependency::from).collect())
.map_err(to_pyerr)
}
fn supplements(&self) -> PyResult<Vec<PyDependency>> {
self.0
.get_supplements()
.map(|v| v.into_iter().map(PyDependency::from).collect())
.map_err(to_pyerr)
}
fn file_paths(&self) -> PyResult<Vec<String>> {
self.0
.get_file_paths()
.map(|v| v.into_iter().map(|p| p.display().to_string()).collect())
.map_err(to_pyerr)
}
fn file_entries(&self) -> PyResult<Vec<PyFileEntry>> {
self.0
.get_file_entries()
.map(|v| v.into_iter().map(PyFileEntry).collect())
.map_err(to_pyerr)
}
fn changelog_entries(&self) -> PyResult<Vec<PyChangelogEntry>> {
self.0
.get_changelog_entries()
.map(|v| v.into_iter().map(PyChangelogEntry).collect())
.map_err(to_pyerr)
}
fn package_segment_offsets(&self) -> PyPackageSegmentOffsets {
PyPackageSegmentOffsets(self.0.get_package_segment_offsets())
}
fn raw_signatures(&self) -> PyResult<Vec<Vec<u8>>> {
self.0
.raw_signatures()
.map(|sigs| sigs.into_iter().map(|s| s.into_owned()).collect())
.map_err(to_pyerr)
}
}
#[pyclass(name = "PackageSegmentOffsets", frozen)]
pub struct PyPackageSegmentOffsets(crate::PackageSegmentOffsets);
#[pymethods]
impl PyPackageSegmentOffsets {
#[getter]
fn lead(&self) -> u64 {
self.0.lead
}
#[getter]
fn signature_header(&self) -> u64 {
self.0.signature_header
}
#[getter]
fn header(&self) -> u64 {
self.0.header
}
#[getter]
fn payload(&self) -> u64 {
self.0.payload
}
fn __repr__(&self) -> String {
format!(
"PackageSegmentOffsets(lead={}, signature_header={}, header={}, payload={})",
self.0.lead, self.0.signature_header, self.0.header, self.0.payload,
)
}
}
#[pyclass(name = "RpmFile")]
pub struct PyRpmFile(pub(crate) crate::RpmFile);
#[pymethods]
impl PyRpmFile {
fn __repr__(&self) -> String {
format!(
"RpmFile({:?}, {} bytes)",
self.0.metadata.path.display(),
self.0.content.len()
)
}
#[getter]
fn metadata(&self) -> PyFileEntry {
PyFileEntry(self.0.metadata.clone())
}
#[getter]
fn content(&self) -> &[u8] {
&self.0.content
}
}
#[pyclass(name = "Package")]
pub struct PyPackage(pub(crate) crate::Package);
#[pymethods]
impl PyPackage {
#[staticmethod]
fn open(path: PathBuf) -> PyResult<Self> {
crate::Package::open(path).map(PyPackage).map_err(to_pyerr)
}
#[staticmethod]
fn from_bytes(data: &[u8]) -> PyResult<Self> {
let mut reader = BufReader::new(Cursor::new(data));
crate::Package::parse(&mut reader)
.map(PyPackage)
.map_err(to_pyerr)
}
fn to_bytes(&self) -> PyResult<Vec<u8>> {
let mut buf = Vec::new();
self.0.write(&mut buf).map_err(to_pyerr)?;
Ok(buf)
}
fn write_file(&self, path: PathBuf) -> PyResult<()> {
self.0.write_file(path).map_err(to_pyerr)
}
fn write_to(&self, path: PathBuf) -> PyResult<String> {
self.0
.write_to(path)
.map(|p| p.to_string_lossy().into_owned())
.map_err(to_pyerr)
}
fn header_bytes(&self) -> PyResult<Vec<u8>> {
self.0.header_bytes().map_err(to_pyerr)
}
#[getter]
fn metadata(&self) -> PyPackageMetadata {
PyPackageMetadata(self.0.metadata.clone())
}
fn canonical_filename(&self) -> PyResult<String> {
self.0.canonical_filename().map_err(to_pyerr)
}
fn extract(&self, destination: &str) -> PyResult<()> {
self.0.extract(destination).map_err(to_pyerr)
}
fn files(&self) -> PyResult<Vec<PyRpmFile>> {
self.0
.files()
.map_err(to_pyerr)?
.map(|r| r.map(PyRpmFile).map_err(to_pyerr))
.collect()
}
fn verify_digests(&self) -> PyResult<()> {
self.0.verify_digests().map_err(to_pyerr)
}
fn check_digests(&self) -> PyResult<PyDigestReport> {
self.0.check_digests().map(PyDigestReport).map_err(to_pyerr)
}
fn apply_signature(&mut self, signature: Vec<u8>) -> PyResult<()> {
self.0.apply_signature(signature).map_err(to_pyerr)
}
fn clear_signatures(&mut self) -> PyResult<()> {
self.0.clear_signatures().map_err(to_pyerr)
}
#[pyo3(signature = (signer, timestamp=None))]
fn sign(&mut self, signer: &PySigner, timestamp: Option<u32>) -> PyResult<()> {
if let Some(timestamp) = timestamp {
self.0.sign_with_timestamp(signer.0.clone(), timestamp)
} else {
self.0.sign(signer.0.clone())
}
.map_err(to_pyerr)
}
fn verify_signature(&self, verifier: &PyVerifier) -> PyResult<()> {
self.0
.verify_signature(verifier.0.clone())
.map_err(to_pyerr)
}
fn check_signatures(&self, verifier: &PyVerifier) -> PyResult<PySignatureReport> {
let report = self
.0
.check_signatures(verifier.0.clone())
.map_err(to_pyerr)?;
let ok = report.is_ok();
let digest_report = report.digests;
let sig_results = report
.signatures
.into_iter()
.map(|r| (r.info, r.error.map(|e| e.to_string())))
.collect();
Ok(PySignatureReport {
digest_report,
sig_results,
ok,
})
}
fn signatures(&self) -> PyResult<Vec<PySignatureInfo>> {
self.0
.signatures()
.map(|sigs| sigs.into_iter().map(PySignatureInfo).collect())
.map_err(to_pyerr)
}
fn raw_signatures(&self) -> PyResult<Vec<Vec<u8>>> {
self.0
.raw_signatures()
.map(|sigs| sigs.into_iter().map(|s| s.into_owned()).collect())
.map_err(to_pyerr)
}
#[staticmethod]
fn resign_in_place(path: PathBuf, signer: &PySigner) -> PyResult<()> {
crate::Package::resign_in_place(path, signer.0.clone()).map_err(to_pyerr)
}
#[staticmethod]
fn apply_signature_in_place(path: PathBuf, signature: Vec<u8>) -> PyResult<()> {
crate::Package::apply_signature_in_place(path, signature).map_err(to_pyerr)
}
#[staticmethod]
fn clear_signatures_in_place(path: PathBuf) -> PyResult<()> {
crate::Package::clear_signatures_in_place(path).map_err(to_pyerr)
}
}
#[pyclass(name = "Signer")]
struct PySigner(crate::signature::pgp::Signer);
#[pymethods]
impl PySigner {
#[new]
fn new(key_asc: &[u8]) -> PyResult<Self> {
crate::signature::pgp::Signer::from_asc_bytes(key_asc)
.map(PySigner)
.map_err(to_pyerr)
}
#[classmethod]
fn from_file(_cls: &Bound<'_, PyType>, path: PathBuf) -> PyResult<Self> {
crate::signature::pgp::Signer::from_asc_file(path)
.map(PySigner)
.map_err(to_pyerr)
}
fn with_key_passphrase(&self, passphrase: &str) -> Self {
PySigner(self.0.clone().with_key_passphrase(passphrase))
}
fn with_signing_key(&self, fingerprint: &str) -> PyResult<Self> {
let fp = hex::decode(fingerprint).map_err(|e| {
pyo3::exceptions::PyValueError::new_err(format!("invalid hex fingerprint: {e}"))
})?;
self.0
.clone()
.with_signing_key(&fp)
.map(PySigner)
.map_err(to_pyerr)
}
fn sign(&self, data: &[u8]) -> PyResult<Vec<u8>> {
use crate::Timestamp;
use crate::signature::Signing;
self.0
.sign(std::io::Cursor::new(data), Timestamp::now())
.map_err(to_pyerr)
}
}
#[pyclass(name = "Verifier")]
struct PyVerifier(crate::signature::pgp::Verifier);
#[pymethods]
impl PyVerifier {
#[new]
#[pyo3(signature = (key_asc=None))]
fn new(key_asc: Option<&[u8]>) -> PyResult<Self> {
match key_asc {
Some(key) => crate::signature::pgp::Verifier::from_asc_bytes(key)
.map(PyVerifier)
.map_err(to_pyerr),
None => Ok(PyVerifier(crate::signature::pgp::Verifier::new())),
}
}
#[classmethod]
fn from_file(_cls: &Bound<'_, PyType>, path: PathBuf) -> PyResult<Self> {
crate::signature::pgp::Verifier::from_asc_file(path)
.map(PyVerifier)
.map_err(to_pyerr)
}
fn load_from_asc_bytes(&mut self, key_asc: &[u8]) -> PyResult<()> {
self.0.load_from_asc_bytes(key_asc).map_err(to_pyerr)
}
fn load_from_asc_file(&mut self, path: PathBuf) -> PyResult<()> {
self.0.load_from_asc_file(path).map_err(to_pyerr)
}
fn with_key(&self, fingerprint: &str) -> PyResult<Self> {
let fp = hex::decode(fingerprint).map_err(|e| {
pyo3::exceptions::PyValueError::new_err(format!("invalid hex fingerprint: {e}"))
})?;
self.0
.clone()
.with_key(&fp)
.map(PyVerifier)
.map_err(to_pyerr)
}
}
#[pyclass(name = "SignatureVersion", eq, eq_int, hash, frozen, from_py_object)]
#[derive(Clone, PartialEq, Hash)]
pub enum PySignatureVersion {
V4 = 4,
V6 = 6,
}
#[pymethods]
impl PySignatureVersion {
fn __repr__(&self) -> &str {
match self {
PySignatureVersion::V4 => "SignatureVersion.V4",
PySignatureVersion::V6 => "SignatureVersion.V6",
}
}
}
#[pyclass(name = "SignatureInfo", frozen)]
struct PySignatureInfo(crate::signature::pgp::SignatureInfo);
#[pymethods]
impl PySignatureInfo {
#[getter]
fn fingerprint(&self) -> Option<&str> {
self.0.fingerprint()
}
#[getter]
fn key_id(&self) -> Option<&str> {
self.0.key_id()
}
#[getter]
fn created(&self) -> Option<u32> {
self.0.created()
}
#[getter]
fn algorithm(&self) -> Option<&str> {
self.0.algorithm().map(|a| match a {
crate::signature::pgp::SignatureAlgorithm::RSA => "RSA",
crate::signature::pgp::SignatureAlgorithm::DSA => "DSA",
crate::signature::pgp::SignatureAlgorithm::ECDSA => "ECDSA",
crate::signature::pgp::SignatureAlgorithm::EdDSALegacy => "EdDSALegacy",
crate::signature::pgp::SignatureAlgorithm::Ed25519 => "Ed25519",
crate::signature::pgp::SignatureAlgorithm::Ed448 => "Ed448",
crate::signature::pgp::SignatureAlgorithm::MlDsa65Ed25519 => "ML-DSA-65+Ed25519",
crate::signature::pgp::SignatureAlgorithm::MlDsa87Ed448 => "ML-DSA-87+Ed448",
_ => "Unsupported",
})
}
#[getter]
fn version(&self) -> PyResult<PySignatureVersion> {
match self.0.version() {
crate::signature::pgp::SignatureVersion::V4 => Ok(PySignatureVersion::V4),
crate::signature::pgp::SignatureVersion::V6 => Ok(PySignatureVersion::V6),
crate::signature::pgp::SignatureVersion::Unsupported(v) => {
Err(pyo3::exceptions::PyValueError::new_err(format!(
"unsupported OpenPGP signature version: {v}"
)))
}
}
}
#[getter]
fn hash_algorithm(&self) -> Option<&str> {
self.0.hash_algorithm().map(|h| match h {
crate::signature::pgp::SignatureHashAlgorithm::SHA1 => "SHA1",
crate::signature::pgp::SignatureHashAlgorithm::SHA256 => "SHA256",
crate::signature::pgp::SignatureHashAlgorithm::SHA384 => "SHA384",
crate::signature::pgp::SignatureHashAlgorithm::SHA512 => "SHA512",
crate::signature::pgp::SignatureHashAlgorithm::SHA224 => "SHA224",
crate::signature::pgp::SignatureHashAlgorithm::SHA3_256 => "SHA3-256",
crate::signature::pgp::SignatureHashAlgorithm::SHA3_512 => "SHA3-512",
_ => "Unsupported",
})
}
fn __repr__(&self) -> String {
format!(
"SignatureInfo(fingerprint={:?}, key_id={:?}, algorithm={:?})",
self.fingerprint(),
self.key_id(),
self.algorithm(),
)
}
}
#[pyclass(name = "DigestStatus", frozen)]
pub struct PyDigestStatus(crate::DigestStatus);
#[pymethods]
impl PyDigestStatus {
fn is_verified(&self) -> bool {
self.0.is_verified()
}
fn is_not_present(&self) -> bool {
self.0.is_not_present()
}
fn is_not_checked(&self) -> bool {
self.0.is_not_checked()
}
fn is_mismatch(&self) -> bool {
self.0.is_mismatch()
}
#[getter]
fn expected(&self) -> Option<&str> {
match &self.0 {
crate::DigestStatus::Mismatch { expected, .. } => Some(expected.as_str()),
_ => None,
}
}
#[getter]
fn actual(&self) -> Option<&str> {
match &self.0 {
crate::DigestStatus::Mismatch { actual, .. } => Some(actual.as_str()),
_ => None,
}
}
fn __repr__(&self) -> String {
match &self.0 {
crate::DigestStatus::Verified => "DigestStatus.Verified".to_string(),
crate::DigestStatus::NotPresent => "DigestStatus.NotPresent".to_string(),
crate::DigestStatus::NotChecked => "DigestStatus.NotChecked".to_string(),
crate::DigestStatus::Mismatch { expected, actual } => {
format!("DigestStatus.Mismatch(expected={expected:?}, actual={actual:?})")
}
}
}
}
#[pyclass(name = "DigestReport", frozen)]
pub struct PyDigestReport(crate::DigestReport);
#[pymethods]
impl PyDigestReport {
#[getter]
fn header_sha1(&self) -> PyDigestStatus {
PyDigestStatus(self.0.header_sha1.clone())
}
#[getter]
fn header_sha256(&self) -> PyDigestStatus {
PyDigestStatus(self.0.header_sha256.clone())
}
#[getter]
fn header_sha3_256(&self) -> PyDigestStatus {
PyDigestStatus(self.0.header_sha3_256.clone())
}
#[getter]
fn payload_sha256(&self) -> PyDigestStatus {
PyDigestStatus(self.0.payload_sha256.clone())
}
#[getter]
fn payload_sha512(&self) -> PyDigestStatus {
PyDigestStatus(self.0.payload_sha512.clone())
}
#[getter]
fn payload_sha3_256(&self) -> PyDigestStatus {
PyDigestStatus(self.0.payload_sha3_256.clone())
}
fn is_ok(&self) -> bool {
self.0.is_ok()
}
fn verify(&self) -> PyResult<()> {
self.0.result().map_err(to_pyerr)
}
fn __repr__(&self) -> String {
format!("DigestReport(is_ok={})", self.0.is_ok())
}
}
#[pyclass(name = "SignatureCheckResult", frozen)]
pub struct PySignatureCheckResult {
info: crate::signature::pgp::SignatureInfo,
error_msg: Option<String>,
}
#[pymethods]
impl PySignatureCheckResult {
#[getter]
fn info(&self) -> PySignatureInfo {
PySignatureInfo(self.info.clone())
}
#[getter]
fn error(&self) -> Option<&str> {
self.error_msg.as_deref()
}
fn is_verified(&self) -> bool {
self.error_msg.is_none()
}
fn __repr__(&self) -> String {
let fp = self.info.fingerprint().unwrap_or("unknown");
if self.error_msg.is_some() {
format!("SignatureCheckResult(fingerprint={:?}, verified=False)", fp)
} else {
format!("SignatureCheckResult(fingerprint={:?}, verified=True)", fp)
}
}
}
#[pyclass(name = "SignatureReport", frozen)]
pub struct PySignatureReport {
digest_report: crate::DigestReport,
sig_results: Vec<(crate::signature::pgp::SignatureInfo, Option<String>)>,
ok: bool,
}
#[pymethods]
impl PySignatureReport {
#[getter]
fn digests(&self) -> PyDigestReport {
PyDigestReport(self.digest_report.clone())
}
#[getter]
fn signatures(&self) -> Vec<PySignatureCheckResult> {
self.sig_results
.iter()
.map(|(info, err)| PySignatureCheckResult {
info: info.clone(),
error_msg: err.clone(),
})
.collect()
}
fn is_ok(&self) -> bool {
self.ok
}
fn verify(&self) -> PyResult<()> {
self.digest_report.result().map_err(to_pyerr)?;
if self.sig_results.iter().any(|(_, err)| err.is_none()) {
Ok(())
} else {
let last_err = self
.sig_results
.last()
.and_then(|(_, err)| err.as_deref())
.unwrap_or("no signature found");
Err(PyRuntimeError::new_err(last_err.to_string()))
}
}
fn __repr__(&self) -> String {
format!(
"SignatureReport(is_ok={}, signatures={})",
self.ok,
self.sig_results.len(),
)
}
}
#[pyclass(name = "CompressionType", eq, eq_int, hash, frozen, from_py_object)]
#[derive(Clone, PartialEq, Hash)]
pub enum PyCompressionType {
#[pyo3(name = "NONE")]
None,
Gzip,
Zstd,
Xz,
Bzip2,
}
impl From<PyCompressionType> for crate::CompressionType {
fn from(ct: PyCompressionType) -> Self {
match ct {
PyCompressionType::None => crate::CompressionType::None,
PyCompressionType::Gzip => crate::CompressionType::Gzip,
PyCompressionType::Zstd => crate::CompressionType::Zstd,
PyCompressionType::Xz => crate::CompressionType::Xz,
PyCompressionType::Bzip2 => crate::CompressionType::Bzip2,
}
}
}
#[pyclass(name = "RpmFormat", eq, eq_int, hash, frozen, from_py_object)]
#[derive(Clone, PartialEq, Hash)]
pub enum PyRpmFormat {
V4 = 4,
V6 = 6,
}
#[pyclass(name = "BuildConfig")]
pub struct PyBuildConfig(crate::BuildConfig);
#[pymethods]
impl PyBuildConfig {
#[new]
#[pyo3(signature = (*, format=None, compression=None, compression_level=None, source_date=None, reserved_space=None))]
fn new(
format: Option<PyRpmFormat>,
compression: Option<PyCompressionType>,
compression_level: Option<i32>,
source_date: Option<u32>,
reserved_space: Option<u32>,
) -> Self {
let mut config = match format {
Some(PyRpmFormat::V4) => crate::BuildConfig::v4(),
Some(PyRpmFormat::V6) | None => crate::BuildConfig::v6(),
};
if let Some(ct) = compression {
let cwl = match (ct, compression_level) {
(PyCompressionType::None, _) => crate::CompressionWithLevel::None,
(PyCompressionType::Gzip, Some(l)) => crate::CompressionWithLevel::Gzip(l as u32),
(PyCompressionType::Gzip, None) => crate::CompressionType::Gzip.into(),
(PyCompressionType::Zstd, Some(l)) => crate::CompressionWithLevel::Zstd(l),
(PyCompressionType::Zstd, None) => crate::CompressionType::Zstd.into(),
(PyCompressionType::Xz, Some(l)) => crate::CompressionWithLevel::Xz(l as u32),
(PyCompressionType::Xz, None) => crate::CompressionType::Xz.into(),
(PyCompressionType::Bzip2, Some(l)) => crate::CompressionWithLevel::Bzip2(l as u32),
(PyCompressionType::Bzip2, None) => crate::CompressionType::Bzip2.into(),
};
config = config.compression(cwl);
}
if let Some(ts) = source_date {
config = config.source_date(ts);
}
if let Some(rs) = reserved_space {
config = config.reserved_space(if rs == 0 { None } else { Some(rs) });
}
PyBuildConfig(config)
}
}
#[pyclass(name = "FileOptions")]
pub struct PyFileOptions(Option<crate::FileOptionsBuilder>);
impl PyFileOptions {
fn take(&mut self) -> crate::FileOptionsBuilder {
self.0
.take()
.expect("FileOptions has already been consumed")
}
}
fn apply_file_options(
mut builder: crate::FileOptionsBuilder,
user: Option<&str>,
group: Option<&str>,
permissions: Option<u16>,
caps: Option<&str>,
config: bool,
noreplace: bool,
missingok: bool,
doc: bool,
license: bool,
artifact: bool,
) -> Result<crate::FileOptionsBuilder, crate::Error> {
if let Some(u) = user {
builder = builder.user(u);
}
if let Some(g) = group {
builder = builder.group(g);
}
if let Some(p) = permissions {
builder = builder.permissions(p);
}
if let Some(c) = caps {
builder = builder.caps(c)?;
}
if config {
builder = builder.config();
}
if noreplace {
builder = builder.noreplace();
}
if missingok {
builder = builder.missingok();
}
if doc {
builder = builder.doc();
}
if license {
builder = builder.license();
}
if artifact {
builder = builder.artifact();
}
Ok(builder)
}
#[pymethods]
impl PyFileOptions {
#[staticmethod]
#[pyo3(name = "new", signature = (dest, *, user=None, group=None, permissions=None, caps=None, config=false, noreplace=false, missingok=false, doc=false, license=false, artifact=false))]
fn new_file(
dest: &str,
user: Option<&str>,
group: Option<&str>,
permissions: Option<u16>,
caps: Option<&str>,
config: bool,
noreplace: bool,
missingok: bool,
doc: bool,
license: bool,
artifact: bool,
) -> PyResult<Self> {
apply_file_options(
crate::FileOptions::new(dest),
user,
group,
permissions,
caps,
config,
noreplace,
missingok,
doc,
license,
artifact,
)
.map(|b| PyFileOptions(Some(b)))
.map_err(to_pyerr)
}
#[staticmethod]
#[pyo3(signature = (dest, *, user=None, group=None, permissions=None))]
fn dir(
dest: &str,
user: Option<&str>,
group: Option<&str>,
permissions: Option<u16>,
) -> PyResult<Self> {
apply_file_options(
crate::FileOptions::dir(dest),
user,
group,
permissions,
None,
false,
false,
false,
false,
false,
false,
)
.map(|b| PyFileOptions(Some(b)))
.map_err(to_pyerr)
}
#[staticmethod]
#[pyo3(signature = (dest, target, *, user=None, group=None))]
fn symlink(
dest: &str,
target: &str,
user: Option<&str>,
group: Option<&str>,
) -> PyResult<Self> {
apply_file_options(
crate::FileOptions::symlink(dest, target),
user,
group,
None,
None,
false,
false,
false,
false,
false,
false,
)
.map(|b| PyFileOptions(Some(b)))
.map_err(to_pyerr)
}
#[staticmethod]
#[pyo3(signature = (dest, *, user=None, group=None, permissions=None))]
fn ghost(
dest: &str,
user: Option<&str>,
group: Option<&str>,
permissions: Option<u16>,
) -> PyResult<Self> {
apply_file_options(
crate::FileOptions::ghost(dest),
user,
group,
permissions,
None,
false,
false,
false,
false,
false,
false,
)
.map(|b| PyFileOptions(Some(b)))
.map_err(to_pyerr)
}
#[staticmethod]
#[pyo3(signature = (dest, *, user=None, group=None, permissions=None))]
fn ghost_dir(
dest: &str,
user: Option<&str>,
group: Option<&str>,
permissions: Option<u16>,
) -> PyResult<Self> {
apply_file_options(
crate::FileOptions::ghost_dir(dest),
user,
group,
permissions,
None,
false,
false,
false,
false,
false,
false,
)
.map(|b| PyFileOptions(Some(b)))
.map_err(to_pyerr)
}
}
#[pyclass(name = "PackageBuilder")]
pub struct PyPackageBuilder(crate::PackageBuilder);
#[pymethods]
impl PyPackageBuilder {
#[new]
#[pyo3(signature = (name, version, license, arch, summary=""))]
fn new(name: &str, version: &str, license: &str, arch: &str, summary: &str) -> Self {
PyPackageBuilder(crate::PackageBuilder::new(
name, version, license, arch, summary,
))
}
fn description(&mut self, desc: &str) {
self.0.description(desc);
}
fn release(&mut self, release: &str) {
self.0.release(release);
}
fn epoch(&mut self, epoch: u32) {
self.0.epoch(epoch);
}
fn url(&mut self, url: &str) {
self.0.url(url);
}
fn vcs(&mut self, vcs: &str) {
self.0.vcs(vcs);
}
fn vendor(&mut self, vendor: &str) {
self.0.vendor(vendor);
}
fn packager(&mut self, packager: &str) {
self.0.packager(packager);
}
fn group(&mut self, group: &str) {
self.0.group(group);
}
fn build_host(&mut self, host: &str) {
self.0.build_host(host);
}
fn cookie(&mut self, cookie: &str) {
self.0.cookie(cookie);
}
#[pyo3(signature = (*, permissions=None, user=None, group=None))]
fn default_file_attrs(
&mut self,
permissions: Option<u16>,
user: Option<String>,
group: Option<String>,
) {
self.0.default_file_attrs(permissions, user, group);
}
#[pyo3(signature = (*, permissions=None, user=None, group=None))]
fn default_dir_attrs(
&mut self,
permissions: Option<u16>,
user: Option<String>,
group: Option<String>,
) {
self.0.default_dir_attrs(permissions, user, group);
}
fn using_config(&mut self, config: &PyBuildConfig) {
self.0.using_config(config.0);
}
fn with_file(&mut self, source: &str, options: &mut PyFileOptions) -> PyResult<()> {
self.0.with_file(source, options.take()).map_err(to_pyerr)?;
Ok(())
}
fn with_file_contents(&mut self, content: &[u8], options: &mut PyFileOptions) -> PyResult<()> {
self.0
.with_file_contents(content.to_vec(), options.take())
.map_err(to_pyerr)?;
Ok(())
}
fn with_dir_entry(&mut self, options: &mut PyFileOptions) -> PyResult<()> {
self.0.with_dir_entry(options.take()).map_err(to_pyerr)?;
Ok(())
}
fn with_symlink(&mut self, options: &mut PyFileOptions) -> PyResult<()> {
self.0.with_symlink(options.take()).map_err(to_pyerr)?;
Ok(())
}
fn with_ghost(&mut self, options: &mut PyFileOptions) -> PyResult<()> {
self.0.with_ghost(options.take()).map_err(to_pyerr)?;
Ok(())
}
#[pyo3(signature = (source_dir, dest_prefix, *, user=None, group=None, permissions=None, caps=None, config=false, noreplace=false, missingok=false, doc=false, license=false, artifact=false))]
fn with_dir(
&mut self,
source_dir: &str,
dest_prefix: &str,
user: Option<String>,
group: Option<String>,
permissions: Option<u16>,
caps: Option<String>,
config: bool,
noreplace: bool,
missingok: bool,
doc: bool,
license: bool,
artifact: bool,
) -> PyResult<()> {
if let Some(ref c) = caps {
crate::FileOptions::new("/validate")
.caps(c)
.map_err(to_pyerr)?;
}
self.0
.with_dir(source_dir, dest_prefix, |opts| {
apply_file_options(
opts,
user.as_deref(),
group.as_deref(),
permissions,
caps.as_deref(),
config,
noreplace,
missingok,
doc,
license,
artifact,
)
.unwrap()
})
.map_err(to_pyerr)?;
Ok(())
}
#[pyo3(signature = (name, version=None, flags=None))]
fn requires(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0.requires(make_dependency(name, version, flags));
}
#[pyo3(signature = (name, version=None, flags=None))]
fn provides(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0.provides(make_dependency(name, version, flags));
}
#[pyo3(signature = (name, version=None, flags=None))]
fn conflicts(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0.conflicts(make_dependency(name, version, flags));
}
#[pyo3(signature = (name, version=None, flags=None))]
fn obsoletes(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0.obsoletes(make_dependency(name, version, flags));
}
#[pyo3(signature = (name, version=None, flags=None))]
fn recommends(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0.recommends(make_dependency(name, version, flags));
}
#[pyo3(signature = (name, version=None, flags=None))]
fn suggests(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0.suggests(make_dependency(name, version, flags));
}
#[pyo3(signature = (name, version=None, flags=None))]
fn enhances(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0.enhances(make_dependency(name, version, flags));
}
#[pyo3(signature = (name, version=None, flags=None))]
fn supplements(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0.supplements(make_dependency(name, version, flags));
}
#[pyo3(signature = (name, version=None, flags=None))]
fn order_with_requires(&mut self, name: &str, version: Option<&str>, flags: Option<u32>) {
self.0
.order_with_requires(make_dependency(name, version, flags));
}
fn add_changelog_entry(&mut self, name: &str, description: &str, timestamp: u32) {
self.0.add_changelog_entry(name, description, timestamp);
}
fn pre_install_script(&mut self, script: &str) {
self.0.pre_install_script(script);
}
fn post_install_script(&mut self, script: &str) {
self.0.post_install_script(script);
}
fn pre_uninstall_script(&mut self, script: &str) {
self.0.pre_uninstall_script(script);
}
fn post_uninstall_script(&mut self, script: &str) {
self.0.post_uninstall_script(script);
}
fn pre_trans_script(&mut self, script: &str) {
self.0.pre_trans_script(script);
}
fn post_trans_script(&mut self, script: &str) {
self.0.post_trans_script(script);
}
fn pre_untrans_script(&mut self, script: &str) {
self.0.pre_untrans_script(script);
}
fn post_untrans_script(&mut self, script: &str) {
self.0.post_untrans_script(script);
}
fn verify_script(&mut self, script: &str) {
self.0.verify_script(script);
}
fn build(&mut self) -> PyResult<PyPackage> {
self.0.build().map(PyPackage).map_err(to_pyerr)
}
fn build_and_sign(&mut self, signer: &PySigner) -> PyResult<PyPackage> {
self.0
.build_and_sign(signer.0.clone())
.map(PyPackage)
.map_err(to_pyerr)
}
}
fn make_dependency(name: &str, version: Option<&str>, flags: Option<u32>) -> crate::Dependency {
match (version, flags) {
(Some(v), Some(f)) => crate::Dependency {
name: name.to_string(),
version: v.to_string(),
flags: crate::DependencyFlags::from_bits_retain(f),
},
(Some(v), None) => crate::Dependency::eq(name, v),
_ => crate::Dependency::any(name),
}
}
#[pyfunction]
fn evr_compare(evr1: &str, evr2: &str) -> i32 {
match crate::rpm_evr_compare(evr1, evr2) {
Ordering::Less => -1,
Ordering::Equal => 0,
Ordering::Greater => 1,
}
}
fn index_data_to_py(py: Python<'_>, data: crate::IndexData) -> PyResult<Py<PyAny>> {
use crate::IndexData;
Ok(match data {
IndexData::Null => py.None(),
IndexData::Char(v) | IndexData::Int8(v) | IndexData::Bin(v) => v.into_pyobject(py)?.into(),
IndexData::Int16(v) => v.into_pyobject(py)?.into(),
IndexData::Int32(v) => v.into_pyobject(py)?.into(),
IndexData::Int64(v) => v.into_pyobject(py)?.into(),
IndexData::StringTag(s) => s.into_pyobject(py)?.into(),
IndexData::StringArray(v) | IndexData::I18NString(v) => v.into_pyobject(py)?.into(),
})
}
fn make_int_flag<'py>(
py: Python<'py>,
name: &str,
members: &[(&str, u32)],
) -> PyResult<Bound<'py, PyAny>> {
let enum_mod = py.import("enum")?;
let int_flag = enum_mod.getattr("IntFlag")?;
let kwargs = PyDict::new(py);
for &(member_name, value) in members {
kwargs.set_item(member_name, value)?;
}
int_flag.call((name, kwargs), None)
}
fn make_int_enum<'py>(
py: Python<'py>,
name: &str,
members: &[(&str, u32)],
) -> PyResult<Bound<'py, PyAny>> {
let enum_mod = py.import("enum")?;
let int_enum = enum_mod.getattr("IntEnum")?;
let kwargs = PyDict::new(py);
for &(member_name, value) in members {
kwargs.set_item(member_name, value)?;
}
int_enum.call((name, kwargs), None)
}
#[pymodule]
pub fn rpm_rs(m: &Bound<'_, PyModule>) -> PyResult<()> {
m.add_class::<PyPackage>()?;
m.add_class::<PyPackageMetadata>()?;
m.add_class::<PyHeader>()?;
m.add_class::<PyPackageSegmentOffsets>()?;
m.add_class::<PyRpmFile>()?;
m.add_class::<PyEvr>()?;
m.add_class::<PyNevra>()?;
m.add_class::<PyDependency>()?;
m.add_class::<PyFileEntry>()?;
m.add_class::<PyFileType>()?;
m.add_class::<PyFileMode>()?;
m.add_class::<PyFileDigest>()?;
m.add_class::<PyFileOwnership>()?;
m.add_class::<PyChangelogEntry>()?;
m.add_class::<PyScriptlet>()?;
m.add_class::<PyDigestAlgorithm>()?;
m.add_class::<PyCompressionType>()?;
m.add_class::<PyRpmFormat>()?;
m.add_class::<PyBuildConfig>()?;
m.add_class::<PyFileOptions>()?;
m.add_class::<PyPackageBuilder>()?;
m.add_class::<PySigner>()?;
m.add_class::<PyVerifier>()?;
m.add_class::<PySignatureVersion>()?;
m.add_class::<PySignatureInfo>()?;
m.add_class::<PyDigestStatus>()?;
m.add_class::<PyDigestReport>()?;
m.add_class::<PySignatureCheckResult>()?;
m.add_class::<PySignatureReport>()?;
m.add_function(wrap_pyfunction!(evr_compare, m)?)?;
m.add(
"Tag",
make_int_enum(
m.py(),
"Tag",
&[
("HEADERIMAGE", crate::IndexTag::RPMTAG_HEADERIMAGE as u32),
(
"HEADERSIGNATURES",
crate::IndexTag::RPMTAG_HEADERSIGNATURES as u32,
),
(
"HEADERIMMUTABLE",
crate::IndexTag::RPMTAG_HEADERIMMUTABLE as u32,
),
(
"HEADERREGIONS",
crate::IndexTag::RPMTAG_HEADERREGIONS as u32,
),
(
"HEADERI18NTABLE",
crate::IndexTag::RPMTAG_HEADERI18NTABLE as u32,
),
("SIGSIZE", crate::IndexTag::RPMTAG_SIGSIZE as u32),
("SIGLEMD5_1", crate::IndexTag::RPMTAG_SIGLEMD5_1 as u32),
("SIGPGP", crate::IndexTag::RPMTAG_SIGPGP as u32),
("SIGLEMD5_2", crate::IndexTag::RPMTAG_SIGLEMD5_2 as u32),
("SIGMD5", crate::IndexTag::RPMTAG_SIGMD5 as u32),
("SIGGPG", crate::IndexTag::RPMTAG_SIGGPG as u32),
("SIGPGP5", crate::IndexTag::RPMTAG_SIGPGP5 as u32),
("BADSHA1_1", crate::IndexTag::RPMTAG_BADSHA1_1 as u32),
("BADSHA1_2", crate::IndexTag::RPMTAG_BADSHA1_2 as u32),
("PUBKEYS", crate::IndexTag::RPMTAG_PUBKEYS as u32),
("DSAHEADER", crate::IndexTag::RPMTAG_DSAHEADER as u32),
("RSAHEADER", crate::IndexTag::RPMTAG_RSAHEADER as u32),
("SHA1HEADER", crate::IndexTag::RPMTAG_SHA1HEADER as u32),
("LONGSIGSIZE", crate::IndexTag::RPMTAG_LONGSIGSIZE as u32),
(
"LONGARCHIVESIZE",
crate::IndexTag::RPMTAG_LONGARCHIVESIZE as u32,
),
("SHA256HEADER", crate::IndexTag::RPMTAG_SHA256HEADER as u32),
(
"VERITYSIGNATURES",
crate::IndexTag::RPMTAG_VERITYSIGNATURES as u32,
),
(
"VERITYSIGNATUREALGO",
crate::IndexTag::RPMTAG_VERITYSIGNATUREALGO as u32,
),
("OPENPGP", crate::IndexTag::RPMTAG_OPENPGP as u32),
(
"SHA3_256_HEADER",
crate::IndexTag::RPMTAG_SHA3_256_HEADER as u32,
),
("NAME", crate::IndexTag::RPMTAG_NAME as u32),
("VERSION", crate::IndexTag::RPMTAG_VERSION as u32),
("RELEASE", crate::IndexTag::RPMTAG_RELEASE as u32),
("EPOCH", crate::IndexTag::RPMTAG_EPOCH as u32),
("SUMMARY", crate::IndexTag::RPMTAG_SUMMARY as u32),
("DESCRIPTION", crate::IndexTag::RPMTAG_DESCRIPTION as u32),
("BUILDTIME", crate::IndexTag::RPMTAG_BUILDTIME as u32),
("BUILDHOST", crate::IndexTag::RPMTAG_BUILDHOST as u32),
("INSTALLTIME", crate::IndexTag::RPMTAG_INSTALLTIME as u32),
("SIZE", crate::IndexTag::RPMTAG_SIZE as u32),
("DISTRIBUTION", crate::IndexTag::RPMTAG_DISTRIBUTION as u32),
("VENDOR", crate::IndexTag::RPMTAG_VENDOR as u32),
("GIF", crate::IndexTag::RPMTAG_GIF as u32),
("XPM", crate::IndexTag::RPMTAG_XPM as u32),
("LICENSE", crate::IndexTag::RPMTAG_LICENSE as u32),
("PACKAGER", crate::IndexTag::RPMTAG_PACKAGER as u32),
("GROUP", crate::IndexTag::RPMTAG_GROUP as u32),
("CHANGELOG", crate::IndexTag::RPMTAG_CHANGELOG as u32),
("SOURCE", crate::IndexTag::RPMTAG_SOURCE as u32),
("PATCH", crate::IndexTag::RPMTAG_PATCH as u32),
("URL", crate::IndexTag::RPMTAG_URL as u32),
("OS", crate::IndexTag::RPMTAG_OS as u32),
("ARCH", crate::IndexTag::RPMTAG_ARCH as u32),
("PREIN", crate::IndexTag::RPMTAG_PREIN as u32),
("POSTIN", crate::IndexTag::RPMTAG_POSTIN as u32),
("PREUN", crate::IndexTag::RPMTAG_PREUN as u32),
("POSTUN", crate::IndexTag::RPMTAG_POSTUN as u32),
("OLDFILENAMES", crate::IndexTag::RPMTAG_OLDFILENAMES as u32),
("FILESIZES", crate::IndexTag::RPMTAG_FILESIZES as u32),
("FILESTATES", crate::IndexTag::RPMTAG_FILESTATES as u32),
("FILEMODES", crate::IndexTag::RPMTAG_FILEMODES as u32),
("FILEUIDS", crate::IndexTag::RPMTAG_FILEUIDS as u32),
("FILEGIDS", crate::IndexTag::RPMTAG_FILEGIDS as u32),
("FILERDEVS", crate::IndexTag::RPMTAG_FILERDEVS as u32),
("FILEMTIMES", crate::IndexTag::RPMTAG_FILEMTIMES as u32),
("FILEDIGESTS", crate::IndexTag::RPMTAG_FILEDIGESTS as u32),
("FILELINKTOS", crate::IndexTag::RPMTAG_FILELINKTOS as u32),
("FILEFLAGS", crate::IndexTag::RPMTAG_FILEFLAGS as u32),
("ROOT", crate::IndexTag::RPMTAG_ROOT as u32),
("FILEUSERNAME", crate::IndexTag::RPMTAG_FILEUSERNAME as u32),
(
"FILEGROUPNAME",
crate::IndexTag::RPMTAG_FILEGROUPNAME as u32,
),
("EXCLUDE", crate::IndexTag::RPMTAG_EXCLUDE as u32),
("EXCLUSIVE", crate::IndexTag::RPMTAG_EXCLUSIVE as u32),
("ICON", crate::IndexTag::RPMTAG_ICON as u32),
("SOURCERPM", crate::IndexTag::RPMTAG_SOURCERPM as u32),
(
"FILEVERIFYFLAGS",
crate::IndexTag::RPMTAG_FILEVERIFYFLAGS as u32,
),
("ARCHIVESIZE", crate::IndexTag::RPMTAG_ARCHIVESIZE as u32),
("PROVIDENAME", crate::IndexTag::RPMTAG_PROVIDENAME as u32),
("REQUIREFLAGS", crate::IndexTag::RPMTAG_REQUIREFLAGS as u32),
("REQUIRENAME", crate::IndexTag::RPMTAG_REQUIRENAME as u32),
(
"REQUIREVERSION",
crate::IndexTag::RPMTAG_REQUIREVERSION as u32,
),
("NOSOURCE", crate::IndexTag::RPMTAG_NOSOURCE as u32),
("NOPATCH", crate::IndexTag::RPMTAG_NOPATCH as u32),
(
"CONFLICTFLAGS",
crate::IndexTag::RPMTAG_CONFLICTFLAGS as u32,
),
("CONFLICTNAME", crate::IndexTag::RPMTAG_CONFLICTNAME as u32),
(
"CONFLICTVERSION",
crate::IndexTag::RPMTAG_CONFLICTVERSION as u32,
),
(
"DEFAULTPREFIX",
crate::IndexTag::RPMTAG_DEFAULTPREFIX as u32,
),
("BUILDROOT", crate::IndexTag::RPMTAG_BUILDROOT as u32),
(
"INSTALLPREFIX",
crate::IndexTag::RPMTAG_INSTALLPREFIX as u32,
),
("EXCLUDEARCH", crate::IndexTag::RPMTAG_EXCLUDEARCH as u32),
("EXCLUDEOS", crate::IndexTag::RPMTAG_EXCLUDEOS as u32),
(
"EXCLUSIVEARCH",
crate::IndexTag::RPMTAG_EXCLUSIVEARCH as u32,
),
("EXCLUSIVEOS", crate::IndexTag::RPMTAG_EXCLUSIVEOS as u32),
("AUTOREQPROV", crate::IndexTag::RPMTAG_AUTOREQPROV as u32),
("RPMVERSION", crate::IndexTag::RPMTAG_RPMVERSION as u32),
(
"TRIGGERSCRIPTS",
crate::IndexTag::RPMTAG_TRIGGERSCRIPTS as u32,
),
("TRIGGERNAME", crate::IndexTag::RPMTAG_TRIGGERNAME as u32),
(
"TRIGGERVERSION",
crate::IndexTag::RPMTAG_TRIGGERVERSION as u32,
),
("TRIGGERFLAGS", crate::IndexTag::RPMTAG_TRIGGERFLAGS as u32),
("TRIGGERINDEX", crate::IndexTag::RPMTAG_TRIGGERINDEX as u32),
("VERIFYSCRIPT", crate::IndexTag::RPMTAG_VERIFYSCRIPT as u32),
(
"CHANGELOGTIME",
crate::IndexTag::RPMTAG_CHANGELOGTIME as u32,
),
(
"CHANGELOGNAME",
crate::IndexTag::RPMTAG_CHANGELOGNAME as u32,
),
(
"CHANGELOGTEXT",
crate::IndexTag::RPMTAG_CHANGELOGTEXT as u32,
),
("BROKENMD5", crate::IndexTag::RPMTAG_BROKENMD5 as u32),
("PREREQ", crate::IndexTag::RPMTAG_PREREQ as u32),
("PREINPROG", crate::IndexTag::RPMTAG_PREINPROG as u32),
("POSTINPROG", crate::IndexTag::RPMTAG_POSTINPROG as u32),
("PREUNPROG", crate::IndexTag::RPMTAG_PREUNPROG as u32),
("POSTUNPROG", crate::IndexTag::RPMTAG_POSTUNPROG as u32),
("BUILDARCHS", crate::IndexTag::RPMTAG_BUILDARCHS as u32),
("OBSOLETENAME", crate::IndexTag::RPMTAG_OBSOLETENAME as u32),
(
"VERIFYSCRIPTPROG",
crate::IndexTag::RPMTAG_VERIFYSCRIPTPROG as u32,
),
(
"TRIGGERSCRIPTPROG",
crate::IndexTag::RPMTAG_TRIGGERSCRIPTPROG as u32,
),
("DOCDIR", crate::IndexTag::RPMTAG_DOCDIR as u32),
("COOKIE", crate::IndexTag::RPMTAG_COOKIE as u32),
("FILEDEVICES", crate::IndexTag::RPMTAG_FILEDEVICES as u32),
("FILEINODES", crate::IndexTag::RPMTAG_FILEINODES as u32),
("FILELANGS", crate::IndexTag::RPMTAG_FILELANGS as u32),
("PREFIXES", crate::IndexTag::RPMTAG_PREFIXES as u32),
("INSTPREFIXES", crate::IndexTag::RPMTAG_INSTPREFIXES as u32),
("TRIGGERIN", crate::IndexTag::RPMTAG_TRIGGERIN as u32),
("TRIGGERUN", crate::IndexTag::RPMTAG_TRIGGERUN as u32),
(
"TRIGGERPOSTUN",
crate::IndexTag::RPMTAG_TRIGGERPOSTUN as u32,
),
("AUTOREQ", crate::IndexTag::RPMTAG_AUTOREQ as u32),
("AUTOPROV", crate::IndexTag::RPMTAG_AUTOPROV as u32),
("CAPABILITY", crate::IndexTag::RPMTAG_CAPABILITY as u32),
(
"SOURCEPACKAGE",
crate::IndexTag::RPMTAG_SOURCEPACKAGE as u32,
),
(
"OLDORIGFILENAMES",
crate::IndexTag::RPMTAG_OLDORIGFILENAMES as u32,
),
("BUILDPREREQ", crate::IndexTag::RPMTAG_BUILDPREREQ as u32),
(
"BUILDREQUIRES",
crate::IndexTag::RPMTAG_BUILDREQUIRES as u32,
),
(
"BUILDCONFLICTS",
crate::IndexTag::RPMTAG_BUILDCONFLICTS as u32,
),
("BUILDMACROS", crate::IndexTag::RPMTAG_BUILDMACROS as u32),
("PROVIDEFLAGS", crate::IndexTag::RPMTAG_PROVIDEFLAGS as u32),
(
"PROVIDEVERSION",
crate::IndexTag::RPMTAG_PROVIDEVERSION as u32,
),
(
"OBSOLETEFLAGS",
crate::IndexTag::RPMTAG_OBSOLETEFLAGS as u32,
),
(
"OBSOLETEVERSION",
crate::IndexTag::RPMTAG_OBSOLETEVERSION as u32,
),
("DIRINDEXES", crate::IndexTag::RPMTAG_DIRINDEXES as u32),
("BASENAMES", crate::IndexTag::RPMTAG_BASENAMES as u32),
("DIRNAMES", crate::IndexTag::RPMTAG_DIRNAMES as u32),
(
"ORIGDIRINDEXES",
crate::IndexTag::RPMTAG_ORIGDIRINDEXES as u32,
),
(
"ORIGBASENAMES",
crate::IndexTag::RPMTAG_ORIGBASENAMES as u32,
),
("ORIGDIRNAMES", crate::IndexTag::RPMTAG_ORIGDIRNAMES as u32),
("OPTFLAGS", crate::IndexTag::RPMTAG_OPTFLAGS as u32),
("DISTURL", crate::IndexTag::RPMTAG_DISTURL as u32),
(
"PAYLOADFORMAT",
crate::IndexTag::RPMTAG_PAYLOADFORMAT as u32,
),
(
"PAYLOADCOMPRESSOR",
crate::IndexTag::RPMTAG_PAYLOADCOMPRESSOR as u32,
),
("PAYLOADFLAGS", crate::IndexTag::RPMTAG_PAYLOADFLAGS as u32),
("INSTALLCOLOR", crate::IndexTag::RPMTAG_INSTALLCOLOR as u32),
("INSTALLTID", crate::IndexTag::RPMTAG_INSTALLTID as u32),
("REMOVETID", crate::IndexTag::RPMTAG_REMOVETID as u32),
("SHA1RHN", crate::IndexTag::RPMTAG_SHA1RHN as u32),
("RHNPLATFORM", crate::IndexTag::RPMTAG_RHNPLATFORM as u32),
("PLATFORM", crate::IndexTag::RPMTAG_PLATFORM as u32),
("PATCHESNAME", crate::IndexTag::RPMTAG_PATCHESNAME as u32),
("PATCHESFLAGS", crate::IndexTag::RPMTAG_PATCHESFLAGS as u32),
(
"PATCHESVERSION",
crate::IndexTag::RPMTAG_PATCHESVERSION as u32,
),
("CACHECTIME", crate::IndexTag::RPMTAG_CACHECTIME as u32),
("CACHEPKGPATH", crate::IndexTag::RPMTAG_CACHEPKGPATH as u32),
("CACHEPKGSIZE", crate::IndexTag::RPMTAG_CACHEPKGSIZE as u32),
(
"CACHEPKGMTIME",
crate::IndexTag::RPMTAG_CACHEPKGMTIME as u32,
),
("FILECOLORS", crate::IndexTag::RPMTAG_FILECOLORS as u32),
("FILECLASS", crate::IndexTag::RPMTAG_FILECLASS as u32),
("CLASSDICT", crate::IndexTag::RPMTAG_CLASSDICT as u32),
("FILEDEPENDSX", crate::IndexTag::RPMTAG_FILEDEPENDSX as u32),
("FILEDEPENDSN", crate::IndexTag::RPMTAG_FILEDEPENDSN as u32),
("DEPENDSDICT", crate::IndexTag::RPMTAG_DEPENDSDICT as u32),
("SOURCESIGMD5", crate::IndexTag::RPMTAG_SOURCESIGMD5 as u32),
("FILECONTEXTS", crate::IndexTag::RPMTAG_FILECONTEXTS as u32),
("FSCONTEXTS", crate::IndexTag::RPMTAG_FSCONTEXTS as u32),
("RECONTEXTS", crate::IndexTag::RPMTAG_RECONTEXTS as u32),
("POLICIES", crate::IndexTag::RPMTAG_POLICIES as u32),
("PRETRANS", crate::IndexTag::RPMTAG_PRETRANS as u32),
("POSTTRANS", crate::IndexTag::RPMTAG_POSTTRANS as u32),
("PRETRANSPROG", crate::IndexTag::RPMTAG_PRETRANSPROG as u32),
(
"POSTTRANSPROG",
crate::IndexTag::RPMTAG_POSTTRANSPROG as u32,
),
("DISTTAG", crate::IndexTag::RPMTAG_DISTTAG as u32),
(
"OLDSUGGESTSNAME",
crate::IndexTag::RPMTAG_OLDSUGGESTSNAME as u32,
),
(
"OLDSUGGESTSVERSION",
crate::IndexTag::RPMTAG_OLDSUGGESTSVERSION as u32,
),
(
"OLDSUGGESTSFLAGS",
crate::IndexTag::RPMTAG_OLDSUGGESTSFLAGS as u32,
),
(
"OLDENHANCESNAME",
crate::IndexTag::RPMTAG_OLDENHANCESNAME as u32,
),
(
"OLDENHANCESVERSION",
crate::IndexTag::RPMTAG_OLDENHANCESVERSION as u32,
),
(
"OLDENHANCESFLAGS",
crate::IndexTag::RPMTAG_OLDENHANCESFLAGS as u32,
),
("PRIORITY", crate::IndexTag::RPMTAG_PRIORITY as u32),
("CVSID", crate::IndexTag::RPMTAG_CVSID as u32),
("BLINKPKGID", crate::IndexTag::RPMTAG_BLINKPKGID as u32),
("BLINKHDRID", crate::IndexTag::RPMTAG_BLINKHDRID as u32),
("BLINKNEVRA", crate::IndexTag::RPMTAG_BLINKNEVRA as u32),
("FLINKPKGID", crate::IndexTag::RPMTAG_FLINKPKGID as u32),
("FLINKHDRID", crate::IndexTag::RPMTAG_FLINKHDRID as u32),
("FLINKNEVRA", crate::IndexTag::RPMTAG_FLINKNEVRA as u32),
(
"PACKAGEORIGIN",
crate::IndexTag::RPMTAG_PACKAGEORIGIN as u32,
),
("TRIGGERPREIN", crate::IndexTag::RPMTAG_TRIGGERPREIN as u32),
(
"BUILDSUGGESTS",
crate::IndexTag::RPMTAG_BUILDSUGGESTS as u32,
),
(
"BUILDENHANCES",
crate::IndexTag::RPMTAG_BUILDENHANCES as u32,
),
("SCRIPTSTATES", crate::IndexTag::RPMTAG_SCRIPTSTATES as u32),
(
"SCRIPTMETRICS",
crate::IndexTag::RPMTAG_SCRIPTMETRICS as u32,
),
(
"BUILDCPUCLOCK",
crate::IndexTag::RPMTAG_BUILDCPUCLOCK as u32,
),
(
"FILEDIGESTALGOS",
crate::IndexTag::RPMTAG_FILEDIGESTALGOS as u32,
),
("VARIANTS", crate::IndexTag::RPMTAG_VARIANTS as u32),
("XMAJOR", crate::IndexTag::RPMTAG_XMAJOR as u32),
("XMINOR", crate::IndexTag::RPMTAG_XMINOR as u32),
("REPOTAG", crate::IndexTag::RPMTAG_REPOTAG as u32),
("KEYWORDS", crate::IndexTag::RPMTAG_KEYWORDS as u32),
(
"BUILDPLATFORMS",
crate::IndexTag::RPMTAG_BUILDPLATFORMS as u32,
),
("PACKAGECOLOR", crate::IndexTag::RPMTAG_PACKAGECOLOR as u32),
(
"PACKAGEPREFCOLOR",
crate::IndexTag::RPMTAG_PACKAGEPREFCOLOR as u32,
),
("XATTRSDICT", crate::IndexTag::RPMTAG_XATTRSDICT as u32),
("FILEXATTRSX", crate::IndexTag::RPMTAG_FILEXATTRSX as u32),
("DEPATTRSDICT", crate::IndexTag::RPMTAG_DEPATTRSDICT as u32),
(
"CONFLICTATTRSX",
crate::IndexTag::RPMTAG_CONFLICTATTRSX as u32,
),
(
"OBSOLETEATTRSX",
crate::IndexTag::RPMTAG_OBSOLETEATTRSX as u32,
),
(
"PROVIDEATTRSX",
crate::IndexTag::RPMTAG_PROVIDEATTRSX as u32,
),
(
"REQUIREATTRSX",
crate::IndexTag::RPMTAG_REQUIREATTRSX as u32,
),
(
"BUILDPROVIDES",
crate::IndexTag::RPMTAG_BUILDPROVIDES as u32,
),
(
"BUILDOBSOLETES",
crate::IndexTag::RPMTAG_BUILDOBSOLETES as u32,
),
("DBINSTANCE", crate::IndexTag::RPMTAG_DBINSTANCE as u32),
("NVRA", crate::IndexTag::RPMTAG_NVRA as u32),
("FILENAMES", crate::IndexTag::RPMTAG_FILENAMES as u32),
("FILEPROVIDE", crate::IndexTag::RPMTAG_FILEPROVIDE as u32),
("FILEREQUIRE", crate::IndexTag::RPMTAG_FILEREQUIRE as u32),
("FSNAMES", crate::IndexTag::RPMTAG_FSNAMES as u32),
("FSSIZES", crate::IndexTag::RPMTAG_FSSIZES as u32),
("TRIGGERCONDS", crate::IndexTag::RPMTAG_TRIGGERCONDS as u32),
("TRIGGERTYPE", crate::IndexTag::RPMTAG_TRIGGERTYPE as u32),
(
"ORIGFILENAMES",
crate::IndexTag::RPMTAG_ORIGFILENAMES as u32,
),
(
"LONGFILESIZES",
crate::IndexTag::RPMTAG_LONGFILESIZES as u32,
),
("LONGSIZE", crate::IndexTag::RPMTAG_LONGSIZE as u32),
("FILECAPS", crate::IndexTag::RPMTAG_FILECAPS as u32),
(
"FILEDIGESTALGO",
crate::IndexTag::RPMTAG_FILEDIGESTALGO as u32,
),
("BUGURL", crate::IndexTag::RPMTAG_BUGURL as u32),
("EVR", crate::IndexTag::RPMTAG_EVR as u32),
("NVR", crate::IndexTag::RPMTAG_NVR as u32),
("NEVR", crate::IndexTag::RPMTAG_NEVR as u32),
("NEVRA", crate::IndexTag::RPMTAG_NEVRA as u32),
("HEADERCOLOR", crate::IndexTag::RPMTAG_HEADERCOLOR as u32),
("VERBOSE", crate::IndexTag::RPMTAG_VERBOSE as u32),
("EPOCHNUM", crate::IndexTag::RPMTAG_EPOCHNUM as u32),
("PREINFLAGS", crate::IndexTag::RPMTAG_PREINFLAGS as u32),
("POSTINFLAGS", crate::IndexTag::RPMTAG_POSTINFLAGS as u32),
("PREUNFLAGS", crate::IndexTag::RPMTAG_PREUNFLAGS as u32),
("POSTUNFLAGS", crate::IndexTag::RPMTAG_POSTUNFLAGS as u32),
(
"PRETRANSFLAGS",
crate::IndexTag::RPMTAG_PRETRANSFLAGS as u32,
),
(
"POSTTRANSFLAGS",
crate::IndexTag::RPMTAG_POSTTRANSFLAGS as u32,
),
(
"VERIFYSCRIPTFLAGS",
crate::IndexTag::RPMTAG_VERIFYSCRIPTFLAGS as u32,
),
(
"TRIGGERSCRIPTFLAGS",
crate::IndexTag::RPMTAG_TRIGGERSCRIPTFLAGS as u32,
),
("COLLECTIONS", crate::IndexTag::RPMTAG_COLLECTIONS as u32),
("POLICYNAMES", crate::IndexTag::RPMTAG_POLICYNAMES as u32),
("POLICYTYPES", crate::IndexTag::RPMTAG_POLICYTYPES as u32),
(
"POLICYTYPESINDEXES",
crate::IndexTag::RPMTAG_POLICYTYPESINDEXES as u32,
),
("POLICYFLAGS", crate::IndexTag::RPMTAG_POLICYFLAGS as u32),
("VCS", crate::IndexTag::RPMTAG_VCS as u32),
("ORDERNAME", crate::IndexTag::RPMTAG_ORDERNAME as u32),
("ORDERVERSION", crate::IndexTag::RPMTAG_ORDERVERSION as u32),
("ORDERFLAGS", crate::IndexTag::RPMTAG_ORDERFLAGS as u32),
("MSSFMANIFEST", crate::IndexTag::RPMTAG_MSSFMANIFEST as u32),
("MSSFDOMAIN", crate::IndexTag::RPMTAG_MSSFDOMAIN as u32),
(
"INSTFILENAMES",
crate::IndexTag::RPMTAG_INSTFILENAMES as u32,
),
("REQUIRENEVRS", crate::IndexTag::RPMTAG_REQUIRENEVRS as u32),
("PROVIDENEVRS", crate::IndexTag::RPMTAG_PROVIDENEVRS as u32),
(
"OBSOLETENEVRS",
crate::IndexTag::RPMTAG_OBSOLETENEVRS as u32,
),
(
"CONFLICTNEVRS",
crate::IndexTag::RPMTAG_CONFLICTNEVRS as u32,
),
("FILENLINKS", crate::IndexTag::RPMTAG_FILENLINKS as u32),
(
"RECOMMENDNAME",
crate::IndexTag::RPMTAG_RECOMMENDNAME as u32,
),
(
"RECOMMENDVERSION",
crate::IndexTag::RPMTAG_RECOMMENDVERSION as u32,
),
(
"RECOMMENDFLAGS",
crate::IndexTag::RPMTAG_RECOMMENDFLAGS as u32,
),
("SUGGESTNAME", crate::IndexTag::RPMTAG_SUGGESTNAME as u32),
(
"SUGGESTVERSION",
crate::IndexTag::RPMTAG_SUGGESTVERSION as u32,
),
("SUGGESTFLAGS", crate::IndexTag::RPMTAG_SUGGESTFLAGS as u32),
(
"SUPPLEMENTNAME",
crate::IndexTag::RPMTAG_SUPPLEMENTNAME as u32,
),
(
"SUPPLEMENTVERSION",
crate::IndexTag::RPMTAG_SUPPLEMENTVERSION as u32,
),
(
"SUPPLEMENTFLAGS",
crate::IndexTag::RPMTAG_SUPPLEMENTFLAGS as u32,
),
("ENHANCENAME", crate::IndexTag::RPMTAG_ENHANCENAME as u32),
(
"ENHANCEVERSION",
crate::IndexTag::RPMTAG_ENHANCEVERSION as u32,
),
("ENHANCEFLAGS", crate::IndexTag::RPMTAG_ENHANCEFLAGS as u32),
(
"RECOMMENDNEVRS",
crate::IndexTag::RPMTAG_RECOMMENDNEVRS as u32,
),
("SUGGESTNEVRS", crate::IndexTag::RPMTAG_SUGGESTNEVRS as u32),
(
"SUPPLEMENTNEVRS",
crate::IndexTag::RPMTAG_SUPPLEMENTNEVRS as u32,
),
("ENHANCENEVRS", crate::IndexTag::RPMTAG_ENHANCENEVRS as u32),
("ENCODING", crate::IndexTag::RPMTAG_ENCODING as u32),
(
"FILETRIGGERIN",
crate::IndexTag::RPMTAG_FILETRIGGERIN as u32,
),
(
"FILETRIGGERUN",
crate::IndexTag::RPMTAG_FILETRIGGERUN as u32,
),
(
"FILETRIGGERPOSTUN",
crate::IndexTag::RPMTAG_FILETRIGGERPOSTUN as u32,
),
(
"FILETRIGGERSCRIPTS",
crate::IndexTag::RPMTAG_FILETRIGGERSCRIPTS as u32,
),
(
"FILETRIGGERSCRIPTPROG",
crate::IndexTag::RPMTAG_FILETRIGGERSCRIPTPROG as u32,
),
(
"FILETRIGGERSCRIPTFLAGS",
crate::IndexTag::RPMTAG_FILETRIGGERSCRIPTFLAGS as u32,
),
(
"FILETRIGGERNAME",
crate::IndexTag::RPMTAG_FILETRIGGERNAME as u32,
),
(
"FILETRIGGERINDEX",
crate::IndexTag::RPMTAG_FILETRIGGERINDEX as u32,
),
(
"FILETRIGGERVERSION",
crate::IndexTag::RPMTAG_FILETRIGGERVERSION as u32,
),
(
"FILETRIGGERFLAGS",
crate::IndexTag::RPMTAG_FILETRIGGERFLAGS as u32,
),
(
"TRANSFILETRIGGERIN",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERIN as u32,
),
(
"TRANSFILETRIGGERUN",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERUN as u32,
),
(
"TRANSFILETRIGGERPOSTUN",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERPOSTUN as u32,
),
(
"TRANSFILETRIGGERSCRIPTS",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERSCRIPTS as u32,
),
(
"TRANSFILETRIGGERSCRIPTPROG",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERSCRIPTPROG as u32,
),
(
"TRANSFILETRIGGERSCRIPTFLAGS",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERSCRIPTFLAGS as u32,
),
(
"TRANSFILETRIGGERNAME",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERNAME as u32,
),
(
"TRANSFILETRIGGERINDEX",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERINDEX as u32,
),
(
"TRANSFILETRIGGERVERSION",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERVERSION as u32,
),
(
"TRANSFILETRIGGERFLAGS",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERFLAGS as u32,
),
(
"REMOVEPATHPOSTFIXES",
crate::IndexTag::RPMTAG_REMOVEPATHPOSTFIXES as u32,
),
(
"FILETRIGGERPRIORITIES",
crate::IndexTag::RPMTAG_FILETRIGGERPRIORITIES as u32,
),
(
"TRANSFILETRIGGERPRIORITIES",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERPRIORITIES as u32,
),
(
"FILETRIGGERCONDS",
crate::IndexTag::RPMTAG_FILETRIGGERCONDS as u32,
),
(
"FILETRIGGERTYPE",
crate::IndexTag::RPMTAG_FILETRIGGERTYPE as u32,
),
(
"TRANSFILETRIGGERCONDS",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERCONDS as u32,
),
(
"TRANSFILETRIGGERTYPE",
crate::IndexTag::RPMTAG_TRANSFILETRIGGERTYPE as u32,
),
(
"FILESIGNATURES",
crate::IndexTag::RPMTAG_FILESIGNATURES as u32,
),
(
"FILESIGNATURELENGTH",
crate::IndexTag::RPMTAG_FILESIGNATURELENGTH as u32,
),
(
"PAYLOADSHA256",
crate::IndexTag::RPMTAG_PAYLOADSHA256 as u32,
),
(
"PAYLOADSHA256ALGO",
crate::IndexTag::RPMTAG_PAYLOADSHA256ALGO as u32,
),
(
"AUTOINSTALLED",
crate::IndexTag::RPMTAG_AUTOINSTALLED as u32,
),
("IDENTITY", crate::IndexTag::RPMTAG_IDENTITY as u32),
(
"MODULARITYLABEL",
crate::IndexTag::RPMTAG_MODULARITYLABEL as u32,
),
(
"PAYLOADSHA256ALT",
crate::IndexTag::RPMTAG_PAYLOADSHA256ALT as u32,
),
("ARCHSUFFIX", crate::IndexTag::RPMTAG_ARCHSUFFIX as u32),
("SPEC", crate::IndexTag::RPMTAG_SPEC as u32),
(
"TRANSLATIONURL",
crate::IndexTag::RPMTAG_TRANSLATIONURL as u32,
),
(
"UPSTREAMRELEASES",
crate::IndexTag::RPMTAG_UPSTREAMRELEASES as u32,
),
(
"SOURCELICENSE",
crate::IndexTag::RPMTAG_SOURCELICENSE as u32,
),
("PREUNTRANS", crate::IndexTag::RPMTAG_PREUNTRANS as u32),
("POSTUNTRANS", crate::IndexTag::RPMTAG_POSTUNTRANS as u32),
(
"PREUNTRANSPROG",
crate::IndexTag::RPMTAG_PREUNTRANSPROG as u32,
),
(
"POSTUNTRANSPROG",
crate::IndexTag::RPMTAG_POSTUNTRANSPROG as u32,
),
(
"PREUNTRANSFLAGS",
crate::IndexTag::RPMTAG_PREUNTRANSFLAGS as u32,
),
(
"POSTUNTRANSFLAGS",
crate::IndexTag::RPMTAG_POSTUNTRANSFLAGS as u32,
),
("SYSUSERS", crate::IndexTag::RPMTAG_SYSUSERS as u32),
("BUILDSYSTEM", crate::IndexTag::RPMTAG_BUILDSYSTEM as u32),
("BUILDOPTION", crate::IndexTag::RPMTAG_BUILDOPTION as u32),
("PAYLOADSIZE", crate::IndexTag::RPMTAG_PAYLOADSIZE as u32),
(
"PAYLOADSIZEALT",
crate::IndexTag::RPMTAG_PAYLOADSIZEALT as u32,
),
("RPMFORMAT", crate::IndexTag::RPMTAG_RPMFORMAT as u32),
(
"FILEMIMEINDEX",
crate::IndexTag::RPMTAG_FILEMIMEINDEX as u32,
),
("MIMEDICT", crate::IndexTag::RPMTAG_MIMEDICT as u32),
("FILEMIMES", crate::IndexTag::RPMTAG_FILEMIMES as u32),
(
"PACKAGEDIGESTS",
crate::IndexTag::RPMTAG_PACKAGEDIGESTS as u32,
),
(
"PACKAGEDIGESTALGOS",
crate::IndexTag::RPMTAG_PACKAGEDIGESTALGOS as u32,
),
("SOURCENEVR", crate::IndexTag::RPMTAG_SOURCENEVR as u32),
(
"PAYLOAD_SHA512",
crate::IndexTag::RPMTAG_PAYLOAD_SHA512 as u32,
),
(
"PAYLOAD_SHA512_ALT",
crate::IndexTag::RPMTAG_PAYLOAD_SHA512_ALT as u32,
),
(
"PAYLOAD_SHA3_256",
crate::IndexTag::RPMTAG_PAYLOAD_SHA3_256 as u32,
),
(
"PAYLOAD_SHA3_256_ALT",
crate::IndexTag::RPMTAG_PAYLOAD_SHA3_256_ALT as u32,
),
],
)?,
)?;
m.add(
"SignatureTag",
make_int_enum(
m.py(),
"SignatureTag",
&[
(
"HEADER_SIGNATURES",
crate::IndexSignatureTag::HEADER_SIGNATURES as u32,
),
(
"FILESIGNATURES",
crate::IndexSignatureTag::RPMSIGTAG_FILESIGNATURES as u32,
),
(
"FILESIGNATURE_LENGTH",
crate::IndexSignatureTag::RPMSIGTAG_FILESIGNATURE_LENGTH as u32,
),
(
"VERITYSIGNATURES",
crate::IndexSignatureTag::RPMSIGTAG_VERITYSIGNATURES as u32,
),
(
"VERITYSIGNATUREALGO",
crate::IndexSignatureTag::RPMSIGTAG_VERITYSIGNATUREALGO as u32,
),
(
"OPENPGP",
crate::IndexSignatureTag::RPMSIGTAG_OPENPGP as u32,
),
("DSA", crate::IndexSignatureTag::RPMSIGTAG_DSA as u32),
("RSA", crate::IndexSignatureTag::RPMSIGTAG_RSA as u32),
("SHA1", crate::IndexSignatureTag::RPMSIGTAG_SHA1 as u32),
(
"SHA3_256",
crate::IndexSignatureTag::RPMSIGTAG_SHA3_256 as u32,
),
("SHA256", crate::IndexSignatureTag::RPMSIGTAG_SHA256 as u32),
(
"RESERVED",
crate::IndexSignatureTag::RPMSIGTAG_RESERVED as u32,
),
(
"RESERVEDSPACE",
crate::IndexSignatureTag::RPMSIGTAG_RESERVEDSPACE as u32,
),
("MD5", crate::IndexSignatureTag::RPMSIGTAG_MD5 as u32),
("PGP", crate::IndexSignatureTag::RPMSIGTAG_PGP as u32),
("GPG", crate::IndexSignatureTag::RPMSIGTAG_GPG as u32),
("SIZE", crate::IndexSignatureTag::RPMSIGTAG_SIZE as u32),
(
"PAYLOADSIZE",
crate::IndexSignatureTag::RPMSIGTAG_PAYLOADSIZE as u32,
),
(
"LONGSIZE",
crate::IndexSignatureTag::RPMSIGTAG_LONGSIZE as u32,
),
(
"LONGARCHIVESIZE",
crate::IndexSignatureTag::RPMSIGTAG_LONGARCHIVESIZE as u32,
),
],
)?,
)?;
m.add(
"FileFlags",
make_int_flag(
m.py(),
"FileFlags",
&[
("CONFIG", crate::FileFlags::CONFIG.bits()),
("DOC", crate::FileFlags::DOC.bits()),
("DONOTUSE", crate::FileFlags::DONOTUSE.bits()),
("MISSINGOK", crate::FileFlags::MISSINGOK.bits()),
("NOREPLACE", crate::FileFlags::NOREPLACE.bits()),
("SPECFILE", crate::FileFlags::SPECFILE.bits()),
("GHOST", crate::FileFlags::GHOST.bits()),
("LICENSE", crate::FileFlags::LICENSE.bits()),
("README", crate::FileFlags::README.bits()),
("PUBKEY", crate::FileFlags::PUBKEY.bits()),
("ARTIFACT", crate::FileFlags::ARTIFACT.bits()),
],
)?,
)?;
m.add(
"DependencyFlags",
make_int_flag(
m.py(),
"DependencyFlags",
&[
("ANY", crate::DependencyFlags::ANY.bits()),
("LESS", crate::DependencyFlags::LESS.bits()),
("GREATER", crate::DependencyFlags::GREATER.bits()),
("EQUAL", crate::DependencyFlags::EQUAL.bits()),
("LE", crate::DependencyFlags::LE.bits()),
("GE", crate::DependencyFlags::GE.bits()),
("POSTTRANS", crate::DependencyFlags::POSTTRANS.bits()),
("PREREQ", crate::DependencyFlags::PREREQ.bits()),
("PRETRANS", crate::DependencyFlags::PRETRANS.bits()),
("INTERP", crate::DependencyFlags::INTERP.bits()),
("SCRIPT_PRE", crate::DependencyFlags::SCRIPT_PRE.bits()),
("SCRIPT_POST", crate::DependencyFlags::SCRIPT_POST.bits()),
("SCRIPT_PREUN", crate::DependencyFlags::SCRIPT_PREUN.bits()),
(
"SCRIPT_POSTUN",
crate::DependencyFlags::SCRIPT_POSTUN.bits(),
),
(
"SCRIPT_VERIFY",
crate::DependencyFlags::SCRIPT_VERIFY.bits(),
),
(
"FIND_REQUIRES",
crate::DependencyFlags::FIND_REQUIRES.bits(),
),
(
"FIND_PROVIDES",
crate::DependencyFlags::FIND_PROVIDES.bits(),
),
("TRIGGERIN", crate::DependencyFlags::TRIGGERIN.bits()),
("TRIGGERUN", crate::DependencyFlags::TRIGGERUN.bits()),
(
"TRIGGERPOSTUN",
crate::DependencyFlags::TRIGGERPOSTUN.bits(),
),
("MISSINGOK", crate::DependencyFlags::MISSINGOK.bits()),
("PREUNTRANS", crate::DependencyFlags::PREUNTRANS.bits()),
("POSTUNTRANS", crate::DependencyFlags::POSTUNTRANS.bits()),
("RPMLIB", crate::DependencyFlags::RPMLIB.bits()),
("TRIGGERPREIN", crate::DependencyFlags::TRIGGERPREIN.bits()),
("KEYRING", crate::DependencyFlags::KEYRING.bits()),
("CONFIG", crate::DependencyFlags::CONFIG.bits()),
("META", crate::DependencyFlags::META.bits()),
],
)?,
)?;
m.add(
"ScriptletFlags",
make_int_flag(
m.py(),
"ScriptletFlags",
&[
("EXPAND", crate::ScriptletFlags::EXPAND.bits()),
("QFORMAT", crate::ScriptletFlags::QFORMAT.bits()),
("CRITICAL", crate::ScriptletFlags::CRITICAL.bits()),
],
)?,
)?;
Ok(())
}