aboutsummaryrefslogtreecommitdiff
path: root/apps/servers/octopus/src/git/log.rs
diff options
context:
space:
mode:
Diffstat (limited to 'apps/servers/octopus/src/git/log.rs')
-rw-r--r--apps/servers/octopus/src/git/log.rs117
1 files changed, 0 insertions, 117 deletions
diff --git a/apps/servers/octopus/src/git/log.rs b/apps/servers/octopus/src/git/log.rs
deleted file mode 100644
index c8f4aa37ccf2..000000000000
--- a/apps/servers/octopus/src/git/log.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-//! libgit2 log parsing
-
-use crate::git::{tree::FileNode, Repo};
-use git2::Oid;
-use std::collections::{BTreeMap, BTreeSet};
-
-/// A file-commit referenced graph thing
-///
-/// git is _weird_! It's essentially just a glorified key-value store
-/// and it shows. There's no utilities to figure out how thing are
-/// related, and all the actual graph things in git are sugar on top
-/// of this store.
-///
-/// In order to make sense of anything in a repo we need to quite
-/// heavily parse the log. This type here is the result of this
-/// parsing: you can ask it smart questions like "when did this file
-/// change" and it will tell you (sort of).
-#[derive(Debug, Default)]
-pub(crate) struct CommitGraph {
- /// The correct order of commits in the log
- order: Vec<String>,
- /// List of all files, and the commits in which they were touched
- file_refs: BTreeMap<String, Vec<String>>,
- /// Map of commit IDs to metadata
- commit_refs: BTreeMap<String, CommitNode>,
-}
-
-#[derive(Debug)]
-pub(crate) struct CommitNode {
- id: String,
- author: String,
- message: String,
- touches: BTreeSet<String>,
- time: i64,
-}
-
-fn build_diff_log(repo: &Repo, log: Vec<(String, Vec<FileNode>)>) -> Vec<CommitNode> {
- todo!()
-}
-
-/// Walk through all commits from a given ref and build a commit graph
-pub(crate) fn create_commit_log(rev: String, repo: &Repo) -> CommitGraph {
- let mut walker = repo.get_inner().revwalk().unwrap();
- walker.push(Oid::from_str(rev.as_str()).unwrap()).unwrap();
- let mut commits = walker
- .into_iter()
- .map(|oid| {
- let oid = oid.unwrap();
- repo.get_inner().find_commit(oid).unwrap()
- })
- .collect::<Vec<_>>();
- commits.reverse();
-
- let mut initial: Vec<(_, _)> = commits
- .into_iter()
- .map(|commit| {
- let id = format!("{}", commit.id());
- (id.clone(), repo.get_tree(id.as_str()))
- })
- .collect();
-
- // split off rest of the diffs and dissolve the len(1) vec
- let log = initial.split_off(1);
- let previous = initial.remove(0).1;
-
- let mut order = vec![];
- let (commit_refs, file_refs) = log.into_iter().fold(
- (BTreeMap::new(), BTreeMap::new()),
- |(mut cm, mut fm), (cid, current)| {
- let commit_id = format!("{}", cid);
-
- let d = repo
- .get_inner()
- .diff_tree_to_tree(Some(&previous), Some(&current), None)
- .unwrap();
-
- // Store the commit to preserve order
- order.push(commit_id.clone());
-
- // For each file, store this commit as one that touched it
- let touches = d.deltas().fold(BTreeSet::new(), |mut set, delta| {
- let file_id = format!("{}", delta.new_file().id());
- fm.entry(file_id.clone())
- .or_insert(vec![])
- .push(commit_id.clone());
- set.insert(file_id);
- set
- });
-
- // From the commit, build a metadata object
- let commit_u = repo
- .get_inner()
- .find_commit(Oid::from_str(cid.as_str()).unwrap())
- .unwrap();
- let author_u = commit_u.author();
- let commit = CommitNode {
- id: commit_id,
- message: commit_u.message().unwrap().to_owned(),
- author: format!("{} {}", author_u.name().unwrap(), author_u.email().unwrap()),
- touches,
- time: author_u.when().seconds(),
- };
-
- // Insert the metadata object
- cm.insert(cid.clone(), commit);
-
- // We pass both the modified maps into the next commit
- (cm, fm)
- },
- );
-
- CommitGraph {
- order,
- file_refs,
- commit_refs,
- }
-}