[PATCHv2 2/2] commit/status: show the index-worktree diff with -v -v

2015-03-03 Thread Michael J Gruber
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.

Signed-off-by: Michael J Gruber 
---
 Documentation/git-commit.txt |  4 
 t/t7508-status.sh| 43 +++
 wt-status.c  | 10 ++
 3 files changed, 57 insertions(+)

diff --git a/Documentation/git-commit.txt b/Documentation/git-commit.txt
index 1e74b75..f14d2ec 100644
--- a/Documentation/git-commit.txt
+++ b/Documentation/git-commit.txt
@@ -284,6 +284,10 @@ configuration variable documented in linkgit:git-config[1].
would be committed at the bottom of the commit message
template.  Note that this diff output doesn't have its
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::
 --quiet::
diff --git a/t/t7508-status.sh b/t/t7508-status.sh
index 4989e98..6779195 100755
--- a/t/t7508-status.sh
+++ b/t/t7508-status.sh
@@ -139,6 +139,49 @@ test_expect_success 'status -v' '
test_cmp expect output
 '
 
+cat >expect <<\EOF
+On branch master
+Changes to be committed:
+  (use "git reset HEAD ..." to unstage)
+
+   new file:   dir2/added
+
+Changes not staged for commit:
+  (use "git add ..." to update what will be committed)
+  (use "git checkout -- ..." to discard changes in working directory)
+
+   modified:   dir1/modified
+
+Untracked files:
+  (use "git add ..." to include in what will be committed)
+
+   dir1/untracked
+   dir2/modified
+   dir2/untracked
+   expect
+   output
+   untracked
+
+diff --git HEAD=base-commit/dir2/added INDEX=staged-for-commit/dir2/added
+new file mode 100644
+index 000..00750ed
+--- /dev/null
 INDEX=staged-for-commit/dir2/added
+@@ -0,0 +1 @@
++3
+diff --git INDEX=staged-for-commit/dir1/modified 
WORKTREE=not-staged-for-commit/dir1/modified
+index e69de29..d00491f 100644
+--- INDEX=staged-for-commit/dir1/modified
 WORKTREE=not-staged-for-commit/dir1/modified
+@@ -0,0 +1 @@
++1
+EOF
+
+test_expect_success 'status -v -v' '
+   git status -v -v >output &&
+   test_cmp expect output
+'
+
 test_expect_success 'setup fake editor' '
cat >.git/editor <<-\EOF &&
#! /bin/sh
diff --git a/wt-status.c b/wt-status.c
index 29666d0..b6e9837 100644
--- a/wt-status.c
+++ b/wt-status.c
@@ -873,7 +873,17 @@ static void wt_status_print_verbose(struct wt_status *s)
rev.diffopt.use_color = 0;
wt_status_add_cut_line(s->fp);
}
+   if (s->verbose > 1) {
+   rev.diffopt.a_prefix = "HEAD=base-commit/";
+   rev.diffopt.b_prefix = "INDEX=staged-for-commit/";
+   } /* else use prefix as per user config */
run_diff_index(&rev, 1);
+   if (s->verbose > 1) {
+   setup_work_tree();
+   rev.diffopt.a_prefix = "INDEX=staged-for-commit/";
+   rev.diffopt.b_prefix = "WORKTREE=not-staged-for-commit/";
+   run_diff_files(&rev, 0);
+   }
 }
 
 static void wt_status_print_tracking(struct wt_status *s)
-- 
2.3.1.303.g5174db1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCHv2 2/2] commit/status: show the index-worktree diff with -v -v

2015-03-03 Thread Junio C Hamano
Michael J Gruber  writes:

> +diff --git INDEX=staged-for-commit/dir1/modified 
> WORKTREE=not-staged-for-commit/dir1/modified
> +index e69de29..d00491f 100644
> +--- INDEX=staged-for-commit/dir1/modified
>  WORKTREE=not-staged-for-commit/dir1/modified

This might be OK for a project like Git itself, but I suspect people
with long pathnames (like, eh, those in Java land) would not
appreciate it.

Wouldn't mnemonic prefix, which the users are already familiar with,
be the most suitable tool for this disambiguation?  After all that
was what it was invented for 8 years ago.
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCHv2 2/2] commit/status: show the index-worktree diff with -v -v

2015-03-04 Thread Michael J Gruber
Junio C Hamano venit, vidit, dixit 03.03.2015 22:26:
> Michael J Gruber  writes:
> 
>> +diff --git INDEX=staged-for-commit/dir1/modified 
>> WORKTREE=not-staged-for-commit/dir1/modified
>> +index e69de29..d00491f 100644
>> +--- INDEX=staged-for-commit/dir1/modified
>>  WORKTREE=not-staged-for-commit/dir1/modified
> 
> This might be OK for a project like Git itself, but I suspect people
> with long pathnames (like, eh, those in Java land) would not
> appreciate it.
> 
> Wouldn't mnemonic prefix, which the users are already familiar with,
> be the most suitable tool for this disambiguation?  After all that
> was what it was invented for 8 years ago.

Well...:

> or it may want to even be like this:
> 
>   diff --git a/A b/A
> ...
> diff --git to-be-committed/A left-out-of-the-commit/A
> ...
> diff --git a/B b/B
> ...
> 
> by using a custom, unusual and easy-to-notice prefixes.

Your idea was to use these verbous prefixes so that one recognizes the
different types of diffs, and so that we don't need to sort them by file.

I'm happy with c/,i/ and i/,w/ and without sorting. Maybe we would need
headings between the two diffs then?

HEAD/,INDEX/ resp. INDEX/,WORKTREE/ would be a shorter alternativ that
is inline with the short acronyms execept for c/, because COMMIT/
(withiut "base") would be misleading during commit -v, I'm afraid.

Michael
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


Re: [PATCHv2 2/2] commit/status: show the index-worktree diff with -v -v

2015-03-04 Thread Junio C Hamano
Michael J Gruber  writes:

> Junio C Hamano venit, vidit, dixit 03.03.2015 22:26:
>> Michael J Gruber  writes:
>> 
>>> +diff --git INDEX=staged-for-commit/dir1/modified
>>> WORKTREE=not-staged-for-commit/dir1/modified
>>> +index e69de29..d00491f 100644
>>> +--- INDEX=staged-for-commit/dir1/modified
>>>  WORKTREE=not-staged-for-commit/dir1/modified
>> 
>> This might be OK for a project like Git itself, but I suspect people
>> with long pathnames (like, eh, those in Java land) would not
>> appreciate it.
>> 
>> Wouldn't mnemonic prefix, which the users are already familiar with,
>> be the most suitable tool for this disambiguation?  After all that
>> was what it was invented for 8 years ago.
>
> Well...:
>
>> or it may want to even be like this:
>> 
>>  diff --git a/A b/A
>> ...
>> diff --git to-be-committed/A left-out-of-the-commit/A
>> ...
>> diff --git a/B b/B
>> ...
>> 
>> by using a custom, unusual and easy-to-notice prefixes.
>
> Your idea was to use these verbous prefixes so that one recognizes the
> different types of diffs, and so that we don't need to sort them by file.

Yeah, but I can become wiser over time and change my opinion, no
;-)?

As to pairing the diffs by paths so that c/i and i/w diffs for the
same path come together, which I mentioned in the older message you
quoted, I think what you said in response made sense, i.e. "the
intention was to show the diff for the two categories of changes
which "git status" lists without diff already".  So I'd prefer
showing c/i diff and then optionall i/w diff like you did, without
mixing them together.

> I'm happy with c/,i/ and i/,w/ and without sorting. Maybe we would need
> headings between the two diffs then?

Yup.  The i/w diff is a new thing and a heading before it to explain
what it is would be very helpful for the users to understand what
they are looking at.  A new heading before c/i diff might help but
it may be OK without.  E.g. something along the following lines


Changes to be committed:
modified: foo

Changes left in the working tree:
modified: bar

--
Changes to be committed
diff --git c/foo i/foo
...


--
Changes left in the working tree
diff --git i/bar w/bsar
...


--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html