aboutsummaryrefslogtreecommitdiffstats
path: root/replace-object.c
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.c
parentf2ffc7418685f75e43e2919426276141fd62c656 (diff)
parent9c7d1b057ff36ee4190621d46e9fe3c83377aea7 (diff)
downloadgit-d9f9f6b358c4d8aad492bc4995be0926048a6248.tar.gz
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.c')
-rw-r--r--replace-object.c28
1 files changed, 27 insertions, 1 deletions
diff --git a/replace-object.c b/replace-object.c
index e98825d585..ae2d55b014 100644
--- a/replace-object.c
+++ b/replace-object.c
@@ -64,7 +64,7 @@ void prepare_replace_object(struct repository *r)
* replacement object's name (replaced recursively, if necessary).
* The return value is either oid or a pointer to a
* permanently-allocated value. This function always respects replace
- * references, regardless of the value of read_replace_refs.
+ * references, regardless of the value of r->settings.read_replace_refs.
*/
const struct object_id *do_lookup_replace_object(struct repository *r,
const struct object_id *oid)
@@ -84,3 +84,29 @@ const struct object_id *do_lookup_replace_object(struct repository *r,
}
die(_("replace depth too high for object %s"), oid_to_hex(oid));
}
+
+/*
+ * This indicator determines whether replace references should be
+ * respected process-wide, regardless of which repository is being
+ * using at the time.
+ */
+static int read_replace_refs = 1;
+
+void disable_replace_refs(void)
+{
+ read_replace_refs = 0;
+}
+
+int replace_refs_enabled(struct repository *r)
+{
+ if (!read_replace_refs)
+ return 0;
+
+ if (r->gitdir) {
+ prepare_repo_settings(r);
+ return r->settings.read_replace_refs;
+ }
+
+ /* repository has no objects or refs. */
+ return 0;
+}