static GFile * git_get_mirror_dir (const char *url, BuilderContext *context) { g_autoptr(GFile) git_dir = NULL; g_autofree char *filename = NULL; g_autofree char *git_dir_path = NULL; git_dir = g_file_get_child (builder_context_get_state_dir (context), "git"); git_dir_path = g_file_get_path (git_dir); g_mkdir_with_parents (git_dir_path, 0755); filename = builder_uri_to_filename (url); return g_file_get_child (git_dir, filename); }
static GFile * git_get_mirror_dir (const char *url_or_path, BuilderContext *context) { g_autoptr(GFile) git_dir = NULL; g_autofree char *filename = NULL; g_autofree char *git_dir_path = NULL; git_dir = g_file_get_child (builder_context_get_state_dir (context), "git"); git_dir_path = g_file_get_path (git_dir); g_mkdir_with_parents (git_dir_path, 0755); /* Technically a path isn't a uri but if it's absolute it should still be unique. */ filename = builder_uri_to_filename (url_or_path); return g_file_get_child (git_dir, filename); }
static gboolean git_mirror_submodules (const char *repo_location, gboolean update, GFile *mirror_dir, const char *revision, BuilderContext *context, GError **error) { g_autofree char *mirror_dir_path = NULL; g_autoptr(GFile) checkout_dir_template = NULL; g_autoptr(GFile) checkout_dir = NULL; g_autofree char *checkout_dir_path = NULL; g_autofree char *submodule_status = NULL; mirror_dir_path = g_file_get_path (mirror_dir); checkout_dir_template = g_file_get_child (builder_context_get_state_dir (context), "tmp-checkout-XXXXXX"); checkout_dir_path = g_file_get_path (checkout_dir_template); if (g_mkdtemp (checkout_dir_path) == NULL) { g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED, "Can't create temporary checkout directory"); return FALSE; } checkout_dir = g_file_new_for_path (checkout_dir_path); if (!git (NULL, NULL, error, "clone", "-q", "--no-checkout", mirror_dir_path, checkout_dir_path, NULL)) return FALSE; if (!git (checkout_dir, NULL, error, "checkout", "-q", "-f", revision, NULL)) return FALSE; if (!git (checkout_dir, &submodule_status, error, "submodule", "status", NULL)) return FALSE; if (submodule_status) { int i; g_auto(GStrv) lines = g_strsplit (submodule_status, "\n", -1); for (i = 0; lines[i] != NULL; i++) { g_autofree char *url = NULL; g_autofree char *option = NULL; g_autofree char *old = NULL; g_auto(GStrv) words = NULL; if (*lines[i] == 0) continue; words = g_strsplit (lines[i] + 1, " ", 3); option = g_strdup_printf ("submodule.%s.url", words[1]); if (!git (checkout_dir, &url, error, "config", "-f", ".gitmodules", option, NULL)) return FALSE; /* Trim trailing whitespace */ g_strchomp (url); old = url; url = make_absolute (repo_location, old, error); if (url == NULL) return FALSE; if (!git_mirror_repo (url, update, words[0], context, error)) return FALSE; } } if (!gs_shutil_rm_rf (checkout_dir, NULL, error)) return FALSE; return TRUE; }