path: root/supergit/src/lib.rs
//! Strongly typed git repository explorer library
//! This library exposes a read-only view into a git repository.  To
//! get started, open an existing bare repo, and then call `sync()` to
//! build a cache of it.  Every time you want your view of the repo to
//! update, call `sync()` again.  If you want the sync operation to be
//! blocking, call `sync_blocking()` instead.

mod branch;
pub use branch::{Branch, BranchCommit};

mod commit;
pub use commit::{CommitId, Commit};

mod diff;
pub use diff::Diff;

pub mod raw;

use std::sync::atomic::{AtomicUsize, Ordering};
use async_std::sync::{Arc, RwLock};

use raw::RawRepository;

/// Represents a git repository with lazy data loading
pub struct Repository {
    raw: RawRepository,

impl Repository {
    pub fn open(path: &std::path::Path) -> Arc<Self> {
    /// Sync the repository with the backing git files
    /// This function can be invoked manually, but should be invoked
    /// basically every time your program expects changes to have
    /// happened.  Polling this function is not recommended.
    pub fn sync(&self) {

/////////// IDs are created from the same pool to save on code size ////////////

const ID_CTR: AtomicUsize = AtomicUsize::new(0);

/// Get monotonically increasing IDs for objects
pub(crate) fn id() -> usize {
    ID_CTR.fetch_add(1, Ordering::Relaxed)