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);