[gitg] Set current ref (from load arguments) as default selection in branches combo



commit c0b966fa76fd73be2c5db9d22e09e56e884bea96
Author: Jesse van den Kieboom <jesse icecrew nl>
Date:   Wed Jun 24 00:19:26 2009 +0200

    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 0ea9d7d..b19ced8 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 83faea0..71d1ec7 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);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]