Skip to content

Commit

Permalink
status: deserialize with -uno does not print correct hint
Browse files Browse the repository at this point in the history
With the "--untracked-files=complete" option status computes a
superset of the untracked files.  We use this when writing the
status cache.  If subsequent deserialize commands ask for either
the complete set or one of the "no", "normal", or "all" subsets,
it can still use the cache file because of filtering in the
deserialize parser.

When running status with the "-uno" option, the long format
status would print a "(use -u to show untracked files)" hint.

When deserializing with the "-uno" option and using a cache computed
with "-ucomplete", the "nothing to commit, working tree clean" message
would be printed instead of the hint.

It was easy to miss because the correct hint message was printed
if the cache was rejected for any reason (and status did the full
fallback).

The "struct wt_status des" structure was initialized with the
content of the status cache (and thus defaulted to "complete").
This change sets "des.show_untracked_files" to the requested
subset from the command-line or config.  This allows the long
format to print the hint.

Signed-off-by: Jeff Hostetler <jeffhost@microsoft.com>
  • Loading branch information
jeffhostetler authored and dscho committed Aug 11, 2023
1 parent d46bd3b commit 06903ac
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 6 deletions.
55 changes: 55 additions & 0 deletions t/t7522-serialized-status.sh
Original file line number Diff line number Diff line change
Expand Up @@ -345,4 +345,59 @@ test_expect_success 'renames' '
test_cmp output.1 output.2
'

test_expect_success 'hint message when cached with u=complete' '
git init -b main hint &&
echo xxx >hint/xxx &&
git -C hint add xxx &&
git -C hint commit -m xxx &&
cat >expect.clean <<EOF &&
On branch main
nothing to commit, working tree clean
EOF
cat >expect.use_u <<EOF &&
On branch main
nothing to commit (use -u to show untracked files)
EOF
# Capture long format output from "no", "normal", and "all"
# (without using status cache) and verify it matches expected
# output.
git -C hint status --untracked-files=normal >hint.output_normal &&
test_cmp expect.clean hint.output_normal &&
git -C hint status --untracked-files=all >hint.output_all &&
test_cmp expect.clean hint.output_all &&
git -C hint status --untracked-files=no >hint.output_no &&
test_cmp expect.use_u hint.output_no &&
# Create long format output for "complete" and create status cache.
git -C hint status --untracked-files=complete --ignored=matching --serialize=../hint.dat >hint.output_complete &&
test_cmp expect.clean hint.output_complete &&
# Capture long format output using the status cache and verify
# that the output matches the non-cached version. There are 2
# ways to specify untracked-files, so do them both.
git -C hint status --deserialize=../hint.dat -unormal >hint.d1_normal &&
test_cmp expect.clean hint.d1_normal &&
git -C hint -c status.showuntrackedfiles=normal status --deserialize=../hint.dat >hint.d2_normal &&
test_cmp expect.clean hint.d2_normal &&
git -C hint status --deserialize=../hint.dat -uall >hint.d1_all &&
test_cmp expect.clean hint.d1_all &&
git -C hint -c status.showuntrackedfiles=all status --deserialize=../hint.dat >hint.d2_all &&
test_cmp expect.clean hint.d2_all &&
git -C hint status --deserialize=../hint.dat -uno >hint.d1_no &&
test_cmp expect.use_u hint.d1_no &&
git -C hint -c status.showuntrackedfiles=no status --deserialize=../hint.dat >hint.d2_no &&
test_cmp expect.use_u hint.d2_no
'

test_done
16 changes: 10 additions & 6 deletions wt-status-deserialize.c
Original file line number Diff line number Diff line change
Expand Up @@ -423,20 +423,24 @@ static int wt_deserialize_v1_ignored_items(struct wt_status *s,
}

static int validate_untracked_files_arg(enum untracked_status_type cmd,
enum untracked_status_type des,
enum untracked_status_type *des,
enum deserialize_parse_strategy *strategy)
{
*strategy = DESERIALIZE_STRATEGY_AS_IS;

if (cmd == des) {
if (cmd == *des) {
*strategy = DESERIALIZE_STRATEGY_AS_IS;
} else if (cmd == SHOW_NO_UNTRACKED_FILES) {
*strategy = DESERIALIZE_STRATEGY_SKIP;
} else if (des == SHOW_COMPLETE_UNTRACKED_FILES) {
if (cmd == SHOW_ALL_UNTRACKED_FILES)
*des = cmd;
} else if (*des == SHOW_COMPLETE_UNTRACKED_FILES) {
if (cmd == SHOW_ALL_UNTRACKED_FILES) {
*strategy = DESERIALIZE_STRATEGY_ALL;
else if (cmd == SHOW_NORMAL_UNTRACKED_FILES)
*des = cmd;
} else if (cmd == SHOW_NORMAL_UNTRACKED_FILES) {
*strategy = DESERIALIZE_STRATEGY_NORMAL;
*des = cmd;
}
} else {
return DESERIALIZE_ERR;
}
Expand Down Expand Up @@ -478,7 +482,7 @@ static int wt_deserialize_v1(const struct wt_status *cmd_s, struct wt_status *s,
* We now have the header parsed. Look at the command args (as passed in), and see how to parse
* the serialized data
*/
if (validate_untracked_files_arg(cmd_s->show_untracked_files, s->show_untracked_files, &untracked_strategy)) {
if (validate_untracked_files_arg(cmd_s->show_untracked_files, &s->show_untracked_files, &untracked_strategy)) {
trace_printf_key(&trace_deserialize, "reject: show_untracked_file: command: %d, serialized : %d",
cmd_s->show_untracked_files,
s->show_untracked_files);
Expand Down

0 comments on commit 06903ac

Please sign in to comment.