[file-roller] file-roller doesn't delete directories w/ files within



commit 238b11888a6d88af70d056963257a7bf2cf4192c
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Sun Nov 25 15:27:16 2012 +0100

    file-roller doesn't delete directories w/ files within
    
    consider '/path/to/dir' and '/path/to/dir/' the same path
    
    [bug #632339]

 src/file-data.c |   31 ++++++++++++++++++++++++-------
 src/fr-window.c |   27 ++++++++++++++++++++++++++-
 2 files changed, 50 insertions(+), 8 deletions(-)
---
diff --git a/src/file-data.c b/src/file-data.c
index 9e92897..0d19519 100644
--- a/src/file-data.c
+++ b/src/file-data.c
@@ -137,21 +137,38 @@ int
 find_path_in_file_data_array (GPtrArray  *array,
 			      const char *path)
 {
-	int       l, r, p, cmp = -1;
+	int       path_l;
+	int       left, right, p, cmp = -1;
 	FileData *fd;
 
-	l = 0;
-	r = array->len;
-	while (l < r) {
-		p = l + ((r - l) / 2);
+	if (path == NULL)
+		return -1;
+
+	path_l = strlen (path);
+	left = 0;
+	right = array->len;
+	while (left < right) {
+		p = left + ((right - left) / 2);
 		fd = (FileData *) g_ptr_array_index (array, p);
+
 		cmp = strcmp (path, fd->original_path);
+		if (cmp != 0) {
+			/* consider '/path/to/dir' and '/path/to/dir/' the same path */
+
+			int original_path_l = strlen (fd->original_path);
+			if ((path_l == original_path_l - 1) && (fd->original_path[original_path_l - 1] == '/')) {
+				int cmp2 = strncmp (path, fd->original_path, original_path_l - 1);
+				if (cmp2 == 0)
+					cmp = cmp2;
+			}
+		}
+
 		if (cmp == 0)
 			return p;
 		else if (cmp < 0)
-			r = p;
+			right = p;
 		else
-			l = p + 1;
+			left = p + 1;
 	}
 
 	return -1;
diff --git a/src/fr-window.c b/src/fr-window.c
index d262ad0..343cba4 100644
--- a/src/fr-window.c
+++ b/src/fr-window.c
@@ -3125,6 +3125,9 @@ _archive_operation_started (FrWindow *window,
 /* -- selections -- */
 
 
+#undef DEBUG_GET_DIR_LIST_FROM_PATH
+
+
 static GList *
 get_dir_list_from_path (FrWindow *window,
 	      		char     *path)
@@ -3141,9 +3144,31 @@ get_dir_list_from_path (FrWindow *window,
 	dirname_l = strlen (dirname);
 	for (i = 0; i < window->archive->files->len; i++) {
 		FileData *fd = g_ptr_array_index (window->archive->files, i);
+		gboolean  matches = FALSE;
 
-		if (strncmp (dirname, fd->full_path, dirname_l) == 0)
+#ifdef DEBUG_GET_DIR_LIST_FROM_PATH
+		g_print ("%s <=> %s (%d)\n", dirname, fd->full_path, dirname_l);
+#endif
+
+		if (fd->dir) {
+			int full_path_l = strlen (fd->full_path);
+			if ((full_path_l == dirname_l - 1) && (strncmp (dirname, fd->full_path, full_path_l) == 0))
+				/* example: dirname is '/path/to/dir/' and fd->full_path is '/path/to/dir' */
+				matches = TRUE;
+			else if (strcmp (dirname, fd->full_path) == 0)
+				matches = TRUE;
+		}
+
+		if (! matches && strncmp (dirname, fd->full_path, dirname_l) == 0) {
+			matches = TRUE;
+		}
+
+		if (matches) {
+#ifdef DEBUG_GET_DIR_LIST_FROM_PATH
+			g_print ("`-> OK\n");
+#endif
 			list = g_list_prepend (list, g_strdup (fd->original_path));
+		}
 	}
 	g_free (dirname);
 



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