aboutsummaryrefslogtreecommitdiff
path: root/src/git/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/git/mod.rs')
-rw-r--r--src/git/mod.rs55
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(),
+ )
+ }
+}