summaryrefslogtreecommitdiff
path: root/split-index.c
diff options
context:
space:
mode:
Diffstat (limited to 'split-index.c')
-rw-r--r--split-index.c43
1 files changed, 33 insertions, 10 deletions
diff --git a/split-index.c b/split-index.c
index 615f4cac05..3eb8ff1b43 100644
--- a/split-index.c
+++ b/split-index.c
@@ -167,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;
}
@@ -239,6 +238,8 @@ void prepare_to_write_split_index(struct index_state *istate)
ALLOC_GROW(entries, nr_entries+1, nr_alloc);
entries[nr_entries++] = ce;
}
+ if (is_null_oid(&ce->oid))
+ istate->drop_cache_tree = 1;
}
}
@@ -304,16 +305,38 @@ void save_or_free_index_entry(struct index_state *istate, struct cache_entry *ce
}
void replace_index_entry_in_base(struct index_state *istate,
- struct cache_entry *old,
- struct cache_entry *new)
+ struct cache_entry *old_entry,
+ struct cache_entry *new_entry)
{
- if (old->index &&
+ if (old_entry->index &&
istate->split_index &&
istate->split_index->base &&
- old->index <= istate->split_index->base->cache_nr) {
- new->index = old->index;
- if (old != istate->split_index->base->cache[new->index - 1])
- free(istate->split_index->base->cache[new->index - 1]);
- istate->split_index->base->cache[new->index - 1] = new;
+ old_entry->index <= istate->split_index->base->cache_nr) {
+ new_entry->index = old_entry->index;
+ if (old_entry != istate->split_index->base->cache[new_entry->index - 1])
+ free(istate->split_index->base->cache[new_entry->index - 1]);
+ istate->split_index->base->cache[new_entry->index - 1] = new_entry;
+ }
+}
+
+void add_split_index(struct index_state *istate)
+{
+ if (!istate->split_index) {
+ init_split_index(istate);
+ istate->cache_changed |= SPLIT_INDEX_ORDERED;
+ }
+}
+
+void remove_split_index(struct index_state *istate)
+{
+ 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;
}
}