[anjuta/libgit2-glib] git: Don't refresh the index more than once when the HEAD or index changes



commit 075ac7f4529634b090fe39db4cf36727bfa41f2c
Author: James Liggett <jrliggett cox net>
Date:   Tue Aug 6 23:19:29 2013 -0700

    git: Don't refresh the index more than once when the HEAD or index changes

 plugins/git/git-index-refreshable.c |   34 +++++++++++++++++++++++++++++-----
 1 files changed, 29 insertions(+), 5 deletions(-)
---
diff --git a/plugins/git/git-index-refreshable.c b/plugins/git/git-index-refreshable.c
index c8d0924..7a00ad5 100644
--- a/plugins/git/git-index-refreshable.c
+++ b/plugins/git/git-index-refreshable.c
@@ -25,18 +25,26 @@ struct _GitIndexRefreshablePrivate
        GFileMonitor *index_monitor;
        GFileMonitor *head_monitor;
        GitCommand *refresh_command;
+       gboolean index_refreshed;
 };
 
 static void
+git_index_refreshable_notify_refreshed (GitIndexRefreshable *self)
+{
+       g_signal_emit_by_name (self, "refreshed", NULL);
+}
+
+static void
 on_refresh_command_finished (AnjutaTask *task, GitIndexRefreshable *self)
 {
        g_clear_object (&self->priv->refresh_command);
-       g_signal_emit_by_name (self, "refreshed", NULL);
+       git_index_refreshable_notify_refreshed (self);
+       self->priv->index_refreshed = TRUE;
 }
 
 static void
-on_file_monitor_changed (GFileMonitor *monitor, GFile *file, GFile *other_file,
-                         GFileMonitorEvent event, GitIndexRefreshable *self)
+on_index_monitor_changed (GFileMonitor *monitor, GFile *file, GFile *other_file,
+                          GFileMonitorEvent event, GitIndexRefreshable *self)
 {
        /* Handle created and modified events just to cover all possible cases. 
         * Sometimes git does some odd things... */
@@ -57,6 +65,22 @@ on_file_monitor_changed (GFileMonitor *monitor, GFile *file, GFile *other_file,
        }
 }
 
+static void
+on_head_monitor_changed (GFileMonitor *monitor, GFile *file, GFile *other_file,
+                         GFileMonitorEvent event, GitIndexRefreshable *self)
+{
+       if (event == G_FILE_MONITOR_EVENT_CHANGED ||
+           event == G_FILE_MONITOR_EVENT_CREATED)
+       {
+               /* Don't refresh the status again if we've already refreshed due to inedex
+                * changes. */
+               if (!self->priv->index_refreshed)
+                       git_index_refreshable_notify_refreshed (self);
+
+               self->priv->index_refreshed = FALSE;
+       }
+}
+
 static void 
 git_index_refreshable_start_monitor (IAnjutaRefreshable *obj, GError **err)
 {
@@ -96,11 +120,11 @@ git_index_refreshable_start_monitor (IAnjutaRefreshable *obj, GError **err)
                if (self->priv->head_monitor)
                {
                        g_signal_connect (G_OBJECT (self->priv->index_monitor), "changed",
-                                         G_CALLBACK (on_file_monitor_changed),
+                                         G_CALLBACK (on_index_monitor_changed),
                                          obj);
 
                        g_signal_connect (G_OBJECT (self->priv->head_monitor), "changed",
-                                         G_CALLBACK (on_file_monitor_changed),
+                                         G_CALLBACK (on_head_monitor_changed),
                                          obj);
 
                }


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