xbp 10.40.1

XBP is a zero-config build pack that can also interact with proxies, kafka, sockets, synthetic monitors.
Documentation
//! Shared version command types.

use semver::Version;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;

use super::release_ledger::{ReleaseLedger, ReleasePublishTarget};


#[derive(Clone, Debug)]
pub(crate) struct VersionObservation {
    pub(crate) location: String,
    pub(crate) version: Version,
}


#[derive(Clone, Debug)]
pub(crate) struct GitTagObservation {
    pub(crate) version: Version,
    pub(crate) raw_tags: Vec<String>,
}


#[derive(Clone, Debug)]
pub(crate) struct RegistryVersionObservation {
    pub(crate) registry: String,
    pub(crate) package_name: String,
    pub(crate) source_file: String,
    pub(crate) latest: Option<Version>,
    pub(crate) raw_version: Option<String>,
    pub(crate) published_at: Option<String>,
    pub(crate) note: Option<String>,
}


#[derive(Clone, Debug)]
pub(crate) struct RegistryVersionDetails {
    pub(crate) version: String,
    pub(crate) published_at: Option<String>,
}


#[derive(Clone, Debug, Default)]
pub(crate) struct ChangedTargetSelection {
    pub(crate) changed_files: Vec<String>,
    pub(crate) version_targets: Vec<ResolvedRegistryPath>,
    pub(crate) publish_targets: Vec<ReleasePublishTarget>,
    pub(crate) baseline_source: String,
    pub(crate) baseline_reference: Option<String>,
    pub(crate) baseline_tag: Option<String>,
}


#[derive(Clone, Debug)]
pub(crate) struct ResolvedRegistryPath {
    pub(crate) relative: String,
    pub(crate) absolute: PathBuf,
    pub(crate) cargo_package_override: Option<String>,
}


#[derive(Clone, Debug)]
pub(crate) struct WorkspacePrimaryCargoTarget {
    pub(crate) manifest_relative: String,
    pub(crate) manifest_absolute: PathBuf,
    pub(crate) package_name: String,
}


#[derive(Default, Debug)]
pub(crate) struct VersionReport {
    pub(crate) worktree: Vec<VersionObservation>,
    pub(crate) head: Vec<VersionObservation>,
    pub(crate) local_tags: Vec<GitTagObservation>,
    pub(crate) remote_tags: Vec<GitTagObservation>,
    pub(crate) registry_versions: Vec<RegistryVersionObservation>,
    pub(crate) dirty_files: Vec<String>,
    pub(crate) release_ledger: Option<ReleaseLedger>,
    pub(crate) warnings: Vec<String>,
}


#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub(crate) struct VersionChangeGuardRegistry {
    #[serde(default)]
    pub(crate) entries: BTreeMap<String, VersionChangeGuardEntry>,
}


#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
pub(crate) struct VersionChangeGuardEntry {
    #[serde(default)]
    pub(crate) pending_version_change_count: usize,
    #[serde(default)]
    pub(crate) head_commit: Option<String>,
}


#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub(crate) struct GitWorktreeState {
    pub(crate) is_dirty: bool,
    pub(crate) head_commit: Option<String>,
}


#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReleaseLatestPolicy {
    True,
    False,
    Legacy,
}

impl ReleaseLatestPolicy {
    pub(crate) fn as_github_api_value(self) -> &'static str {
        match self {
            Self::True => "true",
            Self::False => "false",
            Self::Legacy => "legacy",
        }
    }
}


#[derive(Debug, Clone)]
pub struct VersionReleaseOptions {
    pub explicit_version: Option<String>,
    pub release_flag: Option<String>,
    pub allow_dirty: bool,
    pub title: Option<String>,
    pub notes: Option<String>,
    pub notes_file: Option<PathBuf>,
    pub draft: bool,
    pub prerelease: bool,
    pub publish: bool,
    pub force: bool,
    /// Plan only: no version writes, git tags, ledger updates, registry publish, or GitHub release.
    pub dry_run: bool,
    pub latest_policy: ReleaseLatestPolicy,
}