mirror of
https://github.com/git/git.git
synced 2026-03-07 07:47:42 +01:00
odb/source: introduce source type for robustness
When a caller holds a `struct odb_source`, they have no way of telling what type the source is. This doesn't really cause any problems in the current status quo as we only have a single type anyway, "files". But going forward we expect to add more types, and if so it will become necessary to tell the sources apart. Introduce a new enum to cover this use case and assert that the given source actually matches the target source when performing the downcast. 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
b79d085ef8
commit
88c2f6bae8
@@ -36,7 +36,7 @@ struct odb_source_files *odb_source_files_new(struct object_database *odb,
|
||||
struct odb_source_files *files;
|
||||
|
||||
CALLOC_ARRAY(files, 1);
|
||||
odb_source_init(&files->base, odb, path, local);
|
||||
odb_source_init(&files->base, odb, ODB_SOURCE_FILES, path, local);
|
||||
files->loose = odb_source_loose_new(&files->base);
|
||||
files->packed = packfile_store_new(&files->base);
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ void odb_source_files_free(struct odb_source_files *files);
|
||||
*/
|
||||
static inline struct odb_source_files *odb_source_files_downcast(struct odb_source *source)
|
||||
{
|
||||
if (source->type != ODB_SOURCE_FILES)
|
||||
BUG("trying to downcast source of type '%d' to files", source->type);
|
||||
return container_of(source, struct odb_source_files, base);
|
||||
}
|
||||
|
||||
|
||||
@@ -13,10 +13,12 @@ struct odb_source *odb_source_new(struct object_database *odb,
|
||||
|
||||
void odb_source_init(struct odb_source *source,
|
||||
struct object_database *odb,
|
||||
enum odb_source_type type,
|
||||
const char *path,
|
||||
bool local)
|
||||
{
|
||||
source->odb = odb;
|
||||
source->type = type;
|
||||
source->local = local;
|
||||
source->path = xstrdup(path);
|
||||
}
|
||||
|
||||
16
odb/source.h
16
odb/source.h
@@ -1,6 +1,18 @@
|
||||
#ifndef ODB_SOURCE_H
|
||||
#define ODB_SOURCE_H
|
||||
|
||||
enum odb_source_type {
|
||||
/*
|
||||
* The "unknown" type, which should never be in use. This is type
|
||||
* mostly exists to catch cases where the type field remains zeroed
|
||||
* out.
|
||||
*/
|
||||
ODB_SOURCE_UNKNOWN,
|
||||
|
||||
/* The "files" backend that uses loose objects and packfiles. */
|
||||
ODB_SOURCE_FILES,
|
||||
};
|
||||
|
||||
/*
|
||||
* The source is the part of the object database that stores the actual
|
||||
* objects. It thus encapsulates the logic to read and write the specific
|
||||
@@ -19,6 +31,9 @@ struct odb_source {
|
||||
/* Object database that owns this object source. */
|
||||
struct object_database *odb;
|
||||
|
||||
/* The type used by this source. */
|
||||
enum odb_source_type type;
|
||||
|
||||
/*
|
||||
* Figure out whether this is the local source of the owning
|
||||
* repository, which would typically be its ".git/objects" directory.
|
||||
@@ -58,6 +73,7 @@ struct odb_source *odb_source_new(struct object_database *odb,
|
||||
*/
|
||||
void odb_source_init(struct odb_source *source,
|
||||
struct object_database *odb,
|
||||
enum odb_source_type type,
|
||||
const char *path,
|
||||
bool local);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user