diff options
author | Katharina Fey <kookie@spacekookie.de> | 2020-06-22 16:33:28 +0200 |
---|---|---|
committer | Katharina Fey <kookie@spacekookie.de> | 2020-06-22 16:33:28 +0200 |
commit | a0dca8186bdef76e09e9c388d7f85839e85ce8db (patch) | |
tree | e10257f724b01ddc9b8244c9b2429921612b6856 /src/git/mod.rs | |
parent | 367cb0b2358be04d18dfea963d1c42044893e3b4 (diff) |
git: refactoring git module to have a unified actions API
Diffstat (limited to 'src/git/mod.rs')
-rw-r--r-- | src/git/mod.rs | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/src/git/mod.rs b/src/git/mod.rs index 1cd9057..244e2f4 100644 --- a/src/git/mod.rs +++ b/src/git/mod.rs @@ -1,5 +1,58 @@ //! Wrappers for libgit2 pub mod log; -pub mod repo; pub mod tree; + +use git2::{self, Repository}; +use log::CommitGraph; +use tree::Tree; + +/// A top-level wrapper API for all libgit2 functions +pub struct Repo { + inner: Repository, + commits: Option<CommitGraph>, + rev: Option<String>, +} + +impl Repo { + pub(crate) fn new(path: &str) -> Self { + Self { + inner: Repository::open(path).expect(&format!("`{}` is not a valid git repo", path)), + commits: None, + rev: None, + } + } + + pub(self) fn get_inner(&self) -> &Repository { + &self.inner + } + + pub(self) fn get_tree<'r>(&'r self, rev: &str) -> git2::Tree<'r> { + self.inner + .revparse_single(rev) + .unwrap() + .peel_to_tree() + .unwrap() + } + + pub(crate) fn clear_cache(&mut self) { + self.rev = None; + self.commits = None; + } + + /// Load and cache commits for a specific rev + pub(crate) fn load_commits(&mut self, rev: String) { + self.rev = Some(rev.clone()); + self.commits = Some(log::create_commit_log(rev, &self)); + } + + /// Load the tree of files for the current rev + /// + /// Will fail if no rev was previously cached + pub(crate) fn get_file_tree(&self) -> Tree { + tree::parse_tree( + self.get_tree(self.rev.as_ref().unwrap().as_str()), + self.get_inner(), + ) + } +} |