[nautilus] files-view: don't strip extension when compressing folders



commit 39217dafc20cad30f1c34f0fc1ec7b0ff3cf8902
Author: Rahul Verma <rv404674 gmail com>
Date:   Tue Feb 20 05:23:35 2018 +0530

    files-view: don't strip extension when compressing folders
    
    If a file named "Project 1.4" is compressed, the dialog will propose a
    truncated name for the archive ("Project 1").
    
    However, this applies to folders too, where we don't need to worry about
    extensions.
    
    Therefore, the extension should be ignored if the item to be compressed
    is a folder.
    
    Fixes https://gitlab.gnome.org/GNOME/nautilus/issues/115

 src/nautilus-file-utilities.c | 96 ++++++++++++++++++++++++++++++-------------
 src/nautilus-files-view.c     |  9 +++-
 2 files changed, 76 insertions(+), 29 deletions(-)
---
diff --git a/src/nautilus-file-utilities.c b/src/nautilus-file-utilities.c
index 0a4a4ee59..a642f38e0 100644
--- a/src/nautilus-file-utilities.c
+++ b/src/nautilus-file-utilities.c
@@ -1268,34 +1268,6 @@ nautilus_file_selection_equal (GList *selection_a,
     return selection_matches;
 }
 
-char *
-nautilus_get_common_filename_prefix (GList *file_list,
-                                     int    min_required_len)
-{
-    GList *l;
-    GList *strs = NULL;
-    char *name;
-    char *result;
-
-    if (file_list == NULL)
-    {
-        return NULL;
-    }
-
-    for (l = file_list; l != NULL; l = l->next)
-    {
-        g_return_val_if_fail (NAUTILUS_IS_FILE (l->data), NULL);
-
-        name = nautilus_file_get_display_name (l->data);
-        strs = g_list_append (strs, name);
-    }
-
-    result = nautilus_get_common_filename_prefix_from_filenames (strs, min_required_len);
-    g_list_free_full (strs, g_free);
-
-    return result;
-}
-
 static char *
 trim_whitespace (const gchar *string)
 {
@@ -1330,6 +1302,74 @@ trim_whitespace (const gchar *string)
     return g_utf8_substring (string, 0, length - space_count);
 }
 
+char *
+nautilus_get_common_filename_prefix (GList *file_list,
+                                     int    min_required_len)
+{
+    GList *file_names = NULL;
+    GList *directory_names = NULL;
+    char *result_files;
+    g_autofree char *result = NULL;
+    g_autofree char *result_trimmed = NULL;
+
+    if (file_list == NULL)
+    {
+        return NULL;
+    }
+
+    for (GList *l = file_list; l != NULL; l = l->next)
+    {
+        char *name;
+
+        g_return_val_if_fail (NAUTILUS_IS_FILE (l->data), NULL);
+
+        name = nautilus_file_get_display_name (l->data);
+
+        /* Since the concept of file extensions does not apply to directories,
+         * we filter those out.
+         */
+        if (nautilus_file_is_directory (l->data))
+        {
+            directory_names = g_list_prepend (directory_names, name);
+        }
+        else
+        {
+            file_names = g_list_prepend (file_names, name);
+        }
+    }
+
+    result_files = nautilus_get_common_filename_prefix_from_filenames (file_names, min_required_len);
+
+    if (directory_names == NULL)
+    {
+        return result_files;
+    }
+
+    if (result_files != NULL)
+    {
+        directory_names = g_list_prepend (directory_names, result_files);
+    }
+
+    result = eel_str_get_common_prefix (directory_names, min_required_len);
+
+    g_list_free_full (file_names, g_free);
+    g_list_free_full (directory_names, g_free);
+
+    if (result == NULL)
+    {
+        return NULL;
+    }
+
+    result_trimmed = trim_whitespace (result);
+
+    if (g_utf8_strlen (result_trimmed, -1) < min_required_len)
+    {
+        return NULL;
+    }
+
+    return g_steal_pointer (&result_trimmed);
+}
+
 char *
 nautilus_get_common_filename_prefix_from_filenames (GList *filenames,
                                                     int    min_required_len)
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index e445a6dac..a7fc8f35e 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -2264,7 +2264,14 @@ nautilus_files_view_compress_dialog_new (NautilusFilesView *view)
 
         display_name = nautilus_file_get_display_name (selection->data);
 
-        common_prefix = eel_filename_strip_extension (display_name);
+        if (nautilus_file_is_directory (selection->data))
+        {
+            common_prefix = g_steal_pointer (&display_name);
+        }
+        else
+        {
+            common_prefix = eel_filename_strip_extension (display_name);
+        }
     }
     else
     {


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