[tracker-miners/sam/optional-application-indexing: 9/10] miner-fs: Add an option to disable application indexing



commit 9f3897830613c79902c3832617b638e7217d72e4
Author: Sam Thursfield <sam afuera me uk>
Date:   Wed Sep 4 16:32:35 2019 +0200

    miner-fs: Add an option to disable application indexing
    
    This is useful when testing and in deployments where application
    indexing isn't needed.

 ...org.freedesktop.Tracker.Miner.Files.gschema.xml |   9 ++
 src/miners/fs/tracker-config.c                     |   9 ++
 src/miners/fs/tracker-config.h                     |   1 +
 src/miners/fs/tracker-miner-files.c                | 135 +++++++++++++++------
 4 files changed, 116 insertions(+), 38 deletions(-)
---
diff --git a/data/org.freedesktop.Tracker.Miner.Files.gschema.xml 
b/data/org.freedesktop.Tracker.Miner.Files.gschema.xml
index 4a3db49f0..ae2266519 100644
--- a/data/org.freedesktop.Tracker.Miner.Files.gschema.xml
+++ b/data/org.freedesktop.Tracker.Miner.Files.gschema.xml
@@ -141,6 +141,15 @@ Boston, MA  02110-1301, USA.
       <default>[ '$HOME', '&amp;DOWNLOAD' ]</default>
     </key>
 
+    <key name="index-applications" type="b">
+      <summary>Index applications installed on the system</summary>
+      <description>
+          If this option is enabled, the filesystem miner will look for .desktop
+          files in the standard XDG system and user data directories.
+      </description>
+      <default>true</default>
+    </key>
+
     <key name="ignored-files" type="as">
       <summary>Ignored files</summary>
       <description>List of file patterns to avoid</description>
diff --git a/src/miners/fs/tracker-config.c b/src/miners/fs/tracker-config.c
index 59ef77df8..5836214bf 100644
--- a/src/miners/fs/tracker-config.c
+++ b/src/miners/fs/tracker-config.c
@@ -44,6 +44,7 @@
 #define DEFAULT_THROTTLE                         0        /* 0->20 */
 #define DEFAULT_INDEX_REMOVABLE_DEVICES          FALSE
 #define DEFAULT_INDEX_OPTICAL_DISCS              FALSE
+#define DEFAULT_INDEX_APPLICATIONS               TRUE
 #define DEFAULT_INDEX_ON_BATTERY                 FALSE
 #define DEFAULT_INDEX_ON_BATTERY_FIRST_TIME      TRUE
 #define DEFAULT_LOW_DISK_SPACE_LIMIT             1        /* 0->100 / -1 */
@@ -821,6 +822,14 @@ tracker_config_get_index_optical_discs (TrackerConfig *config)
        return g_settings_get_boolean (G_SETTINGS (config), "index-optical-discs");
 }
 
+gboolean
+tracker_config_get_index_applications (TrackerConfig *config)
+{
+       g_return_val_if_fail (TRACKER_IS_CONFIG (config), DEFAULT_INDEX_APPLICATIONS);
+
+       return g_settings_get_boolean (G_SETTINGS (config), "index-applications");
+}
+
 gint
 tracker_config_get_low_disk_space_limit (TrackerConfig *config)
 {
diff --git a/src/miners/fs/tracker-config.h b/src/miners/fs/tracker-config.h
index 14961295b..78b9adab5 100644
--- a/src/miners/fs/tracker-config.h
+++ b/src/miners/fs/tracker-config.h
@@ -56,6 +56,7 @@ gboolean       tracker_config_get_index_on_battery_first_time      (TrackerConfi
 gboolean       tracker_config_get_index_removable_devices          (TrackerConfig *config);
 gboolean       tracker_config_get_index_optical_discs              (TrackerConfig *config);
 gboolean       tracker_config_get_index_mounted_directories        (TrackerConfig *config);
+gboolean       tracker_config_get_index_applications               (TrackerConfig *config);
 gint           tracker_config_get_low_disk_space_limit             (TrackerConfig *config);
 GSList *       tracker_config_get_index_recursive_directories      (TrackerConfig *config);
 GSList *       tracker_config_get_index_single_directories         (TrackerConfig *config);
diff --git a/src/miners/fs/tracker-miner-files.c b/src/miners/fs/tracker-miner-files.c
index 7d7c1d97e..e096a8a89 100644
--- a/src/miners/fs/tracker-miner-files.c
+++ b/src/miners/fs/tracker-miner-files.c
@@ -105,6 +105,9 @@ struct TrackerMinerFilesPrivate {
        gboolean index_optical_discs;
        guint volumes_changed_id;
 
+       GSList *application_dirs;
+       guint applications_changed_id;
+
        gboolean mount_points_initialized;
 
        guint stale_volumes_check_id;
@@ -196,6 +199,10 @@ static void        trigger_recheck_cb                   (GObject              *g
 static void        index_volumes_changed_cb             (GObject              *gobject,
                                                          GParamSpec           *arg1,
                                                          gpointer              user_data);
+static void        set_up_application_indexing          (TrackerMinerFiles    *mf);
+static void        index_applications_changed_cb        (GObject              *gobject,
+                                                         GParamSpec           *arg1,
+                                                         gpointer              user_data);
 static gboolean    miner_files_process_file             (TrackerMinerFS       *fs,
                                                          GFile                *file,
                                                          GTask                *task);
@@ -531,29 +538,6 @@ miner_files_initable_iface_init (GInitableIface *iface)
        iface->init = miner_files_initable_init;
 }
 
-static void
-miner_files_add_application_dir (TrackerMinerFiles *mf,
-                                 const gchar       *dir)
-{
-       TrackerIndexingTree *indexing_tree;
-       GFile *file;
-       gchar *path;
-
-       indexing_tree = tracker_miner_fs_get_indexing_tree (TRACKER_MINER_FS (mf));
-
-       /* Add $dir/applications */
-       path = g_build_filename (dir, "applications", NULL);
-       file = g_file_new_for_path (path);
-       g_message ("  Adding:'%s'", path);
-
-       tracker_indexing_tree_add (indexing_tree, file,
-                                  TRACKER_DIRECTORY_FLAG_RECURSE |
-                                  TRACKER_DIRECTORY_FLAG_MONITOR |
-                                  TRACKER_DIRECTORY_FLAG_CHECK_MTIME);
-       g_object_unref (file);
-       g_free (path);
-}
-
 static gboolean
 miner_files_initable_init (GInitable     *initable,
                            GCancellable  *cancellable,
@@ -563,13 +547,10 @@ miner_files_initable_init (GInitable     *initable,
        TrackerMinerFS *fs;
        TrackerIndexingTree *indexing_tree;
        TrackerDirectoryFlags flags;
-       const gchar *user_data_dir;
-       const gchar * const *xdg_dirs;
        GError *inner_error = NULL;
        GSList *mounts = NULL;
        GSList *dirs;
        GSList *m;
-       gint i;
 
        /* Chain up parent's initable callback before calling child's one */
        if (!miner_files_initable_parent_iface->init (initable, cancellable, &inner_error)) {
@@ -778,18 +759,8 @@ miner_files_initable_init (GInitable     *initable,
                                                                NULL);
        }
 
-       /* Add application directories */
-       g_message ("Setting up applications to iterate from XDG system directories");
-       xdg_dirs = g_get_system_data_dirs ();
-
-       for (i = 0; xdg_dirs[i]; i++) {
-               miner_files_add_application_dir (mf, xdg_dirs[i]);
-       }
-
-       user_data_dir = g_get_user_data_dir ();
-       if (user_data_dir) {
-               miner_files_add_application_dir (mf, user_data_dir);
-       }
+       /* Initialize application indexing */
+       set_up_application_indexing (mf);
 
        /* We want to get notified when config changes */
 
@@ -820,6 +791,9 @@ miner_files_initable_init (GInitable     *initable,
        g_signal_connect (mf->private->config, "notify::index-optical-discs",
                          G_CALLBACK (index_volumes_changed_cb),
                          mf);
+       g_signal_connect (mf->private->config, "notify::index-applications",
+                         G_CALLBACK (index_applications_changed_cb),
+                         mf);
        g_signal_connect (mf->private->config, "notify::removable-days-threshold",
                          G_CALLBACK (index_volumes_changed_cb),
                          mf);
@@ -2222,6 +2196,91 @@ index_volumes_changed_cb (GObject    *gobject,
        }
 }
 
+static void
+miner_files_add_application_dir (TrackerMinerFiles   *mf,
+                                 TrackerIndexingTree *indexing_tree,
+                                 const gchar         *dir)
+{
+       GFile *file;
+       gchar *path;
+
+       /* Add $dir/applications */
+       path = g_build_filename (dir, "applications", NULL);
+       file = g_file_new_for_path (path);
+       g_message ("  Adding:'%s'", path);
+
+       tracker_indexing_tree_add (indexing_tree, file,
+                                  TRACKER_DIRECTORY_FLAG_RECURSE |
+                                  TRACKER_DIRECTORY_FLAG_MONITOR |
+                                  TRACKER_DIRECTORY_FLAG_CHECK_MTIME);
+       g_free (path);
+
+       mf->private->application_dirs = g_slist_prepend(mf->private->application_dirs, file);
+}
+
+static void
+set_up_application_indexing (TrackerMinerFiles *mf)
+{
+       TrackerIndexingTree *indexing_tree;
+       const gchar *user_data_dir;
+       const gchar * const *xdg_dirs;
+       GSList *n;
+       int i;
+
+       indexing_tree = tracker_miner_fs_get_indexing_tree (TRACKER_MINER_FS (mf));
+
+       if (tracker_config_get_index_applications (mf->private->config)) {
+               g_message ("Setting up applications to iterate from XDG system directories");
+               xdg_dirs = g_get_system_data_dirs ();
+
+               for (i = 0; xdg_dirs[i]; i++) {
+                       miner_files_add_application_dir (mf, indexing_tree, xdg_dirs[i]);
+               }
+
+               user_data_dir = g_get_user_data_dir ();
+               if (user_data_dir) {
+                       miner_files_add_application_dir (mf, indexing_tree, user_data_dir);
+               }
+       } else {
+               g_message ("Removing configured application directories from indexing tree");
+
+               for (n = mf->private->application_dirs; n != NULL; n = n->next) {
+                       tracker_indexing_tree_remove (indexing_tree, G_FILE (n->data));
+               };
+
+               g_slist_free_full (mf->private->application_dirs, g_object_unref);
+               mf->private->application_dirs = NULL;
+       }
+}
+
+static gboolean
+index_applications_changed_idle (gpointer user_data)
+{
+       TrackerMinerFiles *mf;
+
+       mf = TRACKER_MINER_FILES (user_data);
+
+       set_up_application_indexing (mf);
+
+       return FALSE;
+}
+
+static void
+index_applications_changed_cb (GObject    *gobject,
+                               GParamSpec *arg1,
+                               gpointer    user_data)
+{
+       TrackerMinerFiles *miner_files = user_data;
+
+       g_message ("Application related configuration changed, updating...");
+
+       if (miner_files->private->applications_changed_id == 0) {
+               /* Set idle so multiple changes in the config lead to one check */
+               miner_files->private->applications_changed_id =
+                       g_idle_add (index_applications_changed_idle, miner_files);
+       }
+}
+
 static const gchar *
 miner_files_get_file_urn (TrackerMinerFiles *miner,
                           GFile             *file,


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