Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

status: fix crash in git status --deserialize --verbose (based on v2.26) #260

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions builtin/commit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1592,6 +1592,22 @@ int cmd_status(int argc, const char **argv, const char *prefix)
*/
try_deserialize = (!do_serialize &&
(do_implicit_deserialize || do_explicit_deserialize));

/*
* Disable deserialize when verbose is set because it causes us to
* print diffs for each modified file, but that requires us to have
* the index loaded and we don't want to do that (at least not now for
* this seldom used feature). My fear is that would further tangle
* the merge conflict with upstream.
*
* TODO Reconsider this in the future.
*/
if (try_deserialize && verbose) {
trace2_data_string("status", the_repository, "deserialize/reject",
"args/verbose");
try_deserialize = 0;
}

if (try_deserialize)
goto skip_init;
/*
Expand Down
39 changes: 39 additions & 0 deletions t/t7524-serialized-status.sh
Original file line number Diff line number Diff line change
Expand Up @@ -387,4 +387,43 @@ EOF

'

test_expect_success 'ensure deserialize -v does not crash' '

git init verbose_test &&
touch verbose_test/a &&
touch verbose_test/b &&
touch verbose_test/c &&
git -C verbose_test add a b c &&
git -C verbose_test commit -m abc &&

echo green >>verbose_test/a &&
git -C verbose_test add a &&
echo red_1 >>verbose_test/b &&
echo red_2 >verbose_test/dirt &&

git -C verbose_test status >output.ref &&
git -C verbose_test status -v >output.ref_v &&

git -C verbose_test --no-optional-locks status --serialize=../verbose_test.dat >output.ser.long &&
git -C verbose_test --no-optional-locks status --serialize=../verbose_test.dat_v -v >output.ser.long_v &&

# Verify that serialization does not affect the status output itself.
test_i18ncmp output.ref output.ser.long &&
test_i18ncmp output.ref_v output.ser.long_v &&

GIT_TRACE2_PERF="$(pwd)"/verbose_test.log \
git -C verbose_test status --deserialize=../verbose_test.dat >output.des.long &&

# Verify that normal deserialize was actually used and produces the same result.
test_i18ncmp output.ser.long output.des.long &&
grep -q "deserialize/result:ok" verbose_test.log &&

GIT_TRACE2_PERF="$(pwd)"/verbose_test.log_v \
git -C verbose_test status --deserialize=../verbose_test.dat_v -v >output.des.long_v &&

# Verify that vebose mode produces the same result because verbose was rejected.
test_i18ncmp output.ser.long_v output.des.long_v &&
grep -q "deserialize/reject:args/verbose" verbose_test.log_v
'

test_done
1 change: 1 addition & 0 deletions wt-status-deserialize.c
Original file line number Diff line number Diff line change
Expand Up @@ -690,6 +690,7 @@ static int wt_deserialize_fd(const struct wt_status *cmd_s, struct wt_status *de
/*
* Copy over display-related fields from the current command.
*/
des_s->repo = cmd_s->repo;
des_s->verbose = cmd_s->verbose;
/* amend */
/* whence */
Expand Down