Revert "diff-lib.c: adjust position of i-t-a entries in diff"
authorJunio C Hamano <gitster@pobox.com>
Tue, 23 Jun 2015 17:27:47 +0000 (10:27 -0700)
committerJunio C Hamano <gitster@pobox.com>
Tue, 23 Jun 2015 17:37:21 +0000 (10:37 -0700)
This reverts commit d95d728aba06a34394d15466045cbdabdada58a2.

It turns out that many other commands that need to interact with the
result of running diff-files and diff-index, e.g. "git apply", "git
rm", etc., need to be adjusted to the new world order it brings in.
For example, it would break this sequence to correct a whitespace
breakage in the parts you changed:

git add -N file
git diff --cached file | git apply --cached --whitespace=fix
git checkout file

In the old world order, "diff" showed a patch to modify an existing
empty file by adding its full contents, and "apply" updated the
index by modifying the existing empty blob (which is what an
Intent-to-Add entry records in the index) with that patch.

In the new world order, "diff" shows a patch to create a new file
with its full contents, but because "apply" thinks that the i-t-a
entry already exists in the index, it refused to accept a creation.

Adjusting "apply" to this new world order is easy, but we need to
assess the extent of the damage to the rest of the system the new
world order brought in before going forward and adjust them all,
after which we can resurrect the commit being reverted here.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/add.c
diff-lib.c
t/t2203-add-intent.sh
t/t4011-diff-symlink.sh
index ee370b059adfd106c70e2c4aa4df50663cb4a8ec..3390933d68b2dd6c7296a7d2103d009fa27f2ca8 100644 (file)
@@ -63,7 +63,6 @@ static void update_callback(struct diff_queue_struct *q,
                switch (fix_unmerged_status(p, data)) {
                default:
                        die(_("unexpected diff status %c"), p->status);
-               case DIFF_STATUS_ADDED:
                case DIFF_STATUS_MODIFIED:
                case DIFF_STATUS_TYPE_CHANGED:
                        if (add_file_to_index(&the_index, path, data->flags)) {
index 714501a7a3e13129d9de3a57b5e4637c18449f48..a85c4971ac8ece6397c05d0674bbac8c75cf219f 100644 (file)
@@ -212,11 +212,6 @@ int run_diff_files(struct rev_info *revs, unsigned int option)
                                               ce->sha1, !is_null_sha1(ce->sha1),
                                               ce->name, 0);
                                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,
@@ -381,13 +376,6 @@ static void do_oneway_diff(struct unpack_trees_options *o,
        struct rev_info *revs = o->unpack_data;
        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 */
        cached = o->index_only ||
                (idx && ((idx->ce_flags & CE_VALID) || ce_skip_worktree(idx)));
index 7c641bfaf4565a97942a91793370da0ca6285fc3..2a4a749b4fa3b07963a18b645d29ef774c01bbd1 100755 (executable)
@@ -5,24 +5,10 @@ test_description='Intent to add'
 . ./test-lib.sh
 
 test_expect_success 'intent to add' '
-       test_commit 1 &&
-       git rm 1.t &&
-       echo hello >1.t &&
        echo hello >file &&
        echo hello >elif &&
        git add -N file &&
-       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
+       git add elif
 '
 
 test_expect_success 'check result of "add -N"' '
@@ -57,8 +43,7 @@ test_expect_success 'i-t-a entry is simply ignored' '
        git add -N nitfol &&
        git commit -m second &&
        test $(git ls-tree HEAD -- nitfol | wc -l) = 0 &&
-       test $(git diff --name-only HEAD -- nitfol | wc -l) = 0 &&
-       test $(git diff --name-only -- nitfol | wc -l) = 1
+       test $(git diff --name-only HEAD -- nitfol | wc -l) = 1
 '
 
 test_expect_success 'can commit with an unrelated i-t-a entry in index' '
@@ -87,13 +72,13 @@ test_expect_success 'cache-tree invalidates i-t-a paths' '
        : >dir/bar &&
        git add -N dir/bar &&
        git diff --cached --name-only >actual &&
-       >expect &&
+       echo dir/bar >expect &&
        test_cmp expect actual &&
 
        git write-tree >/dev/null &&
 
        git diff --cached --name-only >actual &&
-       >expect &&
+       echo dir/bar >expect &&
        test_cmp expect actual
 '
 
index 7452fce0da94a257f289a9fad1e9d24dd1509195..13e7f621ab79f95cc7c3057d9de5710813049102 100755 (executable)
@@ -139,13 +139,11 @@ test_expect_success SYMLINKS 'setup symlinks with attributes' '
 test_expect_success SYMLINKS 'symlinks do not respect userdiff config by path' '
        cat >expect <<-\EOF &&
        diff --git a/file.bin b/file.bin
-       new file mode 100644
-       index 0000000..d95f3ad
-       Binary files /dev/null and b/file.bin differ
+       index e69de29..d95f3ad 100644
+       Binary files a/file.bin and b/file.bin differ
        diff --git a/link.bin b/link.bin
-       new file mode 120000
-       index 0000000..dce41ec
-       --- /dev/null
+       index e69de29..dce41ec 120000
+       --- a/link.bin
        +++ b/link.bin
        @@ -0,0 +1 @@
        +file.bin