step twenty seven: iterate commits and parents
This commit is contained in:
parent
a555ebf6c0
commit
e0467dec69
22
src/base.rs
22
src/base.rs
|
@ -1,4 +1,4 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
@ -109,6 +109,26 @@ pub fn get_commit(oid: String) -> Commit {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn iter_commits_and_parents(mut oids: HashSet<String>) -> Vec<String> {
|
||||||
|
let mut visited: HashSet<String> = 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) {
|
pub fn checkout(oid: String) {
|
||||||
let commit = get_commit(oid.clone());
|
let commit = get_commit(oid.clone());
|
||||||
read_tree(commit.tree);
|
read_tree(commit.tree);
|
||||||
|
|
12
src/main.rs
12
src/main.rs
|
@ -1,4 +1,5 @@
|
||||||
use clap::{App, Arg, ArgMatches, SubCommand};
|
use clap::{App, Arg, ArgMatches, SubCommand};
|
||||||
|
use std::collections::HashSet;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
mod base;
|
mod base;
|
||||||
mod data;
|
mod data;
|
||||||
|
@ -152,7 +153,18 @@ fn tag(matches: ArgMatches) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn k() {
|
fn k() {
|
||||||
|
let mut oids = HashSet::new();
|
||||||
for refinfo in data::iter_refs() {
|
for refinfo in data::iter_refs() {
|
||||||
println!("{} {}", refinfo.0, refinfo.1);
|
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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue