Merge branch 'nd/diff-i-t-a'

After "git add -N", the path appeared in output of "git diff HEAD"
and "git diff --cached HEAD", leading "git status" to classify it
as "Changes to be committed".  Such a path, however, is not yet to
be scheduled to be committed.  "git diff" showed the change to the
path as modification, not as a "new file", in the header of its
output.

Treat such paths as "yet to be added to the index but Git already
know about them"; "git diff HEAD" and "git diff --cached HEAD"
should not talk about them, and "git diff" should show them as new
files yet to be added to the index.

* nd/diff-i-t-a:
  diff-lib.c: adjust position of i-t-a entries in diff
This commit is contained in:
Junio C Hamano 2015-05-19 13:17:49 -07:00
commit d0c692263f
4 changed files with 38 additions and 8 deletions

View File

@ -63,6 +63,7 @@ static void update_callback(struct diff_queue_struct *q,
switch (fix_unmerged_status(p, data)) { switch (fix_unmerged_status(p, data)) {
default: default:
die(_("unexpected diff status %c"), p->status); die(_("unexpected diff status %c"), p->status);
case DIFF_STATUS_ADDED:
case DIFF_STATUS_MODIFIED: case DIFF_STATUS_MODIFIED:
case DIFF_STATUS_TYPE_CHANGED: case DIFF_STATUS_TYPE_CHANGED:
if (add_file_to_index(&the_index, path, data->flags)) { if (add_file_to_index(&the_index, path, data->flags)) {

View File

@ -212,6 +212,11 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
ce->sha1, !is_null_sha1(ce->sha1), ce->sha1, !is_null_sha1(ce->sha1),
ce->name, 0); ce->name, 0);
continue; continue;
} else if (ce->ce_flags & CE_INTENT_TO_ADD) {
diff_addremove(&revs->diffopt, '+', ce->ce_mode,
EMPTY_BLOB_SHA1_BIN, 0,
ce->name, 0);
continue;
} }
changed = match_stat_with_submodule(&revs->diffopt, ce, &st, changed = match_stat_with_submodule(&revs->diffopt, ce, &st,
@ -376,6 +381,13 @@ static void do_oneway_diff(struct unpack_trees_options *o,
struct rev_info *revs = o->unpack_data; struct rev_info *revs = o->unpack_data;
int match_missing, cached; int match_missing, cached;
/* i-t-a entries do not actually exist in the index */
if (idx && (idx->ce_flags & CE_INTENT_TO_ADD)) {
idx = NULL;
if (!tree)
return; /* nothing to diff.. */
}
/* if the entry is not checked out, don't examine work tree */ /* if the entry is not checked out, don't examine work tree */
cached = o->index_only || cached = o->index_only ||
(idx && ((idx->ce_flags & CE_VALID) || ce_skip_worktree(idx))); (idx && ((idx->ce_flags & CE_VALID) || ce_skip_worktree(idx)));

View File

@ -5,10 +5,24 @@ test_description='Intent to add'
. ./test-lib.sh . ./test-lib.sh
test_expect_success 'intent to add' ' test_expect_success 'intent to add' '
test_commit 1 &&
git rm 1.t &&
echo hello >1.t &&
echo hello >file && echo hello >file &&
echo hello >elif && echo hello >elif &&
git add -N file && git add -N file &&
git add elif git add elif &&
git add -N 1.t
'
test_expect_success 'git status' '
git status --porcelain | grep -v actual >actual &&
cat >expect <<-\EOF &&
DA 1.t
A elif
A file
EOF
test_cmp expect actual
' '
test_expect_success 'check result of "add -N"' ' test_expect_success 'check result of "add -N"' '
@ -43,7 +57,8 @@ test_expect_success 'i-t-a entry is simply ignored' '
git add -N nitfol && git add -N nitfol &&
git commit -m second && git commit -m second &&
test $(git ls-tree HEAD -- nitfol | wc -l) = 0 && test $(git ls-tree HEAD -- nitfol | wc -l) = 0 &&
test $(git diff --name-only HEAD -- nitfol | wc -l) = 1 test $(git diff --name-only HEAD -- nitfol | wc -l) = 0 &&
test $(git diff --name-only -- nitfol | wc -l) = 1
' '
test_expect_success 'can commit with an unrelated i-t-a entry in index' ' test_expect_success 'can commit with an unrelated i-t-a entry in index' '
@ -72,13 +87,13 @@ test_expect_success 'cache-tree invalidates i-t-a paths' '
: >dir/bar && : >dir/bar &&
git add -N dir/bar && git add -N dir/bar &&
git diff --cached --name-only >actual && git diff --cached --name-only >actual &&
echo dir/bar >expect && >expect &&
test_cmp expect actual && test_cmp expect actual &&
git write-tree >/dev/null && git write-tree >/dev/null &&
git diff --cached --name-only >actual && git diff --cached --name-only >actual &&
echo dir/bar >expect && >expect &&
test_cmp expect actual test_cmp expect actual
' '

View File

@ -139,11 +139,13 @@ test_expect_success SYMLINKS 'setup symlinks with attributes' '
test_expect_success SYMLINKS 'symlinks do not respect userdiff config by path' ' test_expect_success SYMLINKS 'symlinks do not respect userdiff config by path' '
cat >expect <<-\EOF && cat >expect <<-\EOF &&
diff --git a/file.bin b/file.bin diff --git a/file.bin b/file.bin
index e69de29..d95f3ad 100644 new file mode 100644
Binary files a/file.bin and b/file.bin differ index 0000000..d95f3ad
Binary files /dev/null and b/file.bin differ
diff --git a/link.bin b/link.bin diff --git a/link.bin b/link.bin
index e69de29..dce41ec 120000 new file mode 120000
--- a/link.bin index 0000000..dce41ec
--- /dev/null
+++ b/link.bin +++ b/link.bin
@@ -0,0 +1 @@ @@ -0,0 +1 @@
+file.bin +file.bin