From: Jonathan Nieder <jrnieder@xxxxxxxxx> Grafts are only meaningful in the context of a single repository. Therefore they cannot be global. Signed-off-by: Stefan Beller <sbeller@xxxxxxxxxx> Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- commit.c | 44 +++++++++++++++++++++++--------------------- object.h | 6 +++++- 2 files changed, 28 insertions(+), 22 deletions(-) diff --git a/commit.c b/commit.c index 2137a0b9c6..2ad5537ed7 100644 --- a/commit.c +++ b/commit.c @@ -1,6 +1,7 @@ #include "cache.h" #include "tag.h" #include "commit.h" +#include "repository.h" #include "object-store.h" #include "pkt-line.h" #include "utf8.h" @@ -98,9 +99,6 @@ static timestamp_t parse_commit_date(const char *buf, const char *tail) return parse_timestamp(dateptr, NULL, 10); } -static struct commit_graft **commit_graft; -static int commit_graft_alloc, commit_graft_nr; - static const unsigned char *commit_graft_sha1_access(size_t index, void *table) { struct commit_graft **commit_graft_table = table; @@ -109,7 +107,8 @@ static const unsigned char *commit_graft_sha1_access(size_t index, void *table) static int commit_graft_pos(const unsigned char *sha1) { - return sha1_pos(sha1, commit_graft, commit_graft_nr, + return sha1_pos(sha1, the_repository->parsed_objects.grafts, + the_repository->parsed_objects.grafts_nr, commit_graft_sha1_access); } @@ -121,20 +120,22 @@ int register_commit_graft(struct commit_graft *graft, int ignore_dups) if (ignore_dups) free(graft); else { - free(commit_graft[pos]); - commit_graft[pos] = graft; + free(the_repository->parsed_objects.grafts[pos]); + the_repository->parsed_objects.grafts[pos] = graft; } return 1; } pos = -pos - 1; - ALLOC_GROW(commit_graft, commit_graft_nr + 1, commit_graft_alloc); - commit_graft_nr++; - if (pos < commit_graft_nr) - memmove(commit_graft + pos + 1, - commit_graft + pos, - (commit_graft_nr - pos - 1) * - sizeof(*commit_graft)); - commit_graft[pos] = graft; + ALLOC_GROW(the_repository->parsed_objects.grafts, + the_repository->parsed_objects.grafts_nr + 1, + the_repository->parsed_objects.grafts_alloc); + the_repository->parsed_objects.grafts_nr++; + if (pos < the_repository->parsed_objects.grafts_nr) + memmove(the_repository->parsed_objects.grafts + pos + 1, + the_repository->parsed_objects.grafts + pos, + (the_repository->parsed_objects.grafts_nr - pos - 1) * + sizeof(*the_repository->parsed_objects.grafts)); + the_repository->parsed_objects.grafts[pos] = graft; return 0; } @@ -216,14 +217,14 @@ struct commit_graft *lookup_commit_graft(const struct object_id *oid) pos = commit_graft_pos(oid->hash); if (pos < 0) return NULL; - return commit_graft[pos]; + return the_repository->parsed_objects.grafts[pos]; } int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data) { int i, ret; - for (i = ret = 0; i < commit_graft_nr && !ret; i++) - ret = fn(commit_graft[i], cb_data); + for (i = ret = 0; i < the_repository->parsed_objects.grafts_nr && !ret; i++) + ret = fn(the_repository->parsed_objects.grafts[i], cb_data); return ret; } @@ -232,10 +233,11 @@ int unregister_shallow(const struct object_id *oid) int pos = commit_graft_pos(oid->hash); if (pos < 0) return -1; - if (pos + 1 < commit_graft_nr) - MOVE_ARRAY(commit_graft + pos, commit_graft + pos + 1, - commit_graft_nr - pos - 1); - commit_graft_nr--; + if (pos + 1 < the_repository->parsed_objects.grafts_nr) + MOVE_ARRAY(the_repository->parsed_objects.grafts + pos, + the_repository->parsed_objects.grafts + pos + 1, + the_repository->parsed_objects.grafts_nr - pos - 1); + the_repository->parsed_objects.grafts_nr--; return 0; } diff --git a/object.h b/object.h index 727a03ebd6..b667404f88 100644 --- a/object.h +++ b/object.h @@ -4,9 +4,13 @@ struct object_parser { struct object **obj_hash; int nr_objs, obj_hash_size; + + /* parent substitutions from .git/info/grafts and .git/shallow */ + struct commit_graft **grafts; + int grafts_alloc, grafts_nr; }; -#define OBJECT_PARSER_INIT { NULL, 0, 0 } +#define OBJECT_PARSER_INIT { NULL, 0, 0, NULL, 0, 0 } struct object_list { struct object *item; -- 2.15.1.433.g936d1b9894.dirty