This applies on top of 464416a2eaadf84d2bfdf795007863d03b222b7c (sb/packfiles-in-repository). It is also available at https://github.com/stefanbeller/git/tree/object-store-3 This series will bring the replacement mechanism (git replace) into the object store. The first patches are cleaning up a bit, and patches 6-19 are converting one function at a time using the tick-tock pattern with the #define trick. See cfc62fc98c (sha1_file: add repository argument to link_alt_odb_entry, 2018-03-23) for explanation. Thanks, Stefan Stefan Beller (19): replace_object.c: rename to use dash in file name replace-object: move replace_object to object store object-store: move lookup_replace_object to replace-object.h replace-object: move replace objects prepared flag to object store replace-object: check_replace_refs is safe in multi repo environment refs: add repository argument to get_main_ref_store refs: add repository argument to for_each_replace_ref replace-object: add repository argument to replace_object_pos replace-object: add repository argument to register_replace_object replace-object: add repository argument to prepare_replace_object replace-object: add repository argument to do_lookup_replace_object replace-object: add repository argument to lookup_replace_object refs: store the main ref store inside the repository struct refs: allow for_each_replace_ref to handle arbitrary repositories replace-object: allow replace_object_pos to handle arbitrary repositories replace-object: allow register_replace_object to handle arbitrary repositories replace-object: allow prepare_replace_object to handle arbitrary repositories replace-object: allow do_lookup_replace_object to handle arbitrary repositories replace-object: allow lookup_replace_object to handle arbitrary repositories Makefile | 2 +- builtin/mktag.c | 3 +- builtin/pack-refs.c | 3 +- builtin/replace.c | 4 +- cache.h | 19 ------- environment.c | 2 +- object-store.h | 16 ++++++ object.c | 3 +- refs.c | 80 ++++++++++++++-------------- refs.h | 4 +- replace_object.c => replace-object.c | 66 +++++++++++------------ replace-object.h | 35 ++++++++++++ repository.h | 5 ++ revision.c | 5 +- sha1_file.c | 7 +-- streaming.c | 3 +- t/helper/test-ref-store.c | 3 +- 17 files changed, 149 insertions(+), 111 deletions(-) rename replace_object.c => replace-object.c (56%) create mode 100644 replace-object.h $ git diff 464416a2eaadf84d2bfdf795007863d03b222b7c..HEAD -- object-store.h repository.h diff --git a/object-store.h b/object-store.h index fef33f345f..be90c02db6 100644 --- a/object-store.h +++ b/object-store.h @@ -93,6 +93,22 @@ struct raw_object_store { struct alternate_object_database *alt_odb_list; struct alternate_object_database **alt_odb_tail; + /* + * Objects that should be substituted by other objects + * (see git-replace(1)). + */ + struct replace_objects { + /* + * An array of replacements. The array is kept sorted by the original + * sha1. + */ + struct replace_object **items; + + int alloc, nr; + + unsigned prepared : 1; + } replacements; + /* * private data * diff --git a/repository.h b/repository.h index 09df94a472..2922d3a28b 100644 --- a/repository.h +++ b/repository.h @@ -26,6 +26,11 @@ struct repository { */ struct raw_object_store *objects; + /* + * The store in which the refs are hold. + */ + struct ref_store *main_ref_store; + /* * Path to the repository's graft file. * Cannot be NULL after initialization. -- 2.17.0.484.g0c8726318c-goog