From f047bb51814f781658968dc3af4fb06a7eca7e5e Mon Sep 17 00:00:00 2001 From: Patrick Marie Date: Wed, 5 Feb 2025 22:55:27 +0100 Subject: [PATCH] feat: adding log --- src/log.rs | 29 +++++++++++++++++++++++++++++ src/main.rs | 7 +++++++ 2 files changed, 36 insertions(+) create mode 100644 src/log.rs diff --git a/src/log.rs b/src/log.rs new file mode 100644 index 0000000..707570f --- /dev/null +++ b/src/log.rs @@ -0,0 +1,29 @@ +use crate::repository::Repository; + +use anyhow::Result; +use hex::FromHex; + +impl Repository { + pub fn log(&self) -> Result<()> { + let mut current_commit = self.current_commit()?; + + loop { + let mut commit = self.read_object(&hex::encode(current_commit))?; + + let commit_desc = commit.string()?; + let lines = commit_desc.lines().collect::>(); + + println!("{} {}", hex::encode(current_commit), lines[lines.len() - 1]); + + let parent_commit_id = lines.iter().find(|line| line.starts_with("parent ")); + if parent_commit_id.is_none() { + break; + } + + let parent_commit_id = parent_commit_id.unwrap(); + current_commit = <[u8; 20]>::from_hex(parent_commit_id.split_once(' ').unwrap().1)?; + } + + Ok(()) + } +} diff --git a/src/main.rs b/src/main.rs index 5fed1b0..65b20b4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,6 +8,7 @@ use clap::Subcommand; mod commit; mod error; mod kind; +mod log; mod object; mod repository; mod tree; @@ -56,6 +57,8 @@ enum Command { /// The commit to show hash: Option, }, + /// Show the commit log + Log, } fn main() -> Result<(), Error> { @@ -92,6 +95,10 @@ fn main() -> Result<(), Error> { Ok(_) => (), Err(e) => eprintln!("Failed to show: {}", e), }, + Command::Log => match repo.log() { + Ok(_) => (), + Err(e) => eprintln!("Failed to show log: {}", e), + }, } Ok(())