heroforge/lib.rs
1//! # heroforge
2//!
3//! A pure Rust client library for reading and writing Heroforge SCM repositories.
4//!
5//! ## Overview
6//!
7//! `heroforge` provides a complete API for interacting with Heroforge repositories without
8//! requiring the Heroforge CLI. It supports both reading from existing repositories and
9//! creating new ones from scratch.
10//!
11//! ## Quick Start (Builder API)
12//!
13//! ```no_run
14//! use heroforge::Repository;
15//!
16//! fn main() -> heroforge::Result<()> {
17//! // Create a new repository
18//! let repo = Repository::init("project.forge")?;
19//!
20//! // Create initial commit using builder
21//! let init = repo.commit()
22//! .message("Initial commit")
23//! .author("admin")
24//! .initial()
25//! .execute()?;
26//!
27//! // Add files using builder
28//! let v1 = repo.commit()
29//! .message("Add project files")
30//! .author("developer")
31//! .parent(&init)
32//! .file("README.md", b"# My Project\n")
33//! .file("src/main.rs", b"fn main() {}\n")
34//! .execute()?;
35//!
36//! // Tag the release
37//! repo.tags()
38//! .create("v1.0.0")
39//! .at_commit(&v1)
40//! .author("developer")
41//! .execute()?;
42//!
43//! // Read files using builder
44//! let readme = repo.files().on_trunk().read_string("README.md")?;
45//! let rust_files = repo.files().at_tag("v1.0.0").find("**/*.rs")?;
46//!
47//! // Sync to remote
48//! repo.sync()
49//! .to("quic://backup.example.com:4443/project")
50//! .push()?;
51//!
52//! Ok(())
53//! }
54//! ```
55//!
56//! ## Features
57//!
58//! ### File Operations
59//! ```no_run
60//! # use heroforge::Repository;
61//! # let repo = Repository::open("project.forge")?;
62//! // List files on trunk
63//! let files = repo.files().on_trunk().list()?;
64//!
65//! // Read file from a branch
66//! let content = repo.files().on_branch("feature").read("config.json")?;
67//!
68//! // Find files at a tag
69//! let rust = repo.files().at_tag("v1.0").find("**/*.rs")?;
70//! # Ok::<(), heroforge::FossilError>(())
71//! ```
72//!
73//! ### Commit Operations
74//! ```no_run
75//! # use heroforge::Repository;
76//! # let repo = Repository::open_rw("project.forge")?;
77//! let hash = repo.commit()
78//! .message("Add feature")
79//! .author("developer")
80//! .parent("abc123")
81//! .file("src/feature.rs", b"// new feature")
82//! .execute()?;
83//! # Ok::<(), heroforge::FossilError>(())
84//! ```
85//!
86//! ### Branch/Tag Operations
87//! ```no_run
88//! # use heroforge::Repository;
89//! # let repo = Repository::open_rw("project.forge")?;
90//! // Create branch
91//! repo.branches()
92//! .create("feature-x")
93//! .from_branch("trunk")
94//! .author("developer")
95//! .execute()?;
96//!
97//! // Create tag
98//! repo.tags()
99//! .create("v1.0.0")
100//! .at_branch("trunk")
101//! .author("developer")
102//! .execute()?;
103//! # Ok::<(), heroforge::FossilError>(())
104//! ```
105//!
106//! ### Filesystem Operations (Copy, Move, Delete, Find, Symlinks)
107//! ```no_run
108//! # use heroforge::Repository;
109//! # let repo = Repository::open_rw("project.forge")?;
110//! // Copy, move, delete files and directories
111//! repo.fs().modify()
112//! .message("Reorganize project structure")
113//! .author("developer")
114//! .copy_file("README.md", "docs/README.md")
115//! .copy_dir("src", "backup/src")
116//! .move_file("old.txt", "archive/old.txt")
117//! .move_dir("scripts", "tools")
118//! .delete_file("temp.log")
119//! .delete_dir("cache")
120//! .execute()?;
121//!
122//! // Find files with patterns and ignore rules
123//! let rust_files = repo.fs().find()
124//! .pattern("**/*.rs")
125//! .ignore("target/**")
126//! .ignore_hidden(true)
127//! .paths()?;
128//!
129//! // Change permissions
130//! repo.fs().modify()
131//! .message("Make scripts executable")
132//! .author("developer")
133//! .make_executable("scripts/deploy.sh")
134//! .chmod_dir("bin", 0o755)
135//! .execute()?;
136//!
137//! // Create symlinks
138//! repo.fs().modify()
139//! .message("Add symlinks")
140//! .author("developer")
141//! .symlink("lib/latest", "lib/v2.0")
142//! .execute()?;
143//!
144//! // Utility operations (no commit needed)
145//! let exists = repo.fs().exists("README.md")?;
146//! let is_dir = repo.fs().is_dir("src")?;
147//! let size = repo.fs().du("src")?;
148//! let count = repo.fs().count("**/*.rs")?;
149//! # Ok::<(), heroforge::FossilError>(())
150//! ```
151//!
152//! ### Sync Operations (QUIC)
153//! ```no_run
154//! # use heroforge::Repository;
155//! # let repo = Repository::open("project.forge")?;
156//! // Push over QUIC
157//! repo.sync()
158//! .to("quic://server:4443/repo")
159//! .push()?;
160//!
161//! // Pull from remote
162//! repo.sync()
163//! .from("quic://server:4443/repo")
164//! .auth("user", "password")
165//! .pull()?;
166//! # Ok::<(), heroforge::FossilError>(())
167//! ```
168
169pub mod artifact;
170pub mod error;
171pub mod hash;
172pub mod repo;
173pub mod server;
174pub mod sync;
175
176pub use error::{FossilError, Result};
177pub use repo::{CheckIn, FileInfo, Repository};
178pub use server::Server;
179pub use sync::{SyncBuilder, SyncProtocol, SyncResult};
180
181// Re-export builders for convenience
182pub use repo::{
183 BranchBuilder, BranchesBuilder, CommitBuilder, FileEntry, FileQuery, FileType, FilesBuilder,
184 FindBuilder, FindResult, FsBuilder, FsOperation, FsOpsBuilder, FsPreview, HistoryBuilder,
185 Permissions, TagBuilder, TagsBuilder, UserBuilder, UsersBuilder,
186};