From c0b966fa76fd73be2c5db9d22e09e56e884bea96 Mon Sep 17 00:00:00 2001 From: Jesse van den Kieboom Date: Wed, 24 Jun 2009 00:19:26 +0200 Subject: [PATCH] Set current ref (from load arguments) as default selection in branches combo This correctly parses the arguments supplied to fetch the revisions and gets the the branch name from it (using git rev-parse). --- gitg/gitg-repository.c | 51 ++++++++++++++++++++++++++++++--------- gitg/gitg-window.c | 55 ++++++++++++++++++------------------------ 2 files changed, 62 insertions(+), 44 deletions(-) diff --git a/gitg/gitg-repository.c b/gitg/gitg-repository.c index 0ea9d7d1..b19ced87 100644 --- a/gitg/gitg-repository.c +++ b/gitg/gitg-repository.c @@ -42,7 +42,8 @@ G_DEFINE_TYPE_EXTENDED(GitgRepository, gitg_repository, G_TYPE_OBJECT, 0, G_IMPLEMENT_INTERFACE(GTK_TYPE_TREE_MODEL, gitg_repository_tree_model_iface_init)); /* Properties */ -enum { +enum +{ PROP_0, PROP_PATH, @@ -870,17 +871,21 @@ reload_revisions(GitgRepository *repository, GError **error) return gitg_repository_run_commandv(repository, repository->priv->loader, error, "log", "--pretty=format:%H\x01%an\x01%s\x01%at", "-g", "refs/stash", NULL); } -static gboolean -load_revisions(GitgRepository *self, gint argc, gchar const **av, GError **error) +static void +build_log_args(GitgRepository *self, gint argc, gchar const **av) { gchar **argv = g_new0(gchar *, 5 + (argc > 0 ? argc - 1 : 0)); argv[0] = g_strdup("log"); if (has_left_right(av, argc)) + { argv[1] = g_strdup("--pretty=format:%H\x01%an\x01%s\x01%P\x01%at\x01%m"); + } else + { argv[1] = g_strdup("--pretty=format:%H\x01%an\x01%s\x01%P\x01%at"); + } gchar *head = NULL; @@ -889,7 +894,9 @@ load_revisions(GitgRepository *self, gint argc, gchar const **av, GError **error head = gitg_repository_parse_ref(self, "HEAD"); if (head) + { argv[2] = g_strdup("HEAD"); + } g_free(head); } @@ -898,13 +905,13 @@ load_revisions(GitgRepository *self, gint argc, gchar const **av, GError **error int i; for (i = 0; i < argc; ++i) + { argv[2 + i] = g_strdup(av[i]); + } } g_strfreev(self->priv->last_args); self->priv->last_args = argv; - - return reload_revisions(self, error); } static gchar * @@ -912,18 +919,32 @@ load_current_ref(GitgRepository *self) { gchar **out; gchar *ret = NULL; + gint i; + gint numargs; - out = gitg_repository_command_with_outputv(self, NULL, "show-branch", "--sha1-name", "--current", NULL); + numargs = g_strv_length(self->priv->last_args); + + gchar const **argv = g_new0(gchar const *, numargs + 3); + + argv[0] = "rev-parse"; + argv[1] = "--no-flags"; + argv[2] = "--symbolic-full-name"; + + for (i = 1; i < numargs; ++i) + { + argv[2 + i] = self->priv->last_args[i]; + } + + out = gitg_repository_command_with_output(self, argv, NULL); if (!out) + { return NULL; + } if (*out) { - gchar *pos = g_utf8_strchr(*out, -1, ']'); - - if (pos) - ret = g_strndup(*out + 1, (pos - *out) - 2); + ret = g_strdup(*out); } g_strfreev(out); @@ -953,8 +974,10 @@ load_refs(GitgRepository *self) gchar const *obj = len == 3 && *components[2] ? components[2] : components[1]; GitgRef *ref = add_ref(self, obj, components[0]); - if (current != NULL && strncmp(obj, current, strlen(current)) == 0) + if (current != NULL && strcmp(gitg_ref_get_name(ref), current) == 0) + { self->priv->current_ref = gitg_ref_copy(ref); + } } } @@ -986,19 +1009,23 @@ gitg_repository_load(GitgRepository *self, int argc, gchar const **av, GError ** if (self->priv->path == NULL) { if (error) + { *error = g_error_new_literal(gitg_repository_error_quark(), GITG_REPOSITORY_ERROR_NOT_FOUND, _("Not a valid git repository")); + } return FALSE; } gitg_runner_cancel(self->priv->loader); gitg_repository_clear(self); + + build_log_args(self, argc, av); /* first get the refs */ load_refs(self); /* request log (all the revision) */ - return load_revisions(self, argc, av, error); + return reload_revisions(self, error); } void diff --git a/gitg/gitg-window.c b/gitg/gitg-window.c index 83faea0d..71d1ec70 100644 --- a/gitg/gitg-window.c +++ b/gitg/gitg-window.c @@ -71,7 +71,6 @@ struct _GitgWindowPrivate GtkActionGroup *edit_group; GtkWidget *open_dialog; - GitgRef *current_branch; GitgCellRendererPath *renderer_path; GTimer *load_timer; @@ -96,8 +95,6 @@ gitg_window_finalize(GObject *object) { GitgWindow *self = GITG_WINDOW(object); - gitg_ref_free(self->priv->current_branch); - g_timer_destroy(self->priv->load_timer); gdk_cursor_unref(self->priv->hand); @@ -609,11 +606,13 @@ create_repository(GitgWindow *window, gchar const *path, gboolean usewd) if (path) { - gchar realp[PATH_MAX]; + GFile *file = g_file_new_for_commandline_arg(path); - if (realpath(path, realp)) + if (g_file_is_native(file) && g_file_query_exists(file, NULL)) { - window->priv->repository = gitg_repository_new(realp); + gchar *p = g_file_get_path(file); + window->priv->repository = gitg_repository_new(p); + g_free(p); if (!gitg_repository_get_path(window->priv->repository)) { @@ -630,6 +629,8 @@ create_repository(GitgWindow *window, gchar const *path, gboolean usewd) ret = FALSE; path = NULL; } + + g_object_unref(file); } if (!path && usewd) @@ -667,26 +668,8 @@ sort_by_ref_type(GitgRef *a, GitgRef *b) } static void -clear_branches_combo(GitgWindow *window, gboolean keepselection) +clear_branches_combo(GitgWindow *window) { - if (keepselection) - { - GtkTreeIter iter; - gtk_combo_box_get_active_iter(GTK_COMBO_BOX(window->priv->combo_branches), &iter); - - gitg_ref_free(window->priv->current_branch); - - gtk_tree_model_get(GTK_TREE_MODEL(window->priv->branches_store), - &iter, - COLUMN_BRANCHES_REF, &window->priv->current_branch, - -1); - } - else - { - gitg_ref_free(window->priv->current_branch); - window->priv->current_branch = NULL; - } - GtkTreeIter iter; if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(window->priv->branches_store), &iter, NULL, 1)) @@ -719,7 +702,9 @@ fill_branches_combo(GitgWindow *window) GtkTreeIter parent; GitgRef *parentref = NULL; GtkTreeStore *store = window->priv->branches_store; - + GitgRef *current_ref = gitg_repository_get_current_ref(window->priv->repository); + gboolean refset = FALSE; + for (item = refs; item; item = item->next) { GitgRef *ref = (GitgRef *)item->data; @@ -767,9 +752,10 @@ fill_branches_combo(GitgWindow *window) COLUMN_BRANCHES_REF, ref, -1); - if (window->priv->current_branch && gitg_ref_equal(window->priv->current_branch, ref) == 0) + if (!refset && gitg_ref_equal(current_ref, ref)) { gtk_combo_box_set_active_iter(window->priv->combo_branches, &iter); + refset = TRUE; } } @@ -786,8 +772,10 @@ fill_branches_combo(GitgWindow *window) COLUMN_BRANCHES_REF, NULL, -1); - if (!window->priv->current_branch) + if (!refset) + { gtk_combo_box_set_active(window->priv->combo_branches, 0); + } g_slist_foreach(refs, (GFunc)gitg_ref_free, NULL); g_slist_free(refs); @@ -864,11 +852,14 @@ load_repository(GitgWindow *window, gchar const *path, gint argc, gchar const ** } g_signal_connect(window->priv->repository, "load", G_CALLBACK(on_repository_load), window); - clear_branches_combo(window, FALSE); + clear_branches_combo(window); + gitg_repository_load(window->priv->repository, argc, ar, NULL); - if (!haspath && argc) + if (!haspath && path) + { g_free(ar); + } gitg_commit_view_set_repository(window->priv->commit_view, window->priv->repository); gitg_revision_view_set_repository(window->priv->revision_view, window->priv->repository); @@ -885,7 +876,7 @@ load_repository(GitgWindow *window, gchar const *path, gint argc, gchar const ** } else { - clear_branches_combo(window, FALSE); + clear_branches_combo(window); gitg_commit_view_set_repository(window->priv->commit_view, window->priv->repository); gitg_revision_view_set_repository(window->priv->revision_view, window->priv->repository); @@ -995,7 +986,7 @@ on_view_refresh(GtkAction *action, GitgWindow *window) if (window->priv->repository && gitg_repository_get_path(window->priv->repository) != NULL) { g_signal_handlers_block_by_func(window->priv->combo_branches, on_branches_combo_changed, window); - clear_branches_combo(window, TRUE); + clear_branches_combo(window); g_signal_handlers_unblock_by_func(window->priv->combo_branches, on_branches_combo_changed, window); gitg_repository_reload(window->priv->repository);