Skip to content

Commit 4055500

Browse files
Michael J Grubergitster
authored andcommitted
commit/status: show the index-worktree diff with -v -v
git commit and git status in long format show the diff between HEAD and the index when given -v. This allows previewing a commit to be made. They also list tracked files with unstaged changes, but without a diff. Introduce '-v -v' which shows the diff between the index and the worktree in addition to the HEAD index diff. This allows a review of unstaged changes which might be missing from the commit. In the case of '-v -v', additonal header lines Changes to be committed: and Changes not staged for commit: are inserted before the diffs, which are equal to those in the status part; the latter preceded by 50*"-" to make it stick out more. Signed-off-by: Michael J Gruber <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent f8c65c1 commit 4055500

File tree

3 files changed

+35
-0
lines changed

3 files changed

+35
-0
lines changed

Documentation/git-commit.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,10 @@ configuration variable documented in linkgit:git-config[1].
284284
would be committed at the bottom of the commit message
285285
template. Note that this diff output doesn't have its
286286
lines prefixed with '#'.
287+
+
288+
If specified twice, show in addition the unified diff between
289+
what would be committed and the worktree files, i.e. the unstaged
290+
changes to tracked files.
287291

288292
-q::
289293
--quiet::

t/t7508-status.sh

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,17 @@ test_expect_success 'status -v' '
143143
test_i18ncmp expect-with-v output
144144
'
145145

146+
test_expect_success 'status -v -v' '
147+
(cat expect &&
148+
echo "Changes to be committed:" &&
149+
git -c diff.mnemonicprefix=true diff --cached &&
150+
echo "--------------------------------------------------" &&
151+
echo "Changes not staged for commit:" &&
152+
git -c diff.mnemonicprefix=true diff) >expect-with-v &&
153+
git status -v -v >output &&
154+
test_i18ncmp expect-with-v output
155+
'
156+
146157
test_expect_success 'setup fake editor' '
147158
cat >.git/editor <<-\EOF &&
148159
#! /bin/sh

wt-status.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,6 +849,8 @@ static void wt_status_print_verbose(struct wt_status *s)
849849
{
850850
struct rev_info rev;
851851
struct setup_revision_opt opt;
852+
int dirty_submodules;
853+
const char *c = color(WT_STATUS_HEADER, s);
852854

853855
init_revisions(&rev, NULL);
854856
DIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV);
@@ -873,7 +875,25 @@ static void wt_status_print_verbose(struct wt_status *s)
873875
rev.diffopt.use_color = 0;
874876
wt_status_add_cut_line(s->fp);
875877
}
878+
if (s->verbose > 1 && s->commitable) {
879+
/* print_updated() printed a header, so do we */
880+
if (s->fp != stdout)
881+
wt_status_print_trailer(s);
882+
status_printf_ln(s, c, _("Changes to be committed:"));
883+
rev.diffopt.a_prefix = "c/";
884+
rev.diffopt.b_prefix = "i/";
885+
} /* else use prefix as per user config */
876886
run_diff_index(&rev, 1);
887+
if (s->verbose > 1 &&
888+
wt_status_check_worktree_changes(s, &dirty_submodules)) {
889+
status_printf_ln(s, c,
890+
"--------------------------------------------------");
891+
status_printf_ln(s, c, _("Changes not staged for commit:"));
892+
setup_work_tree();
893+
rev.diffopt.a_prefix = "i/";
894+
rev.diffopt.b_prefix = "w/";
895+
run_diff_files(&rev, 0);
896+
}
877897
}
878898

879899
static void wt_status_print_tracking(struct wt_status *s)

0 commit comments

Comments
 (0)