static gboolean builder_source_git_update (BuilderSource *source, BuilderContext *context, GError **error) { BuilderSourceGit *self = BUILDER_SOURCE_GIT (source); g_autoptr(GFile) mirror_dir = NULL; char *current_commit; g_autofree char *location = NULL; location = get_url_or_path (self, context, error); if (location == NULL) return FALSE; mirror_dir = git_get_mirror_dir (location, context); current_commit = git_get_current_commit (mirror_dir, get_branch (self), context, NULL); if (current_commit) { g_free (self->branch); self->branch = current_commit; } return TRUE; }
static void builder_source_git_checksum (BuilderSource *source, BuilderCache *cache, BuilderContext *context) { BuilderSourceGit *self = BUILDER_SOURCE_GIT (source); g_autoptr(GFile) mirror_dir = NULL; g_autofree char *current_commit = NULL; g_autoptr(GError) error = NULL; g_autofree char *location = NULL; builder_cache_checksum_str (cache, self->url); builder_cache_checksum_str (cache, self->path); builder_cache_checksum_str (cache, self->branch); location = get_url_or_path (self, context, &error); if (location != NULL) { mirror_dir = git_get_mirror_dir (location, context); current_commit = git_get_current_commit (mirror_dir, get_branch (self), context, &error); if (current_commit) builder_cache_checksum_str (cache, current_commit); else if (error) g_warning ("Failed to get current git checksum: %s", error->message); } else { g_warning ("No url or path"); } }
static gboolean git_mirror_repo (const char *repo_location, gboolean update, const char *ref, BuilderContext *context, GError **error) { g_autoptr(GFile) mirror_dir = NULL; g_autofree char *current_commit = NULL; mirror_dir = git_get_mirror_dir (repo_location, context); if (!g_file_query_exists (mirror_dir, NULL)) { g_autofree char *filename = g_file_get_basename (mirror_dir); g_autoptr(GFile) parent = g_file_get_parent (mirror_dir); g_autofree char *filename_tmp = g_strconcat (filename, ".clone_tmp", NULL); g_autoptr(GFile) mirror_dir_tmp = g_file_get_child (parent, filename_tmp); g_print ("Cloning git repo %s\n", repo_location); if (!git (parent, NULL, error, "clone", "--mirror", repo_location, filename_tmp, NULL) || !g_file_move (mirror_dir_tmp, mirror_dir, 0, NULL, NULL, NULL, error)) return FALSE; } else if (update) { g_print ("Fetching git repo %s\n", repo_location); if (!git (mirror_dir, NULL, error, "fetch", "-p", NULL)) return FALSE; } current_commit = git_get_current_commit (mirror_dir, ref, context, error); if (current_commit == NULL) return FALSE; if (!git_mirror_submodules (repo_location, update, mirror_dir, current_commit, context, error)) return FALSE; return TRUE; }
static gboolean builder_source_git_extract (BuilderSource *source, GFile *dest, BuilderContext *context, GError **error) { BuilderSourceGit *self = BUILDER_SOURCE_GIT (source); g_autoptr(GFile) mirror_dir = NULL; g_autofree char *mirror_dir_path = NULL; g_autofree char *dest_path = NULL; g_autofree char *location = NULL; location = get_url_or_path (self, context, error); if (location == NULL) return FALSE; mirror_dir = git_get_mirror_dir (location, context); mirror_dir_path = g_file_get_path (mirror_dir); dest_path = g_file_get_path (dest); if (!git (NULL, NULL, error, "clone", mirror_dir_path, dest_path, NULL)) return FALSE; if (!git (dest, NULL, error, "checkout", get_branch (self), NULL)) return FALSE; if (!git_extract_submodule (location, dest, context, error)) return FALSE; if (!git (dest, NULL, error, "config", "--local", "remote.origin.url", location, NULL)) return FALSE; return TRUE; }
static gboolean git_extract_submodule (const char *repo_location, GFile *checkout_dir, BuilderContext *context, GError **error) { g_autofree char *submodule_status = NULL; 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_autoptr(GFile) mirror_dir = NULL; g_autoptr(GFile) child_dir = NULL; g_autofree char *child_url = NULL; g_autofree char *option = NULL; g_autofree char *update_method = NULL; g_autofree char *child_relative_url = NULL; g_autofree char *mirror_dir_as_url = NULL; g_auto(GStrv) words = NULL; if (*lines[i] == 0) continue; words = g_strsplit (lines[i] + 1, " ", 3); /* Skip any submodules that are disabled (have the update method set to "none") Only check if the command succeeds. If it fails, the update method is not set. */ option = g_strdup_printf ("submodule.%s.update", words[1]); if (git (checkout_dir, &update_method, NULL, "config", "-f", ".gitmodules", option, NULL)) { /* Trim trailing whitespace */ g_strchomp (update_method); if (g_strcmp0 (update_method, "none") == 0) continue; } option = g_strdup_printf ("submodule.%s.url", words[1]); if (!git (checkout_dir, &child_relative_url, error, "config", "-f", ".gitmodules", option, NULL)) return FALSE; /* Trim trailing whitespace */ g_strchomp (child_relative_url); g_print ("processing submodule %s\n", words[1]); child_url = make_absolute (repo_location, child_relative_url, error); if (child_url == NULL) return FALSE; mirror_dir = git_get_mirror_dir (child_url, context); mirror_dir_as_url = g_file_get_uri (mirror_dir); if (!git (checkout_dir, NULL, error, "config", option, mirror_dir_as_url, NULL)) return FALSE; if (!git (checkout_dir, NULL, error, "submodule", "update", "--init", words[1], NULL)) return FALSE; child_dir = g_file_resolve_relative_path (checkout_dir, words[1]); if (!git_extract_submodule (child_url, child_dir, context, error)) return FALSE; } } return TRUE; }
static gboolean git_extract_submodule (const char *repo_url, GFile *checkout_dir, BuilderContext *context, GError **error) { g_autofree char *submodule_status = NULL; 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_autoptr(GFile) mirror_dir = NULL; g_autoptr(GFile) child_dir = NULL; g_autofree char *child_url = NULL; g_autofree char *option = NULL; g_autofree char *child_relative_url = NULL; g_autofree char *mirror_dir_as_url = 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, &child_relative_url, error, "config", "-f", ".gitmodules", option, NULL)) return FALSE; /* Trim trailing whitespace */ g_strchomp (child_relative_url); g_print ("processing submodule %s\n", words[1]); child_url = make_absolute_url (repo_url, child_relative_url, error); if (child_url == NULL) return FALSE; mirror_dir = git_get_mirror_dir (child_url, context); mirror_dir_as_url = g_file_get_uri (mirror_dir); if (!git (checkout_dir, NULL, error, "config", option, mirror_dir_as_url, NULL)) return FALSE; if (!git (checkout_dir, NULL, error, "submodule", "update", "--init", words[1], NULL)) return FALSE; child_dir = g_file_resolve_relative_path (checkout_dir, words[1]); if (!git_extract_submodule (child_url, child_dir, context, error)) return FALSE; } } return TRUE; }