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 <git@drmicha.warpmail.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Michael J Gruber 2015-03-06 10:43:35 +01:00 committed by Junio C Hamano
parent f8c65c1f97
commit 4055500093
3 changed files with 35 additions and 0 deletions

View File

@ -284,6 +284,10 @@ configuration variable documented in linkgit:git-config[1].
would be committed at the bottom of the commit message would be committed at the bottom of the commit message
template. Note that this diff output doesn't have its template. Note that this diff output doesn't have its
lines prefixed with '#'. lines prefixed with '#'.
+
If specified twice, show in addition the unified diff between
what would be committed and the worktree files, i.e. the unstaged
changes to tracked files.


-q:: -q::
--quiet:: --quiet::

View File

@ -143,6 +143,17 @@ test_expect_success 'status -v' '
test_i18ncmp expect-with-v output test_i18ncmp expect-with-v output
' '


test_expect_success 'status -v -v' '
(cat expect &&
echo "Changes to be committed:" &&
git -c diff.mnemonicprefix=true diff --cached &&
echo "--------------------------------------------------" &&
echo "Changes not staged for commit:" &&
git -c diff.mnemonicprefix=true diff) >expect-with-v &&
git status -v -v >output &&
test_i18ncmp expect-with-v output
'

test_expect_success 'setup fake editor' ' test_expect_success 'setup fake editor' '
cat >.git/editor <<-\EOF && cat >.git/editor <<-\EOF &&
#! /bin/sh #! /bin/sh

View File

@ -849,6 +849,8 @@ static void wt_status_print_verbose(struct wt_status *s)
{ {
struct rev_info rev; struct rev_info rev;
struct setup_revision_opt opt; struct setup_revision_opt opt;
int dirty_submodules;
const char *c = color(WT_STATUS_HEADER, s);


init_revisions(&rev, NULL); init_revisions(&rev, NULL);
DIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV); DIFF_OPT_SET(&rev.diffopt, ALLOW_TEXTCONV);
@ -873,7 +875,25 @@ static void wt_status_print_verbose(struct wt_status *s)
rev.diffopt.use_color = 0; rev.diffopt.use_color = 0;
wt_status_add_cut_line(s->fp); wt_status_add_cut_line(s->fp);
} }
if (s->verbose > 1 && s->commitable) {
/* print_updated() printed a header, so do we */
if (s->fp != stdout)
wt_status_print_trailer(s);
status_printf_ln(s, c, _("Changes to be committed:"));
rev.diffopt.a_prefix = "c/";
rev.diffopt.b_prefix = "i/";
} /* else use prefix as per user config */
run_diff_index(&rev, 1); run_diff_index(&rev, 1);
if (s->verbose > 1 &&
wt_status_check_worktree_changes(s, &dirty_submodules)) {
status_printf_ln(s, c,
"--------------------------------------------------");
status_printf_ln(s, c, _("Changes not staged for commit:"));
setup_work_tree();
rev.diffopt.a_prefix = "i/";
rev.diffopt.b_prefix = "w/";
run_diff_files(&rev, 0);
}
} }


static void wt_status_print_tracking(struct wt_status *s) static void wt_status_print_tracking(struct wt_status *s)