repo_read_index: don't discard the index
[gitweb.git] / split-index.c
index 49bd197f715ae783d7fdbe8e1d638a1bcac0073c..83e39ec8d7739816188ba909a4cb9da302d48f73 100644 (file)
@@ -73,17 +73,10 @@ void move_cache_to_base_index(struct index_state *istate)
        int i;
 
        /*
-        * If "si" is shared with another index_state (e.g. by
-        * unpack-trees code), we will need to duplicate split_index
-        * struct. It's not happening now though, luckily.
+        * do not delete old si->base, its index entries may be shared
+        * with istate->cache[]. Accept a bit of leaking here because
+        * this code is only used by short-lived update-index.
         */
-       assert(si->refcount <= 1);
-
-       unshare_split_index(istate, 0);
-       if (si->base) {
-               discard_index(si->base);
-               free(si->base);
-       }
        si->base = xcalloc(1, sizeof(*si->base));
        si->base->version = istate->version;
        /* zero timestamp disables racy test in ce_write_index() */
@@ -174,10 +167,9 @@ void merge_base_index(struct index_state *istate)
 
        ewah_free(si->delete_bitmap);
        ewah_free(si->replace_bitmap);
-       free(si->saved_cache);
+       FREE_AND_NULL(si->saved_cache);
        si->delete_bitmap  = NULL;
        si->replace_bitmap = NULL;
-       si->saved_cache    = NULL;
        si->saved_cache_nr = 0;
 }
 
@@ -282,41 +274,11 @@ void finish_writing_split_index(struct index_state *istate)
        istate->cache_nr = si->saved_cache_nr;
 }
 
-void unshare_split_index(struct index_state *istate, int discard)
-{
-       struct split_index *si = istate->split_index;
-       int i;
-
-       if (!si || !si->base)
-               return;
-
-       for (i = 0; i < istate->cache_nr; i++) {
-               struct cache_entry *ce = istate->cache[i];
-               struct cache_entry *new = NULL;
-
-               if (!ce->index ||
-                   ce->index > si->base->cache_nr ||
-                   ce != si->base->cache[ce->index - 1])
-                       continue;
-
-               if (!discard) {
-                       int len = ce_namelen(ce);
-                       new = xcalloc(1, cache_entry_size(len));
-                       copy_cache_entry(new, ce);
-                       memcpy(new->name, ce->name, len);
-                       new->index = 0;
-               }
-               istate->cache[i] = new;
-       }
-}
-
-
 void discard_split_index(struct index_state *istate)
 {
        struct split_index *si = istate->split_index;
        if (!si)
                return;
-       unshare_split_index(istate, 0);
        istate->split_index = NULL;
        si->refcount--;
        if (si->refcount)
@@ -365,8 +327,14 @@ void add_split_index(struct index_state *istate)
 
 void remove_split_index(struct index_state *istate)
 {
-       if (!istate->split_index)
-               return;
-       discard_split_index(istate);
-       istate->cache_changed |= SOMETHING_CHANGED;
+       if (istate->split_index) {
+               /*
+                * can't discard_split_index(&the_index); because that
+                * will destroy split_index->base->cache[], which may
+                * be shared with the_index.cache[]. So yeah we're
+                * leaking a bit here.
+                */
+               istate->split_index = NULL;
+               istate->cache_changed |= SOMETHING_CHANGED;
+       }
 }