Derrick Stolee via GitGitGadget wrote: > From: Derrick Stolee <derrickstolee@xxxxxxxxxx> > > The 'read_replace_objects' constant is initialized by git_default_config > (if core.useReplaceRefs is disabled) and within setup_git_env (if > GIT_NO_REPLACE_OBJECTS) is set. To ensure that this variable cannot be > set accidentally in other places, wrap it in a replace_refs_enabled() > method. > > This allows us to remove the global from being recognized outside of > replace-objects.c. > > Further, a future change will help prevent the variable from being read > before it is initialized. Centralizing its access is an important first > step. > > Signed-off-by: Derrick Stolee <derrickstolee@xxxxxxxxxx> > --- > commit-graph.c | 4 +--- > environment.c | 1 - > log-tree.c | 2 +- > replace-object.c | 7 +++++++ > replace-object.h | 15 ++++++++++++++- > 5 files changed, 23 insertions(+), 6 deletions(-) > > diff --git a/commit-graph.c b/commit-graph.c > index 43558b4d9b0..95873317bf7 100644 > --- a/commit-graph.c > +++ b/commit-graph.c > @@ -203,14 +203,12 @@ static struct commit_graph *alloc_commit_graph(void) > return g; > } > > -extern int read_replace_refs; > - > static int commit_graph_compatible(struct repository *r) > { > if (!r->gitdir) > return 0; > > - if (read_replace_refs) { > + if (replace_refs_enabled(r)) { > prepare_replace_object(r); > if (hashmap_get_size(&r->objects->replace_map->map)) > return 0; This and the other 'read_replace_refs' -> 'replace_refs_enabled()' replacements all look good. Although we're not using the 'struct repository' argument yet, I see that it'll be used in patch 3 - adding the (unused) arg here helps avoid the extra churn there. > diff --git a/replace-object.c b/replace-object.c > index ceec81c940c..cf91c3ba456 100644 > --- a/replace-object.c > +++ b/replace-object.c > @@ -85,7 +85,14 @@ const struct object_id *do_lookup_replace_object(struct repository *r, > die(_("replace depth too high for object %s"), oid_to_hex(oid)); > } > > +static int read_replace_refs = 1; > + > void disable_replace_refs(void) > { > read_replace_refs = 0; > } > + > +int replace_refs_enabled(struct repository *r) > +{ > + return read_replace_refs; > +} > diff --git a/replace-object.h b/replace-object.h > index 7786d4152b0..b141075023e 100644 > --- a/replace-object.h > +++ b/replace-object.h > @@ -27,6 +27,19 @@ void prepare_replace_object(struct repository *r); > const struct object_id *do_lookup_replace_object(struct repository *r, > const struct object_id *oid); > > + > +/* > + * Some commands disable replace-refs unconditionally, and otherwise each > + * repository could alter the core.useReplaceRefs config value. > + * > + * Return 1 if and only if all of the following are true: > + * > + * a. disable_replace_refs() has not been called. > + * b. GIT_NO_REPLACE_OBJECTS is unset or zero. > + * c. the given repository does not have core.useReplaceRefs=false. > + */ > +int replace_refs_enabled(struct repository *r); Since the purpose of this function is to access global state, would 'environment.[c|h]' be a more appropriate place for it (and 'disable_replace_refs()', for that matter)? There's also some precedent; 'set_shared_repository()' and 'get_shared_repository()' have a very similar design to what you've added here.