From: "tsukasa inoue via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: Harald Nordgren <haraldnordgren@gmail.com>,
tsukasa-ino <inoue.tsukasa.4@gmail.com>,
tsukasa inoue <inoue.tsukasa.4@gmail.com>
Subject: [PATCH v2 2/3] branch: return an error from setup_tracking()
Date: Wed, 21 Oct 2026 21:35:17 +0000 [thread overview]
Message-ID: <4d2cbaf17032a60aac15c081303f13e1d8eb87e5.1792618518.git.gitgitgadget@gmail.com> (raw)
In-Reply-To: <pull.2268.v2.git.1792618518.gitgitgadget@gmail.com>
From: tsukasa inoue <inoue.tsukasa.4@gmail.com>
setup_tracking() calls exit(1) when it cannot write the tracking
configuration. This exit was introduced in 27852b2c53 (branch: report
errors in tracking branch setup, 2016-02-22). Because of it, callers
cannot continue after a tracking failure, even though the ref has
already been created.
Change setup_tracking() to return an error instead of exiting, and make
create_branch() and dwim_and_setup_tracking() return that value too.
This does not change behavior. Callers still exit with status 1 on
failure, as before. Changing checkout
Signed-off-by: tsukasa inoue <inoue.tsukasa.4@gmail.com>
---
branch.c | 35 +++++++++++++++++++++--------------
branch.h | 21 +++++++++++++--------
builtin/branch.c | 17 ++++++++++++-----
builtin/checkout.c | 17 +++++++++--------
4 files changed, 55 insertions(+), 35 deletions(-)
diff --git a/branch.c b/branch.c
index bb07846911..7876892cc5 100644
--- a/branch.c
+++ b/branch.c
@@ -251,12 +251,13 @@ static int inherit_tracking(struct tracking *tracking, const char *orig_ref)
* will not be expanded to "refs/remotes/origin/main", so it is not safe
* for 'orig_ref' to be raw user input.
*/
-static void setup_tracking(const char *new_ref, const char *orig_ref,
- enum branch_track track, int quiet)
+static int setup_tracking(const char *new_ref, const char *orig_ref,
+ enum branch_track track, int quiet)
{
struct tracking tracking;
struct string_list tracking_srcs = STRING_LIST_INIT_DUP;
int config_flags = quiet ? 0 : BRANCH_CONFIG_VERBOSE;
+ int ret = 0;
struct find_tracked_branch_cb ftb_cb = {
.tracking = &tracking,
.ambiguous_remotes = STRING_LIST_INIT_DUP,
@@ -345,11 +346,12 @@ static void setup_tracking(const char *new_ref, const char *orig_ref,
string_list_append(tracking.srcs, orig_ref);
if (install_branch_config_multiple_remotes(config_flags, new_ref,
tracking.remote, tracking.srcs) < 0)
- exit(1);
+ ret = -1;
cleanup:
string_list_clear(&tracking_srcs, 0);
string_list_clear(&ftb_cb.ambiguous_remotes, 0);
+ return ret;
}
int read_branch_desc(struct strbuf *buf, const char *branch_name)
@@ -629,10 +631,10 @@ static void dwim_branch_start(struct repository *r, const char *start_name,
FREE_AND_NULL(real_ref);
}
-void create_branch(struct repository *r,
- const char *name, const char *start_name,
- int force, int clobber_head_ok, int reflog,
- int quiet, enum branch_track track, int dry_run)
+int create_branch(struct repository *r,
+ const char *name, const char *start_name,
+ int force, int clobber_head_ok, int reflog,
+ int quiet, enum branch_track track, int dry_run)
{
struct object_id oid;
char *real_ref;
@@ -641,6 +643,7 @@ void create_branch(struct repository *r,
struct ref_transaction *transaction;
struct strbuf err = STRBUF_INIT;
int flags = 0;
+ int ret = 0;
char *msg;
if (track == BRANCH_TRACK_OVERRIDE)
@@ -678,21 +681,25 @@ void create_branch(struct repository *r,
free(msg);
if (real_ref && track)
- setup_tracking(ref.buf + 11, real_ref, track, quiet);
+ ret = setup_tracking(ref.buf + 11, real_ref, track, quiet);
cleanup:
strbuf_release(&ref);
free(real_ref);
+ return ret;
}
-void dwim_and_setup_tracking(struct repository *r, const char *new_ref,
- const char *orig_ref, enum branch_track track,
- int quiet)
+int dwim_and_setup_tracking(struct repository *r, const char *new_ref,
+ const char *orig_ref, enum branch_track track,
+ int quiet)
{
char *real_orig_ref = NULL;
+ int ret;
+
dwim_branch_start(r, orig_ref, track, &real_orig_ref, NULL);
- setup_tracking(new_ref, real_orig_ref, track, quiet);
+ ret = setup_tracking(new_ref, real_orig_ref, track, quiet);
free(real_orig_ref);
+ return ret;
}
/**
@@ -842,8 +849,8 @@ void create_branches_recursively(struct repository *r, const char *name,
* tedious to determine whether or not tracking was set up in the
* superproject.
*/
- if (track)
- setup_tracking(name, tracking_name, track, quiet);
+ if (track && setup_tracking(name, tracking_name, track, quiet))
+ exit(1);
for (i = 0; i < submodule_entry_list.entry_nr; i++) {
if (submodule_create_branch(
diff --git a/branch.h b/branch.h
index e9b1f7b37d..4bc4527284 100644
--- a/branch.h
+++ b/branch.h
@@ -34,10 +34,13 @@ enum branch_track {
* causes new_ref to track whatever orig_ref tracks.
*
* - quiet suppresses tracking information.
+ *
+ * Returns 0 on success, or -1 if the tracking configuration could not be
+ * written.
*/
-void dwim_and_setup_tracking(struct repository *r, const char *new_ref,
- const char *orig_ref, enum branch_track track,
- int quiet);
+int dwim_and_setup_tracking(struct repository *r, const char *new_ref,
+ const char *orig_ref, enum branch_track track,
+ int quiet);
/*
* Creates a new branch, where:
@@ -63,12 +66,14 @@ void dwim_and_setup_tracking(struct repository *r, const char *new_ref,
*
* - dry_run causes the branch to be validated but not created.
*
+ * Returns 0 on success, or -1 if the tracking configuration could not be
+ * written.
*/
-void create_branch(struct repository *r,
- const char *name, const char *start_name,
- int force, int clobber_head_ok,
- int reflog, int quiet, enum branch_track track,
- int dry_run);
+int create_branch(struct repository *r,
+ const char *name, const char *start_name,
+ int force, int clobber_head_ok,
+ int reflog, int quiet, enum branch_track track,
+ int dry_run);
/*
* Creates a new branch in a repository and its submodules (and its
diff --git a/builtin/branch.c b/builtin/branch.c
index a613148fc7..b536b619bb 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -1253,9 +1253,13 @@ int cmd_branch(int argc,
die(_("branch '%s' does not exist"), branch->name);
}
- dwim_and_setup_tracking(the_repository, branch->name,
- new_upstream, BRANCH_TRACK_OVERRIDE,
- quiet);
+ if (dwim_and_setup_tracking(the_repository, branch->name,
+ new_upstream, BRANCH_TRACK_OVERRIDE,
+ quiet)) {
+ strbuf_release(&buf);
+ ret = 1;
+ goto out;
+ }
strbuf_release(&buf);
} else if (unset_upstream) {
struct branch *branch;
@@ -1305,8 +1309,11 @@ int cmd_branch(int argc,
ret = 0;
goto out;
}
- create_branch(the_repository, branch_name, start_name, force, 0,
- reflog, quiet, track, 0);
+ if (create_branch(the_repository, branch_name, start_name,
+ force, 0, reflog, quiet, track, 0)) {
+ ret = 1;
+ goto out;
+ }
} else
usage_with_options(builtin_branch_usage, options);
diff --git a/builtin/checkout.c b/builtin/checkout.c
index c0f0d2c700..87e067b45b 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -979,14 +979,15 @@ static void update_refs_for_switch(const struct checkout_opts *opts,
free(refname);
}
else
- create_branch(the_repository,
- opts->new_branch, new_branch_info->name,
- opts->new_branch_force ? 1 : 0,
- opts->new_branch_force ? 1 : 0,
- opts->new_branch_log,
- opts->quiet,
- opts->track,
- 0);
+ if (create_branch(the_repository,
+ opts->new_branch, new_branch_info->name,
+ opts->new_branch_force ? 1 : 0,
+ opts->new_branch_force ? 1 : 0,
+ opts->new_branch_log,
+ opts->quiet,
+ opts->track,
+ 0))
+ exit(1);
free(new_branch_info->name);
free(new_branch_info->refname);
new_branch_info->name = xstrdup(opts->new_branch);
--
gitgitgadget
next prev parent reply other threads:[~2026-10-21 21:35 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-20 1:15 [PATCH] branch: strip refs/heads/ from the --set-upstream-to hint tsukasa-ino via GitGitGadget
2026-10-20 19:51 ` Junio C Hamano
2026-10-21 7:05 ` Harald Nordgren
2026-10-21 21:35 ` [PATCH v2 0/3] checkout: finish switch when tracking config cannot be written tsukasa-ino via GitGitGadget
2026-10-21 21:35 ` [PATCH v2 1/3] branch: strip refs/heads/ from the --set-upstream-to hint tsukasa inoue via GitGitGadget
2026-10-21 21:35 ` tsukasa inoue via GitGitGadget [this message]
2026-10-21 21:35 ` [PATCH v2 3/3] checkout: finish switching when the tracking config cannot be written tsukasa inoue via GitGitGadget
2026-10-21 22:20 ` [PATCH v2 0/3] checkout: finish switch when " Junio C Hamano
2026-10-22 2:17 ` 井上司
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4d2cbaf17032a60aac15c081303f13e1d8eb87e5.1792618518.git.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=haraldnordgren@gmail.com \
--cc=inoue.tsukasa.4@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.