From patchwork Tue Sep 10 20:24:58 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bence Ferdinandy X-Patchwork-Id: 13799297 Received: from aib29agh125.zrh1.oracleemaildelivery.com (aib29agh125.zrh1.oracleemaildelivery.com [192.29.178.125]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A7FF91741E8 for ; Tue, 10 Sep 2024 20:37:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.29.178.125 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726000634; cv=none; b=Z2zF7MbIeR6u22kOq9b5maCQin3Gvs3WH7iZN4eP/66T1i+Twi3dP2naVQlTJqcoV+bi5iYOJy7pXUWBsMhrfetccSO0bkKqQs1WyaiHSceJi5FBzeqQHZ7MI5gssJH3C5e71AWxQd2Dp0VTcTOhq6epVr/NWPzUuXrX0NtBS/I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726000634; c=relaxed/simple; bh=QZBCqw2G82OdN2aDRIhGTS893iPwEWAjoCSNC2nDoS0=; h=From:To:Cc:Subject:Date:Message-id:In-reply-to:References: MIME-version; b=adHE7zf/lUJ9g1F8m2KY3XDpaiOFMg7XqgNolKx6IuSf2Nqrakm24LdDY/ozFBUT20q0m+X5dJTUc7rIVEyOwKzZaibWkCj0mY23NA6aG1vJ+vIGUxHuXiFj29StxWtV4wjR1maUDGypyZ/tDMe0zEu7tQNO6mBuNKuoIhbV/KU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=ferdinandy.com; spf=pass smtp.mailfrom=zrh1.rp.oracleemaildelivery.com; dkim=pass (2048-bit key) header.d=zrh1.rp.oracleemaildelivery.com header.i=@zrh1.rp.oracleemaildelivery.com header.b=pXR0Gql4; arc=none smtp.client-ip=192.29.178.125 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=ferdinandy.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zrh1.rp.oracleemaildelivery.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=zrh1.rp.oracleemaildelivery.com header.i=@zrh1.rp.oracleemaildelivery.com header.b="pXR0Gql4" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=prod-zrh-20200406; d=zrh1.rp.oracleemaildelivery.com; h=Date:To:From:Subject:Message-Id:MIME-Version:Sender:List-Unsubscribe:List-Unsubscribe-Post; bh=R1YrB40qO3JlgrgVOKo9miaDmh2216DNGKIvrWEzizs=; b=pXR0Gql4Pu5pKSYfaHDET3P26yP0Do0YQ6urHhQ+ZS4xfC8VxIBJwu4khlJnzoujxwQNDwblTmnT H0p3jfsvYlXvZ8LOztbATG33ymNnDdii3RUdvefMk6iKPZ/NSsP+eZMY+e7ED+SRl13Bbso9zcIu vL4m3TBIzjCmt9enz6ihHYZotmiuIrN45MH6uiOHCNIYQ/donEInWqNMAx0MmNewYCZvN1YAmV4s fGqvQim08YLk7HQZIu7PM3tYbCXavzgGvsQkZhWXeZ1dxECqwp1zP9wRvMQizGlCzGjAieBJRtwP MQIW/Tlx+LHn5vHDXapaGGw47ug434UjHTO0RA== Received: by omta-ad1-fd2-402-eu-zurich-1.omtaad1.vcndpzrh.oraclevcn.com (Oracle Communications Messaging Server 8.1.0.1.20240709 64bit (built Jul 9 2024)) with ESMTPS id <0SJM002Z96DDPM80@omta-ad1-fd2-402-eu-zurich-1.omtaad1.vcndpzrh.oraclevcn.com> for git@vger.kernel.org; Tue, 10 Sep 2024 20:32:01 +0000 (GMT) List-Unsubscribe-Post: List-Unsubscribe=One-Click From: Bence Ferdinandy To: git@vger.kernel.org Cc: johannes.schindelin@gmx.de, Bence Ferdinandy , cc@mail.ferdinandy.com, /tmp/FUboFpyPuH/0001-fetch-set-head-with-set-head-option.patch@mail.ferdinandy.com Subject: [RFC PATCH 1/2] fetch: set-head with --set-head option Date: Tue, 10 Sep 2024 22:24:58 +0200 Message-id: <20240910203129.2251090-2-bence@ferdinandy.com> In-reply-to: <20240910203129.2251090-1-bence@ferdinandy.com> References: <20240910203129.2251090-1-bence@ferdinandy.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-version: 1.0 Content-transfer-encoding: 8bit Reporting-Meta: AAGJ6/mkol+Ap++/pEyqGNeGu9zVxxvhfnzcW8vd2ea3WUcu9RlcMLRcPbzoE7zE zntPrxyZWTntUgHFoc+mQ3JKx8oyEPMPhSnW5KSC2AfRIy2WJkm+sQ67FnqGy0oE 2LYCkOf9TKtyfApdpPqDOtFvFXjdN72vTiSUz5wZX4u+D2HWBW8ELEJP9z5V42Eh zHtFFMVQR65DpuElhwrWbxhV4mAF65McAI+zSk3I3WEJXkmciSokBMl9wzfCNjTg LkBdqUPBhZg4DMb8cpSurlQx4YYxjPL8xqUUwN1xp2MNUSru7Z/bFjKRqnvvlVND F1IzBqoVWKHIf6+SCdsSdhJ8FFD4jUcy58wWAo+cCn7MwQLuVsWgJMyy65V3ESsA UB2Ag25wfeuwiBAI7IZpLCeCPFvpOh1DpgiUp0xTWTcTgZmKb6X0mLD654/F2jjX KthOjEYETa1lhhZtRj+u1kCj5CNwHLaAI7b3YI+l4GXiAEwCKGLST+0= When cloning a repository refs/remotes/origin/HEAD is set automatically. In contrast, when using init, remote add and fetch to set a remote, one needs to call remote set-head --auto to achieve the same result. Add a --set-head option to git fetch to automatically set heads on remotes. Signed-off-by: Bence Ferdinandy --- builtin/fetch.c | 29 ++++++++++++++++++++++++----- builtin/remote.c | 5 +++++ 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/builtin/fetch.c b/builtin/fetch.c index b2b5aee5bf..6392314c6a 100644 --- a/builtin/fetch.c +++ b/builtin/fetch.c @@ -1961,8 +1961,19 @@ static int fetch_finished(int result, struct strbuf *out, return 0; } -static int fetch_multiple(struct string_list *list, int max_children, - const struct fetch_config *config) +static int run_set_head(const char *name) +{ + struct child_process cmd = CHILD_PROCESS_INIT; + strvec_push(&cmd.args, "remote"); + strvec_push(&cmd.args, "set-head"); + strvec_push(&cmd.args, "--auto"); + strvec_push(&cmd.args, name); + cmd.git_cmd = 1; + return run_command(&cmd); +} + +static int fetch_multiple(struct string_list *list, int max_children, int set_head, + const struct fetch_config *config) { int i, result = 0; struct strvec argv = STRVEC_INIT; @@ -2014,6 +2025,8 @@ static int fetch_multiple(struct string_list *list, int max_children, error(_("could not fetch %s"), name); result = 1; } + if (set_head && run_set_head(name)) + result = 1; } strvec_clear(&argv); @@ -2062,7 +2075,7 @@ static inline void fetch_one_setup_partial(struct remote *remote) } static int fetch_one(struct remote *remote, int argc, const char **argv, - int prune_tags_ok, int use_stdin_refspecs, + int prune_tags_ok, int set_head, int use_stdin_refspecs, const struct fetch_config *config) { struct refspec rs = REFSPEC_INIT_FETCH; @@ -2135,9 +2148,12 @@ static int fetch_one(struct remote *remote, int argc, const char **argv, refspec_clear(&rs); transport_disconnect(gtransport); gtransport = NULL; + if (set_head && run_set_head(remote -> name)) + exit_code = 1; return exit_code; } + int cmd_fetch(int argc, const char **argv, const char *prefix) { struct fetch_config config = { @@ -2154,6 +2170,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) struct string_list list = STRING_LIST_INIT_DUP; struct remote *remote = NULL; int all = -1, multiple = 0; + int set_head = 0; int result = 0; int prune_tags_ok = 1; int enable_auto_gc = 1; @@ -2171,6 +2188,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) OPT__VERBOSITY(&verbosity), OPT_BOOL(0, "all", &all, N_("fetch from all remotes")), + OPT_BOOL(0, "set-head", &set_head, + N_("auto set remote HEAD")), OPT_BOOL(0, "set-upstream", &set_upstream, N_("set upstream for git pull/fetch")), OPT_BOOL('a', "append", &append, @@ -2436,7 +2455,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) trace2_region_leave("fetch", "setup-partial", the_repository); } trace2_region_enter("fetch", "fetch-one", the_repository); - result = fetch_one(remote, argc, argv, prune_tags_ok, stdin_refspecs, + result = fetch_one(remote, argc, argv, prune_tags_ok, set_head, stdin_refspecs, &config); trace2_region_leave("fetch", "fetch-one", the_repository); } else { @@ -2459,7 +2478,7 @@ int cmd_fetch(int argc, const char **argv, const char *prefix) /* TODO should this also die if we have a previous partial-clone? */ trace2_region_enter("fetch", "fetch-multiple", the_repository); - result = fetch_multiple(&list, max_children, &config); + result = fetch_multiple(&list, max_children, set_head, &config); trace2_region_leave("fetch", "fetch-multiple", the_repository); } diff --git a/builtin/remote.c b/builtin/remote.c index 0acc547d69..35c54dd103 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -1536,9 +1536,12 @@ static int get_remote_default(const char *key, const char *value UNUSED, static int update(int argc, const char **argv, const char *prefix) { int i, prune = -1; + int set_head = 0; struct option options[] = { OPT_BOOL('p', "prune", &prune, N_("prune remotes after fetching")), + OPT_BOOL(0, "set-head", &set_head, + N_("auto set remote HEAD")), OPT_END() }; struct child_process cmd = CHILD_PROCESS_INIT; @@ -1552,6 +1555,8 @@ static int update(int argc, const char **argv, const char *prefix) if (prune != -1) strvec_push(&cmd.args, prune ? "--prune" : "--no-prune"); + if (set_head) + strvec_push(&cmd.args, "--set-head"); if (verbose) strvec_push(&cmd.args, "-v"); strvec_push(&cmd.args, "--multiple"); From patchwork Tue Sep 10 20:24:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bence Ferdinandy X-Patchwork-Id: 13799299 Received: from aib29agh125.zrh1.oracleemaildelivery.com (aib29agh125.zrh1.oracleemaildelivery.com [192.29.178.125]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A325D1AAE2B for ; Tue, 10 Sep 2024 20:37:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=192.29.178.125 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726000638; cv=none; b=gWWEfUP3FOtALnX4zLoTOj4GKzfh5r37pezmVHCzJy12lC+/uujeoM0q5M7aiy6/Sl63P9H5Y+M92/0P++nX1IH3pCVfQTYl3XI/4lFlkJ9vrrICFjhfDyl7HtQreaR/3SbG4W0i3pFLzs0u+3+8WogBhRWQfu+qYhaLRe0O2d4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1726000638; c=relaxed/simple; bh=b5NrbsBixKD2I1DrQJ1TlOrzd6gVpzK7pQW9yz0tf+o=; h=From:To:Cc:Subject:Date:Message-id:In-reply-to:References: MIME-version; b=CxbjqkCEfxWv4Xg9VUl0hDab+rt5xGZEtG4GOGMhQbV8XcJbdsymfTV8ngK1hgszJUXLApeUZUhSA1w8zNzDvcmPAq5iQifE9kJyLqosaEN366eXRmEQI6NKSO7qy4o53WwJYNMG4+8jVY4J2xvIjeFtYtSdH5Y4z8Qpjht4Bbo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=ferdinandy.com; spf=pass smtp.mailfrom=zrh1.rp.oracleemaildelivery.com; dkim=pass (2048-bit key) header.d=zrh1.rp.oracleemaildelivery.com header.i=@zrh1.rp.oracleemaildelivery.com header.b=eXaYUVYO; arc=none smtp.client-ip=192.29.178.125 Authentication-Results: smtp.subspace.kernel.org; dmarc=fail (p=none dis=none) header.from=ferdinandy.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=zrh1.rp.oracleemaildelivery.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=zrh1.rp.oracleemaildelivery.com header.i=@zrh1.rp.oracleemaildelivery.com header.b="eXaYUVYO" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; s=prod-zrh-20200406; d=zrh1.rp.oracleemaildelivery.com; h=Date:To:From:Subject:Message-Id:MIME-Version:Sender:List-Unsubscribe:List-Unsubscribe-Post; bh=6U7X65IS9yvt5ArGE0vZuKwRwAVma+9LaJi7Q8pWPzQ=; b=eXaYUVYOq60XplSybgL3tBoRwNKGFTkOO0U60zBfpVkfGDfSXrj+A/Al918vHmy9NaOBXohpGlK0 3FghgzJMbMmVvYDdmyE11HNQTFbrvsjclaEV3/dGVXKKHTmPiYA5T3qUZADOwrElGiPSvLSG9OGe 8NxvitPGKKHJpvH4pzEdt2FzFzB0+K60QS0Yj6nwJXCHPh0L+35VJsC/MszVRF3hK01dYt+Q+Wiw rz2Ewm+t9p9SCj13T0OnN5j67ClJDrAfZ8CUZxA/fSL6YezT+sxtyOUMXUVq0e/Hj9cJpCBRQZtL d3uxJq1GKvjtCvUXZZ8HWK2Cp6RK9JoqxV1fCA== Received: by omta-ad1-fd2-402-eu-zurich-1.omtaad1.vcndpzrh.oraclevcn.com (Oracle Communications Messaging Server 8.1.0.1.20240709 64bit (built Jul 9 2024)) with ESMTPS id <0SJM002ZH6DJPM80@omta-ad1-fd2-402-eu-zurich-1.omtaad1.vcndpzrh.oraclevcn.com> for git@vger.kernel.org; Tue, 10 Sep 2024 20:32:07 +0000 (GMT) List-Unsubscribe-Post: List-Unsubscribe=One-Click From: Bence Ferdinandy To: git@vger.kernel.org Cc: johannes.schindelin@gmx.de, Bence Ferdinandy , cc@mail.ferdinandy.com, /tmp/FUboFpyPuH/0002-set-head-do-not-update-if-there-is-no-change.patch@mail.ferdinandy.com Subject: [RFC PATCH 2/2] set-head: do not update if there is no change Date: Tue, 10 Sep 2024 22:24:59 +0200 Message-id: <20240910203129.2251090-3-bence@ferdinandy.com> In-reply-to: <20240910203129.2251090-1-bence@ferdinandy.com> References: <20240910203129.2251090-1-bence@ferdinandy.com> Precedence: bulk X-Mailing-List: git@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-version: 1.0 Content-transfer-encoding: 8bit Reporting-Meta: AAFxi86bPgRcegmbXIsY/P7lbwx4JNeZPF/hHo7CO58m8jRv1gYSgzOjKP2xP//n 6TfHVxYFhd/f6MHZWCwICNT2hqDCm6ulmMAMRvMRNHSNV/yS9Nsp5ySM9Ykh1tv3 1zOnVl7FyG8W8GHN0z+Mp5K6R9e5FOSFpSjh3aI33DzYjz/clCUTZa4htKH9xQBh dT3f1W0UUciBMgvasKOOAslIXMB9Er1LjTnLxaBjqN7eNHwqcfQt3JL3kkmEFttu 68BPvMl9SmEX1tebM3ulGXJLE4dUsDjScqHmNcDZIJA1PZgXq8+J/7oydFh7+LxS oPASqsOqx8pSOrYks8GsyHvkv1nMufGtSob15FQN647v458/GhTlGsoJVfQHmLo+ /OOKra9SYsKmikYGOcktC81k1WSpU9CfLRD20voRoQ9WRrAYanVkCPNUj6rRBdtf GrDk0Tai0p/cqXhHA5fQSlmzoWhzWDIIJPwxPp1urQuybw4z89w7PXY= Currently, even if there is no actual change to remote/HEAD calling remote set-head will overwrite the appropriate file and if set to --auto will also print a message saying "remote/HEAD set to branch", which implies something was changed. In contrast, on a nil operation e.g. pull will clearly state that nothing was done, while fetch will not output anything. Change the behaviour of remote set-head so that the reference is only updated if it actually needs to change. Since set-head --auto is essentially a fetch-like operation, align it's behaviour with fetch and only print output if something was actually done. Signed-off-by: Bence Ferdinandy --- builtin/remote.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/builtin/remote.c b/builtin/remote.c index 35c54dd103..e220e51b84 100644 --- a/builtin/remote.c +++ b/builtin/remote.c @@ -1400,8 +1400,8 @@ static int show(int argc, const char **argv, const char *prefix) static int set_head(int argc, const char **argv, const char *prefix) { - int i, opt_a = 0, opt_d = 0, result = 0; - struct strbuf buf = STRBUF_INIT, buf2 = STRBUF_INIT; + int i, opt_a = 0, opt_d = 0, is_ref_changed = 0, result = 0; + struct strbuf buf = STRBUF_INIT, buf2 = STRBUF_INIT, buf3 = STRBUF_INIT; char *head_name = NULL; struct option options[] = { @@ -1440,12 +1440,14 @@ static int set_head(int argc, const char **argv, const char *prefix) if (head_name) { strbuf_addf(&buf2, "refs/remotes/%s/%s", argv[0], head_name); + refs_read_symbolic_ref(get_main_ref_store(the_repository),buf.buf,&buf3); + is_ref_changed = strcmp(buf2.buf,buf3.buf); /* make sure it's valid */ if (!refs_ref_exists(get_main_ref_store(the_repository), buf2.buf)) result |= error(_("Not a valid ref: %s"), buf2.buf); - else if (refs_update_symref(get_main_ref_store(the_repository), buf.buf, buf2.buf, "remote set-head")) + else if (is_ref_changed && refs_update_symref(get_main_ref_store(the_repository), buf.buf, buf2.buf, "remote set-head")) result |= error(_("Could not setup %s"), buf.buf); - else if (opt_a) + else if (opt_a && is_ref_changed) printf("%s/HEAD set to %s\n", argv[0], head_name); free(head_name); }