repository: introduce raw object store field

The raw object store field will contain any objects needed for access
to objects in a given repository.

This patch introduces the raw object store and populates it with the
`objectdir`, which used to be part of the repository struct.

As the struct gains members, we'll also populate the function to clear
the memory for these members.

In a later step, we'll introduce a struct object_parser, that will
complement the object parsing in a repository struct: The raw object
parser is the layer that will provide access to raw object content,
while the higher level object parser code will parse raw objects and
keeps track of parenthood and other object relationships using 'struct
object'.  For now only add the lower level to the repository struct.

Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stefan Beller 2018-03-23 18:20:55 +01:00 committed by Junio C Hamano
parent 00a3da2a13
commit 90c62155d6
8 changed files with 57 additions and 18 deletions

View File

@ -22,6 +22,7 @@
#include "pathspec.h"
#include "submodule.h"
#include "submodule-config.h"
#include "object-store.h"
static char const * const grep_usage[] = {
N_("git grep [<options>] [-e] <pattern> [<rev>...] [[--] <path>...]"),
@ -432,7 +433,7 @@ static int grep_submodule(struct grep_opt *opt, struct repository *superproject,
* object.
*/
grep_read_lock();
add_to_alternates_memory(submodule.objectdir);
add_to_alternates_memory(submodule.objects->objectdir);
grep_read_unlock();
if (oid) {

View File

@ -14,6 +14,7 @@
#include "fmt-merge-msg.h"
#include "commit.h"
#include "argv-array.h"
#include "object-store.h"
int trust_executable_bit = 1;
int trust_ctime = 1;
@ -270,9 +271,9 @@ const char *get_git_work_tree(void)
char *get_object_directory(void)
{
if (!the_repository->objectdir)
if (!the_repository->objects->objectdir)
BUG("git environment hasn't been setup");
return the_repository->objectdir;
return the_repository->objects->objectdir;
}
int odb_mkstemp(struct strbuf *template, const char *pattern)

18
object-store.h Normal file
View File

@ -0,0 +1,18 @@
#ifndef OBJECT_STORE_H
#define OBJECT_STORE_H
struct raw_object_store {
/*
* Path to the repository's object store.
* Cannot be NULL after initialization.
*/
char *objectdir;
/* Path to extra alternate object database if not NULL */
char *alternate_db;
};
struct raw_object_store *raw_object_store_new(void);
void raw_object_store_clear(struct raw_object_store *o);
#endif /* OBJECT_STORE_H */

View File

@ -4,6 +4,7 @@
#include "tree.h"
#include "commit.h"
#include "tag.h"
#include "object-store.h"
static struct object **obj_hash;
static int nr_objs, obj_hash_size;
@ -445,3 +446,16 @@ void clear_commit_marks_all(unsigned int flags)
obj->flags &= ~flags;
}
}
struct raw_object_store *raw_object_store_new(void)
{
struct raw_object_store *o = xmalloc(sizeof(*o));
memset(o, 0, sizeof(*o));
return o;
}
void raw_object_store_clear(struct raw_object_store *o)
{
FREE_AND_NULL(o->objectdir);
FREE_AND_NULL(o->alternate_db);
}

3
path.c
View File

@ -10,6 +10,7 @@
#include "submodule-config.h"
#include "path.h"
#include "packfile.h"
#include "object-store.h"
static int get_st_mode_bits(const char *path, int *mode)
{
@ -382,7 +383,7 @@ static void adjust_git_path(const struct repository *repo,
strbuf_splice(buf, 0, buf->len,
repo->index_file, strlen(repo->index_file));
else if (dir_prefix(base, "objects"))
replace_dir(buf, git_dir_len + 7, repo->objectdir);
replace_dir(buf, git_dir_len + 7, repo->objects->objectdir);
else if (git_hooks_path && dir_prefix(base, "hooks"))
replace_dir(buf, git_dir_len + 5, git_hooks_path);
else if (repo->different_commondir)

View File

@ -1,5 +1,6 @@
#include "cache.h"
#include "repository.h"
#include "object-store.h"
#include "config.h"
#include "submodule-config.h"
@ -12,6 +13,7 @@ void initialize_the_repository(void)
the_repository = &the_repo;
the_repo.index = &the_index;
the_repo.objects = raw_object_store_new();
repo_set_hash_algo(&the_repo, GIT_HASH_SHA1);
}
@ -58,10 +60,10 @@ void repo_set_gitdir(struct repository *repo,
free(old_gitdir);
repo_set_commondir(repo, o->commondir);
expand_base_dir(&repo->objectdir, o->object_dir,
expand_base_dir(&repo->objects->objectdir, o->object_dir,
repo->commondir, "objects");
free(repo->alternate_db);
repo->alternate_db = xstrdup_or_null(o->alternate_db);
free(repo->objects->alternate_db);
repo->objects->alternate_db = xstrdup_or_null(o->alternate_db);
expand_base_dir(&repo->graft_file, o->graft_file,
repo->commondir, "info/grafts");
expand_base_dir(&repo->index_file, o->index_file,
@ -140,6 +142,8 @@ static int repo_init(struct repository *repo,
struct repository_format format;
memset(repo, 0, sizeof(*repo));
repo->objects = raw_object_store_new();
if (repo_init_gitdir(repo, gitdir))
goto error;
@ -214,13 +218,14 @@ void repo_clear(struct repository *repo)
{
FREE_AND_NULL(repo->gitdir);
FREE_AND_NULL(repo->commondir);
FREE_AND_NULL(repo->objectdir);
FREE_AND_NULL(repo->alternate_db);
FREE_AND_NULL(repo->graft_file);
FREE_AND_NULL(repo->index_file);
FREE_AND_NULL(repo->worktree);
FREE_AND_NULL(repo->submodule_prefix);
raw_object_store_clear(repo->objects);
FREE_AND_NULL(repo->objects);
if (repo->config) {
git_configset_clear(repo->config);
FREE_AND_NULL(repo->config);

View File

@ -2,9 +2,10 @@
#define REPOSITORY_H
struct config_set;
struct index_state;
struct submodule_cache;
struct git_hash_algo;
struct index_state;
struct raw_object_store;
struct submodule_cache;
struct repository {
/* Environment */
@ -21,13 +22,9 @@ struct repository {
char *commondir;
/*
* Path to the repository's object store.
* Cannot be NULL after initialization.
* Holds any information related to accessing the raw object content.
*/
char *objectdir;
/* Path to extra alternate object database if not NULL */
char *alternate_db;
struct raw_object_store *objects;
/*
* Path to the repository's graft file.

View File

@ -29,6 +29,7 @@
#include "quote.h"
#include "packfile.h"
#include "fetch-object.h"
#include "object-store.h"
const unsigned char null_sha1[GIT_MAX_RAWSZ];
const struct object_id null_oid;
@ -671,7 +672,8 @@ void prepare_alt_odb(void)
return;
alt_odb_tail = &alt_odb_list;
link_alt_odb_entries(the_repository->alternate_db, PATH_SEP, NULL, 0);
link_alt_odb_entries(the_repository->objects->alternate_db,
PATH_SEP, NULL, 0);
read_info_alternates(get_object_directory(), 0);
}