Commit 4793a084 authored by Sam Thursfield's avatar Sam Thursfield Committed by Debarshi Ray

Start private Tracker 2.x daemons in all cases

GNOME is switching to Tracker 3.x by default (see
Initiatives#17) however Photos
is not ready to switch this cycle.

We want to avoid having two Tracker daemons indexing the same content
as much as possible. This commit means that Photos will start private
instances of Tracker 2.x daemons, and the daemons will be tied to the
lifetime of the Photos app. Distros can disable Tracker 2.x by default
and it will only activate when needed by Photos.

This also allows the Photos Flatpak to run Tracker 2.x daemons inside
the sandbox, ensuring it works on systems which don't have Tracker 2.x
available.

Based on a patch by Yi-Soo An <yisooan@gmail.com>.
parent d5525fcf
Pipeline #212878 passed with stage
in 10 minutes and 27 seconds
#!/bin/bash
mkdir -p $MESON_INSTALL_DESTDIR_PREFIX/share/tracker/miners/
for miner in org.gnome.Photos.Tracker1.Miner.Files org.gnome.Photos.Tracker1.Miner.Extract; do
ln -sf $MESON_INSTALL_PREFIX/share/dbus-1/services/$miner.service $MESON_INSTALL_DESTDIR_PREFIX/share/tracker/miners/
done
......@@ -45,6 +45,37 @@ configure_file(
install_dir: dbus_service_dir,
)
domain_ontologies_dir = join_paths(photos_datadir, 'tracker', 'domain-ontologies')
dbus_services_dir = get_option('datadir') / 'dbus-1' / 'services'
domain_conf = configuration_data()
domain_conf.set('datadir', photos_datadir)
domain_conf.set('prefix', get_option('prefix'))
configure_file(
input: photos_namespace + '.rule.in',
output: photos_namespace + '.rule',
configuration: domain_conf,
install: true,
install_dir: domain_ontologies_dir,
)
tracker_domain_services = [
'Tracker1',
'Tracker1.Miner.Extract',
'Tracker1.Miner.Files'
]
foreach service: tracker_domain_services
configure_file(
input: '@0@.@1@.service.in'.format(photos_namespace, service),
output: '@0@.@1@.service'.format(photos_namespace, service),
configuration: domain_conf,
install: true,
install_dir: dbus_services_dir,
)
endforeach
install_data(
photos_namespace + '.search-provider.ini',
install_dir: join_paths(photos_datadir, 'gnome-shell', 'search-providers'),
......@@ -54,3 +85,5 @@ install_data(
photos_namespace.to_lower() + '.gschema.xml',
install_dir: join_paths(photos_datadir, 'glib-2.0', 'schemas'),
)
meson.add_install_script('create-miner-symlinks.sh')
[D-BUS Service]
Name=org.gnome.Photos.Tracker1.Miner.Extract
Exec=@prefix@/libexec/tracker-extract --domain-ontology org.gnome.Photos
# Miner details needed for tracker-control
Path=/org/freedesktop/Tracker1/Miner/Extract
NameSuffix=Miner.Extract
DisplayName=Extractor
[D-BUS Service]
Name=org.gnome.Photos.Tracker1.Miner.Files
Exec=@prefix@/libexec/tracker-miner-fs --initial-sleep=0 --domain-ontology org.gnome.Photos
# Miner details needed for tracker-control
Path=/org/freedesktop/Tracker1/Miner/Files
NameSuffix=Miner.Files
DisplayName=File System
[D-BUS Service]
Name=org.gnome.Photos.Tracker1
Exec=@prefix@/libexec/tracker-store --domain-ontology org.gnome.Photos
[DomainOntology]
# All locations accept
# 1) Paths relative from a variable, the variables
# may be: HOME, XDG_CACHE_HOME, XDG_DATA_HOME, XDG_RUNTIME_DIR,
# XDG_DESKTOP_DIR, XDG_DOCUMENTS_DIR, XDG_DOWNLOAD_DIR,
# XDG_MUSIC_DIR, XDG_PICTURES_DIR, XDG_PUBLICSHARE_DIR,
# XDG_VIDEOS_DIR.
#
# eg. $XDG_CACHE_HOME/...
#
# 2) URIs
#
# eg. file:///var/...
#
# Location for the Tracker database (not optional)
CacheLocation=$XDG_CACHE_HOME/tracker
# Location for the data journal, used in data recovery
# situations (optional)
JournalLocation=$XDG_DATA_HOME/tracker/data
# Name of the ontology to use, must be one located in
# $(sharedir)/tracker/ontologies
OntologyName=nepomuk
# DBus name for the owner (not optional). Tracker will use
# the domain as the prefix of the DBus name for all the
# services related to this domain ontology.
#
# eg. org.gnome.Photos
Domain=org.gnome.Photos
# Miners that the domain ontology will require. This is
# purely a hint (mainly for libtracker-control), and not
# any sort of white list. Anything else knowing about this
# domain ontology may still perform updates, miners and
# non-miners.
Miners=Miner.Files;Miner.Extract
......@@ -251,7 +251,7 @@
{
"name": "tracker",
"buildsystem": "meson",
"cleanup": [ "/bin", "/etc", "/lib/girepository-1.0", "/libexec", "/share/dbus-1", "/share/gir-1.0" ],
"cleanup": [ "/bin", "/etc", "/lib/girepository-1.0", "/share/dbus-1", "/share/gir-1.0" ],
"config-opts": [ "-Dbash_completion=no", "-Ddocs=false", "-Dsystemd_user_services=no" ],
"sources": [
{
......@@ -276,18 +276,14 @@
"name": "tracker-miners",
"buildsystem": "meson",
"cleanup": [ "/etc",
"/lib",
"/libexec",
"/libexec/tracker-writeback",
"/share/dbus-1/services/org.freedesktop.Tracker1.Miner.Extract.service",
"/share/dbus-1/services/org.freedesktop.Tracker1.Writeback.service",
"/share/tracker/miners/org.freedesktop.Tracker1.Miner.Applications.service",
"/share/tracker/miners/org.freedesktop.Tracker1.Miner.Extract.service",
"/share/tracker/miners/org.freedesktop.Tracker1.Miner.RSS.service",
"/share/tracker-miners",
"/share/glib-2.0/schemas/org.freedesktop.Tracker.Extract.gschema.xml",
"/share/glib-2.0/schemas/org.freedesktop.Tracker.Writeback.gschema.xml" ],
"config-opts": [ "-Dextract=false",
"-Dgeneric_media_extractor=none",
"config-opts": [ "-Dextract=true",
"-Dminer_apps=false",
"-Dminer_fs=true",
"-Dminer_rss=false",
......
......@@ -127,6 +127,7 @@ struct _PhotosApplication
PhotosSearchProvider *search_provider;
PhotosSelectionController *sel_cntrlr;
PhotosThumbnailFactory *factory;
TrackerMinerManager *miner_manager;
TrackerExtractPriority *extract_priority;
gboolean empty_results;
gboolean main_window_deleted;
......@@ -195,7 +196,6 @@ struct _PhotosApplicationImportData
GFile *import_sub_dir;
GList *files;
PhotosBaseItem *collection;
TrackerMinerManager *manager;
gchar *collection_urn;
gint64 ctime_latest;
};
......@@ -248,7 +248,6 @@ photos_application_create_data_free (PhotosApplicationCreateData *data)
static PhotosApplicationImportData *
photos_application_import_data_new (PhotosApplication *application,
TrackerMinerManager *manager,
GList *files,
gint64 ctime_latest)
{
......@@ -257,7 +256,6 @@ photos_application_import_data_new (PhotosApplication *application,
data = g_slice_new0 (PhotosApplicationImportData);
g_application_hold (G_APPLICATION (application));
data->application = application;
data->manager = g_object_ref (manager);
data->files = g_list_copy_deep (files, (GCopyFunc) g_object_ref, NULL);
data->ctime_latest = ctime_latest;
return data;
......@@ -278,7 +276,6 @@ photos_application_import_data_free (PhotosApplicationImportData *data)
g_clear_object (&data->destination);
g_clear_object (&data->import_sub_dir);
g_list_free_full (data->files, g_object_unref);
g_clear_object (&data->manager);
g_free (data->collection_urn);
g_slice_free (PhotosApplicationImportData, data);
}
......@@ -693,7 +690,7 @@ photos_application_gom_miner (GObject *source_object, GAsyncResult *res, gpointe
static void
photos_application_create_miners (PhotosApplication *self)
photos_application_create_online_miners (PhotosApplication *self)
{
GIOExtensionPoint *extension_point;
GList *extensions;
......@@ -800,6 +797,7 @@ photos_application_create_window (PhotosApplication *self)
gboolean gegl_sanity_checked;
gboolean gexiv2_initialized;
gboolean gexiv2_registered_namespace;
g_autoptr (GError) error = NULL;
if (self->main_window != NULL)
return TRUE;
......@@ -830,12 +828,18 @@ photos_application_create_window (PhotosApplication *self)
g_application_hold (G_APPLICATION (self));
tracker_extract_priority_proxy_new_for_bus (G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_NONE,
"org.freedesktop.Tracker1.Miner.Extract",
"org.gnome.Photos.Tracker1.Miner.Extract",
"/org/freedesktop/Tracker1/Extract/Priority",
self->create_window_cancellable,
photos_application_tracker_extract_priority,
self);
self->miner_manager = tracker_miner_manager_new_full (TRUE, &error);
if (error)
{
g_warning ("Unable to create Miner Manager: %s", error->message);
}
photos_application_start_miners (self);
return TRUE;
}
......@@ -1323,7 +1327,7 @@ photos_application_import_file_copy (GObject *source_object, GAsyncResult *res,
PhotosApplication *self = data->application;
g_autoptr (GFile) destination = NULL;
GFile *source = G_FILE (source_object);
TrackerMinerManager *manager = data->manager;
TrackerMinerManager *manager = self->miner_manager;
{
g_autoptr (GError) error = NULL;
......@@ -1519,7 +1523,6 @@ photos_application_import (PhotosApplication *self)
GtkWidget *dialog;
g_autoptr (PhotosApplicationImportData) data = NULL;
PhotosSource *source;
TrackerMinerManager *manager = NULL; /* TODO: use g_autoptr */
gint64 ctime_latest = -1;
source = PHOTOS_SOURCE (photos_base_manager_get_active_object (self->state->src_mngr));
......@@ -1533,17 +1536,11 @@ photos_application_import (PhotosApplication *self)
selection = photos_selection_controller_get_selection (self->sel_cntrlr);
g_return_if_fail (selection != NULL);
{
g_autoptr (GError) error = NULL;
manager = tracker_miner_manager_new_full (FALSE, &error);
if (error != NULL)
{
g_warning ("Unable to create a TrackerMinerManager, importing from attached devices won't work: %s",
error->message);
goto out;
}
}
if (!self->miner_manager)
{
g_warning ("No TrackerMinerManager, importing from attached devices won't work");
goto out;
}
for (l = selection; l != NULL; l = l->next)
{
......@@ -1572,14 +1569,13 @@ photos_application_import (PhotosApplication *self)
dialog = photos_import_dialog_new (GTK_WINDOW (self->main_window), ctime_latest);
gtk_widget_show_all (dialog);
data = photos_application_import_data_new (self, manager, files, ctime_latest);
data = photos_application_import_data_new (self, files, ctime_latest);
g_signal_connect (dialog,
"response",
G_CALLBACK (photos_application_import_response),
g_steal_pointer (&data));
out:
g_clear_object (&manager);
g_list_free_full (files, g_object_unref);
}
......@@ -2245,7 +2241,32 @@ photos_application_share_current (PhotosApplication *self)
static void
photos_application_start_miners (PhotosApplication *self)
{
photos_application_create_miners (self);
if (self->miner_manager)
{
GSList *available, *photos_miner_files;
const gchar *photos_miner_files_name = "org.gnome.Photos.Tracker1.Miner.Files";
/* This autostarts the miners */
available = tracker_miner_manager_get_running (self->miner_manager);
photos_miner_files = g_slist_find_custom (available, photos_miner_files_name, (GCompareFunc) strcmp);
if (photos_miner_files)
{
gboolean active;
active = tracker_miner_manager_is_active (self->miner_manager, photos_miner_files_name);
if (!active)
g_warning ("%s is inactive", photos_miner_files_name);
}
else
g_warning ("Miner %s was not found", photos_miner_files_name);
g_slist_free_full (available, g_free);
}
photos_application_create_online_miners (self);
}
......@@ -3003,6 +3024,7 @@ photos_application_dispose (GObject *object)
g_clear_object (&self->sel_cntrlr);
g_clear_object (&self->factory);
g_clear_object (&self->extract_priority);
g_clear_object (&self->miner_manager);
if (self->state != NULL)
{
......
......@@ -56,7 +56,7 @@ enum
REMOTE_MINER_TIMEOUT = 10 /* s */
};
static const gchar *MINER_FILES = "org.freedesktop.Tracker1.Miner.Files";
static const gchar *MINER_FILES = "org.gnome.Photos.Tracker1.Miner.Files";
static void
......@@ -242,7 +242,7 @@ photos_indexing_notification_init (PhotosIndexingNotification *self)
{
g_autoptr (GError) error = NULL;
self->manager = tracker_miner_manager_new_full (FALSE, &error);
self->manager = tracker_miner_manager_new_full (TRUE, &error);
if (error != NULL)
{
g_warning ("Unable to create a TrackerMinerManager, indexing progress notification won't work: %s",
......
......@@ -434,7 +434,7 @@ photos_tracker_change_monitor_initable_init (GInitable *initable, GCancellable *
self->resource_service = tracker_resources_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_NONE,
"org.freedesktop.Tracker1",
"org.gnome.Photos.Tracker1",
"/org/freedesktop/Tracker1/Resources",
cancellable,
error);
......
......@@ -424,7 +424,7 @@ photos_tracker_import_controller_init (PhotosTrackerImportController *self)
{
g_autoptr (GError) error = NULL;
self->manager = tracker_miner_manager_new_full (FALSE, &error);
self->manager = tracker_miner_manager_new_full (TRUE, &error);
if (error != NULL)
g_warning ("Unable to create a TrackerMinerManager, indexing attached devices won't work: %s", error->message);
}
......
......@@ -290,6 +290,8 @@ photos_tracker_queue_initable_init (GInitable *initable, GCancellable *cancellab
g_assert_no_error (self->initialization_error);
tracker_sparql_connection_set_domain ("org.gnome.Photos");
self->connection = tracker_sparql_connection_get (cancellable, &self->initialization_error);
if (G_UNLIKELY (self->initialization_error != NULL))
goto out;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment