update-index --split-index: do not split if $GIT_DIR is read only
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Fri, 13 Jun 2014 12:19:45 +0000 (19:19 +0700)
committerJunio C Hamano <gitster@pobox.com>
Fri, 13 Jun 2014 18:49:41 +0000 (11:49 -0700)
If $GIT_DIR is read only, we can't write $GIT_DIR/sharedindex. This
could happen when $GIT_INDEX_FILE is set to somehwere outside
$GIT_DIR.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
read-cache.c
index 8ecb9599e58d3e08e6cf84f3d5403eae59d1e997..aa848e170f205fda3e4cc9afae115b7795612a58 100644 (file)
@@ -2030,14 +2030,21 @@ static void remove_temporary_sharedindex_on_signal(int signo)
        raise(signo);
 }
 
-static int write_shared_index(struct index_state *istate)
+static int write_shared_index(struct index_state *istate,
+                             struct lock_file *lock, unsigned flags)
 {
        struct split_index *si = istate->split_index;
        static int installed_handler;
        int fd, ret;
 
        temporary_sharedindex = git_pathdup("sharedindex_XXXXXX");
-       fd = xmkstemp(temporary_sharedindex);
+       fd = mkstemp(temporary_sharedindex);
+       if (fd < 0) {
+               free(temporary_sharedindex);
+               temporary_sharedindex = NULL;
+               hashclr(si->base_sha1);
+               return do_write_locked_index(istate, lock, flags);
+       }
        if (!installed_handler) {
                atexit(remove_temporary_sharedindex);
                sigchain_push_common(remove_temporary_sharedindex_on_signal);
@@ -2070,7 +2077,7 @@ int write_locked_index(struct index_state *istate, struct lock_file *lock,
        }
 
        if (istate->cache_changed & SPLIT_INDEX_ORDERED) {
-               int ret = write_shared_index(istate);
+               int ret = write_shared_index(istate, lock, flags);
                if (ret)
                        return ret;
        }