diff --git a/src/base.rs b/src/base.rs index 2e30302..0a5a4bc 100644 --- a/src/base.rs +++ b/src/base.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::fs; use std::io; use std::path::Path; @@ -109,6 +109,26 @@ pub fn get_commit(oid: String) -> Commit { }; } +pub fn iter_commits_and_parents(mut oids: HashSet) -> Vec { + let mut visited: HashSet = HashSet::new(); + let mut oid_sequence = vec![]; + + while !oids.is_empty() { + let oid = oids.iter().next().cloned().unwrap(); + oids.remove(&oid); + if oid == "" || visited.contains(&oid) { + continue; + } + visited.insert(oid.clone()); + oid_sequence.push(oid.clone()); + + let commit = get_commit(oid); + oids.insert(commit.parent); + } + + return oid_sequence; +} + pub fn checkout(oid: String) { let commit = get_commit(oid.clone()); read_tree(commit.tree); diff --git a/src/main.rs b/src/main.rs index bddb738..8115870 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ use clap::{App, Arg, ArgMatches, SubCommand}; +use std::collections::HashSet; use std::fs; mod base; mod data; @@ -152,7 +153,18 @@ fn tag(matches: ArgMatches) { } fn k() { + let mut oids = HashSet::new(); for refinfo in data::iter_refs() { println!("{} {}", refinfo.0, refinfo.1); + oids.insert(refinfo.1); } + + for oid in base::iter_commits_and_parents(oids) { + let commit = base::get_commit(oid.clone()); + println!("{}", oid); + if commit.parent != "" { + println!("Parent: {}", commit.parent); + } + } + // TODO visualize refs }