]> git.ipfire.org Git - thirdparty/git.git/commitdiff
refs: stop modifying global `log_all_ref_updates` variable
authorPatrick Steinhardt <ps@pks.im>
Thu, 12 Sep 2024 11:30:13 +0000 (13:30 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 12 Sep 2024 17:15:43 +0000 (10:15 -0700)
In refs-related code we modify the global `log_all_ref_updates`
variable, which is done because `should_autocreate_reflog()` does not
accept passing an `enum log_refs_config` but instead accesses the global
variable. Adapt its interface such that the value is provided by the
caller, which allows us to compute the proper value locally without
having to modify global state.

This change requires us to move the enum to "repo-settings.h", or
otherwise we get compilation errors due to include cycles. We're about
to fully move this setting into the repo-settings subsystem anyway, so
this is fine.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/checkout.c
environment.h
refs.c
refs.h
refs/files-backend.c
refs/reftable-backend.c
repo-settings.h

index 4cfe6fab505d6dfd905243adb63380eef0782038..6db7f39492ef96946eb5cbd4a46b7cfd96bdb9fd 100644 (file)
@@ -23,6 +23,7 @@
 #include "read-cache.h"
 #include "refs.h"
 #include "remote.h"
+#include "repo-settings.h"
 #include "resolve-undo.h"
 #include "revision.h"
 #include "setup.h"
@@ -954,7 +955,7 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
 
                        refname = mkpathdup("refs/heads/%s", opts->new_orphan_branch);
                        if (opts->new_branch_log &&
-                           !should_autocreate_reflog(refname)) {
+                           !should_autocreate_reflog(log_all_ref_updates, refname)) {
                                int ret;
                                struct strbuf err = STRBUF_INIT;
 
index 934859e1c59a80af4e3db481e56fe7e2aa354029..0b4e5afc36d849de083177dc73a748a2fa9a626f 100644 (file)
@@ -1,6 +1,8 @@
 #ifndef ENVIRONMENT_H
 #define ENVIRONMENT_H
 
+#include "repo-settings.h"
+
 /* Double-check local_repo_env below if you add to this list. */
 #define GIT_DIR_ENVIRONMENT "GIT_DIR"
 #define GIT_COMMON_DIR_ENVIRONMENT "GIT_COMMON_DIR"
@@ -179,12 +181,6 @@ extern int core_apply_sparse_checkout;
 extern int core_sparse_checkout_cone;
 extern int sparse_expect_files_outside_of_patterns;
 
-enum log_refs_config {
-       LOG_REFS_UNSET = -1,
-       LOG_REFS_NONE = 0,
-       LOG_REFS_NORMAL,
-       LOG_REFS_ALWAYS
-};
 extern enum log_refs_config log_all_ref_updates;
 
 enum rebase_setup_type {
diff --git a/refs.c b/refs.c
index ceb72d4bd740b9496f284c2d654b69eb9eafe33d..d7402bcd196bf4bbe625ae9ec6dbc8304726a8dc 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -24,7 +24,7 @@
 #include "submodule.h"
 #include "worktree.h"
 #include "strvec.h"
-#include "repository.h"
+#include "repo-settings.h"
 #include "setup.h"
 #include "sigchain.h"
 #include "date.h"
@@ -958,7 +958,8 @@ static char *normalize_reflog_message(const char *msg)
        return strbuf_detach(&sb, NULL);
 }
 
-int should_autocreate_reflog(const char *refname)
+int should_autocreate_reflog(enum log_refs_config log_all_ref_updates,
+                            const char *refname)
 {
        switch (log_all_ref_updates) {
        case LOG_REFS_ALWAYS:
diff --git a/refs.h b/refs.h
index f8b919a138868ed20e4fb344f5a9caf925c92755..f2c4ccde6111f477a58dd5ec9275e503315cb0b8 100644 (file)
--- a/refs.h
+++ b/refs.h
@@ -3,6 +3,7 @@
 
 #include "commit.h"
 #include "repository.h"
+#include "repo-settings.h"
 
 struct fsck_options;
 struct object_id;
@@ -111,7 +112,8 @@ int refs_verify_refname_available(struct ref_store *refs,
 
 int refs_ref_exists(struct ref_store *refs, const char *refname);
 
-int should_autocreate_reflog(const char *refname);
+int should_autocreate_reflog(enum log_refs_config log_all_ref_updates,
+                            const char *refname);
 
 int is_branch(const char *refname);
 
index 1bbb550f3af8e63f40048dec06a268d906ec82be..f5871abcf75e32b6158091630d92b4f3a298c663 100644 (file)
@@ -8,6 +8,7 @@
 #include "../hex.h"
 #include "../fsck.h"
 #include "../refs.h"
+#include "../repo-settings.h"
 #include "refs-internal.h"
 #include "ref-cache.h"
 #include "packed-backend.h"
@@ -1443,6 +1444,7 @@ static int write_ref_to_lockfile(struct files_ref_store *refs,
 static int commit_ref_update(struct files_ref_store *refs,
                             struct ref_lock *lock,
                             const struct object_id *oid, const char *logmsg,
+                            int flags,
                             struct strbuf *err);
 
 /*
@@ -1586,7 +1588,7 @@ static int files_copy_or_rename_ref(struct ref_store *ref_store,
        oidcpy(&lock->old_oid, &orig_oid);
 
        if (write_ref_to_lockfile(refs, lock, &orig_oid, 0, &err) ||
-           commit_ref_update(refs, lock, &orig_oid, logmsg, &err)) {
+           commit_ref_update(refs, lock, &orig_oid, logmsg, 0, &err)) {
                error("unable to write current sha1 into %s: %s", newrefname, err.buf);
                strbuf_release(&err);
                goto rollback;
@@ -1603,14 +1605,11 @@ static int files_copy_or_rename_ref(struct ref_store *ref_store,
                goto rollbacklog;
        }
 
-       flag = log_all_ref_updates;
-       log_all_ref_updates = LOG_REFS_NONE;
        if (write_ref_to_lockfile(refs, lock, &orig_oid, 0, &err) ||
-           commit_ref_update(refs, lock, &orig_oid, NULL, &err)) {
+           commit_ref_update(refs, lock, &orig_oid, NULL, REF_SKIP_CREATE_REFLOG, &err)) {
                error("unable to write current sha1 into %s: %s", oldrefname, err.buf);
                strbuf_release(&err);
        }
-       log_all_ref_updates = flag;
 
  rollbacklog:
        if (logmoved && rename(sb_newref.buf, sb_oldref.buf))
@@ -1705,13 +1704,17 @@ static int log_ref_setup(struct files_ref_store *refs,
                         const char *refname, int force_create,
                         int *logfd, struct strbuf *err)
 {
+       enum log_refs_config log_refs_cfg = log_all_ref_updates;
        struct strbuf logfile_sb = STRBUF_INIT;
        char *logfile;
 
+       if (log_refs_cfg == LOG_REFS_UNSET)
+               log_refs_cfg = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
+
        files_reflog_path(refs, &logfile_sb, refname);
        logfile = strbuf_detach(&logfile_sb, NULL);
 
-       if (force_create || should_autocreate_reflog(refname)) {
+       if (force_create || should_autocreate_reflog(log_refs_cfg, refname)) {
                if (raceproof_create_file(logfile, open_or_create_logfile, logfd)) {
                        if (errno == ENOENT)
                                strbuf_addf(err, "unable to create directory for '%s': "
@@ -1800,9 +1803,6 @@ static int files_log_ref_write(struct files_ref_store *refs,
        if (flags & REF_SKIP_CREATE_REFLOG)
                return 0;
 
-       if (log_all_ref_updates == LOG_REFS_UNSET)
-               log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
-
        result = log_ref_setup(refs, refname,
                               flags & REF_FORCE_CREATE_REFLOG,
                               &logfd, err);
@@ -1891,6 +1891,7 @@ static int write_ref_to_lockfile(struct files_ref_store *refs,
 static int commit_ref_update(struct files_ref_store *refs,
                             struct ref_lock *lock,
                             const struct object_id *oid, const char *logmsg,
+                            int flags,
                             struct strbuf *err)
 {
        files_assert_main_repository(refs, "commit_ref_update");
@@ -1898,7 +1899,7 @@ static int commit_ref_update(struct files_ref_store *refs,
        clear_loose_ref_cache(refs);
        if (files_log_ref_write(refs, lock->ref_name,
                                &lock->old_oid, oid,
-                               logmsg, 0, err)) {
+                               logmsg, flags, err)) {
                char *old_msg = strbuf_detach(err, NULL);
                strbuf_addf(err, "cannot update the ref '%s': %s",
                            lock->ref_name, old_msg);
@@ -1931,7 +1932,7 @@ static int commit_ref_update(struct files_ref_store *refs,
                        struct strbuf log_err = STRBUF_INIT;
                        if (files_log_ref_write(refs, "HEAD",
                                                &lock->old_oid, oid,
-                                               logmsg, 0, &log_err)) {
+                                               logmsg, flags, &log_err)) {
                                error("%s", log_err.buf);
                                strbuf_release(&log_err);
                        }
index 1c4b19e737fb3d136c0a91fbcedb71124fb5abc5..c78186423a1e18a37ab92650f864dd13e524f11c 100644 (file)
@@ -19,6 +19,7 @@
 #include "../reftable/reftable-record.h"
 #include "../reftable/reftable-error.h"
 #include "../reftable/reftable-iterator.h"
+#include "../repo-settings.h"
 #include "../setup.h"
 #include "../strmap.h"
 #include "parse.h"
@@ -158,20 +159,21 @@ static struct reftable_stack *stack_for(struct reftable_ref_store *store,
 
 static int should_write_log(struct ref_store *refs, const char *refname)
 {
-       if (log_all_ref_updates == LOG_REFS_UNSET)
-               log_all_ref_updates = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
+       enum log_refs_config log_refs_cfg = log_all_ref_updates;
+       if (log_refs_cfg == LOG_REFS_UNSET)
+               log_refs_cfg = is_bare_repository() ? LOG_REFS_NONE : LOG_REFS_NORMAL;
 
-       switch (log_all_ref_updates) {
+       switch (log_refs_cfg) {
        case LOG_REFS_NONE:
                return refs_reflog_exists(refs, refname);
        case LOG_REFS_ALWAYS:
                return 1;
        case LOG_REFS_NORMAL:
-               if (should_autocreate_reflog(refname))
+               if (should_autocreate_reflog(log_refs_cfg, refname))
                        return 1;
                return refs_reflog_exists(refs, refname);
        default:
-               BUG("unhandled core.logAllRefUpdates value %d", log_all_ref_updates);
+               BUG("unhandled core.logAllRefUpdates value %d", log_refs_cfg);
        }
 }
 
index 28f95695b3a437798396ec4dcb8294ce79737e35..d03b6e57f0c31bc64234428451a6452fad305f55 100644 (file)
@@ -16,6 +16,13 @@ enum fetch_negotiation_setting {
        FETCH_NEGOTIATION_NOOP,
 };
 
+enum log_refs_config {
+       LOG_REFS_UNSET = -1,
+       LOG_REFS_NONE = 0,
+       LOG_REFS_NORMAL,
+       LOG_REFS_ALWAYS
+};
+
 struct repo_settings {
        int initialized;