]> git.ipfire.org Git - thirdparty/git.git/blobdiff - commit-graph.c
Merge branch 'ns/core-fsyncmethod'
[thirdparty/git.git] / commit-graph.c
index 64897f57d9f2ebc9503994c34eb3ced714352fda..441b36016ba796c13665603b4c523c9baa52c12d 100644 (file)
@@ -39,8 +39,8 @@ void git_test_write_commit_graph_or_die(void)
 #define GRAPH_CHUNKID_OIDFANOUT 0x4f494446 /* "OIDF" */
 #define GRAPH_CHUNKID_OIDLOOKUP 0x4f49444c /* "OIDL" */
 #define GRAPH_CHUNKID_DATA 0x43444154 /* "CDAT" */
-#define GRAPH_CHUNKID_GENERATION_DATA 0x47444154 /* "GDAT" */
-#define GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW 0x47444f56 /* "GDOV" */
+#define GRAPH_CHUNKID_GENERATION_DATA 0x47444132 /* "GDA2" */
+#define GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW 0x47444f32 /* "GDO2" */
 #define GRAPH_CHUNKID_EXTRAEDGES 0x45444745 /* "EDGE" */
 #define GRAPH_CHUNKID_BLOOMINDEXES 0x42494458 /* "BIDX" */
 #define GRAPH_CHUNKID_BLOOMDATA 0x42444154 /* "BDAT" */
@@ -407,6 +407,9 @@ struct commit_graph *parse_commit_graph(struct repository *r,
                        &graph->chunk_generation_data);
                pair_chunk(cf, GRAPH_CHUNKID_GENERATION_DATA_OVERFLOW,
                        &graph->chunk_generation_data_overflow);
+
+               if (graph->chunk_generation_data)
+                       graph->read_generation_data = 1;
        }
 
        if (r->settings.commit_graph_read_changed_paths) {
@@ -803,7 +806,7 @@ static void fill_commit_graph_info(struct commit *item, struct commit_graph *g,
                                die(_("commit-graph requires overflow generation data but has none"));
 
                        offset_pos = offset ^ CORRECTED_COMMIT_DATE_OFFSET_OVERFLOW;
-                       graph_data->generation = get_be64(g->chunk_generation_data_overflow + 8 * offset_pos);
+                       graph_data->generation = item->date + get_be64(g->chunk_generation_data_overflow + 8 * offset_pos);
                } else
                        graph_data->generation = item->date + offset;
        } else
@@ -1556,12 +1559,16 @@ static void compute_generation_numbers(struct write_commit_graph_context *ctx)
                                if (current->date && current->date > max_corrected_commit_date)
                                        max_corrected_commit_date = current->date - 1;
                                commit_graph_data_at(current)->generation = max_corrected_commit_date + 1;
-
-                               if (commit_graph_data_at(current)->generation - current->date > GENERATION_NUMBER_V2_OFFSET_MAX)
-                                       ctx->num_generation_data_overflows++;
                        }
                }
        }
+
+       for (i = 0; i < ctx->commits.nr; i++) {
+               struct commit *c = ctx->commits.list[i];
+               timestamp_t offset = commit_graph_data_at(c)->generation - c->date;
+               if (offset > GENERATION_NUMBER_V2_OFFSET_MAX)
+                       ctx->num_generation_data_overflows++;
+       }
        stop_progress(&ctx->progress);
 }
 
@@ -1679,21 +1686,22 @@ int write_commit_graph_reachable(struct object_directory *odb,
 }
 
 static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
-                               struct string_list *pack_indexes)
+                               const struct string_list *pack_indexes)
 {
        uint32_t i;
        struct strbuf progress_title = STRBUF_INIT;
        struct strbuf packname = STRBUF_INIT;
        int dirlen;
+       int ret = 0;
 
        strbuf_addf(&packname, "%s/pack/", ctx->odb->path);
        dirlen = packname.len;
        if (ctx->report_progress) {
                strbuf_addf(&progress_title,
-                           Q_("Finding commits for commit graph in %d pack",
-                              "Finding commits for commit graph in %d packs",
+                           Q_("Finding commits for commit graph in %"PRIuMAX" pack",
+                              "Finding commits for commit graph in %"PRIuMAX" packs",
                               pack_indexes->nr),
-                           pack_indexes->nr);
+                           (uintmax_t)pack_indexes->nr);
                ctx->progress = start_delayed_progress(progress_title.buf, 0);
                ctx->progress_done = 0;
        }
@@ -1703,12 +1711,12 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
                strbuf_addstr(&packname, pack_indexes->items[i].string);
                p = add_packed_git(packname.buf, packname.len, 1);
                if (!p) {
-                       error(_("error adding pack %s"), packname.buf);
-                       return -1;
+                       ret = error(_("error adding pack %s"), packname.buf);
+                       goto cleanup;
                }
                if (open_pack_index(p)) {
-                       error(_("error opening index for %s"), packname.buf);
-                       return -1;
+                       ret = error(_("error opening index for %s"), packname.buf);
+                       goto cleanup;
                }
                for_each_object_in_pack(p, add_packed_commits, ctx,
                                        FOR_EACH_OBJECT_PACK_ORDER);
@@ -1716,11 +1724,12 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
                free(p);
        }
 
+cleanup:
        stop_progress(&ctx->progress);
        strbuf_release(&progress_title);
        strbuf_release(&packname);
 
-       return 0;
+       return ret;
 }
 
 static int fill_oids_from_commits(struct write_commit_graph_context *ctx,
@@ -1852,6 +1861,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
 
                hold_lock_file_for_update_mode(&lk, lock_name,
                                               LOCK_DIE_ON_ERROR, 0444);
+               free(lock_name);
 
                fd = git_mkstemp_mode(ctx->graph_name, 0444);
                if (fd < 0) {
@@ -1977,6 +1987,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
                } else {
                        char *graph_name = get_commit_graph_filename(ctx->odb);
                        unlink(graph_name);
+                       free(graph_name);
                }
 
                ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1] = xstrdup(hash_to_hex(file_hash));
@@ -2260,7 +2271,7 @@ out:
 }
 
 int write_commit_graph(struct object_directory *odb,
-                      struct string_list *pack_indexes,
+                      const struct string_list *const pack_indexes,
                       struct oidset *commits,
                       enum commit_graph_write_flags flags,
                       const struct commit_graph_opts *opts)