aboutsummaryrefslogtreecommitdiff
path: root/replace-object.h
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2023-06-22 16:29:05 -0700
committerJunio C Hamano <gitster@pobox.com>2023-06-22 16:29:06 -0700
commitd9f9f6b358c4d8aad492bc4995be0926048a6248 (patch)
tree62cf18a137ffecb83675d7d5dda4f2f43d33253d /replace-object.h
parentf2ffc7418685f75e43e2919426276141fd62c656 (diff)
parent9c7d1b057ff36ee4190621d46e9fe3c83377aea7 (diff)
downloadgit-d9f9f6b358c4d8aad492bc4995be0926048a6248.tar.xz
Merge branch 'ds/disable-replace-refs'
Introduce a mechanism to disable replace refs globally and per repository. * ds/disable-replace-refs: repository: create read_replace_refs setting replace-objects: create wrapper around setting repository: create disable_replace_refs()
Diffstat (limited to 'replace-object.h')
-rw-r--r--replace-object.h30
1 files changed, 21 insertions, 9 deletions
diff --git a/replace-object.h b/replace-object.h
index 500482b02b..ba478eb30c 100644
--- a/replace-object.h
+++ b/replace-object.h
@@ -5,14 +5,6 @@
#include "repository.h"
#include "object-store.h"
-/*
- * Do replace refs need to be checked this run? This variable is
- * initialized to true unless --no-replace-object is used or
- * $GIT_NO_REPLACE_OBJECTS is set, but is set to false by some
- * commands that do not want replace references to be active.
- */
-extern int read_replace_refs;
-
struct replace_object {
struct oidmap_entry original;
struct object_id replacement;
@@ -28,6 +20,18 @@ 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);
+
+/*
* If object sha1 should be replaced, return the replacement object's
* name (replaced recursively, if necessary). The return value is
* either sha1 or a pointer to a permanently-allocated value. When
@@ -41,11 +45,19 @@ const struct object_id *do_lookup_replace_object(struct repository *r,
static inline const struct object_id *lookup_replace_object(struct repository *r,
const struct object_id *oid)
{
- if (!read_replace_refs ||
+ if (!replace_refs_enabled(r) ||
(r->objects->replace_map_initialized &&
r->objects->replace_map->map.tablesize == 0))
return oid;
return do_lookup_replace_object(r, oid);
}
+/*
+ * Some commands override config and environment settings for using
+ * replace references. Use this method to disable the setting and ensure
+ * those other settings will not override this choice. This applies
+ * globally to all in-process repositories.
+ */
+void disable_replace_refs(void);
+
#endif /* REPLACE_OBJECT_H */