object: move grafts to object parser

Grafts are only meaningful in the context of a single repository. Therefore they cannot be global. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Jonathan Nieder committed May 15, 2018 at 16:42 UTC 6a1a79fd146510a7f1a6e6303d5adb1f8f298989
2 files changed +27 -19
commit.c
+23 -19
@@ -1,6 +1,7 @@
1 #include "cache.h"
2 #include "tag.h"
3 #include "commit.h"
4 +#include "repository.h"
5 #include "object-store.h"
6 #include "pkt-line.h"
7 #include "utf8.h"
@@ -97,9 +98,6 @@ static timestamp_t parse_commit_date(const char *buf, const char *tail)
98 return parse_timestamp(dateptr, NULL, 10);
99 }
100
100 -static struct commit_graft **commit_graft;
101 -static int commit_graft_alloc, commit_graft_nr;
102 -
101 static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
102 {
103 struct commit_graft **commit_graft_table = table;
@@ -108,7 +106,8 @@ static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
106
107 static int commit_graft_pos(const unsigned char *sha1)
108 {
111 - return sha1_pos(sha1, commit_graft, commit_graft_nr,
109 + return sha1_pos(sha1, the_repository->parsed_objects->grafts,
110 + the_repository->parsed_objects->grafts_nr,
111 commit_graft_sha1_access);
112 }
113
@@ -120,18 +119,22 @@ int register_commit_graft(struct commit_graft *graft, int ignore_dups)
119 if (ignore_dups)
120 free(graft);
121 else {
123 - free(commit_graft[pos]);
124 - commit_graft[pos] = graft;
122 + free(the_repository->parsed_objects->grafts[pos]);
123 + the_repository->parsed_objects->grafts[pos] = graft;
124 }
125 return 1;
126 }
127 pos = -pos - 1;
129 - ALLOC_GROW(commit_graft, commit_graft_nr + 1, commit_graft_alloc);
130 - commit_graft_nr++;
131 - if (pos < commit_graft_nr)
132 - MOVE_ARRAY(commit_graft + pos + 1, commit_graft + pos,
133 - commit_graft_nr - pos - 1);
134 - commit_graft[pos] = graft;
128 + ALLOC_GROW(the_repository->parsed_objects->grafts,
129 + the_repository->parsed_objects->grafts_nr + 1,
130 + the_repository->parsed_objects->grafts_alloc);
131 + the_repository->parsed_objects->grafts_nr++;
132 + if (pos < the_repository->parsed_objects->grafts_nr)
133 + memmove(the_repository->parsed_objects->grafts + pos + 1,
134 + the_repository->parsed_objects->grafts + pos,
135 + (the_repository->parsed_objects->grafts_nr - pos - 1) *
136 + sizeof(*the_repository->parsed_objects->grafts));
137 + the_repository->parsed_objects->grafts[pos] = graft;
138 return 0;
139 }
140
@@ -213,14 +216,14 @@ struct commit_graft *lookup_commit_graft(const struct object_id *oid)
216 pos = commit_graft_pos(oid->hash);
217 if (pos < 0)
218 return NULL;
216 - return commit_graft[pos];
219 + return the_repository->parsed_objects->grafts[pos];
220 }
221
222 int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)
223 {
224 int i, ret;
222 - for (i = ret = 0; i < commit_graft_nr && !ret; i++)
223 - ret = fn(commit_graft[i], cb_data);
225 + for (i = ret = 0; i < the_repository->parsed_objects->grafts_nr && !ret; i++)
226 + ret = fn(the_repository->parsed_objects->grafts[i], cb_data);
227 return ret;
228 }
229
@@ -229,10 +232,11 @@ int unregister_shallow(const struct object_id *oid)
232 int pos = commit_graft_pos(oid->hash);
233 if (pos < 0)
234 return -1;
232 - if (pos + 1 < commit_graft_nr)
233 - MOVE_ARRAY(commit_graft + pos, commit_graft + pos + 1,
234 - commit_graft_nr - pos - 1);
235 - commit_graft_nr--;
235 + if (pos + 1 < the_repository->parsed_objects->grafts_nr)
236 + MOVE_ARRAY(the_repository->parsed_objects->grafts + pos,
237 + the_repository->parsed_objects->grafts + pos + 1,
238 + the_repository->parsed_objects->grafts_nr - pos - 1);
239 + the_repository->parsed_objects->grafts_nr--;
240 return 0;
241 }
242
object.h
+4
@@ -12,6 +12,10 @@ struct parsed_object_pool {
12 struct alloc_state *tag_state;
13 struct alloc_state *object_state;
14 unsigned commit_count;
15 +
16 + /* parent substitutions from .git/info/grafts and .git/shallow */
17 + struct commit_graft **grafts;
18 + int grafts_alloc, grafts_nr;
19 };
20
21 struct parsed_object_pool *parsed_object_pool_new(void);