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>
This commit is contained in:
Jonathan Nieder 2018-05-15 16:42:16 -07:00 committed by Junio C Hamano
parent cbd53a2193
commit 6a1a79fd14
2 changed files with 27 additions and 19 deletions

View File

@ -1,6 +1,7 @@
#include "cache.h" #include "cache.h"
#include "tag.h" #include "tag.h"
#include "commit.h" #include "commit.h"
#include "repository.h"
#include "object-store.h" #include "object-store.h"
#include "pkt-line.h" #include "pkt-line.h"
#include "utf8.h" #include "utf8.h"
@ -97,9 +98,6 @@ static timestamp_t parse_commit_date(const char *buf, const char *tail)
return parse_timestamp(dateptr, NULL, 10); 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) static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
{ {
struct commit_graft **commit_graft_table = table; struct commit_graft **commit_graft_table = table;
@ -108,7 +106,8 @@ static const unsigned char *commit_graft_sha1_access(size_t index, void *table)
static int commit_graft_pos(const unsigned char *sha1) 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); commit_graft_sha1_access);
} }
@ -120,18 +119,22 @@ int register_commit_graft(struct commit_graft *graft, int ignore_dups)
if (ignore_dups) if (ignore_dups)
free(graft); free(graft);
else { else {
free(commit_graft[pos]); free(the_repository->parsed_objects->grafts[pos]);
commit_graft[pos] = graft; the_repository->parsed_objects->grafts[pos] = graft;
} }
return 1; return 1;
} }
pos = -pos - 1; pos = -pos - 1;
ALLOC_GROW(commit_graft, commit_graft_nr + 1, commit_graft_alloc); ALLOC_GROW(the_repository->parsed_objects->grafts,
commit_graft_nr++; the_repository->parsed_objects->grafts_nr + 1,
if (pos < commit_graft_nr) the_repository->parsed_objects->grafts_alloc);
MOVE_ARRAY(commit_graft + pos + 1, commit_graft + pos, the_repository->parsed_objects->grafts_nr++;
commit_graft_nr - pos - 1); if (pos < the_repository->parsed_objects->grafts_nr)
commit_graft[pos] = graft; 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; return 0;
} }
@ -213,14 +216,14 @@ struct commit_graft *lookup_commit_graft(const struct object_id *oid)
pos = commit_graft_pos(oid->hash); pos = commit_graft_pos(oid->hash);
if (pos < 0) if (pos < 0)
return NULL; 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 for_each_commit_graft(each_commit_graft_fn fn, void *cb_data)
{ {
int i, ret; int i, ret;
for (i = ret = 0; i < commit_graft_nr && !ret; i++) for (i = ret = 0; i < the_repository->parsed_objects->grafts_nr && !ret; i++)
ret = fn(commit_graft[i], cb_data); ret = fn(the_repository->parsed_objects->grafts[i], cb_data);
return ret; return ret;
} }
@ -229,10 +232,11 @@ int unregister_shallow(const struct object_id *oid)
int pos = commit_graft_pos(oid->hash); int pos = commit_graft_pos(oid->hash);
if (pos < 0) if (pos < 0)
return -1; return -1;
if (pos + 1 < commit_graft_nr) if (pos + 1 < the_repository->parsed_objects->grafts_nr)
MOVE_ARRAY(commit_graft + pos, commit_graft + pos + 1, MOVE_ARRAY(the_repository->parsed_objects->grafts + pos,
commit_graft_nr - pos - 1); the_repository->parsed_objects->grafts + pos + 1,
commit_graft_nr--; the_repository->parsed_objects->grafts_nr - pos - 1);
the_repository->parsed_objects->grafts_nr--;
return 0; return 0;
} }

View File

@ -12,6 +12,10 @@ struct parsed_object_pool {
struct alloc_state *tag_state; struct alloc_state *tag_state;
struct alloc_state *object_state; struct alloc_state *object_state;
unsigned commit_count; unsigned commit_count;
/* parent substitutions from .git/info/grafts and .git/shallow */
struct commit_graft **grafts;
int grafts_alloc, grafts_nr;
}; };
struct parsed_object_pool *parsed_object_pool_new(void); struct parsed_object_pool *parsed_object_pool_new(void);