diff options
| author | Patrick Steinhardt <ps@pks.im> | 2026-03-05 15:19:52 +0100 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2026-03-05 11:45:16 -0800 |
| commit | 6a38b13fbac73d1a1982f9211c5c3e64e1191696 (patch) | |
| tree | 5476c9e8b1b91e9189384d434676ea906be52d8e | |
| parent | fdefdc2e6979e9e8cb28b34c458f42b44f217bf0 (diff) | |
| download | git-6a38b13fbac73d1a1982f9211c5c3e64e1191696.tar.xz | |
odb/source: make `freshen_object()` function pluggable
Introduce a new callback function in `struct odb_source` to make the
function pluggable.
Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
| -rw-r--r-- | odb.c | 12 | ||||
| -rw-r--r-- | odb/source-files.c | 11 | ||||
| -rw-r--r-- | odb/source.h | 23 |
3 files changed, 36 insertions, 10 deletions
@@ -959,18 +959,10 @@ int odb_freshen_object(struct object_database *odb, const struct object_id *oid) { struct odb_source *source; - odb_prepare_alternates(odb); - for (source = odb->sources; source; source = source->next) { - struct odb_source_files *files = odb_source_files_downcast(source); - - if (packfile_store_freshen_object(files->packed, oid)) + for (source = odb->sources; source; source = source->next) + if (odb_source_freshen_object(source, oid)) return 1; - - if (odb_source_loose_freshen_object(source, oid)) - return 1; - } - return 0; } diff --git a/odb/source-files.c b/odb/source-files.c index d8ef1d8237..a6447909e0 100644 --- a/odb/source-files.c +++ b/odb/source-files.c @@ -88,6 +88,16 @@ static int odb_source_files_for_each_object(struct odb_source *source, return 0; } +static int odb_source_files_freshen_object(struct odb_source *source, + const struct object_id *oid) +{ + struct odb_source_files *files = odb_source_files_downcast(source); + if (packfile_store_freshen_object(files->packed, oid) || + odb_source_loose_freshen_object(source, oid)) + return 1; + return 0; +} + struct odb_source_files *odb_source_files_new(struct object_database *odb, const char *path, bool local) @@ -105,6 +115,7 @@ struct odb_source_files *odb_source_files_new(struct object_database *odb, files->base.read_object_info = odb_source_files_read_object_info; files->base.read_object_stream = odb_source_files_read_object_stream; files->base.for_each_object = odb_source_files_for_each_object; + files->base.freshen_object = odb_source_files_freshen_object; /* * Ideally, we would only ever store absolute paths in the source. This diff --git a/odb/source.h b/odb/source.h index be56995389..7f2ecf420b 100644 --- a/odb/source.h +++ b/odb/source.h @@ -186,6 +186,18 @@ struct odb_source { odb_for_each_object_cb cb, void *cb_data, unsigned flags); + + /* + * This callback is expected to freshen the given object so that its + * last access time is set to the current time. This is used to ensure + * that objects that are recent will not get garbage collected even if + * they were unreachable. + * + * Returns 0 in case the object does not exist, 1 in case the object + * has been freshened. + */ + int (*freshen_object)(struct odb_source *source, + const struct object_id *oid); }; /* @@ -297,4 +309,15 @@ static inline int odb_source_for_each_object(struct odb_source *source, return source->for_each_object(source, request, cb, cb_data, flags); } +/* + * Freshen an object in the object database by updating its timestamp. + * Returns 1 in case the object has been freshened, 0 in case the object does + * not exist. + */ +static inline int odb_source_freshen_object(struct odb_source *source, + const struct object_id *oid) +{ + return source->freshen_object(source, oid); +} + #endif |
