[nautilus/wip/csoriano/nautilus-3.24.1: 1/14] file-conflict-dialog: Prevent replacing a directory with a symbolic link



commit b881c990337624ee511710b32b8ccff9269a5597
Author: echo-devim <devim outlook it>
Date:   Wed Mar 15 18:05:36 2017 +0100

    file-conflict-dialog: Prevent replacing a directory with a symbolic link
    
    If the user tries to replace a folder with a symbolic link with the same
    name,the content of the destination folder was being deleted.
    
    To fix this behaviour, the UI disables the replace button allowing the
    user only to skip or to rename in order to avoid the deletion of the
    destination folder's content.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=632323

 src/nautilus-file-conflict-dialog.c  |    6 ++++++
 src/nautilus-file-conflict-dialog.h  |    1 +
 src/nautilus-operations-ui-manager.c |   25 +++++++++++++++++++++----
 3 files changed, 28 insertions(+), 4 deletions(-)
---
diff --git a/src/nautilus-file-conflict-dialog.c b/src/nautilus-file-conflict-dialog.c
index 55e5366..62eafd1 100644
--- a/src/nautilus-file-conflict-dialog.c
+++ b/src/nautilus-file-conflict-dialog.c
@@ -153,6 +153,12 @@ nautilus_file_conflict_dialog_disable_skip (NautilusFileConflictDialog *fcd)
 }
 
 void
+nautilus_file_conflict_dialog_disable_replace (NautilusFileConflictDialog *fcd)
+{
+    gtk_widget_set_sensitive (fcd->replace_button, FALSE);
+}
+
+void
 nautilus_file_conflict_dialog_disable_apply_to_all (NautilusFileConflictDialog *fcd)
 {
     gtk_widget_hide (fcd->checkbox);
diff --git a/src/nautilus-file-conflict-dialog.h b/src/nautilus-file-conflict-dialog.h
index 1b8452f..206d100 100644
--- a/src/nautilus-file-conflict-dialog.h
+++ b/src/nautilus-file-conflict-dialog.h
@@ -50,6 +50,7 @@ void nautilus_file_conflict_dialog_set_replace_button_label (NautilusFileConflic
                                                              gchar *label);
 
 void nautilus_file_conflict_dialog_disable_skip (NautilusFileConflictDialog *fcd);
+void nautilus_file_conflict_dialog_disable_replace (NautilusFileConflictDialog *fcd);
 void nautilus_file_conflict_dialog_disable_apply_to_all (NautilusFileConflictDialog *fcd);
 
 char*      nautilus_file_conflict_dialog_get_new_name     (NautilusFileConflictDialog *dialog);
diff --git a/src/nautilus-operations-ui-manager.c b/src/nautilus-operations-ui-manager.c
index ab6da21..fd56e18 100644
--- a/src/nautilus-operations-ui-manager.c
+++ b/src/nautilus-operations-ui-manager.c
@@ -137,7 +137,15 @@ set_copy_move_dialog_text (FileConflictDialogData *data)
 
     if (destination_is_directory)
     {
-        if (source_is_directory)
+        if (nautilus_file_is_symbolic_link (data->source)
+            && !nautilus_file_is_symbolic_link (data->destination))
+        {
+            primary_text = g_strdup_printf (_("You are trying to replace the destination folder ā€œ%sā€ with a 
symbolic link."),
+                                            destination_name);
+            message = g_strdup_printf(_("This is not allowed in order to avoid the deletion of the 
destination folder's contents."));
+            message_extra = _("Please rename the symbolic link or press the skip button.");
+        }
+        else if (source_is_directory)
         {
             primary_text = g_strdup_printf (_("Merge folder ā€œ%sā€?"),
                                             destination_name);
@@ -339,10 +347,19 @@ set_replace_button_label (FileConflictDialogData *data)
     source_is_directory = nautilus_file_is_directory (data->source);
     destination_is_directory = nautilus_file_is_directory (data->destination);
 
-    if (source_is_directory && destination_is_directory)
+    if (destination_is_directory)
     {
-        nautilus_file_conflict_dialog_set_replace_button_label (data->dialog,
-                                                                _("Merge"));
+        if (nautilus_file_is_symbolic_link (data->source)
+            && !nautilus_file_is_symbolic_link (data->destination))
+        {
+            nautilus_file_conflict_dialog_disable_replace (data->dialog);
+            nautilus_file_conflict_dialog_disable_apply_to_all (data->dialog);
+        }
+        else if (source_is_directory)
+        {
+            nautilus_file_conflict_dialog_set_replace_button_label (data->dialog,
+                                                                    _("Merge"));
+        }
     }
 }
 


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