aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/ci.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/ci.c101
1 files changed, 101 insertions, 0 deletions
diff --git a/src/ci.c b/src/ci.c
new file mode 100644
index 0000000..1932008
--- /dev/null
+++ b/src/ci.c
@@ -0,0 +1,101 @@
+#include "ci.h"
+#include "file.h"
+#include "git.h"
+#include "log.h"
+#include "process.h"
+
+#include <git2.h>
+#include <stddef.h>
+#include <stdlib.h>
+
+/* clang-format off */
+static const char *ci_scripts[] = {
+ "./.ci.sh",
+ "./.ci",
+ "./ci.sh",
+ "./ci",
+ NULL,
+};
+/* clang-format on */
+
+static run_result ci_run_script(const char *script, int *ec)
+{
+ const char *args[] = {script, NULL};
+ int ret = 0;
+
+ ret = proc_spawn(args, ec);
+ if (ret < 0)
+ return RUN_ERROR;
+ if (*ec)
+ return RUN_FAILURE;
+ return RUN_SUCCESS;
+}
+
+run_result ci_run(int *ec)
+{
+ for (const char **script = ci_scripts; *script; ++script) {
+ if (!file_exists(*script))
+ continue;
+ print_log("Going to run: %s\n", *script);
+ return ci_run_script(*script, ec);
+ }
+
+ print_log("Couldn't find any CI scripts to run\n");
+ return RUN_NO;
+}
+
+static void ci_cleanup_git_repo(git_repository *repo)
+{
+ rm_rf(git_repository_workdir(repo));
+ libgit_repository_free(repo);
+}
+
+static int ci_prepare_git_repo(git_repository **repo, const char *url, const char *rev)
+{
+ int ret = 0;
+
+ ret = libgit_clone_to_tmp(repo, url);
+ if (ret < 0)
+ return ret;
+
+ ret = libgit_checkout(*repo, rev);
+ if (ret < 0)
+ goto free_repo;
+
+ return ret;
+
+free_repo:
+ ci_cleanup_git_repo(*repo);
+
+ return ret;
+}
+
+run_result ci_run_git_repo(const char *url, const char *rev, int *ec)
+{
+ char *oldpwd;
+ git_repository *repo;
+ run_result result = RUN_ERROR;
+ int ret = 0;
+
+ ret = ci_prepare_git_repo(&repo, url, rev);
+ if (ret < 0)
+ goto exit;
+
+ ret = my_chdir(git_repository_workdir(repo), &oldpwd);
+ if (ret < 0)
+ goto free_repo;
+
+ result = ci_run(ec);
+ if (result < 0)
+ goto oldpwd;
+
+oldpwd:
+ my_chdir(oldpwd, NULL);
+ free(oldpwd);
+
+free_repo:
+ ci_cleanup_git_repo(repo);
+
+exit:
+ return result;
+}