ips/libips/src/repository/mod.rs

195 lines
5.8 KiB
Rust
Raw Normal View History

// This Source Code Form is subject to the terms of
// the Mozilla Public License, v. 2.0. If a copy of the
// MPL was not distributed with this file, You can
// obtain one at https://mozilla.org/MPL/2.0/.
use anyhow::Result;
use std::collections::HashMap;
2025-07-26 12:54:01 +02:00
use std::path::Path;
2025-07-26 12:54:01 +02:00
mod catalog;
mod file_backend;
mod rest_backend;
#[cfg(test)]
mod tests;
2025-07-26 12:54:01 +02:00
pub use catalog::{CatalogAttrs, CatalogManager, CatalogOperationType, CatalogPart, UpdateLog};
pub use file_backend::FileBackend;
pub use rest_backend::RestBackend;
/// Repository configuration filename
pub const REPOSITORY_CONFIG_FILENAME: &str = "pkg6.repository";
/// Information about a publisher in a repository
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct PublisherInfo {
/// Name of the publisher
pub name: String,
/// Number of packages from this publisher
pub package_count: usize,
/// Status of the publisher (e.g., "online", "offline")
pub status: String,
/// Last updated timestamp in ISO 8601 format
pub updated: String,
}
/// Information about a repository
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct RepositoryInfo {
/// Information about publishers in the repository
pub publishers: Vec<PublisherInfo>,
}
/// Information about a package in a repository
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct PackageInfo {
/// FMRI (Fault Management Resource Identifier) of the package
pub fmri: crate::fmri::Fmri,
}
/// Contents of a package
#[derive(Debug, Clone, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub struct PackageContents {
/// Package identifier (name and version)
pub package_id: String,
/// Files in the package
pub files: Option<Vec<String>>,
/// Directories in the package
pub directories: Option<Vec<String>>,
/// Links in the package
pub links: Option<Vec<String>>,
/// Dependencies of the package
pub dependencies: Option<Vec<String>>,
/// Licenses in the package
pub licenses: Option<Vec<String>>,
}
/// Repository version
#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
pub enum RepositoryVersion {
V4 = 4,
}
impl Default for RepositoryVersion {
fn default() -> Self {
RepositoryVersion::V4
}
}
impl std::convert::TryFrom<u32> for RepositoryVersion {
type Error = anyhow::Error;
fn try_from(value: u32) -> Result<Self, Self::Error> {
match value {
4 => Ok(RepositoryVersion::V4),
_ => Err(anyhow::anyhow!("Unsupported repository version: {}", value)),
}
}
}
/// Repository configuration
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct RepositoryConfig {
pub version: RepositoryVersion,
pub publishers: Vec<String>,
pub properties: HashMap<String, String>,
pub default_publisher: Option<String>,
}
impl Default for RepositoryConfig {
fn default() -> Self {
RepositoryConfig {
version: RepositoryVersion::default(),
publishers: Vec::new(),
properties: HashMap::new(),
default_publisher: None,
}
}
}
/// Repository trait for read-only operations
pub trait ReadableRepository {
/// Open an existing repository
2025-07-26 12:54:01 +02:00
fn open<P: AsRef<Path>>(path: P) -> Result<Self>
where
Self: Sized;
/// Get repository information
fn get_info(&self) -> Result<RepositoryInfo>;
2025-07-26 12:54:01 +02:00
/// List packages in the repository
2025-07-26 12:54:01 +02:00
fn list_packages(
&self,
publisher: Option<&str>,
pattern: Option<&str>,
) -> Result<Vec<PackageInfo>>;
/// Show contents of packages
2025-07-26 12:54:01 +02:00
fn show_contents(
&self,
publisher: Option<&str>,
pattern: Option<&str>,
action_types: Option<&[String]>,
) -> Result<Vec<PackageContents>>;
/// Search for packages in the repository
2025-07-26 12:54:01 +02:00
///
/// This method searches for packages in the repository using the search index.
/// It returns a list of packages that match the search query.
2025-07-26 12:54:01 +02:00
///
/// # Arguments
2025-07-26 12:54:01 +02:00
///
/// * `query` - The search query
/// * `publisher` - Optional publisher to limit the search to
/// * `limit` - Optional maximum number of results to return
2025-07-26 12:54:01 +02:00
fn search(
&self,
query: &str,
publisher: Option<&str>,
limit: Option<usize>,
) -> Result<Vec<PackageInfo>>;
}
/// Repository trait for write operations
pub trait WritableRepository {
/// Create a new repository at the specified path
2025-07-26 12:54:01 +02:00
fn create<P: AsRef<Path>>(path: P, version: RepositoryVersion) -> Result<Self>
where
Self: Sized;
/// Save the repository configuration
fn save_config(&self) -> Result<()>;
2025-07-26 12:54:01 +02:00
/// Add a publisher to the repository
fn add_publisher(&mut self, publisher: &str) -> Result<()>;
2025-07-26 12:54:01 +02:00
/// Remove a publisher from the repository
fn remove_publisher(&mut self, publisher: &str, dry_run: bool) -> Result<()>;
2025-07-26 12:54:01 +02:00
/// Set a repository property
fn set_property(&mut self, property: &str, value: &str) -> Result<()>;
2025-07-26 12:54:01 +02:00
/// Set a publisher property
2025-07-26 12:54:01 +02:00
fn set_publisher_property(
&mut self,
publisher: &str,
property: &str,
value: &str,
) -> Result<()>;
/// Rebuild repository metadata
fn rebuild(&self, publisher: Option<&str>, no_catalog: bool, no_index: bool) -> Result<()>;
2025-07-26 12:54:01 +02:00
/// Refresh repository metadata
fn refresh(&self, publisher: Option<&str>, no_catalog: bool, no_index: bool) -> Result<()>;
2025-07-26 12:54:01 +02:00
/// Set the default publisher for the repository
fn set_default_publisher(&mut self, publisher: &str) -> Result<()>;
}
/// Repository trait defining the interface for all repository backends
2025-07-26 12:54:01 +02:00
///
/// This trait combines both ReadableRepository and WritableRepository traits
/// for backward compatibility.
2025-07-26 12:54:01 +02:00
pub trait Repository: ReadableRepository + WritableRepository {}