]> git.ipfire.org Git - thirdparty/git.git/blobdiff - bloom.c
Merge branch 'pb/ref-filter-with-crlf'
[thirdparty/git.git] / bloom.c
diff --git a/bloom.c b/bloom.c
index db9fb8243711f6b17d82fbbde7766a71028cb842..68c73200a54aa4fdad582d6031c59313c2c90d73 100644 (file)
--- a/bloom.c
+++ b/bloom.c
@@ -177,6 +177,13 @@ static int pathmap_cmp(const void *hashmap_cmp_fn_data,
        return strcmp(e1->path, e2->path);
 }
 
+static void init_truncated_large_filter(struct bloom_filter *filter)
+{
+       filter->data = xmalloc(1);
+       filter->data[0] = 0xFF;
+       filter->len = 1;
+}
+
 struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
                                                 struct commit *c,
                                                 int compute_if_not_present,
@@ -197,12 +204,11 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
 
        if (!filter->data) {
                load_commit_graph_info(r, c);
-               if (commit_graph_position(c) != COMMIT_NOT_FROM_GRAPH &&
-                       load_bloom_filter_from_graph(r->objects->commit_graph, filter, c))
-                               return filter;
+               if (commit_graph_position(c) != COMMIT_NOT_FROM_GRAPH)
+                       load_bloom_filter_from_graph(r->objects->commit_graph, filter, c);
        }
 
-       if (filter->data)
+       if (filter->data && filter->len)
                return filter;
        if (!compute_if_not_present)
                return NULL;
@@ -260,12 +266,18 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
                }
 
                if (hashmap_get_size(&pathmap) > settings->max_changed_paths) {
+                       init_truncated_large_filter(filter);
                        if (computed)
                                *computed |= BLOOM_TRUNC_LARGE;
                        goto cleanup;
                }
 
                filter->len = (hashmap_get_size(&pathmap) * settings->bits_per_entry + BITS_PER_WORD - 1) / BITS_PER_WORD;
+               if (!filter->len) {
+                       if (computed)
+                               *computed |= BLOOM_TRUNC_EMPTY;
+                       filter->len = 1;
+               }
                filter->data = xcalloc(filter->len, sizeof(unsigned char));
 
                hashmap_for_each_entry(&pathmap, &iter, e, entry) {
@@ -279,8 +291,7 @@ struct bloom_filter *get_or_compute_bloom_filter(struct repository *r,
        } else {
                for (i = 0; i < diff_queued_diff.nr; i++)
                        diff_free_filepair(diff_queued_diff.queue[i]);
-               filter->data = NULL;
-               filter->len = 0;
+               init_truncated_large_filter(filter);
 
                if (computed)
                        *computed |= BLOOM_TRUNC_LARGE;