1use std::{io::Write, process::Command};
4
5use itertools::Itertools;
6use owo_colors::OwoColorize;
7use tagit_core::{Tagit, out};
8use tagit_workspace::{WorkspaceEntry, with_workspace_entries};
9
10pub fn diff(short: bool) -> anyhow::Result<()> {
12 with_workspace_entries(
13 false,
14 false,
15 |WorkspaceEntry {
16 version,
17 tag_prefix,
18 paths,
19 name,
20 ..
21 }| {
22 let tag = &*format!("{tag_prefix}{version}");
23 let no_diff = paths.is_empty()
24 || !Tagit::exists(tag)?
25 || Command::new("git")
26 .arg("diff-index")
27 .arg("--quiet")
28 .arg(tag)
29 .args(paths)
30 .status()?
31 .success();
32 if !no_diff {
33 out!(
34 "differs",
35 "{} ({}; some of {})",
36 name.purple(),
37 tag.dimmed(),
38 paths.iter().map(|path| path.display()).join(" ").dimmed(),
39 );
40 if !short {
41 let stdout = Command::new("git")
42 .arg("--no-pager")
43 .arg("diff")
44 .arg("--color")
45 .arg("-U0")
46 .arg(tag)
47 .arg("--")
48 .args(paths)
49 .output()?
50 .stdout;
51 std::io::stdout().write_all(&stdout)?;
52 }
53 }
54 Ok(())
55 },
56 )
57}