mirror of
https://github.com/git/git.git
synced 2026-06-30 19:58:12 +00:00
odb/source-loose: start converting to a proper struct odb_source
Start converting `struct odb_source_loose` into a proper pluggable `struct odb_source` by embedding the base struct and assigning it the new `ODB_SOURCE_LOOSE` type. Furthermore, wire up lifecycle management of this source by implementing the `free` callback and taking ownership of the chdir notifications. Note that the loose source is not yet functional as a standalone `struct odb_source`, as it's missing all of the callback implementations. These will be wired up in subsequent commits. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
committed by
Junio C Hamano
parent
1d451ba6fe
commit
ead691927b
@@ -27,7 +27,7 @@ static void odb_source_files_free(struct odb_source *source)
|
||||
{
|
||||
struct odb_source_files *files = odb_source_files_downcast(source);
|
||||
chdir_notify_unregister(NULL, odb_source_files_reparent, files);
|
||||
odb_source_loose_free(files->loose);
|
||||
odb_source_free(&files->loose->base);
|
||||
packfile_store_free(files->packed);
|
||||
odb_source_release(&files->base);
|
||||
free(files);
|
||||
|
||||
@@ -1,10 +1,55 @@
|
||||
#include "git-compat-util.h"
|
||||
#include "abspath.h"
|
||||
#include "chdir-notify.h"
|
||||
#include "loose.h"
|
||||
#include "odb.h"
|
||||
#include "odb/source-files.h"
|
||||
#include "odb/source-loose.h"
|
||||
#include "oidtree.h"
|
||||
|
||||
void odb_source_loose_clear_cache(struct odb_source_loose *loose)
|
||||
{
|
||||
oidtree_clear(loose->cache);
|
||||
FREE_AND_NULL(loose->cache);
|
||||
memset(&loose->subdir_seen, 0,
|
||||
sizeof(loose->subdir_seen));
|
||||
}
|
||||
|
||||
static void odb_source_loose_reparent(const char *name UNUSED,
|
||||
const char *old_cwd,
|
||||
const char *new_cwd,
|
||||
void *cb_data)
|
||||
{
|
||||
struct odb_source_loose *loose = cb_data;
|
||||
char *path = reparent_relative_path(old_cwd, new_cwd,
|
||||
loose->base.path);
|
||||
free(loose->base.path);
|
||||
loose->base.path = path;
|
||||
}
|
||||
|
||||
static void odb_source_loose_free(struct odb_source *source)
|
||||
{
|
||||
struct odb_source_loose *loose = odb_source_loose_downcast(source);
|
||||
odb_source_loose_clear_cache(loose);
|
||||
loose_object_map_clear(&loose->map);
|
||||
chdir_notify_unregister(NULL, odb_source_loose_reparent, loose);
|
||||
odb_source_release(&loose->base);
|
||||
free(loose);
|
||||
}
|
||||
|
||||
struct odb_source_loose *odb_source_loose_new(struct odb_source_files *files)
|
||||
{
|
||||
struct odb_source_loose *loose;
|
||||
|
||||
CALLOC_ARRAY(loose, 1);
|
||||
odb_source_init(&loose->base, files->base.odb, ODB_SOURCE_LOOSE,
|
||||
files->base.path, files->base.local);
|
||||
loose->files = files;
|
||||
|
||||
loose->base.free = odb_source_loose_free;
|
||||
|
||||
if (!is_absolute_path(loose->base.path))
|
||||
chdir_notify_register(NULL, odb_source_loose_reparent, loose);
|
||||
|
||||
return loose;
|
||||
}
|
||||
|
||||
@@ -12,6 +12,7 @@ struct oidtree;
|
||||
* file per object. This source is part of the files source.
|
||||
*/
|
||||
struct odb_source_loose {
|
||||
struct odb_source base;
|
||||
struct odb_source_files *files;
|
||||
|
||||
/*
|
||||
@@ -32,4 +33,17 @@ struct odb_source_loose {
|
||||
|
||||
struct odb_source_loose *odb_source_loose_new(struct odb_source_files *files);
|
||||
|
||||
/*
|
||||
* Cast the given object database source to the loose backend. This will cause
|
||||
* a BUG in case the source doesn't use this backend.
|
||||
*/
|
||||
static inline struct odb_source_loose *odb_source_loose_downcast(struct odb_source *source)
|
||||
{
|
||||
if (source->type != ODB_SOURCE_LOOSE)
|
||||
BUG("trying to downcast source of type '%d' to loose", source->type);
|
||||
return container_of(source, struct odb_source_loose, base);
|
||||
}
|
||||
|
||||
void odb_source_loose_clear_cache(struct odb_source_loose *loose);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -14,6 +14,9 @@ enum odb_source_type {
|
||||
/* The "files" backend that uses loose objects and packfiles. */
|
||||
ODB_SOURCE_FILES,
|
||||
|
||||
/* The "loose" backend that uses loose objects, only. */
|
||||
ODB_SOURCE_LOOSE,
|
||||
|
||||
/* The "in-memory" backend that stores objects in memory. */
|
||||
ODB_SOURCE_INMEMORY,
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user