[gnome-builder] unsaved-files: add API to reap old files



commit 50ca32a8ab1df3dc991563eae206b1d69be85954
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jan 24 18:44:47 2018 -0800

    unsaved-files: add API to reap old files
    
    This removes the auto-reaping at initialization time (which would happen
    since context would be set immediately) and instead adds API to force
    a reaping.
    
    Otherwise, we try to reap data dirs before we can build a full path to the
    directory containing the buffers.
    
    This fixes an error for which we reap all the old project data in the
    .cache instead of just the buffers directory of the current project.

 src/libide/buffers/ide-unsaved-files.c | 100 +++++++++++++++++++++------------
 src/libide/buffers/ide-unsaved-files.h |   9 +++
 2 files changed, 74 insertions(+), 35 deletions(-)
---
diff --git a/src/libide/buffers/ide-unsaved-files.c b/src/libide/buffers/ide-unsaved-files.c
index 7900e0688..f0dce5d1b 100644
--- a/src/libide/buffers/ide-unsaved-files.c
+++ b/src/libide/buffers/ide-unsaved-files.c
@@ -814,38 +814,6 @@ ide_unsaved_files_get_sequence (IdeUnsavedFiles *self)
   return ret;
 }
 
-static void
-ide_unsaved_files_set_context (IdeObject  *object,
-                               IdeContext *context)
-{
-  IdeUnsavedFiles *self = (IdeUnsavedFiles *)object;
-
-  g_assert (IDE_IS_MAIN_THREAD ());
-  g_assert (IDE_IS_UNSAVED_FILES (self));
-  g_assert (!context || IDE_IS_CONTEXT (context));
-
-  IDE_OBJECT_CLASS (ide_unsaved_files_parent_class)->set_context (object, context);
-
-  /*
-   * Setup a reaper to cleanup old files in case that we left some around
-   * after a previous crash.
-   */
-  if (context != NULL)
-    {
-      g_autoptr(DzlDirectoryReaper) reaper = NULL;
-      g_autoptr(GFile) buffersdir = NULL;
-      g_autofree gchar *path = NULL;
-
-      reaper = dzl_directory_reaper_new ();
-      path = get_buffers_dir (context);
-      buffersdir = g_file_new_for_path (path);
-      dzl_directory_reaper_add_directory (reaper, buffersdir, G_TIME_SPAN_HOUR);
-
-      /* Now cleanup the old files */
-      dzl_directory_reaper_execute_async (reaper, NULL, NULL, NULL);
-    }
-}
-
 static void
 ide_unsaved_files_finalize (GObject *object)
 {
@@ -863,11 +831,8 @@ static void
 ide_unsaved_files_class_init (IdeUnsavedFilesClass *klass)
 {
   GObjectClass *object_class = G_OBJECT_CLASS (klass);
-  IdeObjectClass *ide_object_class = IDE_OBJECT_CLASS (klass);
 
   object_class->finalize = ide_unsaved_files_finalize;
-
-  ide_object_class->set_context = ide_unsaved_files_set_context;
 }
 
 static void
@@ -899,3 +864,68 @@ ide_unsaved_files_clear (IdeUnsavedFiles *self)
 
   g_mutex_unlock (&self->mutex);
 }
+
+static void
+ide_unsaved_files_reap_cb (GObject      *object,
+                           GAsyncResult *result,
+                           gpointer      user_data)
+{
+  DzlDirectoryReaper *reaper = (DzlDirectoryReaper *)object;
+  g_autoptr(GTask) task = user_data;
+  g_autoptr(GError) error = NULL;
+
+  g_assert (DZL_IS_DIRECTORY_REAPER (reaper));
+  g_assert (G_IS_ASYNC_RESULT (result));
+  g_assert (G_IS_TASK (task));
+
+  if (!dzl_directory_reaper_execute_finish (reaper, result, &error))
+    g_task_return_error (task, g_steal_pointer (&error));
+  else
+    g_task_return_boolean (task, TRUE);
+}
+
+void
+ide_unsaved_files_reap_async (IdeUnsavedFiles     *self,
+                              GCancellable        *cancellable,
+                              GAsyncReadyCallback  callback,
+                              gpointer             user_data)
+{
+  g_autoptr(GTask) task = NULL;
+  g_autoptr(DzlDirectoryReaper) reaper = NULL;
+  g_autoptr(GFile) buffersdir = NULL;
+  g_autofree gchar *path = NULL;
+  IdeContext *context;
+
+  g_return_if_fail (IDE_IS_UNSAVED_FILES (self));
+  g_return_if_fail (!cancellable || G_IS_CANCELLABLE (cancellable));
+
+  task = g_task_new (self, cancellable, callback, user_data);
+  g_task_set_source_tag (task, ide_unsaved_files_reap_async);
+  g_task_set_priority (task, G_PRIORITY_LOW);
+
+  context = ide_object_get_context (IDE_OBJECT (self));
+  g_return_if_fail (context != NULL);
+
+  reaper = dzl_directory_reaper_new ();
+  path = get_buffers_dir (context);
+  buffersdir = g_file_new_for_path (path);
+
+  dzl_directory_reaper_add_directory (reaper, buffersdir, G_TIME_SPAN_DAY);
+
+  /* Now cleanup the old files */
+  dzl_directory_reaper_execute_async (reaper,
+                                      cancellable,
+                                      ide_unsaved_files_reap_cb,
+                                      g_steal_pointer (&task));
+}
+
+gboolean
+ide_unsaved_files_reap_finish (IdeUnsavedFiles  *self,
+                               GAsyncResult     *result,
+                               GError          **error)
+{
+  g_return_val_if_fail (IDE_IS_UNSAVED_FILES (self), FALSE);
+  g_return_val_if_fail (G_IS_TASK (result), FALSE);
+
+  return g_task_propagate_boolean (G_TASK (result), error);
+}
diff --git a/src/libide/buffers/ide-unsaved-files.h b/src/libide/buffers/ide-unsaved-files.h
index de5c52b58..b596beebd 100644
--- a/src/libide/buffers/ide-unsaved-files.h
+++ b/src/libide/buffers/ide-unsaved-files.h
@@ -65,5 +65,14 @@ void            ide_unsaved_files_clear             (IdeUnsavedFiles      *self)
 IDE_AVAILABLE_IN_ALL
 gboolean        ide_unsaved_files_contains          (IdeUnsavedFiles      *self,
                                                      GFile                *file);
+IDE_AVAILABLE_IN_3_28
+void            ide_unsaved_files_reap_async        (IdeUnsavedFiles      *self,
+                                                     GCancellable         *cancellable,
+                                                     GAsyncReadyCallback   callback,
+                                                     gpointer              user_data);
+IDE_AVAILABLE_IN_3_28
+gboolean        ide_unsaved_files_reap_finish       (IdeUnsavedFiles      *self,
+                                                     GAsyncResult         *result,
+                                                     GError              **error);
 
 G_END_DECLS


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