diff mbox series

[RFC,v1,2/2] remote set-head: set followRemoteHEAD to "warn" if "always"

Message ID 20241203215713.135068-3-bence@ferdinandy.com (mailing list archive)
State New
Headers show
Series set_head finishing touches | expand

Commit Message

Bence Ferdinandy Dec. 3, 2024, 9:56 p.m. UTC
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>
---
 builtin/remote.c  | 12 +++++++++++-
 t/t5505-remote.sh | 11 +++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

Comments

Junio C Hamano Dec. 4, 2024, 2:22 a.m. UTC | #1
Bence Ferdinandy <bence@ferdinandy.com> writes:

> 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".

If we were to take [1/2] of this series, then another plausible
option is to set it to whatever their current value is, but that
would require an extra probing of the remote state, so "warn" is
probably a reasonable choice here.

Thanks.
diff mbox series

Patch

diff --git a/builtin/remote.c b/builtin/remote.c
index 4a8b2ef678..9a30c17724 100644
--- a/builtin/remote.c
+++ b/builtin/remote.c
@@ -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);
diff --git a/t/t5505-remote.sh b/t/t5505-remote.sh
index 2600add82a..76ffdb2ec9 100755
--- a/t/t5505-remote.sh
+++ b/t/t5505-remote.sh
@@ -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 >output &&
+		echo "warn" >expect &&
+		test_cmp expect output
+	)
+'
+
 cat >test/expect <<\EOF
 refs/remotes/origin/side2
 EOF