[gnome-builder] directory: don't enumerate non-native directories including FUSE



commit e6c6b81d31bbbfde4632afe66425b2cdc3bc8aea
Author: Christian Hergert <christian hergert me>
Date:   Wed Apr 1 14:21:30 2015 -0700

    directory: don't enumerate non-native directories including FUSE
    
    Unless the toplevel directory is also non-native, do not try to enumerate
    children of non-native paths. This could happen in an SSHFS situation,
    which could have heavy costs associated with enumerating children. We will
    still enumerate those children if the top-level directory provided is
    non-native.

 libide/tasks/ide-load-directory-task.c |   11 +++++++++++
 1 files changed, 11 insertions(+), 0 deletions(-)
---
diff --git a/libide/tasks/ide-load-directory-task.c b/libide/tasks/ide-load-directory-task.c
index e697479..0cc04e9 100644
--- a/libide/tasks/ide-load-directory-task.c
+++ b/libide/tasks/ide-load-directory-task.c
@@ -37,6 +37,7 @@ typedef struct
   int             io_priority;
   gsize           max_files;
   gsize           current_files;
+  guint           top_is_native : 1;
 } IdeLoadDirectoryTask;
 
 static gboolean gSpecialDirsInit;
@@ -177,6 +178,15 @@ ide_load_directory_task_load_directory (IdeLoadDirectoryTask  *self,
     }
 
   /*
+   * If this directory is non-native (including SSHFS FUSE mounts), don't try
+   * to enumerate the children. However, it is okay to recurse if the top-level
+   * directory is also non-native. This could easily happen in a situation like
+   * sshfs to your server with HTML files.
+   */
+  if (self->top_is_native && !g_file_is_native (directory))
+    return TRUE;
+
+  /*
    * If this is a special directory (.git, Music, Pictures, etc), ignore it.
    */
   if (is_special_directory (directory))
@@ -425,6 +435,7 @@ ide_load_directory_task_new (gpointer             source_object,
   state->io_priority = io_priority;
   state->max_files = max_files ?: DEFAULT_MAX_FILES;
   state->current_files = 0;
+  state->top_is_native = g_file_is_native (directory);
 
   g_task_set_task_data (task, state, ide_load_directory_task_free);
   g_task_run_in_thread (task, ide_load_directory_task_worker);


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