cli: make the working copy changes in jj status clearer

This commit is contained in:
Martin von Zweigbergk 2021-05-23 22:08:12 -07:00
parent dcfc888f50
commit ba8ff31e32
3 changed files with 22 additions and 16 deletions

View File

@ -47,6 +47,12 @@ pub struct DiffSummary {
pub removed: Vec<RepoPath>, pub removed: Vec<RepoPath>,
} }
impl DiffSummary {
pub fn is_empty(&self) -> bool {
self.modified.is_empty() && self.added.is_empty() && self.removed.is_empty()
}
}
impl Tree { impl Tree {
pub fn new( pub fn new(
store: Arc<StoreWrapper>, store: Arc<StoreWrapper>,

View File

@ -49,7 +49,7 @@ use jujutsu_lib::settings::UserSettings;
use jujutsu_lib::store::{StoreError, Timestamp, TreeValue}; use jujutsu_lib::store::{StoreError, Timestamp, TreeValue};
use jujutsu_lib::store_wrapper::StoreWrapper; use jujutsu_lib::store_wrapper::StoreWrapper;
use jujutsu_lib::transaction::Transaction; use jujutsu_lib::transaction::Transaction;
use jujutsu_lib::tree::Tree; use jujutsu_lib::tree::DiffSummary;
use jujutsu_lib::trees::Diff; use jujutsu_lib::trees::Diff;
use jujutsu_lib::working_copy::{CheckoutStats, WorkingCopy}; use jujutsu_lib::working_copy::{CheckoutStats, WorkingCopy};
use jujutsu_lib::{conflicts, files, git, revset}; use jujutsu_lib::{conflicts, files, git, revset};
@ -965,7 +965,8 @@ fn cmd_diff(
} }
let repo = repo_command.repo(); let repo = repo_command.repo();
if sub_matches.is_present("summary") { if sub_matches.is_present("summary") {
show_diff_summary(ui, repo.working_copy_path(), &from_tree, &to_tree)?; let summary = from_tree.diff_summary(&to_tree);
show_diff_summary(ui, repo.working_copy_path(), &summary)?;
} else { } else {
let mut styler = ui.styler(); let mut styler = ui.styler();
styler.add_label(String::from("diff"))?; styler.add_label(String::from("diff"))?;
@ -1095,15 +1096,14 @@ fn cmd_diff(
Ok(()) Ok(())
} }
fn show_diff_summary(ui: &mut Ui, wc_path: &Path, from: &Tree, to: &Tree) -> io::Result<()> { fn show_diff_summary(ui: &mut Ui, wc_path: &Path, summary: &DiffSummary) -> io::Result<()> {
let summary = from.diff_summary(&to); for file in &summary.modified {
for file in summary.modified {
writeln!(ui, "M {}", ui.format_file_path(wc_path, &file))?; writeln!(ui, "M {}", ui.format_file_path(wc_path, &file))?;
} }
for file in summary.added { for file in &summary.added {
writeln!(ui, "A {}", ui.format_file_path(wc_path, &file))?; writeln!(ui, "A {}", ui.format_file_path(wc_path, &file))?;
} }
for file in summary.removed { for file in &summary.removed {
writeln!(ui, "R {}", ui.format_file_path(wc_path, &file))?; writeln!(ui, "R {}", ui.format_file_path(wc_path, &file))?;
} }
Ok(()) Ok(())
@ -1123,13 +1123,13 @@ fn cmd_status(
ui.write("Parent commit: ")?; ui.write("Parent commit: ")?;
ui.write_commit_summary(repo.as_repo_ref(), &commit.parents()[0])?; ui.write_commit_summary(repo.as_repo_ref(), &commit.parents()[0])?;
ui.write("\n")?; ui.write("\n")?;
ui.write("Diff summary:\n")?; let summary = commit.parents()[0].tree().diff_summary(&commit.tree());
show_diff_summary( if summary.is_empty() {
ui, ui.write("The working copy is clean\n")?;
repo.working_copy_path(), } else {
&commit.parents()[0].tree(), ui.write("Working copy changes:\n")?;
&commit.tree(), show_diff_summary(ui, repo.working_copy_path(), &summary)?;
)?; }
Ok(()) Ok(())
} }

View File

@ -30,7 +30,7 @@ fn smoke_test() {
let output_regex = Regex::new( let output_regex = Regex::new(
"^Working copy : ([[:xdigit:]]+) \n\ "^Working copy : ([[:xdigit:]]+) \n\
Parent commit: 000000000000 \n\ Parent commit: 000000000000 \n\
Diff summary:\n\ The working copy is clean\n\
$", $",
) )
.unwrap(); .unwrap();
@ -58,7 +58,7 @@ fn smoke_test() {
let output_regex = Regex::new( let output_regex = Regex::new(
"^Working copy : ([[:xdigit:]]+) \n\ "^Working copy : ([[:xdigit:]]+) \n\
Parent commit: 000000000000 \n\ Parent commit: 000000000000 \n\
Diff summary:\n\ Working copy changes:\n\
A file1\n\ A file1\n\
A file2\n\ A file2\n\
A file3\n\ A file3\n\