]> git.ipfire.org Git - thirdparty/git.git/commitdiff
environment: move push_default into repo_config_values
authorTian Yuchen <cat@malon.dev>
Tue, 14 Jul 2026 03:25:22 +0000 (11:25 +0800)
committerJunio C Hamano <gitster@pobox.com>
Tue, 14 Jul 2026 14:30:23 +0000 (07:30 -0700)
The global variable 'push_default' specifies the default behavior of
'git push' when no explicit refspec is provided. Move 'push_default'
into 'struct repo_config_values' to continue the libification effort.

While 'enum push_default_type' ideally belongs in 'remote.h', moving it
there introduces a circular dependency chain:

  remote.h -> hash.h -> repository.h -> environment.h.

Therefore, the enum definition is kept in 'environment.h' just above
'struct repo_config_values' with a NEEDSWORK comment for future cleanup.

Modify the configuration parsing in environment.c to update the
per-repository structure directly, and update caller across the
codebase to access the value via 'repo_config_values()'.

Mentored-by: Christian Couder <christian.couder@gmail.com>
Mentored-by: Ayush Chandekar <ayu.chandekar@gmail.com>
Mentored-by: Olamide Caleb Bello <belkid98@gmail.com>
Signed-off-by: Tian Yuchen <cat@malon.dev>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/push.c
environment.c
environment.h
remote.c

index 6021b71d66845567a155ddd2242ca6fb4fba4fb9..7578ff38c42ef36a2f4d38d5e9b01bb61553662f 100644 (file)
@@ -73,6 +73,7 @@ static void refspec_append_mapped(struct refspec *refspec, const char *ref,
                                  struct remote *remote, struct ref *matched)
 {
        const char *branch_name;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
 
        if (remote->push.nr) {
                struct refspec_item query = {
@@ -88,7 +89,7 @@ static void refspec_append_mapped(struct refspec *refspec, const char *ref,
                }
        }
 
-       if (push_default == PUSH_DEFAULT_UPSTREAM &&
+       if (cfg->push_default == PUSH_DEFAULT_UPSTREAM &&
            skip_prefix(matched->name, "refs/heads/", &branch_name)) {
                struct branch *branch = branch_get(branch_name);
                if (branch->merge_nr == 1 && branch->merge[0]->src) {
@@ -160,7 +161,7 @@ static NORETURN void die_push_simple(struct branch *branch,
         * Don't show advice for people who explicitly set
         * push.default.
         */
-       if (push_default == PUSH_DEFAULT_UNSPECIFIED)
+       if (cfg->push_default == PUSH_DEFAULT_UNSPECIFIED)
                advice_pushdefault_maybe = _("\n"
                                 "To choose either option permanently, "
                                 "see push.default in 'git help config'.\n");
@@ -231,8 +232,9 @@ static void setup_default_push_refspecs(int *flags, struct remote *remote)
        struct branch *branch;
        const char *dst;
        int same_remote;
+       struct repo_config_values *cfg = repo_config_values(the_repository);
 
-       switch (push_default) {
+       switch (cfg->push_default) {
        case PUSH_DEFAULT_MATCHING:
                refspec_append(&rs, ":");
                return;
@@ -252,7 +254,7 @@ static void setup_default_push_refspecs(int *flags, struct remote *remote)
        dst = branch->refname;
        same_remote = !strcmp(remote->name, remote_for_branch(branch, NULL));
 
-       switch (push_default) {
+       switch (cfg->push_default) {
        default:
        case PUSH_DEFAULT_UNSPECIFIED:
        case PUSH_DEFAULT_SIMPLE:
index 20500658a20d679455711b39c1020fbef7b50b6d..66c1ac1ab8c0ee3856e127c8ab547723cc888141 100644 (file)
@@ -58,7 +58,6 @@ enum eol core_eol = EOL_UNSET;
 int global_conv_flags_eol = CONV_EOL_RNDTRP_WARN;
 char *check_roundtrip_encoding;
 enum rebase_setup_type autorebase = AUTOREBASE_NEVER;
-enum push_default_type push_default = PUSH_DEFAULT_UNSPECIFIED;
 #ifndef OBJECT_CREATION_MODE
 #define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKS
 #endif
@@ -620,21 +619,23 @@ static int git_default_branch_config(const char *var, const char *value)
 
 static int git_default_push_config(const char *var, const char *value)
 {
+       struct repo_config_values *cfg = repo_config_values(the_repository);
+
        if (!strcmp(var, "push.default")) {
                if (!value)
                        return config_error_nonbool(var);
                else if (!strcmp(value, "nothing"))
-                       push_default = PUSH_DEFAULT_NOTHING;
+                       cfg->push_default = PUSH_DEFAULT_NOTHING;
                else if (!strcmp(value, "matching"))
-                       push_default = PUSH_DEFAULT_MATCHING;
+                       cfg->push_default = PUSH_DEFAULT_MATCHING;
                else if (!strcmp(value, "simple"))
-                       push_default = PUSH_DEFAULT_SIMPLE;
+                       cfg->push_default = PUSH_DEFAULT_SIMPLE;
                else if (!strcmp(value, "upstream"))
-                       push_default = PUSH_DEFAULT_UPSTREAM;
+                       cfg->push_default = PUSH_DEFAULT_UPSTREAM;
                else if (!strcmp(value, "tracking")) /* deprecated */
-                       push_default = PUSH_DEFAULT_UPSTREAM;
+                       cfg->push_default = PUSH_DEFAULT_UPSTREAM;
                else if (!strcmp(value, "current"))
-                       push_default = PUSH_DEFAULT_CURRENT;
+                       cfg->push_default = PUSH_DEFAULT_CURRENT;
                else {
                        error(_("malformed value for %s: %s"), var, value);
                        return error(_("must be one of nothing, matching, simple, "
@@ -726,6 +727,7 @@ void repo_config_values_init(struct repo_config_values *cfg)
        cfg->askpass_program = NULL;
        cfg->apply_default_whitespace = NULL;
        cfg->apply_default_ignorewhitespace = NULL;
+       cfg->push_default = PUSH_DEFAULT_UNSPECIFIED;
        cfg->apply_sparse_checkout = 0;
        cfg->branch_track = BRANCH_TRACK_REMOTE;
        cfg->trust_ctime = 1;
index f450242ac03badbeba2398bf8403e090cb0dafb5..17a3a628d2d299b26b264dbb1d29927273f9870d 100644 (file)
@@ -87,6 +87,21 @@ extern const char * const local_repo_env[];
 struct strvec;
 
 struct repository;
+
+/*
+ * NEEDSWORK: It would be better if these definitions could be moved to
+ * other more specific files, but care is needed to avoid circular
+ * inclusion issues.
+ */
+enum push_default_type {
+       PUSH_DEFAULT_NOTHING = 0,
+       PUSH_DEFAULT_MATCHING,
+       PUSH_DEFAULT_SIMPLE,
+       PUSH_DEFAULT_UPSTREAM,
+       PUSH_DEFAULT_CURRENT,
+       PUSH_DEFAULT_UNSPECIFIED
+};
+
 struct repo_config_values {
        /* section "core" config values */
        char *attributes_file;
@@ -96,6 +111,7 @@ struct repo_config_values {
        char *askpass_program;
        char *apply_default_whitespace;
        char *apply_default_ignorewhitespace;
+       enum push_default_type push_default;
        int apply_sparse_checkout;
        int trust_ctime;
        int check_stat;
@@ -197,16 +213,6 @@ enum rebase_setup_type {
 };
 extern enum rebase_setup_type autorebase;
 
-enum push_default_type {
-       PUSH_DEFAULT_NOTHING = 0,
-       PUSH_DEFAULT_MATCHING,
-       PUSH_DEFAULT_SIMPLE,
-       PUSH_DEFAULT_UPSTREAM,
-       PUSH_DEFAULT_CURRENT,
-       PUSH_DEFAULT_UNSPECIFIED
-};
-extern enum push_default_type push_default;
-
 enum object_creation_mode {
        OBJECT_CREATION_USES_HARDLINKS = 0,
        OBJECT_CREATION_USES_RENAMES = 1
index 00723b385e1d5247e1903d309f34b8d706b51452..d48c01d37559df188673ca9b21878276117498e8 100644 (file)
--- a/remote.c
+++ b/remote.c
@@ -1933,7 +1933,7 @@ static char *branch_get_push_1(struct repository *repo,
        if (remote->mirror)
                return tracking_for_push_dest(remote, branch->refname, err);
 
-       switch (push_default) {
+       switch (repo_config_values(repo)->push_default) {
        case PUSH_DEFAULT_NOTHING:
                return error_buf(err, _("push has no destination (push.default is 'nothing')"));