ok/jj
1
0
Fork 0
forked from mirrors/jj

cli: warn explicit paths not exist in either of diff trees

Maybe we can optimize it to check paths during diffing, but I think it's okay
to add extra lookup cost at the end. The size of the path arguments is usually
small.

Closes #505
This commit is contained in:
Yuya Nishihara 2024-04-09 16:35:23 +09:00
parent 33beb8d456
commit ae70db843e
3 changed files with 62 additions and 4 deletions

View file

@ -1722,6 +1722,32 @@ Discard the conflicting changes with `jj restore --from {}`.",
Ok(())
}
/// Prints warning about explicit paths that don't match any of the tree
/// entries.
pub fn print_unmatched_explicit_paths<'a>(
ui: &Ui,
workspace_command: &WorkspaceCommandHelper,
expression: &FilesetExpression,
trees: impl IntoIterator<Item = &'a MergedTree>,
) -> io::Result<()> {
let mut explicit_paths = expression.explicit_paths().collect_vec();
for tree in trees {
explicit_paths.retain(|&path| tree.path_value(path).is_absent());
if explicit_paths.is_empty() {
return Ok(());
}
}
let ui_paths = explicit_paths
.iter()
.map(|&path| workspace_command.format_file_path(path))
.join(", ");
writeln!(
ui.warning_default(),
"No matching entries for paths: {ui_paths}"
)?;
Ok(())
}
pub fn print_trackable_remote_branches(ui: &Ui, view: &View) -> io::Result<()> {
let remote_branch_names = view
.branches()

View file

@ -15,7 +15,7 @@
use jj_lib::rewrite::merge_commit_trees;
use tracing::instrument;
use crate::cli_util::{CommandHelper, RevisionArg};
use crate::cli_util::{print_unmatched_explicit_paths, CommandHelper, RevisionArg};
use crate::command_error::CommandError;
use crate::diff_util::{diff_formats_for, show_diff, DiffFormatArgs};
use crate::ui::Ui;
@ -76,9 +76,8 @@ pub(crate) fn cmd_diff(
from_tree = merge_commit_trees(workspace_command.repo().as_ref(), &parents)?;
to_tree = commit.tree()?
}
let matcher = workspace_command
.parse_file_patterns(&args.paths)?
.to_matcher();
let fileset_expression = workspace_command.parse_file_patterns(&args.paths)?;
let matcher = fileset_expression.to_matcher();
let diff_formats = diff_formats_for(command.settings(), &args.format)?;
ui.request_pager();
show_diff(
@ -90,5 +89,11 @@ pub(crate) fn cmd_diff(
matcher.as_ref(),
&diff_formats,
)?;
print_unmatched_explicit_paths(
ui,
&workspace_command,
&fileset_expression,
[&from_tree, &to_tree],
)?;
Ok(())
}

View file

@ -149,6 +149,33 @@ fn test_diff_basic() {
file3 | 1 +
3 files changed, 2 insertions(+), 1 deletion(-)
"###);
// Unmatched paths should generate warnings
let (stdout, stderr) = test_env.jj_cmd_ok(
test_env.env_root(),
&[
"diff",
"-Rrepo",
"-s",
"repo", // matches directory
"repo/file1", // deleted in to_tree, but exists in from_tree
"repo/x",
"repo/y/z",
],
);
insta::assert_snapshot!(stdout.replace('\\', "/"), @r###"
D repo/file1
M repo/file2
A repo/file3
"###);
insta::assert_snapshot!(stderr.replace('\\', "/"), @r###"
Warning: No matching entries for paths: repo/x, repo/y/z
"###);
// Unmodified paths shouldn't generate warnings
let (stdout, stderr) = test_env.jj_cmd_ok(&repo_path, &["diff", "-s", "--from=@", "file2"]);
insta::assert_snapshot!(stdout, @"");
insta::assert_snapshot!(stderr, @"");
}
#[test]