@@ -1416,6 +1416,7 @@ static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
int ceil_offset = -1, min_offset = offset_1st_component(dir->buf);
dev_t current_device = 0;
int one_filesystem = 1;
+ enum discovery_result result;
/*
* If GIT_DIR is set explicitly, we're not going
@@ -1425,7 +1426,8 @@ static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
gitdirenv = getenv(GIT_DIR_ENVIRONMENT);
if (gitdirenv) {
strbuf_addstr(gitdir, gitdirenv);
- return GIT_DIR_EXPLICIT;
+ result = GIT_DIR_EXPLICIT;
+ goto cleanup_and_return;
}
if (env_ceiling_dirs) {
@@ -1479,8 +1481,10 @@ static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
gitdirenv = DEFAULT_GIT_DIR_ENVIRONMENT;
gitdir_path = xstrdup(dir->buf);
}
- } else if (error_code != READ_GITFILE_ERR_STAT_FAILED)
- return GIT_DIR_INVALID_GITFILE;
+ } else if (error_code != READ_GITFILE_ERR_STAT_FAILED) {
+ result = GIT_DIR_INVALID_GITFILE;
+ goto cleanup_and_return;
+ }
} else
gitfile = xstrdup(dir->buf);
/*
@@ -1491,16 +1495,15 @@ static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
*/
strbuf_setlen(dir, offset);
if (gitdirenv) {
- enum discovery_result ret;
const char *gitdir_candidate =
gitdir_path ? gitdir_path : gitdirenv;
if (ensure_valid_ownership(gitfile, dir->buf,
gitdir_candidate, report)) {
strbuf_addstr(gitdir, gitdirenv);
- ret = GIT_DIR_DISCOVERED;
+ result = GIT_DIR_DISCOVERED;
} else
- ret = GIT_DIR_INVALID_OWNERSHIP;
+ result = GIT_DIR_INVALID_OWNERSHIP;
/*
* Earlier, during discovery, we might have allocated
@@ -1514,8 +1517,7 @@ static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
*/
free(gitdir_path);
free(gitfile);
-
- return ret;
+ goto cleanup_and_return;
}
if (is_git_directory(dir->buf)) {
@@ -1523,25 +1525,37 @@ static enum discovery_result setup_git_directory_gently_1(struct strbuf *dir,
if (get_allowed_bare_repo() == ALLOWED_BARE_REPO_EXPLICIT &&
!is_implicit_bare_repo(dir->buf))
return GIT_DIR_DISALLOWED_BARE;
- if (!ensure_valid_ownership(NULL, NULL, dir->buf, report))
- return GIT_DIR_INVALID_OWNERSHIP;
- strbuf_addstr(gitdir, ".");
- return GIT_DIR_BARE;
+ if (!ensure_valid_ownership(NULL, NULL, dir->buf, report)) {
+ result = GIT_DIR_INVALID_OWNERSHIP;
+ } else {
+ strbuf_addstr(gitdir, ".");
+ result = GIT_DIR_BARE;
+ }
+ goto cleanup_and_return;
}
- if (offset <= min_offset)
- return GIT_DIR_HIT_CEILING;
+ if (offset <= min_offset) {
+ result = GIT_DIR_HIT_CEILING;
+ goto cleanup_and_return;
+ }
while (--offset > ceil_offset && !is_dir_sep(dir->buf[offset]))
; /* continue */
- if (offset <= ceil_offset)
- return GIT_DIR_HIT_CEILING;
+ if (offset <= ceil_offset) {
+ result = GIT_DIR_HIT_CEILING;
+ goto cleanup_and_return;
+ }
strbuf_setlen(dir, offset > min_offset ? offset : min_offset);
if (one_filesystem &&
- current_device != get_device_or_die(dir->buf, NULL, offset))
- return GIT_DIR_HIT_MOUNT_POINT;
+ current_device != get_device_or_die(dir->buf, NULL, offset)) {
+ result = GIT_DIR_HIT_MOUNT_POINT;
+ goto cleanup_and_return;
+ }
}
+
+cleanup_and_return:
+ return result;
}
enum discovery_result discover_git_directory_reason(struct strbuf *commondir,
[Do not use. For illustration purposes only] Instead of sprinkling "return" all over the place, use the "assign to the result variable and then jump to the single label set up to leave the function" pattern, so that we can clean up any extra resource allocated before returning at a single place. No functional change is intended with this step, but it will be used soon. Signed-off-by: Junio C Hamano <gitster@pobox.com> --- setup.c | 50 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 18 deletions(-)