about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2018-03-22 14:24:16 -0700
committerJunio C Hamano <gitster@pobox.com>2018-03-22 14:24:16 -0700
commit3112c3fa7fdc7209e4c832a9faf4f023e97a4f5e (patch)
tree0d517c9c6160f3d7aa43060e751e7f7d42a6fcdf
parentbffce882fdf03aa7083d56d038c2dc2be58a9200 (diff)
parentef5b3a6c5e24c54ba4436e225b9431c63ab163f0 (diff)
downloadgit-svn-3112c3fa7fdc7209e4c832a9faf4f023e97a4f5e.tar.gz
Code clean-up.

* nd/shared-index-fix:
  read-cache: don't write index twice if we can't write shared index
  read-cache.c: move tempfile creation/cleanup out of write_shared_index
  read-cache.c: change type of "temp" in write_shared_index()
-rw-r--r--read-cache.c40
-rwxr-xr-xt/t1700-split-index.sh19
2 files changed, 41 insertions, 18 deletions
diff --git a/read-cache.c b/read-cache.c
index d13ce83794..198e72b685 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -2472,32 +2472,21 @@ static int clean_shared_index_files(const char *current_hex)
 }
 
 static int write_shared_index(struct index_state *istate,
-                              struct lock_file *lock, unsigned flags)
+                              struct tempfile **temp)
 {
-        struct tempfile *temp;
         struct split_index *si = istate->split_index;
         int ret;
 
-        temp = mks_tempfile(git_path("sharedindex_XXXXXX"));
-        if (!temp) {
-                hashclr(si->base_sha1);
-                return do_write_locked_index(istate, lock, flags);
-        }
         move_cache_to_base_index(istate);
-        ret = do_write_index(si->base, temp, 1);
-        if (ret) {
-                delete_tempfile(&temp);
+        ret = do_write_index(si->base, *temp, 1);
+        if (ret)
                 return ret;
-        }
-        ret = adjust_shared_perm(get_tempfile_path(temp));
+        ret = adjust_shared_perm(get_tempfile_path(*temp));
         if (ret) {
-                int save_errno = errno;
-                error("cannot fix permission bits on %s", get_tempfile_path(temp));
-                delete_tempfile(&temp);
-                errno = save_errno;
+                error("cannot fix permission bits on %s", get_tempfile_path(*temp));
                 return ret;
         }
-        ret = rename_tempfile(&temp,
+        ret = rename_tempfile(temp,
                               git_path("sharedindex.%s", sha1_to_hex(si->base->sha1)));
         if (!ret) {
                 hashcpy(si->base_sha1, si->base->sha1);
@@ -2565,7 +2554,22 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock,
         new_shared_index = istate->cache_changed & SPLIT_INDEX_ORDERED;
 
         if (new_shared_index) {
-                ret = write_shared_index(istate, lock, flags);
+                struct tempfile *temp;
+                int saved_errno;
+
+                temp = mks_tempfile(git_path("sharedindex_XXXXXX"));
+                if (!temp) {
+                        hashclr(si->base_sha1);
+                        ret = do_write_locked_index(istate, lock, flags);
+                        goto out;
+                }
+                ret = write_shared_index(istate, &temp);
+
+                saved_errno = errno;
+                if (is_tempfile_active(temp))
+                        delete_tempfile(&temp);
+                errno = saved_errno;
+
                 if (ret)
                         goto out;
         }
diff --git a/t/t1700-split-index.sh b/t/t1700-split-index.sh
index c087b63367..a66936fe9b 100755
--- a/t/t1700-split-index.sh
+++ b/t/t1700-split-index.sh
@@ -401,6 +401,25 @@ done <<\EOF
 0642 -rw-r---w-
 EOF
 
+test_expect_success POSIXPERM,SANITY 'graceful handling when splitting index is not allowed' '
+        test_create_repo ro &&
+        (
+                cd ro &&
+                test_commit initial &&
+                git update-index --split-index &&
+                test -f .git/sharedindex.*
+        ) &&
+        cp ro/.git/index new-index &&
+        test_when_finished "chmod u+w ro/.git" &&
+        chmod u-w ro/.git &&
+        GIT_INDEX_FILE="$(pwd)/new-index" git -C ro update-index --split-index &&
+        chmod u+w ro/.git &&
+        rm ro/.git/sharedindex.* &&
+        GIT_INDEX_FILE=new-index git ls-files >actual &&
+        echo initial.t >expected &&
+        test_cmp expected actual
+'
+
 test_expect_success 'writing split index with null sha1 does not write cache tree' '
         git config core.splitIndex true &&
         git config splitIndex.maxPercentChange 0 &&