replace-object: eliminate replace objects prepared flag

Make the oidmap a pointer. That way we eliminate the need for the global boolean variable 'replace_object_prepared' as we can put this information into the pointer being NULL or not. Another advantage of this is that we would more quickly catch code that tries to access replace-map without initializing it. This also allows the '#include "oidmap.h"' introduced in a previous patch to be replaced by the forward declaration of 'struct oidmap;'. Keeping the type opaque discourages circumventing accessor functions; not dragging in other headers avoids some compile time overhead. One disadvantage of this is change is performance as we need to pay the overhead for a malloc. The alternative of moving the global variable into the object store is less modular code. Helped-by: René Scharfe <l.s.r@web.de> Helped-by: Junio C Hamano <gitster@pobox.com> Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Stefan Beller committed Apr 11, 2018 at 17:21 UTC c1274495ce74cb71c8c6e9e16490d6c4d2d1fe22
2 files changed +10 -8
object-store.h
+1 -1
@@ -99,7 +99,7 @@ struct raw_object_store {
99 * Objects that should be substituted by other objects
100 * (see git-replace(1)).
101 */
102 - struct oidmap replace_map;
102 + struct oidmap *replace_map;
103
104 /*
105 * private data
replace_object.c
+9 -7
@@ -25,7 +25,7 @@ static int register_replace_ref(const char *refname,
25 oidcpy(&repl_obj->replacement, oid);
26
27 /* Register new object */
28 - if (oidmap_put(&the_repository->objects->replace_map, repl_obj))
28 + if (oidmap_put(the_repository->objects->replace_map, repl_obj))
29 die("duplicate replace ref: %s", refname);
30
31 return 0;
@@ -33,14 +33,16 @@ static int register_replace_ref(const char *refname,
33
34 static void prepare_replace_object(void)
35 {
36 - static int replace_object_prepared;
37 -
38 - if (replace_object_prepared)
36 + if (the_repository->objects->replace_map)
37 return;
38
39 + the_repository->objects->replace_map =
40 + xmalloc(sizeof(*the_repository->objects->replace_map));
41 + oidmap_init(the_repository->objects->replace_map, 0);
42 +
43 for_each_replace_ref(register_replace_ref, NULL);
42 - replace_object_prepared = 1;
43 - if (!the_repository->objects->replace_map.map.tablesize)
44 +
45 + if (!the_repository->objects->replace_map->map.tablesize)
46 check_replace_refs = 0;
47 }
48
@@ -64,7 +66,7 @@ const struct object_id *do_lookup_replace_object(const struct object_id *oid)
66 /* Try to recursively replace the object */
67 while (depth-- > 0) {
68 struct replace_object *repl_obj =
67 - oidmap_get(&the_repository->objects->replace_map, cur);
69 + oidmap_get(the_repository->objects->replace_map, cur);
70 if (!repl_obj)
71 return cur;
72 cur = &repl_obj->replacement;