| Crates.io | heroforge-core |
| lib.rs | heroforge-core |
| version | 0.2.2 |
| created_at | 2025-12-18 16:26:11.021543+00 |
| updated_at | 2025-12-18 16:26:11.021543+00 |
| description | Pure Rust core library for reading and writing Fossil SCM repositories |
| homepage | https://github.com/herocode/heroforge-core |
| repository | https://github.com/herocode/heroforge-core |
| max_upload_size | |
| id | 1992770 |
| size | 930,353 |
| Resource | Link |
|---|---|
| Crate | crates.io/crates/heroforge-core |
| Documentation | docs.rs/heroforge-core |
| Repository | github.com/herocode/heroforge-core |
heroforge-core is the core database library for Heroforge, providing a complete API for interacting with Fossil SCM repositories programmatically, without requiring the Fossil CLI to be installed. It supports both reading from existing repositories and creating new ones from scratch.
sync-quic feature)Add heroforge-core to your project:
cargo add heroforge-core
Or add to your Cargo.toml:
[dependencies]
heroforge-core = "0.2.2"
Enable QUIC sync for remote repository synchronization:
[dependencies]
heroforge-core = { version = "0.2.2", features = ["sync-quic"] }
The heroforge-core binary provides both an interactive REPL and daemon mode for script execution.
# Start interactive shell (default)
heroforge-core
# Or explicitly with --ui flag
heroforge-core --ui
The REPL provides:
# Run a script file
heroforge-core myscript.rhai
# Execute inline script
heroforge-core -e 'let repo = repo_open("project.fossil"); print(branches_list(repo));'
# Read script from stdin
echo 'print(version())' | heroforge-core -i
# Run locally without daemon
heroforge-core --local -e 'print("Hello!")'
# Start daemon in background
heroforge-core start -bg
# Check daemon status
heroforge-core status
# Stop daemon
heroforge-core stop
| Command | Description |
|---|---|
/help |
Show help |
/functions |
List all available functions |
/repo |
Show repository functions |
/fs |
Show filesystem functions |
/files |
Show file functions |
/branches |
Show branch/tag functions |
/modify |
Show modify builder functions |
/find |
Show find builder functions |
/utils |
Show utility functions |
/scope |
Show current scope variables |
/load <file> |
Load and execute a .rhai script |
/clear |
Clear screen |
/quit |
Exit REPL |
use heroforge_core::Repository;
fn main() -> heroforge_core::Result<()> {
// Open a Fossil repository
let repo = Repository::open("project.fossil")?;
// Get the latest check-in on trunk
let tip = repo.history().trunk_tip()?;
println!("Latest: {} by {}", tip.hash, tip.user);
println!("Comment: {}", tip.comment);
// List all files on trunk
let files = repo.files().on_trunk().list()?;
for file in &files {
println!(" {}", file.name);
}
// Read a specific file from trunk
let content = repo.files().on_trunk().read("README.md")?;
println!("README:\n{}", String::from_utf8_lossy(&content));
Ok(())
}
use heroforge_core::Repository;
fn main() -> heroforge_core::Result<()> {
// Create a new repository
let repo = Repository::init("new_project.fossil")?;
// Create initial check-in
let init_hash = repo.commit_builder()
.message("initial empty check-in")
.author("admin")
.initial()
.execute()?;
// Add some files in a new commit
let commit_hash = repo.commit_builder()
.message("Initial project structure")
.author("developer")
.parent(&init_hash)
.file("README.md", b"# My Project\n")
.file("src/main.rs", b"fn main() { println!(\"Hello!\"); }\n")
.execute()?;
// Tag the release
repo.tags()
.create("v1.0.0")
.at_commit(&commit_hash)
.author("developer")
.execute()?;
// Create a feature branch
repo.branches()
.create("feature-x")
.from_commit(&commit_hash)
.author("developer")
.execute()?;
Ok(())
}
// Open a repository
let repo = repo_open("project.fossil");
// List branches
let branches = branches_list(repo);
for b in branches {
print("Branch: " + b);
}
// List files
let files = files_list(repo);
for f in files {
print(" " + f.name() + " (" + f.size() + " bytes)");
}
// Read a file
let content = files_read(repo, "README.md");
print("Content:\n" + content);
// Use the filesystem interface for modifications
let repo_rw = repo_open_rw("project.fossil");
let fs = fs_new(repo_rw, "developer@example.com");
fs_write(fs, "newfile.txt", "Hello, World!");
fs_commit(fs);
use heroforge_core::Repository;
fn main() -> heroforge_core::Result<()> {
let repo = Repository::open("project.fossil")?;
// Find all Rust files on trunk
let rust_files = repo.files().on_trunk().find("**/*.rs")?;
for file in rust_files {
println!("Found: {}", file.name);
}
// Find files in a specific directory on a branch
let src_files = repo.files().on_branch("feature-x").find("src/**/*")?;
// Find files at a specific tag
let tagged_files = repo.files().at_tag("v1.0.0").find("*.md")?;
Ok(())
}
use heroforge_core::Repository;
fn main() -> heroforge_core::Result<()> {
let repo = Repository::open("project.fossil")?;
// Get recent check-ins
let history = repo.history().recent(10)?;
for checkin in history {
println!("{} | {} | {}",
&checkin.hash[..12],
checkin.user,
checkin.comment
);
}
// List all branches
let branches = repo.branches().list()?;
for branch in branches {
println!("Branch: {}", branch);
}
// List all tags
let tags = repo.tags().list()?;
for tag in tags {
println!("Tag: {}", tag);
}
// Get the tip of a specific branch
let feature_tip = repo.history().branch_tip("feature-x")?;
println!("Feature branch tip: {}", feature_tip.hash);
Ok(())
}
use heroforge_core::Repository;
fn main() -> heroforge_core::Result<()> {
let repo = Repository::open_rw("project.fossil")?;
// Copy, move, delete files atomically
let hash = repo.fs().modify()
.message("Reorganize project")
.author("developer")
.copy_file("README.md", "docs/README.md")
.move_dir("scripts", "tools")
.delete_file("old_config.txt")
.make_executable("tools/build.sh")
.symlink("build", "tools/build.sh")
.execute()?;
// Advanced find with ignore patterns
let files = repo.fs().find()
.pattern("**/*.rs")
.ignore("target/**")
.ignore_hidden()
.max_depth(3)
.paths()?;
// Utility functions
println!("Exists: {}", repo.fs().exists("README.md")?);
println!("Is dir: {}", repo.fs().is_dir("src")?);
println!("Total size: {} bytes", repo.fs().du("**/*.rs")?);
Ok(())
}
The library uses a fluent builder pattern for all operations:
| Builder | Entry Point | Purpose |
|---|---|---|
FilesBuilder |
repo.files() |
Read files, list directories, find with glob patterns |
CommitBuilder |
repo.commit_builder() |
Create new check-ins with files |
BranchesBuilder |
repo.branches() |
List and create branches |
TagsBuilder |
repo.tags() |
List, create, and resolve tags |
HistoryBuilder |
repo.history() |
Browse commits and history |
UsersBuilder |
repo.users() |
Manage repository users |
SyncBuilder |
repo.sync() |
Synchronize with remote repositories (QUIC) |
FsOpsBuilder |
repo.fs() |
Filesystem operations (copy, move, delete, chmod, find, symlinks) |
| Function | Return | Description |
|---|---|---|
repo_open(path) |
Repository | Open repository read-only |
repo_open_rw(path) |
Repository | Open repository read-write |
repo_init(path) |
Repository | Create new repository |
repo_project_name(repo) |
string | Get project name |
| Function | Return | Description |
|---|---|---|
fs_new(repo, author) |
FsHandle | Create filesystem interface |
fs_read(fs, path) |
string | Read file as string |
fs_write(fs, path, content) |
void | Write file |
fs_delete(fs, path) |
void | Delete file |
fs_exists(fs, path) |
bool | Check if file exists |
fs_list(fs, dir) |
array | List directory |
fs_commit(fs) |
string | Commit changes |
| Function | Return | Description |
|---|---|---|
files_list(repo) |
array | List files on trunk |
files_read(repo, path) |
string | Read file from trunk |
files_find(repo, pattern) |
array | Find files by pattern |
| Function | Return | Description |
|---|---|---|
branches_list(repo) |
array | List all branches |
branches_create(repo, name, parent) |
string | Create branch |
tags_list(repo) |
array | List all tags |
tags_create(repo, name, target) |
string | Create tag |
| Function | Return | Description |
|---|---|---|
version() |
string | Get heroforge-core version |
uuid() |
string | Generate UUID |
timestamp() |
i64 | Get Unix timestamp |
sleep(ms) |
void | Sleep for milliseconds |
env(name) |
string | Get environment variable |
cwd() |
string | Current directory |
home() |
string | Home directory |
| Feature | Description | Dependencies |
|---|---|---|
rhai |
Rhai scripting support (default) | rhai, tokio, rustyline |
sync-quic |
QUIC protocol sync | quinn, rustls, tokio |
git-import |
Import git repositories | herolib-os |
The repository includes many examples demonstrating various features:
# Basic repository reading
cargo run --example read_repo
# Find files with glob patterns
cargo run --example find_and_read
# Branches and tags demonstration
cargo run --example branch_tag_test
# Comprehensive API demo
cargo run --example comprehensive_test
# Filesystem operations (copy, move, delete, chmod, symlinks)
cargo run --example fs_operations
# Advanced find with ignore patterns
cargo run --example fs_find
# QUIC sync (requires sync-quic feature)
cargo run --example quic_incremental_sync_test --features sync-quic
Full API documentation is available at docs.rs/heroforge-core.
Generate local documentation with:
cargo doc --open --all-features
A Fossil repository is a SQLite database containing: