From 8fb080d0600d25f3f4937b450f74c0a7a242b3a4 Mon Sep 17 00:00:00 2001 From: dacctal Date: Tue, 7 Jul 2026 06:31:14 +0000 Subject: doesn't work at all but checkpoint anyway! --- src/fetch.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) (limited to 'src/fetch.c') diff --git a/src/fetch.c b/src/fetch.c index c6cefe5..87c632d 100644 --- a/src/fetch.c +++ b/src/fetch.c @@ -18,9 +18,86 @@ */ -#include +//#include +#include +#include +#include +#include +#include #include "fetch.h" +#include "globs.h" +#include "log.h" + +//bool fetch(package_t *pkg) { +// git_libgit2_init(); +// git_clone_options clone_opts = GIT_CLONE_OPTIONS_INIT; +// clone_opts.checkout_branch = pkg->version.data; +// clone_opts.checkout_opts.checkout_strategy = GIT_CHECKOUT_SAFE; +// git_repository *repo = NULL; +// int error = git_clone(&repo, pkg->url.data, pkg->src.data, NULL); +// if (error < 0) { +// const git_error *e = git_error_last(); +// fprintf(stderr, "clone failed: %s\n", +// e && e->message ? e->message : "unknown error"); +// git_libgit2_shutdown(); +// return false; +// } +// git_repository_free(repo); +// git_libgit2_shutdown(); +// return true; +//} + bool fetch(package_t *pkg) { + if (pkg->url.data == NULL || pkg->src.data == NULL) { + log_warn("invalid pkg: url or src is NULL"); + return false; + } + + pid_t pid = fork(); + if (pid < 0) { + log_error("fork failed"); + return false; + } + + if (pid == 0) { + if (!flags.verbose) { + int nullfd = open("/dev/null", O_WRONLY); + if (nullfd >= 0) { + dup2(nullfd, STDOUT_FILENO); + dup2(nullfd, STDERR_FILENO); + close(nullfd); + } + } + + const char *argv[12]; + int i = 0; + + argv[i++] = "git"; + argv[i++] = "-c"; + argv[i++] = "advice.detachedHead=false"; + argv[i++] = "clone"; + + if (pkg->version.data != NULL && !str_equal_cstr(&pkg->version, "HEAD")) { + argv[i++] = "--branch"; + argv[i++] = pkg->version.data; + } + + argv[i++] = "--recursive"; + argv[i++] = pkg->url.data; + argv[i++] = pkg->src.data; + argv[i] = NULL; + + execvp("git", (char *const *)argv); + _exit(127); + } + + int status; + waitpid(pid, &status, 0); + + bool result = (WEXITSTATUS(status) == 0); + if (!result) { log_warn("git clone failed"); } + + return result; } -- cgit v1.2.3