mkit_cli/commands/
summary.rs1use std::io::Write;
8
9use mkit_core::hash::Hash;
10use mkit_core::object::EntryMode;
11use mkit_core::ops::{DiffKind, diff_trees};
12use mkit_core::store::ObjectStore;
13
14use crate::format;
15
16#[derive(Debug)]
18pub enum HeadRef<'a> {
19 Branch(&'a str),
21 Detached,
23}
24
25pub fn print_commit_summary(
36 out: &mut impl Write,
37 store: &ObjectStore,
38 head: &HeadRef,
39 hash: &Hash,
40 subject: &str,
41 is_root: bool,
42 old_tree: Option<Hash>,
43 new_tree: Option<Hash>,
44) {
45 let short = format::short_hash(hash, format::SUMMARY_ABBREV);
46 let head_part = match head {
47 HeadRef::Detached => format!("detached HEAD {short}"),
48 HeadRef::Branch(b) if is_root => format!("{b} (root-commit) {short}"),
49 HeadRef::Branch(b) => format!("{b} {short}"),
50 };
51 let _ = writeln!(out, "[{head_part}] {subject}");
52 let Ok(result) = diff_trees(store, old_tree, new_tree) else {
53 return;
54 };
55 let _ = super::diff::render_stat(out, store, result.entries.iter());
57 for e in &result.entries {
58 match e.kind {
59 DiffKind::Added => {
60 let _ = writeln!(out, " create mode {} {}", octal(e.new_mode), e.path);
61 }
62 DiffKind::Removed => {
63 let _ = writeln!(out, " delete mode {} {}", octal(e.old_mode), e.path);
64 }
65 DiffKind::Modified | DiffKind::ModeChanged | DiffKind::Renamed => {}
66 }
67 }
68}
69
70fn octal(mode: Option<EntryMode>) -> &'static str {
73 match mode {
74 Some(EntryMode::Executable) => "100755",
75 Some(EntryMode::Symlink) => "120000",
76 Some(EntryMode::Tree) => "040000",
77 _ => "100644",
78 }
79}