1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
//! # releasaurus-core
//!
//! Core library powering [Releasaurus] release automation. Use this
//! crate to embed the full release pipeline in your own Rust tooling
//! without taking a dependency on the CLI binary.
//!
//! ## Architecture
//!
//! ```text
//! Orchestrator (pipeline entry point)
//! └─ OrchestratorConfig (merged settings)
//! └─ ForgeManager (caching + dry-run wrapper)
//! └─ Forge (GitHub / GitLab / Gitea / Local)
//! ```
//!
//! ## Quick start
//!
//! ```rust,no_run
//! use std::{collections::HashMap, rc::Rc};
//! use releasaurus_core::{
//! forge::{
//! github::Github,
//! manager::{ForgeManager, ForgeOptions},
//! config::{RepoUrl, Scheme},
//! },
//! orchestrator::{
//! Orchestrator,
//! config::{
//! CommitModifiers, GlobalOverrides, OrchestratorConfig,
//! },
//! package::resolved::{
//! ResolvedPackage, ResolvedPackageHash,
//! },
//! },
//! };
//!
//! #[tokio::main]
//! async fn main() -> releasaurus_core::error::Result<()> {
//! let url = RepoUrl {
//! scheme: Scheme::Https,
//! host: "github.com".into(),
//! owner: "my-org".into(),
//! name: "my-repo".into(),
//! path: "my-org/my-repo".into(),
//! port: None,
//! token: None,
//! };
//!
//! // 1. Build a forge client.
//! let forge = Github::new(url, None).await?;
//! let forge_manager = ForgeManager::new(
//! Box::new(forge),
//! ForgeOptions { dry_run: false },
//! );
//!
//! // 2. Load releasaurus.toml from the repository.
//! let config = Rc::new(
//! forge_manager.load_config(None).await?,
//! );
//!
//! // 3. Build the orchestrator config.
//! let orch_config = Rc::new(
//! OrchestratorConfig::builder()
//! .toml_config(Rc::clone(&config))
//! .repo_name(forge_manager.repo_name())
//! .repo_default_branch(
//! forge_manager.default_branch(),
//! )
//! .release_link_base_url(
//! forge_manager.release_link_base_url().clone(),
//! )
//! .compare_link_base_url(
//! forge_manager.compare_link_base_url().clone(),
//! )
//! .global_overrides(GlobalOverrides::default())
//! .package_overrides(HashMap::new())
//! .commit_modifiers(CommitModifiers::default())
//! .build()?,
//! );
//!
//! // 4. Resolve each package declared in releasaurus.toml.
//! let mut resolved = vec![];
//! for pkg in config.packages.iter() {
//! resolved.push(
//! ResolvedPackage::builder()
//! .orchestrator_config(Rc::clone(&orch_config))
//! .package_config(pkg.clone())
//! .build()?,
//! );
//! }
//!
//! // 5. Build the orchestrator and run the pipeline.
//! let fm = Rc::new(forge_manager);
//! let orchestrator = Orchestrator::builder()
//! .config(Rc::clone(&orch_config))
//! .package_configs(Rc::new(
//! ResolvedPackageHash::new(resolved)?,
//! ))
//! .forge(Rc::clone(&fm))
//! .build()?;
//!
//! orchestrator.create_release_prs(None).await
//! }
//! ```
//!
//! ## Modules
//!
//! - [`analyzer`] — conventional commit parsing and version
//! calculation
//! - [`config`] — TOML configuration types and deserialization
//! - [`error`] — [`ReleasaurusError`][error::ReleasaurusError]
//! and [`Result`][error::Result]
//! - [`file_loader`] — trait for loading files from a forge or
//! filesystem
//! - [`forge`] — [`Forge`][forge::traits::Forge] trait and
//! platform implementations (GitHub, GitLab, Gitea, Local)
//! - [`orchestrator`] — all release operations flow through
//! [`Orchestrator`][orchestrator::Orchestrator]
//! - [`updater`] — language-specific version file updaters
//!
//! [Releasaurus]: https://releasaurus.rgon.io