1use std::{env, ffi};
2
3use crate::{
4 error::{Error, Result},
5 git::git,
6 trunk,
7};
8
9struct Args {
10 git_args: Vec<ffi::OsString>,
12 base: Option<ffi::OsString>,
14}
15
16impl Args {
17 fn new(our_args: env::ArgsOs) -> Result<Args> {
18 let mut base: Option<ffi::OsString> = None;
19 let mut git_args = [
20 "log",
21 "--color=always",
22 "--decorate",
23 "--first-parent",
24 "--graph",
25 "--oneline",
26 ]
27 .map(ffi::OsString::from)
28 .to_vec();
29 for os in our_args {
30 let Some(s) = os.to_str() else {
31 return Err(Error::Arg(os));
32 };
33 if s.starts_with('-') {
34 git_args.push(os);
35 } else if base.is_none() {
36 base = Some(os);
37 } else {
38 return Err(Error::Arg(os));
39 }
40 }
41 Ok(Args { git_args, base })
42 }
43}
44
45pub async fn short(our_args: env::ArgsOs) -> Result<()> {
58 let Args { mut git_args, base } = Args::new(our_args)?;
59 let range = match base {
60 Some(some) => format!("{}..", some.display()),
61 None => format!("{}..", trunk::local().await?),
62 };
63 git_args.push(range.into());
64 print!("{}", git(git_args).await?);
65 Ok(())
66}
67
68pub async fn long(our_args: env::ArgsOs) -> Result<()> {
75 let Args { mut git_args, base } = Args::new(our_args)?;
76 print!("{}", git(["diff", "--stat"]).await?);
77 let range = match base {
78 Some(some) => format!("{}^..", some.display()),
79 None => format!("{}^..", trunk::local().await?),
80 };
81 git_args.push(range.into());
82 print!("{}", git(git_args).await?);
83 Ok(())
84}