revert(3p/git): Revert merge of git upstream at v2.26.2
This causes cgit to serve error pages, which is undesirable. This reverts commit5229c9b232, reversing changes made tof2b211131f.
This commit is contained in:
parent
6f8fbf4aa4
commit
93ba78d6f4
1006 changed files with 60537 additions and 148724 deletions
242
third_party/git/commit-graph.c
vendored
242
third_party/git/commit-graph.c
vendored
|
|
@ -41,24 +41,30 @@
|
|||
#define GRAPH_MIN_SIZE (GRAPH_HEADER_SIZE + 4 * GRAPH_CHUNKLOOKUP_WIDTH \
|
||||
+ GRAPH_FANOUT_SIZE + the_hash_algo->rawsz)
|
||||
|
||||
/* Remember to update object flag allocation in object.h */
|
||||
#define REACHABLE (1u<<15)
|
||||
|
||||
char *get_commit_graph_filename(struct object_directory *odb)
|
||||
char *get_commit_graph_filename(const char *obj_dir)
|
||||
{
|
||||
return xstrfmt("%s/info/commit-graph", odb->path);
|
||||
char *filename = xstrfmt("%s/info/commit-graph", obj_dir);
|
||||
char *normalized = xmalloc(strlen(filename) + 1);
|
||||
normalize_path_copy(normalized, filename);
|
||||
free(filename);
|
||||
return normalized;
|
||||
}
|
||||
|
||||
static char *get_split_graph_filename(struct object_directory *odb,
|
||||
static char *get_split_graph_filename(const char *obj_dir,
|
||||
const char *oid_hex)
|
||||
{
|
||||
return xstrfmt("%s/info/commit-graphs/graph-%s.graph", odb->path,
|
||||
oid_hex);
|
||||
char *filename = xstrfmt("%s/info/commit-graphs/graph-%s.graph",
|
||||
obj_dir,
|
||||
oid_hex);
|
||||
char *normalized = xmalloc(strlen(filename) + 1);
|
||||
normalize_path_copy(normalized, filename);
|
||||
free(filename);
|
||||
return normalized;
|
||||
}
|
||||
|
||||
static char *get_chain_filename(struct object_directory *odb)
|
||||
static char *get_chain_filename(const char *obj_dir)
|
||||
{
|
||||
return xstrfmt("%s/info/commit-graphs/commit-graph-chain", odb->path);
|
||||
return xstrfmt("%s/info/commit-graphs/commit-graph-chain", obj_dir);
|
||||
}
|
||||
|
||||
static uint8_t oid_version(void)
|
||||
|
|
@ -108,8 +114,7 @@ int open_commit_graph(const char *graph_file, int *fd, struct stat *st)
|
|||
return 1;
|
||||
}
|
||||
|
||||
struct commit_graph *load_commit_graph_one_fd_st(int fd, struct stat *st,
|
||||
struct object_directory *odb)
|
||||
struct commit_graph *load_commit_graph_one_fd_st(int fd, struct stat *st)
|
||||
{
|
||||
void *graph_map;
|
||||
size_t graph_size;
|
||||
|
|
@ -125,9 +130,7 @@ struct commit_graph *load_commit_graph_one_fd_st(int fd, struct stat *st,
|
|||
graph_map = xmmap(NULL, graph_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||
ret = parse_commit_graph(graph_map, fd, graph_size);
|
||||
|
||||
if (ret)
|
||||
ret->odb = odb;
|
||||
else {
|
||||
if (!ret) {
|
||||
munmap(graph_map, graph_size);
|
||||
close(fd);
|
||||
}
|
||||
|
|
@ -302,8 +305,7 @@ struct commit_graph *parse_commit_graph(void *graph_map, int fd,
|
|||
return graph;
|
||||
}
|
||||
|
||||
static struct commit_graph *load_commit_graph_one(const char *graph_file,
|
||||
struct object_directory *odb)
|
||||
static struct commit_graph *load_commit_graph_one(const char *graph_file)
|
||||
{
|
||||
|
||||
struct stat st;
|
||||
|
|
@ -314,7 +316,7 @@ static struct commit_graph *load_commit_graph_one(const char *graph_file,
|
|||
if (!open_ok)
|
||||
return NULL;
|
||||
|
||||
g = load_commit_graph_one_fd_st(fd, &st, odb);
|
||||
g = load_commit_graph_one_fd_st(fd, &st);
|
||||
|
||||
if (g)
|
||||
g->filename = xstrdup(graph_file);
|
||||
|
|
@ -322,13 +324,15 @@ static struct commit_graph *load_commit_graph_one(const char *graph_file,
|
|||
return g;
|
||||
}
|
||||
|
||||
static struct commit_graph *load_commit_graph_v1(struct repository *r,
|
||||
struct object_directory *odb)
|
||||
static struct commit_graph *load_commit_graph_v1(struct repository *r, const char *obj_dir)
|
||||
{
|
||||
char *graph_name = get_commit_graph_filename(odb);
|
||||
struct commit_graph *g = load_commit_graph_one(graph_name, odb);
|
||||
char *graph_name = get_commit_graph_filename(obj_dir);
|
||||
struct commit_graph *g = load_commit_graph_one(graph_name);
|
||||
free(graph_name);
|
||||
|
||||
if (g)
|
||||
g->obj_dir = obj_dir;
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
|
|
@ -365,15 +369,14 @@ static int add_graph_to_chain(struct commit_graph *g,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static struct commit_graph *load_commit_graph_chain(struct repository *r,
|
||||
struct object_directory *odb)
|
||||
static struct commit_graph *load_commit_graph_chain(struct repository *r, const char *obj_dir)
|
||||
{
|
||||
struct commit_graph *graph_chain = NULL;
|
||||
struct strbuf line = STRBUF_INIT;
|
||||
struct stat st;
|
||||
struct object_id *oids;
|
||||
int i = 0, valid = 1, count;
|
||||
char *chain_name = get_chain_filename(odb);
|
||||
char *chain_name = get_chain_filename(obj_dir);
|
||||
FILE *fp;
|
||||
int stat_res;
|
||||
|
||||
|
|
@ -406,12 +409,14 @@ static struct commit_graph *load_commit_graph_chain(struct repository *r,
|
|||
|
||||
valid = 0;
|
||||
for (odb = r->objects->odb; odb; odb = odb->next) {
|
||||
char *graph_name = get_split_graph_filename(odb, line.buf);
|
||||
struct commit_graph *g = load_commit_graph_one(graph_name, odb);
|
||||
char *graph_name = get_split_graph_filename(odb->path, line.buf);
|
||||
struct commit_graph *g = load_commit_graph_one(graph_name);
|
||||
|
||||
free(graph_name);
|
||||
|
||||
if (g) {
|
||||
g->obj_dir = odb->path;
|
||||
|
||||
if (add_graph_to_chain(g, graph_chain, oids, i)) {
|
||||
graph_chain = g;
|
||||
valid = 1;
|
||||
|
|
@ -434,56 +439,47 @@ static struct commit_graph *load_commit_graph_chain(struct repository *r,
|
|||
return graph_chain;
|
||||
}
|
||||
|
||||
struct commit_graph *read_commit_graph_one(struct repository *r,
|
||||
struct object_directory *odb)
|
||||
struct commit_graph *read_commit_graph_one(struct repository *r, const char *obj_dir)
|
||||
{
|
||||
struct commit_graph *g = load_commit_graph_v1(r, odb);
|
||||
struct commit_graph *g = load_commit_graph_v1(r, obj_dir);
|
||||
|
||||
if (!g)
|
||||
g = load_commit_graph_chain(r, odb);
|
||||
g = load_commit_graph_chain(r, obj_dir);
|
||||
|
||||
return g;
|
||||
}
|
||||
|
||||
static void prepare_commit_graph_one(struct repository *r,
|
||||
struct object_directory *odb)
|
||||
static void prepare_commit_graph_one(struct repository *r, const char *obj_dir)
|
||||
{
|
||||
|
||||
if (r->objects->commit_graph)
|
||||
return;
|
||||
|
||||
r->objects->commit_graph = read_commit_graph_one(r, odb);
|
||||
r->objects->commit_graph = read_commit_graph_one(r, obj_dir);
|
||||
}
|
||||
|
||||
/*
|
||||
* Return 1 if commit_graph is non-NULL, and 0 otherwise.
|
||||
*
|
||||
* On the first invocation, this function attempts to load the commit
|
||||
* On the first invocation, this function attemps to load the commit
|
||||
* graph if the_repository is configured to have one.
|
||||
*/
|
||||
static int prepare_commit_graph(struct repository *r)
|
||||
{
|
||||
struct object_directory *odb;
|
||||
|
||||
/*
|
||||
* This must come before the "already attempted?" check below, because
|
||||
* we want to disable even an already-loaded graph file.
|
||||
*/
|
||||
if (r->commit_graph_disabled)
|
||||
return 0;
|
||||
|
||||
if (r->objects->commit_graph_attempted)
|
||||
return !!r->objects->commit_graph;
|
||||
r->objects->commit_graph_attempted = 1;
|
||||
int config_value;
|
||||
|
||||
if (git_env_bool(GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD, 0))
|
||||
die("dying as requested by the '%s' variable on commit-graph load!",
|
||||
GIT_TEST_COMMIT_GRAPH_DIE_ON_LOAD);
|
||||
|
||||
prepare_repo_settings(r);
|
||||
if (r->objects->commit_graph_attempted)
|
||||
return !!r->objects->commit_graph;
|
||||
r->objects->commit_graph_attempted = 1;
|
||||
|
||||
if (!git_env_bool(GIT_TEST_COMMIT_GRAPH, 0) &&
|
||||
r->settings.core_commit_graph != 1)
|
||||
(repo_config_get_bool(r, "core.commitgraph", &config_value) ||
|
||||
!config_value))
|
||||
/*
|
||||
* This repository is not configured to use commit graphs, so
|
||||
* do not load one. (But report commit_graph_attempted anyway
|
||||
|
|
@ -499,7 +495,7 @@ static int prepare_commit_graph(struct repository *r)
|
|||
for (odb = r->objects->odb;
|
||||
!r->objects->commit_graph && odb;
|
||||
odb = odb->next)
|
||||
prepare_commit_graph_one(r, odb);
|
||||
prepare_commit_graph_one(r, odb->path);
|
||||
return !!r->objects->commit_graph;
|
||||
}
|
||||
|
||||
|
|
@ -766,7 +762,7 @@ struct packed_oid_list {
|
|||
|
||||
struct write_commit_graph_context {
|
||||
struct repository *r;
|
||||
struct object_directory *odb;
|
||||
char *obj_dir;
|
||||
char *graph_name;
|
||||
struct packed_oid_list oids;
|
||||
struct packed_commit_list commits;
|
||||
|
|
@ -787,8 +783,7 @@ struct write_commit_graph_context {
|
|||
|
||||
unsigned append:1,
|
||||
report_progress:1,
|
||||
split:1,
|
||||
check_oids:1;
|
||||
split:1;
|
||||
|
||||
const struct split_commit_graph_opts *split_opts;
|
||||
};
|
||||
|
|
@ -843,16 +838,12 @@ static void write_graph_chunk_data(struct hashfile *f, int hash_len,
|
|||
|
||||
while (list < last) {
|
||||
struct commit_list *parent;
|
||||
struct object_id *tree;
|
||||
int edge_value;
|
||||
uint32_t packedDate[2];
|
||||
display_progress(ctx->progress, ++ctx->progress_cnt);
|
||||
|
||||
if (parse_commit_no_graph(*list))
|
||||
die(_("unable to parse commit %s"),
|
||||
oid_to_hex(&(*list)->object.oid));
|
||||
tree = get_commit_tree_oid(*list);
|
||||
hashwrite(f, tree->hash, hash_len);
|
||||
parse_commit_no_graph(*list);
|
||||
hashwrite(f, get_commit_tree_oid(*list)->hash, hash_len);
|
||||
|
||||
parent = (*list)->parents;
|
||||
|
||||
|
|
@ -1024,11 +1015,11 @@ static void add_missing_parents(struct write_commit_graph_context *ctx, struct c
|
|||
{
|
||||
struct commit_list *parent;
|
||||
for (parent = commit->parents; parent; parent = parent->next) {
|
||||
if (!(parent->item->object.flags & REACHABLE)) {
|
||||
if (!(parent->item->object.flags & UNINTERESTING)) {
|
||||
ALLOC_GROW(ctx->oids.list, ctx->oids.nr + 1, ctx->oids.alloc);
|
||||
oidcpy(&ctx->oids.list[ctx->oids.nr], &(parent->item->object.oid));
|
||||
ctx->oids.nr++;
|
||||
parent->item->object.flags |= REACHABLE;
|
||||
parent->item->object.flags |= UNINTERESTING;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1046,7 +1037,7 @@ static void close_reachable(struct write_commit_graph_context *ctx)
|
|||
display_progress(ctx->progress, i + 1);
|
||||
commit = lookup_commit(ctx->r, &ctx->oids.list[i]);
|
||||
if (commit)
|
||||
commit->object.flags |= REACHABLE;
|
||||
commit->object.flags |= UNINTERESTING;
|
||||
}
|
||||
stop_progress(&ctx->progress);
|
||||
|
||||
|
|
@ -1058,7 +1049,7 @@ static void close_reachable(struct write_commit_graph_context *ctx)
|
|||
if (ctx->report_progress)
|
||||
ctx->progress = start_delayed_progress(
|
||||
_("Expanding reachable commits in commit graph"),
|
||||
0);
|
||||
ctx->oids.nr);
|
||||
for (i = 0; i < ctx->oids.nr; i++) {
|
||||
display_progress(ctx->progress, i + 1);
|
||||
commit = lookup_commit(ctx->r, &ctx->oids.list[i]);
|
||||
|
|
@ -1083,7 +1074,7 @@ static void close_reachable(struct write_commit_graph_context *ctx)
|
|||
commit = lookup_commit(ctx->r, &ctx->oids.list[i]);
|
||||
|
||||
if (commit)
|
||||
commit->object.flags &= ~REACHABLE;
|
||||
commit->object.flags &= ~UNINTERESTING;
|
||||
}
|
||||
stop_progress(&ctx->progress);
|
||||
}
|
||||
|
|
@ -1094,7 +1085,7 @@ static void compute_generation_numbers(struct write_commit_graph_context *ctx)
|
|||
struct commit_list *list = NULL;
|
||||
|
||||
if (ctx->report_progress)
|
||||
ctx->progress = start_delayed_progress(
|
||||
ctx->progress = start_progress(
|
||||
_("Computing commit graph generation numbers"),
|
||||
ctx->commits.nr);
|
||||
for (i = 0; i < ctx->commits.nr; i++) {
|
||||
|
|
@ -1143,15 +1134,14 @@ static int add_ref_to_list(const char *refname,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int write_commit_graph_reachable(struct object_directory *odb,
|
||||
enum commit_graph_write_flags flags,
|
||||
int write_commit_graph_reachable(const char *obj_dir, unsigned int flags,
|
||||
const struct split_commit_graph_opts *split_opts)
|
||||
{
|
||||
struct string_list list = STRING_LIST_INIT_DUP;
|
||||
int result;
|
||||
|
||||
for_each_ref(add_ref_to_list, &list);
|
||||
result = write_commit_graph(odb, NULL, &list,
|
||||
result = write_commit_graph(obj_dir, NULL, &list,
|
||||
flags, split_opts);
|
||||
|
||||
string_list_clear(&list, 0);
|
||||
|
|
@ -1166,7 +1156,7 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
|
|||
struct strbuf packname = STRBUF_INIT;
|
||||
int dirlen;
|
||||
|
||||
strbuf_addf(&packname, "%s/pack/", ctx->odb->path);
|
||||
strbuf_addf(&packname, "%s/pack/", ctx->obj_dir);
|
||||
dirlen = packname.len;
|
||||
if (ctx->report_progress) {
|
||||
strbuf_addf(&progress_title,
|
||||
|
|
@ -1203,8 +1193,8 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int fill_oids_from_commit_hex(struct write_commit_graph_context *ctx,
|
||||
struct string_list *commit_hex)
|
||||
static void fill_oids_from_commit_hex(struct write_commit_graph_context *ctx,
|
||||
struct string_list *commit_hex)
|
||||
{
|
||||
uint32_t i;
|
||||
struct strbuf progress_title = STRBUF_INIT;
|
||||
|
|
@ -1225,21 +1215,20 @@ static int fill_oids_from_commit_hex(struct write_commit_graph_context *ctx,
|
|||
struct commit *result;
|
||||
|
||||
display_progress(ctx->progress, i + 1);
|
||||
if (!parse_oid_hex(commit_hex->items[i].string, &oid, &end) &&
|
||||
(result = lookup_commit_reference_gently(ctx->r, &oid, 1))) {
|
||||
if (commit_hex->items[i].string &&
|
||||
parse_oid_hex(commit_hex->items[i].string, &oid, &end))
|
||||
continue;
|
||||
|
||||
result = lookup_commit_reference_gently(ctx->r, &oid, 1);
|
||||
|
||||
if (result) {
|
||||
ALLOC_GROW(ctx->oids.list, ctx->oids.nr + 1, ctx->oids.alloc);
|
||||
oidcpy(&ctx->oids.list[ctx->oids.nr], &(result->object.oid));
|
||||
ctx->oids.nr++;
|
||||
} else if (ctx->check_oids) {
|
||||
error(_("invalid commit object id: %s"),
|
||||
commit_hex->items[i].string);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
stop_progress(&ctx->progress);
|
||||
strbuf_release(&progress_title);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void fill_oids_from_all_packs(struct write_commit_graph_context *ctx)
|
||||
|
|
@ -1287,6 +1276,7 @@ static uint32_t count_distinct_commits(struct write_commit_graph_context *ctx)
|
|||
static void copy_oids_to_commits(struct write_commit_graph_context *ctx)
|
||||
{
|
||||
uint32_t i;
|
||||
struct commit_list *parent;
|
||||
|
||||
ctx->num_extra_edges = 0;
|
||||
if (ctx->report_progress)
|
||||
|
|
@ -1294,8 +1284,7 @@ static void copy_oids_to_commits(struct write_commit_graph_context *ctx)
|
|||
_("Finding extra edges in commit graph"),
|
||||
ctx->oids.nr);
|
||||
for (i = 0; i < ctx->oids.nr; i++) {
|
||||
unsigned int num_parents;
|
||||
|
||||
int num_parents = 0;
|
||||
display_progress(ctx->progress, i + 1);
|
||||
if (i > 0 && oideq(&ctx->oids.list[i - 1], &ctx->oids.list[i]))
|
||||
continue;
|
||||
|
|
@ -1309,7 +1298,10 @@ static void copy_oids_to_commits(struct write_commit_graph_context *ctx)
|
|||
|
||||
parse_commit_no_graph(ctx->commits.list[ctx->commits.nr]);
|
||||
|
||||
num_parents = commit_list_count(ctx->commits.list[ctx->commits.nr]->parents);
|
||||
for (parent = ctx->commits.list[ctx->commits.nr]->parents;
|
||||
parent; parent = parent->next)
|
||||
num_parents++;
|
||||
|
||||
if (num_parents > 2)
|
||||
ctx->num_extra_edges += num_parents - 1;
|
||||
|
||||
|
|
@ -1362,10 +1354,10 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
|
|||
|
||||
strbuf_addf(&tmp_file,
|
||||
"%s/info/commit-graphs/tmp_graph_XXXXXX",
|
||||
ctx->odb->path);
|
||||
ctx->obj_dir);
|
||||
ctx->graph_name = strbuf_detach(&tmp_file, NULL);
|
||||
} else {
|
||||
ctx->graph_name = get_commit_graph_filename(ctx->odb);
|
||||
ctx->graph_name = get_commit_graph_filename(ctx->obj_dir);
|
||||
}
|
||||
|
||||
if (safe_create_leading_directories(ctx->graph_name)) {
|
||||
|
|
@ -1376,7 +1368,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
|
|||
}
|
||||
|
||||
if (ctx->split) {
|
||||
char *lock_name = get_chain_filename(ctx->odb);
|
||||
char *lock_name = get_chain_filename(ctx->obj_dir);
|
||||
|
||||
hold_lock_file_for_update(&lk, lock_name, LOCK_DIE_ON_ERROR);
|
||||
|
||||
|
|
@ -1464,7 +1456,7 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
|
|||
|
||||
if (ctx->split && ctx->base_graph_name && ctx->num_commit_graphs_after > 1) {
|
||||
char *new_base_hash = xstrdup(oid_to_hex(&ctx->new_base_graph->oid));
|
||||
char *new_base_name = get_split_graph_filename(ctx->new_base_graph->odb, new_base_hash);
|
||||
char *new_base_name = get_split_graph_filename(ctx->new_base_graph->obj_dir, new_base_hash);
|
||||
|
||||
free(ctx->commit_graph_filenames_after[ctx->num_commit_graphs_after - 2]);
|
||||
free(ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 2]);
|
||||
|
|
@ -1500,12 +1492,12 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
|
|||
}
|
||||
}
|
||||
} else {
|
||||
char *graph_name = get_commit_graph_filename(ctx->odb);
|
||||
char *graph_name = get_commit_graph_filename(ctx->obj_dir);
|
||||
unlink(graph_name);
|
||||
}
|
||||
|
||||
ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1] = xstrdup(oid_to_hex(&file_hash));
|
||||
final_graph_name = get_split_graph_filename(ctx->odb,
|
||||
final_graph_name = get_split_graph_filename(ctx->obj_dir,
|
||||
ctx->commit_graph_hash_after[ctx->num_commit_graphs_after - 1]);
|
||||
ctx->commit_graph_filenames_after[ctx->num_commit_graphs_after - 1] = final_graph_name;
|
||||
|
||||
|
|
@ -1527,8 +1519,8 @@ static int write_commit_graph_file(struct write_commit_graph_context *ctx)
|
|||
|
||||
static void split_graph_merge_strategy(struct write_commit_graph_context *ctx)
|
||||
{
|
||||
struct commit_graph *g;
|
||||
uint32_t num_commits;
|
||||
struct commit_graph *g = ctx->r->objects->commit_graph;
|
||||
uint32_t num_commits = ctx->commits.nr;
|
||||
uint32_t i;
|
||||
|
||||
int max_commits = 0;
|
||||
|
|
@ -1536,18 +1528,15 @@ static void split_graph_merge_strategy(struct write_commit_graph_context *ctx)
|
|||
|
||||
if (ctx->split_opts) {
|
||||
max_commits = ctx->split_opts->max_commits;
|
||||
|
||||
if (ctx->split_opts->size_multiple)
|
||||
size_mult = ctx->split_opts->size_multiple;
|
||||
size_mult = ctx->split_opts->size_multiple;
|
||||
}
|
||||
|
||||
g = ctx->r->objects->commit_graph;
|
||||
num_commits = ctx->commits.nr;
|
||||
ctx->num_commit_graphs_after = ctx->num_commit_graphs_before + 1;
|
||||
|
||||
while (g && (g->num_commits <= size_mult * num_commits ||
|
||||
(max_commits && num_commits > max_commits))) {
|
||||
if (g->odb != ctx->odb)
|
||||
if (strcmp(g->obj_dir, ctx->obj_dir))
|
||||
break;
|
||||
|
||||
num_commits += g->num_commits;
|
||||
|
|
@ -1559,10 +1548,10 @@ static void split_graph_merge_strategy(struct write_commit_graph_context *ctx)
|
|||
ctx->new_base_graph = g;
|
||||
|
||||
if (ctx->num_commit_graphs_after == 2) {
|
||||
char *old_graph_name = get_commit_graph_filename(g->odb);
|
||||
char *old_graph_name = get_commit_graph_filename(g->obj_dir);
|
||||
|
||||
if (!strcmp(g->filename, old_graph_name) &&
|
||||
g->odb != ctx->odb) {
|
||||
strcmp(g->obj_dir, ctx->obj_dir)) {
|
||||
ctx->num_commit_graphs_after = 1;
|
||||
ctx->new_base_graph = NULL;
|
||||
}
|
||||
|
|
@ -1624,7 +1613,8 @@ static int commit_compare(const void *_a, const void *_b)
|
|||
|
||||
static void sort_and_scan_merged_commits(struct write_commit_graph_context *ctx)
|
||||
{
|
||||
uint32_t i;
|
||||
uint32_t i, num_parents;
|
||||
struct commit_list *parent;
|
||||
|
||||
if (ctx->report_progress)
|
||||
ctx->progress = start_delayed_progress(
|
||||
|
|
@ -1642,9 +1632,10 @@ static void sort_and_scan_merged_commits(struct write_commit_graph_context *ctx)
|
|||
die(_("unexpected duplicate commit id %s"),
|
||||
oid_to_hex(&ctx->commits.list[i]->object.oid));
|
||||
} else {
|
||||
unsigned int num_parents;
|
||||
num_parents = 0;
|
||||
for (parent = ctx->commits.list[i]->parents; parent; parent = parent->next)
|
||||
num_parents++;
|
||||
|
||||
num_parents = commit_list_count(ctx->commits.list[i]->parents);
|
||||
if (num_parents > 2)
|
||||
ctx->num_extra_edges += num_parents - 1;
|
||||
}
|
||||
|
|
@ -1657,15 +1648,19 @@ static void merge_commit_graphs(struct write_commit_graph_context *ctx)
|
|||
{
|
||||
struct commit_graph *g = ctx->r->objects->commit_graph;
|
||||
uint32_t current_graph_number = ctx->num_commit_graphs_before;
|
||||
struct strbuf progress_title = STRBUF_INIT;
|
||||
|
||||
while (g && current_graph_number >= ctx->num_commit_graphs_after) {
|
||||
current_graph_number--;
|
||||
|
||||
if (ctx->report_progress)
|
||||
ctx->progress = start_delayed_progress(_("Merging commit-graph"), 0);
|
||||
if (ctx->report_progress) {
|
||||
strbuf_addstr(&progress_title, _("Merging commit-graph"));
|
||||
ctx->progress = start_delayed_progress(progress_title.buf, 0);
|
||||
}
|
||||
|
||||
merge_commit_graph(ctx, g);
|
||||
stop_progress(&ctx->progress);
|
||||
strbuf_release(&progress_title);
|
||||
|
||||
g = g->base_graph;
|
||||
}
|
||||
|
|
@ -1709,13 +1704,13 @@ static void expire_commit_graphs(struct write_commit_graph_context *ctx)
|
|||
if (ctx->split_opts && ctx->split_opts->expire_time)
|
||||
expire_time -= ctx->split_opts->expire_time;
|
||||
if (!ctx->split) {
|
||||
char *chain_file_name = get_chain_filename(ctx->odb);
|
||||
char *chain_file_name = get_chain_filename(ctx->obj_dir);
|
||||
unlink(chain_file_name);
|
||||
free(chain_file_name);
|
||||
ctx->num_commit_graphs_after = 0;
|
||||
}
|
||||
|
||||
strbuf_addstr(&path, ctx->odb->path);
|
||||
strbuf_addstr(&path, ctx->obj_dir);
|
||||
strbuf_addstr(&path, "/info/commit-graphs");
|
||||
dir = opendir(path.buf);
|
||||
|
||||
|
|
@ -1754,14 +1749,15 @@ out:
|
|||
strbuf_release(&path);
|
||||
}
|
||||
|
||||
int write_commit_graph(struct object_directory *odb,
|
||||
int write_commit_graph(const char *obj_dir,
|
||||
struct string_list *pack_indexes,
|
||||
struct string_list *commit_hex,
|
||||
enum commit_graph_write_flags flags,
|
||||
unsigned int flags,
|
||||
const struct split_commit_graph_opts *split_opts)
|
||||
{
|
||||
struct write_commit_graph_context *ctx;
|
||||
uint32_t i, count_distinct = 0;
|
||||
size_t len;
|
||||
int res = 0;
|
||||
|
||||
if (!commit_graph_compatible(the_repository))
|
||||
|
|
@ -1769,11 +1765,17 @@ int write_commit_graph(struct object_directory *odb,
|
|||
|
||||
ctx = xcalloc(1, sizeof(struct write_commit_graph_context));
|
||||
ctx->r = the_repository;
|
||||
ctx->odb = odb;
|
||||
ctx->append = flags & COMMIT_GRAPH_WRITE_APPEND ? 1 : 0;
|
||||
ctx->report_progress = flags & COMMIT_GRAPH_WRITE_PROGRESS ? 1 : 0;
|
||||
ctx->split = flags & COMMIT_GRAPH_WRITE_SPLIT ? 1 : 0;
|
||||
ctx->check_oids = flags & COMMIT_GRAPH_WRITE_CHECK_OIDS ? 1 : 0;
|
||||
|
||||
/* normalize object dir with no trailing slash */
|
||||
ctx->obj_dir = xmallocz(strlen(obj_dir) + 1);
|
||||
normalize_path_copy(ctx->obj_dir, obj_dir);
|
||||
len = strlen(ctx->obj_dir);
|
||||
if (len && ctx->obj_dir[len - 1] == '/')
|
||||
ctx->obj_dir[len - 1] = 0;
|
||||
|
||||
ctx->append = flags & COMMIT_GRAPH_APPEND ? 1 : 0;
|
||||
ctx->report_progress = flags & COMMIT_GRAPH_PROGRESS ? 1 : 0;
|
||||
ctx->split = flags & COMMIT_GRAPH_SPLIT ? 1 : 0;
|
||||
ctx->split_opts = split_opts;
|
||||
|
||||
if (ctx->split) {
|
||||
|
|
@ -1806,7 +1808,7 @@ int write_commit_graph(struct object_directory *odb,
|
|||
ctx->oids.alloc = split_opts->max_commits;
|
||||
|
||||
if (ctx->append) {
|
||||
prepare_commit_graph_one(ctx->r, ctx->odb);
|
||||
prepare_commit_graph_one(ctx->r, ctx->obj_dir);
|
||||
if (ctx->r->objects->commit_graph)
|
||||
ctx->oids.alloc += ctx->r->objects->commit_graph->num_commits;
|
||||
}
|
||||
|
|
@ -1828,10 +1830,8 @@ int write_commit_graph(struct object_directory *odb,
|
|||
goto cleanup;
|
||||
}
|
||||
|
||||
if (commit_hex) {
|
||||
if ((res = fill_oids_from_commit_hex(ctx, commit_hex)))
|
||||
goto cleanup;
|
||||
}
|
||||
if (commit_hex)
|
||||
fill_oids_from_commit_hex(ctx, commit_hex);
|
||||
|
||||
if (!pack_indexes && !commit_hex)
|
||||
fill_oids_from_all_packs(ctx);
|
||||
|
|
@ -1880,6 +1880,7 @@ cleanup:
|
|||
free(ctx->graph_name);
|
||||
free(ctx->commits.list);
|
||||
free(ctx->oids.list);
|
||||
free(ctx->obj_dir);
|
||||
|
||||
if (ctx->commit_graph_filenames_after) {
|
||||
for (i = 0; i < ctx->num_commit_graphs_after; i++) {
|
||||
|
|
@ -1985,10 +1986,8 @@ int verify_commit_graph(struct repository *r, struct commit_graph *g, int flags)
|
|||
if (verify_commit_graph_error & ~VERIFY_COMMIT_GRAPH_ERROR_HASH)
|
||||
return verify_commit_graph_error;
|
||||
|
||||
if (flags & COMMIT_GRAPH_WRITE_PROGRESS)
|
||||
progress = start_progress(_("Verifying commits in commit graph"),
|
||||
g->num_commits);
|
||||
|
||||
progress = start_progress(_("Verifying commits in commit graph"),
|
||||
g->num_commits);
|
||||
for (i = 0; i < g->num_commits; i++) {
|
||||
struct commit *graph_commit, *odb_commit;
|
||||
struct commit_list *graph_parents, *odb_parents;
|
||||
|
|
@ -2096,8 +2095,3 @@ void free_commit_graph(struct commit_graph *g)
|
|||
free(g->filename);
|
||||
free(g);
|
||||
}
|
||||
|
||||
void disable_commit_graph(struct repository *r)
|
||||
{
|
||||
r->commit_graph_disabled = 1;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue