use radicle::git; use crate::terminal as term; use crate::terminal::cell::Cell as _; /// The user supplied `Patch` description. #[derive(Clone, Debug, PartialEq, Eq)] pub enum Message { /// Prompt user to write comment in editor. Edit, /// Don't leave a comment. Blank, /// Use the following string as comment. Text(String), } impl Message { /// Get the `Message` as a string according to the method. pub fn get(self, help: &str) -> String { let comment = match self { Message::Edit => term::Editor::new() .extension("markdown") .edit(help) .ok() .flatten(), Message::Blank => None, Message::Text(c) => Some(c), }; let comment = comment.unwrap_or_default(); let comment = comment.trim(); comment.to_owned() } pub fn append(&mut self, arg: &str) { if let Message::Text(v) = self { v.extend(["\n\n", arg]); } else { *self = Message::Text(arg.into()); }; } } impl Default for Message { fn default() -> Self { Self::Edit } } /// List the given commits in a table. pub fn list_commits(commits: &[git::raw::Commit]) -> anyhow::Result<()> { let mut table = term::Table::default(); for commit in commits { let message = commit .summary_bytes() .unwrap_or_else(|| commit.message_bytes()); table.push([ term::format::secondary(term::format::oid(commit.id())), term::format::italic(String::from_utf8_lossy(message).to_string()), ]); } table.render(); Ok(()) } /// Print commits ahead and behind. pub fn print_commits_ahead_behind( repo: &git::raw::Repository, left: git::raw::Oid, right: git::raw::Oid, ) -> anyhow::Result<()> { let (ahead, behind) = repo.graph_ahead_behind(left, right)?; term::info!( "{} commit(s) ahead, {} commit(s) behind", term::format::positive(ahead), if behind > 0 { term::format::negative(behind) } else { term::format::dim(behind) } ); Ok(()) } /// Print title and description in a text box. pub fn print_title_desc(title: &str, description: &str) { let title_pretty = &term::format::dim(format!("╭─ {title} ───────")); term::print(title_pretty); term::blank(); if description.is_empty() { term::print(term::format::italic("No description provided.")); } else { term::markdown(description); } term::blank(); term::print(term::format::dim(format!( "╰{}", "─".repeat(title_pretty.to_string().width() - 1) ))); }