[gnome-builder] project: rename open buffer before renaming file



commit cc897e0bbec0c6f22335f7a1481d58ac3547b70a
Author: Christian Hergert <chergert redhat com>
Date:   Thu Jan 25 17:01:06 2018 -0800

    project: rename open buffer before renaming file
    
    If we are renaming a file, we might need to change the destination of an
    open buffer so the user doesn't create diverging files.
    
    Fixes #368

 src/libide/projects/ide-project.c | 59 ++++++++++++++++++++++++++++-----------
 1 file changed, 43 insertions(+), 16 deletions(-)
---
diff --git a/src/libide/projects/ide-project.c b/src/libide/projects/ide-project.c
index 150c2bd8b..6b1a940fb 100644
--- a/src/libide/projects/ide-project.c
+++ b/src/libide/projects/ide-project.c
@@ -365,10 +365,10 @@ ide_project_rename_file_worker (GTask        *task,
   IdeProject *self = source_object;
   g_autofree gchar *path = NULL;
   g_autoptr(GFile) parent = NULL;
+  g_autoptr(GError) error = NULL;
+  RenameFile *op = task_data;
   IdeContext *context;
   IdeVcs *vcs;
-  RenameFile *op = task_data;
-  g_autoptr(GError) error = NULL;
   GFile *workdir;
 
   g_assert (IDE_IS_PROJECT (self));
@@ -435,16 +435,37 @@ ide_project_rename_buffer_save_cb (GObject      *object,
 {
   IdeBufferManager *bufmgr = (IdeBufferManager *)object;
   g_autoptr(GTask) task = user_data;
+  g_autoptr(IdeFile) file = NULL;
   g_autoptr(GError) error = NULL;
+  IdeContext *context;
+  RenameFile *rf;
 
+  g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (IDE_IS_BUFFER_MANAGER (bufmgr));
   g_assert (G_IS_ASYNC_RESULT (result));
   g_assert (G_IS_TASK (task));
 
   if (!ide_buffer_manager_save_file_finish (bufmgr, result, &error))
-    g_task_return_error (task, g_steal_pointer (&error));
-  else
-    g_task_run_in_thread (task, ide_project_rename_file_worker);
+    {
+      g_task_return_error (task, g_steal_pointer (&error));
+      return;
+    }
+
+  rf = g_task_get_task_data (task);
+  g_assert (rf != NULL);
+  g_assert (G_IS_FILE (rf->orig_file));
+  g_assert (G_IS_FILE (rf->new_file));
+  g_assert (IDE_IS_BUFFER (rf->buffer));
+
+  /*
+   * Change the filename in the buffer so that the user doesn't continue
+   * to edit the file under the old name.
+   */
+  context = ide_object_get_context (IDE_OBJECT (bufmgr));
+  file = ide_file_new (context, rf->new_file);
+  ide_buffer_set_file (rf->buffer, file);
+
+  g_task_run_in_thread (task, ide_project_rename_file_worker);
 }
 
 void
@@ -484,18 +505,24 @@ ide_project_rename_file_async (IdeProject          *self,
    * If the file is open and has any changes, we need to save those
    * changes before we can proceed.
    */
-  if (buffer != NULL && gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (buffer)))
+  if (buffer != NULL)
     {
-      g_autoptr(IdeFile) file = ide_file_new (context, orig_file);
-
-      ide_buffer_manager_save_file_async (bufmgr,
-                                          buffer,
-                                          file,
-                                          NULL,
-                                          NULL,
-                                          ide_project_rename_buffer_save_cb,
-                                          g_steal_pointer (&task));
-      return;
+      g_autoptr(IdeFile) from = ide_file_new (context, orig_file);
+      g_autoptr(IdeFile) to = ide_file_new (context, new_file);
+
+      if (gtk_text_buffer_get_modified (GTK_TEXT_BUFFER (buffer)))
+        {
+          ide_buffer_manager_save_file_async (bufmgr,
+                                              buffer,
+                                              from,
+                                              NULL,
+                                              NULL,
+                                              ide_project_rename_buffer_save_cb,
+                                              g_steal_pointer (&task));
+          return;
+        }
+
+      ide_buffer_set_file (buffer, to);
     }
 
   g_task_run_in_thread (task, ide_project_rename_file_worker);


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