[nautilus] file, file-undo-operations: Let renames on Google Drive be undone



commit 060410979a5e0575f2e674c39dbda87de86a48e1
Author: Debarshi Ray <debarshir gnome org>
Date:   Wed Sep 9 17:24:25 2015 +0200

    file, file-undo-operations: Let renames on Google Drive be undone
    
    We really should be using standard::display-name when renaming files -
    g_file_get_basename is simply not the right thing to use. Moreover,
    in case of Google Drive, the URI might not change with the display
    name and we can not get the old display name from the old GFile.
    
    Therefore, let's explicitly keep track of the old and new display
    names to address these issues.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=754785

 .../nautilus-file-undo-operations.c                |   29 ++++++++++++-------
 .../nautilus-file-undo-operations.h                |    9 ++++--
 libnautilus-private/nautilus-file.c                |    9 +++++-
 3 files changed, 31 insertions(+), 16 deletions(-)
---
diff --git a/libnautilus-private/nautilus-file-undo-operations.c 
b/libnautilus-private/nautilus-file-undo-operations.c
index 25a49f2..6a47223 100644
--- a/libnautilus-private/nautilus-file-undo-operations.c
+++ b/libnautilus-private/nautilus-file-undo-operations.c
@@ -852,6 +852,8 @@ G_DEFINE_TYPE (NautilusFileUndoInfoRename, nautilus_file_undo_info_rename, NAUTI
 struct _NautilusFileUndoInfoRenameDetails {
        GFile *old_file;
        GFile *new_file;
+       gchar *old_display_name;
+       gchar *new_display_name;
 };
 
 static void
@@ -882,16 +884,13 @@ rename_redo_func (NautilusFileUndoInfo *info,
                  GtkWindow *parent_window)
 {
        NautilusFileUndoInfoRename *self = NAUTILUS_FILE_UNDO_INFO_RENAME (info);
-       gchar *new_name;
        NautilusFile *file;
 
-       new_name = g_file_get_basename (self->priv->new_file);
        file = nautilus_file_get (self->priv->old_file);
-       nautilus_file_rename (file, new_name,
+       nautilus_file_rename (file, self->priv->new_display_name,
                              file_undo_info_operation_callback, self);
 
        nautilus_file_unref (file);
-       g_free (new_name);
 }
 
 static void
@@ -899,16 +898,13 @@ rename_undo_func (NautilusFileUndoInfo *info,
                  GtkWindow *parent_window)
 {
        NautilusFileUndoInfoRename *self = NAUTILUS_FILE_UNDO_INFO_RENAME (info);
-       gchar *new_name;
        NautilusFile *file;
 
-       new_name = g_file_get_basename (self->priv->old_file);
        file = nautilus_file_get (self->priv->new_file);
-       nautilus_file_rename (file, new_name,
+       nautilus_file_rename (file, self->priv->old_display_name,
                              file_undo_info_operation_callback, self);
 
        nautilus_file_unref (file);
-       g_free (new_name);
 }
 
 static void
@@ -924,6 +920,8 @@ nautilus_file_undo_info_rename_finalize (GObject *obj)
        NautilusFileUndoInfoRename *self = NAUTILUS_FILE_UNDO_INFO_RENAME (obj);
        g_clear_object (&self->priv->old_file);
        g_clear_object (&self->priv->new_file);
+       g_free (self->priv->old_display_name);
+       g_free (self->priv->new_display_name);
 
        G_OBJECT_CLASS (nautilus_file_undo_info_rename_parent_class)->finalize (obj);
 }
@@ -953,11 +951,20 @@ nautilus_file_undo_info_rename_new (void)
 }
 
 void
-nautilus_file_undo_info_rename_set_data (NautilusFileUndoInfoRename *self,
-                                        GFile                      *old_file,
-                                        GFile                      *new_file)
+nautilus_file_undo_info_rename_set_data_pre (NautilusFileUndoInfoRename *self,
+                                            GFile                      *old_file,
+                                            gchar                      *old_display_name,
+                                            gchar                      *new_display_name)
 {
        self->priv->old_file = g_object_ref (old_file);
+       self->priv->old_display_name = g_strdup (old_display_name);
+       self->priv->new_display_name = g_strdup (new_display_name);
+}
+
+void
+nautilus_file_undo_info_rename_set_data_post (NautilusFileUndoInfoRename *self,
+                                             GFile                      *new_file)
+{
        self->priv->new_file = g_object_ref (new_file);
 }
 
diff --git a/libnautilus-private/nautilus-file-undo-operations.h 
b/libnautilus-private/nautilus-file-undo-operations.h
index 498c766..ffc1fa2 100644
--- a/libnautilus-private/nautilus-file-undo-operations.h
+++ b/libnautilus-private/nautilus-file-undo-operations.h
@@ -179,9 +179,12 @@ struct _NautilusFileUndoInfoRenameClass {
 
 GType nautilus_file_undo_info_rename_get_type (void) G_GNUC_CONST;
 NautilusFileUndoInfo *nautilus_file_undo_info_rename_new (void);
-void nautilus_file_undo_info_rename_set_data (NautilusFileUndoInfoRename *self,
-                                             GFile                      *old_file,
-                                             GFile                      *new_file);
+void nautilus_file_undo_info_rename_set_data_pre (NautilusFileUndoInfoRename *self,
+                                                 GFile                      *old_file,
+                                                 gchar                      *old_display_name,
+                                                 gchar                      *new_display_name);
+void nautilus_file_undo_info_rename_set_data_post (NautilusFileUndoInfoRename *self,
+                                                  GFile                      *new_file);
 
 /* trash */
 #define NAUTILUS_TYPE_FILE_UNDO_INFO_TRASH         (nautilus_file_undo_info_trash_get_type ())
diff --git a/libnautilus-private/nautilus-file.c b/libnautilus-private/nautilus-file.c
index 6807cad..7b2f91c 100644
--- a/libnautilus-private/nautilus-file.c
+++ b/libnautilus-private/nautilus-file.c
@@ -1791,8 +1791,8 @@ rename_callback (GObject *source_object,
 
        if (new_file != NULL) {
                if (op->undo_info != NULL) {
-                       nautilus_file_undo_info_rename_set_data (NAUTILUS_FILE_UNDO_INFO_RENAME 
(op->undo_info),
-                                                                G_FILE (source_object), new_file);
+                       nautilus_file_undo_info_rename_set_data_post (NAUTILUS_FILE_UNDO_INFO_RENAME 
(op->undo_info),
+                                                                     new_file);
                }
 
                g_file_query_info_async (new_file,
@@ -1970,6 +1970,11 @@ nautilus_file_rename (NautilusFile *file,
        /* Tell the undo manager a rename is taking place */
        if (!nautilus_file_undo_manager_pop_flag ()) {
                op->undo_info = nautilus_file_undo_info_rename_new ();
+
+               old_name = nautilus_file_get_display_name (file);
+               nautilus_file_undo_info_rename_set_data_pre (NAUTILUS_FILE_UNDO_INFO_RENAME (op->undo_info),
+                                                            location, old_name, new_file_name);
+               g_free (old_name);
        }
 
        /* Do the renaming. */


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