]> git.ipfire.org Git - thirdparty/git.git/commitdiff
remote set-head: set followRemoteHEAD to "warn" if "always"
authorBence Ferdinandy <bence@ferdinandy.com>
Thu, 5 Dec 2024 12:16:22 +0000 (13:16 +0100)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Dec 2024 17:59:40 +0000 (02:59 +0900)
When running "remote set-head" manually it is unlikely, that the user
would actually like to have "fetch" always update the remote/HEAD. On
the contrary, it is more likely, that the user would expect remote/HEAD
to stay the way they manually set it, and just forgot about having
"followRemoteHEAD" set to "always".

When "followRemoteHEAD" is set to "always" make running "remote
set-head" change the config to "warn".

Signed-off-by: Bence Ferdinandy <bence@ferdinandy.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/remote.c
t/t5505-remote.sh

index 4a8b2ef6787ec21f8c0f7bce48e723f9f8ee1109..9a30c17724e45b6dddeeac807f0df77a09372814 100644 (file)
@@ -1433,6 +1433,7 @@ static int set_head(int argc, const char **argv, const char *prefix)
                b_local_head = STRBUF_INIT;
        char *head_name = NULL;
        struct ref_store *refs = get_main_ref_store(the_repository);
+       struct remote *remote;
 
        struct option options[] = {
                OPT_BOOL('a', "auto", &opt_a,
@@ -1443,8 +1444,10 @@ static int set_head(int argc, const char **argv, const char *prefix)
        };
        argc = parse_options(argc, argv, prefix, options,
                             builtin_remote_sethead_usage, 0);
-       if (argc)
+       if (argc) {
                strbuf_addf(&b_head, "refs/remotes/%s/HEAD", argv[0]);
+               remote = remote_get(argv[0]);
+       }
 
        if (!opt_a && !opt_d && argc == 2) {
                head_name = xstrdup(argv[1]);
@@ -1483,6 +1486,13 @@ static int set_head(int argc, const char **argv, const char *prefix)
        }
        if (opt_a)
                report_set_head_auto(argv[0], head_name, &b_local_head, was_detached);
+       if (remote->follow_remote_head == FOLLOW_REMOTE_ALWAYS) {
+               struct strbuf config_name = STRBUF_INIT;
+               strbuf_addf(&config_name,
+                       "remote.%s.followremotehead", remote->name);
+               git_config_set(config_name.buf, "warn");
+               strbuf_release(&config_name);
+       }
 
 cleanup:
        free(head_name);
index 2600add82a7cb0e0434ef7a0a65d747639c5d6da..93240a36024c5b47e08f2d647573dfb2ba852524 100755 (executable)
@@ -505,6 +505,17 @@ test_expect_success 'set-head --auto has no problem w/multiple HEADs' '
        )
 '
 
+test_expect_success 'set-head changes followRemoteHEAD always to warn' '
+       (
+               cd test &&
+               git config set remote.origin.followRemoteHEAD "always" &&
+               git remote set-head --auto origin &&
+               git config get remote.origin.followRemoteHEAD >actual &&
+               echo "warn" >expect &&
+               test_cmp expect actual
+       )
+'
+
 cat >test/expect <<\EOF
 refs/remotes/origin/side2
 EOF