From d664bef4e570647f85d6000170dba7e63807facc Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Mon, 16 Dec 2024 15:15:34 -0500 Subject: [PATCH] git_clone: rework the error handler to return the proper exit code * Use goto to drop out for different failure conditions --- src/lib/core/utils.c | 37 +++++++++++++++++++++++++++++++------ tests/test_recipe.c | 2 -- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/src/lib/core/utils.c b/src/lib/core/utils.c index 96c89bb..621831c 100644 --- a/src/lib/core/utils.c +++ b/src/lib/core/utils.c @@ -307,39 +307,64 @@ int touch(const char *filename) { } int git_clone(struct Process *proc, char *url, char *destdir, char *gitref) { - int result = -1; + int result = 0; char *chdir_to = NULL; char *program = find_program("git"); if (!program) { - return result; + result = -1; + goto die_quick; } - static char command[PATH_MAX]; + static char command[PATH_MAX] = {0}; sprintf(command, "%s clone -c advice.detachedHead=false --recursive %s", program, url); + if (destdir && access(destdir, F_OK) < 0) { + // Destination directory does not exist sprintf(command + strlen(command), " %s", destdir); + // Clone the repo result = shell(proc, command); + if (result) { + goto die_quick; + } } if (destdir) { chdir_to = destdir; } else { + // Assume the name of the directory to be the basename of the URL + // like it is when executed in a shell session chdir_to = path_basename(url); } - pushd(chdir_to); - { + if (!pushd(chdir_to)) { memset(command, 0, sizeof(command)); sprintf(command, "%s fetch --all", program); result = shell(proc, command); + if (result) { + goto die_pop; + } if (gitref != NULL) { memset(command, 0, sizeof(command)); sprintf(command, "%s checkout %s", program, gitref); - result += shell(proc, command); + + result = shell(proc, command); + if (result) { + goto die_pop; + } } popd(); + } else { + result = -1; + goto die_quick; } + return 0; + + die_pop: + // close out last pushd() call + popd(); + + die_quick: return result; } diff --git a/tests/test_recipe.c b/tests/test_recipe.c index 7c55cd5..531b3b4 100644 --- a/tests/test_recipe.c +++ b/tests/test_recipe.c @@ -94,8 +94,6 @@ int main(int argc, char *argv[]) { STASIS_TEST_FUNC *tests[] = { test_recipe_clone, }; - mkdir("workspace", 0755); - pushd("workspace"); STASIS_TEST_RUN(tests); popd(); STASIS_TEST_END_MAIN();