diff --git a/desktop/budgie/budgie-desktop/actions.py b/desktop/budgie/budgie-desktop/actions.py
new file mode 100644
index 0000000000..d34594f1a7
--- /dev/null
+++ b/desktop/budgie/budgie-desktop/actions.py
@@ -0,0 +1,19 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 2
+# See the file http://www.gnu.org/copyleft/gpl.txt
+
+from pisi.actionsapi import mesontools
+from pisi.actionsapi import pisitools
+
+def setup():
+ mesontools.configure("-Dwith-gtk-doc=false")
+
+def build():
+ mesontools.build()
+
+def install():
+ mesontools.install()
+
+ pisitools.dodoc("README.md", "LICENSE*")
diff --git a/desktop/budgie/budgie-desktop/pspec.xml b/desktop/budgie/budgie-desktop/pspec.xml
new file mode 100644
index 0000000000..f6ed0d1192
--- /dev/null
+++ b/desktop/budgie/budgie-desktop/pspec.xml
@@ -0,0 +1,112 @@
+
+
+
+
+ budgie-desktop
+ https://github.com/solus-project/budgie-desktop
+
+ Pisi Linux Admins
+ admins@pisilinux.org
+
+ GPLv2
+ LGPLv2.1
+ Modern desktop environment from the Solus Project.
+ Budgie is a desktop environment that uses GNOME technologies such as GTK3 and is developed by the Solus project.
+ https://github.com/solus-project/budgie-desktop/releases/download/v10.5.3/budgie-desktop-v10.5.3.tar.xz
+
+ vala-devel
+ intltool
+ glib2-devel
+ gobject-introspection-devel
+ sassc
+ budgie-screensaver
+ alsa-lib-devel
+ libnotify-devel
+ accountsservice-devel
+ libpeas-devel
+ libwnck3-devel
+ mutter-devel
+ ibus-devel
+ gnome-desktop-devel
+ libseccomp-devel
+ pulseaudio-libs-devel
+ upower-devel
+ gtk3-devel
+ polkit-devel
+ gnome-bluetooth-devel
+ gnome-menus-devel
+ gnome-settings-daemon-devel
+ meson
+ mesa-devel
+
+
+
+
+ budgie-desktop
+
+ gtk3
+ ibus
+ cairo
+ glib2
+ pango
+ libX11
+ mutter
+ polkit
+ upower
+ libpeas
+ alsa-lib
+ libwnck3
+ libnotify
+ gdk-pixbuf
+ gnome-menus
+ gnome-desktop
+ libXcomposite
+ libutil-linux
+ gnome-bluetooth
+ pulseaudio-libs
+ gobject-introspection
+
+
+ /etc/xdg
+ /usr/bin
+ /usr/lib/lib*.so*
+ /usr/lib/budgie-desktop
+ /usr/lib/girepository-1.0
+ /usr/share/locale
+ /usr/share/icons
+ /usr/share/backgrounds
+ /usr/share/budgie-desktop
+ /usr/share/doc
+ /usr/share/xsessions
+ /usr/share/applications
+ /usr/share/gnome-session
+ /usr/share/glib-2.0
+
+
+
+
+ budgie-desktop-devel
+
+ budgie-desktop
+ gtk3-devel
+ glib2-devel
+ libpeas-devel
+
+
+ /usr/include
+ /usr/lib/pkgconfig
+ /usr/share/vala
+ /usr/share/gir-1.0
+
+
+
+
+
+ 2021-06-05
+ 10.5.3
+ First release for Pisi Linux
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
diff --git a/desktop/budgie/budgie-screensaver/actions.py b/desktop/budgie/budgie-screensaver/actions.py
new file mode 100644
index 0000000000..a42eec345e
--- /dev/null
+++ b/desktop/budgie/budgie-screensaver/actions.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file http://www.gnu.org/licenses/gpl.txt
+
+from pisi.actionsapi import autotools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import get
+
+def setup():
+ autotools.configure()
+
+def build():
+ autotools.make()
+
+def install():
+ autotools.rawInstall("DESTDIR=%s" % get.installDIR())
+
+ pisitools.dodoc("COPYING*", "NEWS", "README*", "AUTHORS", "ChangeLog")
diff --git a/desktop/budgie/budgie-screensaver/files/0001-Fix-killing-gjs.patch b/desktop/budgie/budgie-screensaver/files/0001-Fix-killing-gjs.patch
new file mode 100644
index 0000000000..4c162ae3c9
--- /dev/null
+++ b/desktop/budgie/budgie-screensaver/files/0001-Fix-killing-gjs.patch
@@ -0,0 +1,93 @@
+From 1553374b9c5db3db8232738dc8fa747684b070d1 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ball=C3=B3=20Gy=C3=B6rgy?=
+Date: Fri, 30 Apr 2021 15:58:22 +0200
+Subject: [PATCH] Fix killing gjs
+
+---
+ src/gnome-screensaver.c | 22 +++++++++++-----------
+ src/gs-listener-dbus.c | 29 ++++++++++++-----------------
+ 2 files changed, 23 insertions(+), 28 deletions(-)
+
+diff --git a/src/gnome-screensaver.c b/src/gnome-screensaver.c
+index d2ccae3..96a7d49 100644
+--- a/src/gnome-screensaver.c
++++ b/src/gnome-screensaver.c
+@@ -82,17 +82,17 @@ main (int argc,
+ exit (1);
+ }
+
+- gchar** env_vars = g_get_environ(); // Get our list of environment variables
+- gchar* desktop = g_environ_getenv(env_vars, "XDG_CURRENT_DESKTOP"); // Get the current desktop value
+-
+- if (desktop != NULL) { // Got a value
+- if (!g_str_has_prefix(desktop, "Budgie")) { // Does not start with Budgie
+- g_message("Not running under Budgie, exiting.");
+- exit(1);
+- }
+- }
+-
+- g_strfreev(env_vars); // Free our environment variables
++ if (g_find_program_in_path("pkill") != NULL) { // Have pkill
++ g_spawn_command_line_sync("pkill -9 -f '/usr/bin/gjs /usr/share/gnome-shell/org.gnome.ScreenSaver'",
++ NULL,
++ NULL,
++ NULL,
++ &error);
++ if (error) {
++ g_warning("Failed to kill gjs: %s", error->message);
++ g_error_free (error);
++ }
++ }
+
+ gs_debug_init (debug, FALSE);
+ gs_debug ("initializing budgie-screensaver %s", VERSION);
+diff --git a/src/gs-listener-dbus.c b/src/gs-listener-dbus.c
+index 124d83a..f667127 100644
+--- a/src/gs-listener-dbus.c
++++ b/src/gs-listener-dbus.c
+@@ -1334,6 +1334,14 @@ gs_listener_acquire (GSListener *listener,
+ _("not connected to the message bus"));
+ return FALSE;
+ }
++ if (screensaver_is_running (listener->priv->connection)) {
++ g_set_error (error,
++ GS_LISTENER_ERROR,
++ GS_LISTENER_ERROR_ACQUISITION_FAILURE,
++ "%s",
++ _("screensaver already running in this session"));
++ return FALSE;
++ }
+
+ dbus_error_init (&buserror);
+
+@@ -1345,23 +1353,10 @@ gs_listener_acquire (GSListener *listener,
+ return FALSE;
+ }
+
+- if (g_find_program_in_path("pkill") != NULL) { // Have pkill
+- char *argv[5];
+- argv[0] = "pkill";
+- argv[1] = "-9";
+- argv[2] = "-f";
+- argv[3] = "'/usr/bin/gjs /usr/share/gnome-shell/org.gnome.ScreenSaver'";
+- argv[4] = NULL;
+-
+- g_autoptr(GError) error = NULL;
+- gboolean kill_ret = g_spawn_sync(NULL, argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, NULL, &error);
+-
+- if (!kill_ret) {
+- g_warning("Failed to kill gjs: %s", error->message);
+- }
+- }
+-
+- res = dbus_bus_request_name (listener->priv->connection, GS_SERVICE, DBUS_NAME_FLAG_REPLACE_EXISTING, &buserror);
++ res = dbus_bus_request_name (listener->priv->connection,
++ GS_SERVICE,
++ DBUS_NAME_FLAG_DO_NOT_QUEUE | DBUS_NAME_FLAG_ALLOW_REPLACEMENT,
++ &buserror);
+ if (dbus_error_is_set (&buserror)) {
+ g_set_error (error,
+ GS_LISTENER_ERROR,
+--
+2.31.1
+
diff --git a/desktop/budgie/budgie-screensaver/pspec.xml b/desktop/budgie/budgie-screensaver/pspec.xml
new file mode 100644
index 0000000000..7861f13620
--- /dev/null
+++ b/desktop/budgie/budgie-screensaver/pspec.xml
@@ -0,0 +1,69 @@
+
+
+
+
+ budgie-screensaver
+ https://github.com/solus-project/budgie-desktop
+
+ Pisi Linux Admins
+ admins@pisilinux.org
+
+ GPLv2
+ Fork of GNOME Screensaver for Budgie 10.
+ Budgie Screensaver is a fork of gnome-screensaver intended for use with Budgie Desktop and is similar in purpose to other screensavers such as MATE Screensaver.
+ https://github.com/getsolus/budgie-screensaver/releases/download/v4.0/budgie-screensaver-v4.0.tar.xz
+
+ dbus-glib-devel
+ gnome-desktop-devel
+ pam-devel
+ elogind-devel
+ gsettings-desktop-schemas-devel
+ gtk3-devel
+ libseccomp-devel
+ intltool
+ glib2-devel
+
+
+ 0001-Fix-killing-gjs.patch
+
+
+
+
+ budgie-screensaver
+
+ pam
+ dbus
+ gtk3
+ cairo
+ glib2
+ libX11
+ elogind
+ libXext
+ dbus-glib
+ gdk-pixbuf
+ libXxf86vm
+ libXxf86misc
+ gnome-desktop
+
+
+ /etc/pam.d
+ /usr/bin
+ /usr/lib
+ /usr/libexec
+ /usr/share/locale
+ /usr/share/doc
+ /usr/share/man
+ /usr/share/applications
+
+
+
+
+
+ 2021-06-05
+ 4.0
+ First release for Pisi Linux
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
diff --git a/desktop/font/adobe-source-code-pro-fonts/actions.py b/desktop/font/adobe-source-code-pro-fonts/actions.py
new file mode 100644
index 0000000000..d8962883a7
--- /dev/null
+++ b/desktop/font/adobe-source-code-pro-fonts/actions.py
@@ -0,0 +1,13 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file http://www.gnu.org/licenses/gpl.txt
+
+from pisi.actionsapi import pisitools
+
+def install():
+ pisitools.insinto("/usr/share/fonts/adobe-source-code-pro-fonts/", "OTF/*.otf")
+ pisitools.insinto("/usr/share/fonts/adobe-source-code-pro-fonts/", "VAR/*.otf")
+
+ pisitools.dodoc("LICENSE.md", "README.md")
diff --git a/desktop/font/adobe-source-code-pro-fonts/pspec.xml b/desktop/font/adobe-source-code-pro-fonts/pspec.xml
new file mode 100644
index 0000000000..27c2d1253b
--- /dev/null
+++ b/desktop/font/adobe-source-code-pro-fonts/pspec.xml
@@ -0,0 +1,34 @@
+
+
+
+
+ adobe-source-code-pro-fonts
+ http://www.gnome.org
+
+ Pisi Linux Admins
+ admins@pisilinux.org
+
+ Monospaced font family for user interface and coding environments.
+ Source Code Pro is a set of OpenType fonts that have been designed to work well in user interface (UI) environments.
+ OFL
+ https://github.com/adobe-fonts/source-code-pro/archive/refs/tags/2.038R-ro/1.058R-it/1.018R-VAR.tar.gz
+
+
+
+ adobe-source-code-pro-fonts
+
+ /usr/share/fonts
+ /usr/share/doc
+
+
+
+
+
+ 2021-06-05
+ 2.038R
+ First release for Pisi Linux.
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
diff --git a/desktop/gnome/apps/epiphany/actions.py b/desktop/gnome/apps/epiphany/actions.py
new file mode 100644
index 0000000000..85c4cc1c2a
--- /dev/null
+++ b/desktop/gnome/apps/epiphany/actions.py
@@ -0,0 +1,20 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file https://www.gnu.org/licenses/gpl-3.0.txt
+
+from pisi.actionsapi import mesontools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import shelltools
+
+def setup():
+ mesontools.configure("-Dunit_tests=disabled")
+
+def build():
+ mesontools.build()
+
+def install():
+ mesontools.install()
+
+ pisitools.dodoc("COPYING", "README.md", "CONTRIBUTING.md", "HACKING.md")
diff --git a/desktop/gnome/apps/epiphany/pspec.xml b/desktop/gnome/apps/epiphany/pspec.xml
new file mode 100644
index 0000000000..055c05629c
--- /dev/null
+++ b/desktop/gnome/apps/epiphany/pspec.xml
@@ -0,0 +1,92 @@
+
+
+
+
+ epiphany
+ https://gitlab.gnome.org/GNOME/epiphany
+
+ Pisi Linux Admins
+ admins@pisilinux.org
+
+ GPLv2
+ app:gui
+ Intuitive GNOME web browser.
+ Epiphany is a GNOME web browser based on the WebKit rendering engine.
+
+ glib2-devel
+ itstool
+ NetworkManager-devel
+ avahi-glib-devel
+ gcr-devel
+ gnome-desktop-devel
+ json-glib-devel
+ libdazzle-devel
+ libhandy-devel
+ libnotify-devel
+ libsecret-devel
+ libsoup-gnome
+ libwnck3-devel
+ libxslt-devel
+ nettle-devel
+ nss-devel
+ webkit2gtk-devel
+ libportal-devel
+ libsoup-devel
+ libarchive-devel
+ appstream-glib-devel
+ gmp-devel
+ meson
+
+ https://download.gnome.org/sources/epiphany/3.38/epiphany-3.38.5.tar.xz
+
+
+
+ epiphany
+
+ atk
+ cairo
+ gcr
+ gdk-pixbuf
+ glib2
+ gmp
+ gtk3
+ json-glib
+ libdazzle
+ libsecret
+ libsoup
+ libxml2
+ nettle
+ pango
+ sqlite
+ webkit2gtk
+ libhandy
+ libportal
+
+
+ /usr/bin
+ /usr/lib
+ /usr/libexec
+ /usr/share/applications
+ /usr/share/dbus-1
+ /usr/share/doc
+ /usr/share/epiphany
+ /usr/share/glib-2.0
+ /usr/share/gnome-shell
+ /usr/share/help
+ /usr/share/icons
+ /usr/share/locale
+ /usr/share/man
+ /usr/share/metainfo
+
+
+
+
+
+ 2021-06-07
+ 3.38.5
+ First release for Pisi Linux
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
diff --git a/desktop/gnome/apps/evolution/actions.py b/desktop/gnome/apps/evolution/actions.py
new file mode 100644
index 0000000000..1dc5ddaafc
--- /dev/null
+++ b/desktop/gnome/apps/evolution/actions.py
@@ -0,0 +1,27 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file https://www.gnu.org/licenses/gpl-3.0.txt
+# TODO: Add libchamplain (Contact Maps) support.
+
+from pisi.actionsapi import cmaketools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import get
+
+def setup():
+ cmaketools.configure("-DCMAKE_INSTALL_PREFIX=/usr \
+ -DSYSCONF_INSTALL_DIR=/etc \
+ -DENABLE_INSTALLED_TESTS=OFF \
+ -DENABLE_PST_IMPORT=OFF \
+ -DENABLE_YTNEF=OFF \
+ -DENABLE_CONTACT_MAPS=OFF \
+ -DENABLE_TEXT_HIGHLIGHT=OFF")
+
+def build():
+ cmaketools.make()
+
+def install():
+ cmaketools.rawInstall("DESTDIR=%s" % get.installDIR())
+
+ pisitools.dodoc("COPYING", "ChangeLog", "HACKING", "MAINTAINERS", "NEWS", "README.md")
diff --git a/desktop/gnome/apps/evolution/pspec.xml b/desktop/gnome/apps/evolution/pspec.xml
new file mode 100644
index 0000000000..3c31fc31c5
--- /dev/null
+++ b/desktop/gnome/apps/evolution/pspec.xml
@@ -0,0 +1,114 @@
+
+
+
+
+ evolution
+ https://gitlab.gnome.org/GNOME/evolution
+
+ Pisi Linux Admins
+ admin@pisilinux.org
+
+ LGPLv2
+ LGPLv3
+ app:gui
+ Integrated mail, addressbook and calendaring for GNOME.
+ The Evolution package contains an integrated mail, calendar and address book suite designed for the GNOME environment.
+ https://download.gnome.org/sources/evolution/3.40/evolution-3.40.1.tar.xz
+
+ gnome-desktop-devel
+ libcanberra-gtk3-devel
+ evolution-data-server-devel
+ gspell-devel
+ gnome-autoar-devel
+ libarchive-devel
+ intltool
+ itstool
+ docbook-xsl
+ NetworkManager-devel
+ yelp-tools
+ libgdata-devel
+ webkit2gtk-devel
+ enchant2-devel
+ libgweather-devel
+ libnotify-devel
+ clutter-gtk-devel
+ geoclue-devel
+ geocode-glib-devel
+ libseccomp-devel
+ openldap-client
+ cmake
+
+
+
+
+ evolution
+
+ atk
+ gcr
+ nss
+ gtk3
+ nspr
+ cairo
+ glib2
+ pango
+ gspell
+ sqlite
+ libical
+ libsoup
+ libxml2
+ enchant2
+ libnotify
+ libsecret
+ gdk-pixbuf
+ webkit2gtk
+ libcanberra
+ libgweather
+ gnome-autoar
+ gnome-desktop
+ openldap-client
+ evolution-data-server
+
+
+ /usr/bin
+ /usr/lib/evolution-data-server
+ /usr/lib/evolution
+ /usr/libexec
+ /usr/share/GConf
+ /usr/share/applications
+ /usr/share/doc
+ /usr/share/evolution
+ /usr/share/glib-2.0
+ /usr/share/icons
+ /usr/share/help
+ /usr/share/locale
+ /usr/share/man
+ /usr/share/metainfo
+
+
+
+
+ evolution-devel
+
+ evolution
+ gtk3-devel
+ glib2-devel
+ gnome-desktop-devel
+ evolution-data-server-devel
+ webkit2gtk-devel
+
+
+ /usr/include
+ /usr/lib/pkgconfig
+
+
+
+
+
+ 2021-06-05
+ 3.40.1
+ First release for Pisi Linux
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
diff --git a/desktop/gnome/base/gdm/actions.py b/desktop/gnome/base/gdm/actions.py
new file mode 100644
index 0000000000..66440430d2
--- /dev/null
+++ b/desktop/gnome/base/gdm/actions.py
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file https://www.gnu.org/licenses/gpl-3.0.txt
+
+from pisi.actionsapi import mesontools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import shelltools
+
+def setup():
+ shelltools.system("sed -i 's@systemd@elogind@' data/pam-lfs/gdm-launch-environment.pam")
+ shelltools.system("sed -i 's@-session@session @' data/pam-lfs/gdm-launch-environment.pam")
+
+ mesontools.configure("--prefix=/usr \
+ --localstatedir=/var \
+ --buildtype=release \
+ -Ddefault-pam-config=lfs \
+ -Dplymouth=disabled \
+ -Dpam-mod-dir=/lib/security \
+ -Dgdm-xsession=true \
+ -Dsystemd-journal=false \
+ -Dsystemdsystemunitdir=no \
+ -Dsystemduserunitdir=no \
+ -Dlogind-provider=elogind \
+ -Dscreenshot-dir=/var/lib/gdm/greeter")
+
+def build():
+ mesontools.build()
+
+def install():
+ mesontools.install()
+
+ pisitools.dodoc("NEWS", "README.md", "COPYING", "AUTHORS", "HACKING")
diff --git a/desktop/gnome/base/gdm/comar/package.py b/desktop/gnome/base/gdm/comar/package.py
new file mode 100644
index 0000000000..0fc996674c
--- /dev/null
+++ b/desktop/gnome/base/gdm/comar/package.py
@@ -0,0 +1,25 @@
+#!/usr/bin/python
+
+import os, re
+
+OUR_ID = 42
+OUR_NAME = "gdm"
+OUR_DESC = "GDM"
+
+def postInstall(fromVersion, fromRelease, toVersion, toRelease):
+ try:
+ os.system("groupadd -g %d %s" % (OUR_ID, OUR_NAME))
+ os.system("useradd -m -d /var/lib/gdm -r -s /bin/false -u %d -g %d %s -c %s" % (OUR_ID, OUR_ID, OUR_NAME, OUR_DESC))
+ os.system("passwd -ql %s" % (OUR_NAME))
+
+ os.system("/bin/chown gdm:gdm -R /var/lib/gdm")
+ os.system("/bin/chown root:gdm -R /var/log/gdm")
+ except:
+ pass
+
+def postRemove():
+ try:
+ os.system("userdel %s" % OUR_NAME)
+ os.system("groupdel %s" % OUR_NAME)
+ except:
+ pass
\ No newline at end of file
diff --git a/desktop/gnome/base/gdm/comar/service.py b/desktop/gnome/base/gdm/comar/service.py
new file mode 100644
index 0000000000..679c6940b1
--- /dev/null
+++ b/desktop/gnome/base/gdm/comar/service.py
@@ -0,0 +1,34 @@
+#!/usr/bin/python
+#-*- coding: UTF-8 -*-
+
+from comar.service import *
+import os
+
+serviceType = "server"
+serviceDesc = _({
+ "en": "GNOME Desktop",
+ "tr": "GNOME Masaüstü",
+})
+serviceDefault="on"
+PIDFILE="/var/run/gdm/gdm.pid"
+DAEMON="/usr/sbin/gdm"
+
+@synchronized
+def start():
+ startService(command=DAEMON,
+ pidfile=PIDFILE,
+ detach=True,
+ donotify=True)
+
+@synchronized
+def stop():
+ stopService(pidfile=PIDFILE,
+ donotify=True)
+
+ try:
+ os.unlink(PIDFILE)
+ except OSError:
+ pass
+
+def status():
+ return isServiceRunning(PIDFILE)
diff --git a/desktop/gnome/base/gdm/files/0000-Force-Xorg-use-on-the-login-screen.patch b/desktop/gnome/base/gdm/files/0000-Force-Xorg-use-on-the-login-screen.patch
new file mode 100644
index 0000000000..7f135e07dd
--- /dev/null
+++ b/desktop/gnome/base/gdm/files/0000-Force-Xorg-use-on-the-login-screen.patch
@@ -0,0 +1,25 @@
+From 1c8fc3f30630dec1526979d190c280902712b99d Mon Sep 17 00:00:00 2001
+From: Joshua Strobl
+Date: Wed, 17 Apr 2019 12:50:33 +0300
+Subject: [PATCH 1/1] Force Xorg use on the login screen
+
+---
+ data/gdm.conf-custom.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/data/gdm.conf-custom.in b/data/gdm.conf-custom.in
+index 9b63ba95..4f220684 100644
+--- a/data/gdm.conf-custom.in
++++ b/data/gdm.conf-custom.in
+@@ -2,7 +2,7 @@
+
+ [daemon]
+ # Uncomment the line below to force the login screen to use Xorg
+-#WaylandEnable=false
++WaylandEnable=false
+
+ [security]
+
+--
+2.21.0
+
diff --git a/desktop/gnome/base/gdm/files/0001-pam-arch-Update-to-match-pambase-20200721.1-2.patch b/desktop/gnome/base/gdm/files/0001-pam-arch-Update-to-match-pambase-20200721.1-2.patch
new file mode 100644
index 0000000000..9f4cce14fc
--- /dev/null
+++ b/desktop/gnome/base/gdm/files/0001-pam-arch-Update-to-match-pambase-20200721.1-2.patch
@@ -0,0 +1,216 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: "Jan Alexander Steffens (heftig)"
+Date: Tue, 27 Oct 2020 18:59:14 +0000
+Subject: [PATCH] pam-arch: Update to match pambase 20200721.1-2
+
+Update the PAM files for Arch Linux. This has been applied downstream
+since Aug 2020.
+
+https://bugs.archlinux.org/task/67485
+---
+ data/meson.build | 1 -
+ data/pam-arch/gdm-autologin.pam | 22 +++++++++--------
+ data/pam-arch/gdm-fingerprint.pam | 31 +++++++++++++++---------
+ data/pam-arch/gdm-launch-environment.pam | 24 ++++++++++--------
+ data/pam-arch/gdm-password.pam | 17 +++++++------
+ data/pam-arch/gdm-pin.pam | 13 ----------
+ data/pam-arch/gdm-smartcard.pam | 31 +++++++++++++++---------
+ 7 files changed, 75 insertions(+), 64 deletions(-)
+ delete mode 100644 data/pam-arch/gdm-pin.pam
+
+diff --git a/data/meson.build b/data/meson.build
+index 23e2d7f9..7c5222ea 100644
+--- a/data/meson.build
++++ b/data/meson.build
+@@ -134,7 +134,6 @@ pam_data_files_map = {
+ 'gdm-fingerprint',
+ 'gdm-smartcard',
+ 'gdm-password',
+- 'gdm-pin',
+ ],
+ 'none': [],
+ # We should no longer have 'autodetect' at this point
+diff --git a/data/pam-arch/gdm-autologin.pam b/data/pam-arch/gdm-autologin.pam
+index 99b14209..30bdf529 100644
+--- a/data/pam-arch/gdm-autologin.pam
++++ b/data/pam-arch/gdm-autologin.pam
+@@ -1,13 +1,15 @@
+-auth requisite pam_nologin.so
+-auth required pam_env.so
+-auth optional pam_gdm.so
+-auth optional pam_gnome_keyring.so
+-auth optional pam_permit.so
++#%PAM-1.0
+
+-account include system-local-login
++auth required pam_shells.so
++auth requisite pam_nologin.so
++auth optional pam_permit.so
++auth required pam_env.so
++auth [success=ok default=1] pam_gdm.so
++auth optional pam_gnome_keyring.so
+
+-password include system-local-login
++account include system-local-login
+
+-session optional pam_keyinit.so force revoke
+-session include system-local-login
+-session optional pam_gnome_keyring.so auto_start
++password required pam_deny.so
++
++session include system-local-login
++session optional pam_gnome_keyring.so auto_start
+diff --git a/data/pam-arch/gdm-fingerprint.pam b/data/pam-arch/gdm-fingerprint.pam
+index a4808617..cc660d9a 100644
+--- a/data/pam-arch/gdm-fingerprint.pam
++++ b/data/pam-arch/gdm-fingerprint.pam
+@@ -1,14 +1,23 @@
+-auth required pam_tally.so onerr=succeed file=/var/log/faillog
+-auth required pam_shells.so
+-auth requisite pam_nologin.so
+-auth required pam_env.so
+-auth required pam_fprintd.so
+-auth optional pam_permit.so
++#%PAM-1.0
+
+-account include system-local-login
++auth required pam_shells.so
++auth requisite pam_nologin.so
++auth required pam_faillock.so preauth
++# Optionally use requisite above if you do not want to prompt for the fingerprint
++# on locked accounts.
++auth [success=1 default=ignore] pam_fprintd.so
++auth [default=die] pam_faillock.so authfail
++auth optional pam_permit.so
++auth required pam_env.so
++auth required pam_faillock.so authsucc
++# If you drop the above call to pam_faillock.so the lock will be done also
++# on non-consecutive authentication failures.
++auth [success=ok default=1] pam_gdm.so
++auth optional pam_gnome_keyring.so
+
+-password required pam_fprintd.so
+-password optional pam_permit.so
++account include system-local-login
+
+-session optional pam_keyinit.so force revoke
+-session include system-local-login
++password required pam_deny.so
++
++session include system-local-login
++session optional pam_gnome_keyring.so auto_start
+diff --git a/data/pam-arch/gdm-launch-environment.pam b/data/pam-arch/gdm-launch-environment.pam
+index d59c9cb9..20d1810a 100644
+--- a/data/pam-arch/gdm-launch-environment.pam
++++ b/data/pam-arch/gdm-launch-environment.pam
+@@ -1,13 +1,17 @@
+-auth required pam_env.so
+-auth required pam_succeed_if.so audit quiet_success user = gdm
+-auth optional pam_permit.so
++#%PAM-1.0
+
+-account required pam_succeed_if.so audit quiet_success user = gdm
+-account optional pam_permit.so
++auth required pam_succeed_if.so audit quiet_success user in gdm:gnome-initial-setup
++auth optional pam_permit.so
++auth required pam_env.so
+
+-password required pam_deny.so
++account required pam_succeed_if.so audit quiet_success user in gdm:gnome-initial-setup
++account optional pam_permit.so
+
+-session optional pam_keyinit.so force revoke
+-session required pam_succeed_if.so audit quiet_success user = gdm
+-session required pam_systemd.so
+-session optional pam_permit.so
++password required pam_deny.so
++
++session optional pam_loginuid.so
++session optional pam_keyinit.so force revoke
++session required pam_succeed_if.so audit quiet_success user in gdm:gnome-initial-setup
++session optional pam_permit.so
++-session optional pam_systemd.so
++session required pam_env.so user_readenv=1
+diff --git a/data/pam-arch/gdm-password.pam b/data/pam-arch/gdm-password.pam
+index 8d34794e..137242a6 100644
+--- a/data/pam-arch/gdm-password.pam
++++ b/data/pam-arch/gdm-password.pam
+@@ -1,11 +1,12 @@
+-auth include system-local-login
+-auth optional pam_gnome_keyring.so
++#%PAM-1.0
+
+-account include system-local-login
++auth include system-local-login
++auth optional pam_gnome_keyring.so
+
+-password include system-local-login
+-password optional pam_gnome_keyring.so use_authtok
++account include system-local-login
+
+-session optional pam_keyinit.so force revoke
+-session include system-local-login
+-session optional pam_gnome_keyring.so auto_start
++password include system-local-login
++password optional pam_gnome_keyring.so use_authtok
++
++session include system-local-login
++session optional pam_gnome_keyring.so auto_start
+diff --git a/data/pam-arch/gdm-pin.pam b/data/pam-arch/gdm-pin.pam
+deleted file mode 100644
+index 135e205e..00000000
+--- a/data/pam-arch/gdm-pin.pam
++++ /dev/null
+@@ -1,13 +0,0 @@
+-auth requisite pam_pin.so
+-auth include system-local-login
+-auth optional pam_gnome_keyring.so
+-
+-account include system-local-login
+-
+-password include system-local-login
+-password optional pam_pin.so
+-password optional pam_gnome_keyring.so use_authtok
+-
+-session optional pam_keyinit.so force revoke
+-session include system-local-login
+-session optional pam_gnome_keyring.so auto_start
+diff --git a/data/pam-arch/gdm-smartcard.pam b/data/pam-arch/gdm-smartcard.pam
+index ec6f75d5..e6ec1299 100644
+--- a/data/pam-arch/gdm-smartcard.pam
++++ b/data/pam-arch/gdm-smartcard.pam
+@@ -1,14 +1,23 @@
+-auth required pam_tally.so onerr=succeed file=/var/log/faillog
+-auth required pam_shells.so
+-auth requisite pam_nologin.so
+-auth required pam_env.so
+-auth required pam_pkcs11.so wait_for_card card_only
+-auth optional pam_permit.so
++#%PAM-1.0
+
+-account include system-local-login
++auth required pam_shells.so
++auth requisite pam_nologin.so
++auth required pam_faillock.so preauth
++# Optionally use requisite above if you do not want to prompt for the smartcard
++# on locked accounts.
++auth [success=1 default=ignore] pam_pkcs11.so wait_for_card card_only
++auth [default=die] pam_faillock.so authfail
++auth optional pam_permit.so
++auth required pam_env.so
++auth required pam_faillock.so authsucc
++# If you drop the above call to pam_faillock.so the lock will be done also
++# on non-consecutive authentication failures.
++auth [success=ok default=1] pam_gdm.so
++auth optional pam_gnome_keyring.so
+
+-password required pam_pkcs11.so
+-password optional pam_permit.so
++account include system-local-login
+
+-session optional pam_keyinit.so force revoke
+-session include system-local-login
++password required pam_deny.so
++
++session include system-local-login
++session optional pam_gnome_keyring.so auto_start
diff --git a/desktop/gnome/base/gdm/files/0002-Xsession-Don-t-start-ssh-agent-by-default.patch b/desktop/gnome/base/gdm/files/0002-Xsession-Don-t-start-ssh-agent-by-default.patch
new file mode 100644
index 0000000000..568eb2c568
--- /dev/null
+++ b/desktop/gnome/base/gdm/files/0002-Xsession-Don-t-start-ssh-agent-by-default.patch
@@ -0,0 +1,28 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: "Jan Alexander Steffens (heftig)"
+Date: Sat, 20 Jun 2015 17:22:38 +0200
+Subject: [PATCH] Xsession: Don't start ssh-agent by default
+
+---
+ data/Xsession.in | 8 --------
+ 1 file changed, 8 deletions(-)
+
+diff --git a/data/Xsession.in b/data/Xsession.in
+index 2e4de4fe..29ebc30e 100755
+--- a/data/Xsession.in
++++ b/data/Xsession.in
+@@ -207,14 +207,6 @@ if [ "x$command" = "xdefault" ] ; then
+ fi
+ fi
+
+-# add ssh-agent if found
+-sshagent="`gdmwhich ssh-agent`"
+-if [ -n "$sshagent" ] && [ -x "$sshagent" ] && [ -z "$SSH_AUTH_SOCK" ]; then
+- command="$sshagent -- $command"
+-elif [ -z "$sshagent" ] ; then
+- echo "$0: ssh-agent not found!"
+-fi
+-
+ echo "$0: Setup done, will execute: $command"
+
+ eval exec $command
diff --git a/desktop/gnome/base/gdm/files/0003-enable-elogind-build.patch b/desktop/gnome/base/gdm/files/0003-enable-elogind-build.patch
new file mode 100644
index 0000000000..b190a44595
--- /dev/null
+++ b/desktop/gnome/base/gdm/files/0003-enable-elogind-build.patch
@@ -0,0 +1,215 @@
+From a8bb1878df6a98798c66b87bbc555bc9f55fcec6 Mon Sep 17 00:00:00 2001
+From: Dudemanguy
+Date: Tue, 27 Oct 2020 18:00:24 -0500
+Subject: [PATCH] enable elogind build
+
+---
+ common/meson.build | 2 +-
+ data/meson.build | 62 ++++++++++++++----------
+ data/pam-arch/gdm-launch-environment.pam | 1 +
+ libgdm/meson.build | 2 +-
+ meson.build | 36 +++++++++-----
+ meson_options.txt | 5 +-
+ 6 files changed, 66 insertions(+), 42 deletions(-)
+
+diff --git a/common/meson.build b/common/meson.build
+index 074dd92e..bca58f7c 100644
+--- a/common/meson.build
++++ b/common/meson.build
+@@ -11,7 +11,7 @@ libgdmcommon_src = files(
+ )
+
+ libgdmcommon_deps = [
+- libsystemd_dep,
++ logind_dep,
+ gobject_dep,
+ gio_dep,
+ gio_unix_dep,
+diff --git a/data/meson.build b/data/meson.build
+index 5d9e2847..56074489 100644
+--- a/data/meson.build
++++ b/data/meson.build
+@@ -169,41 +169,53 @@ else
+ service_config.set('PLYMOUTH_QUIT_SERVICE', '')
+ endif
+
+-if get_option('systemdsystemunitdir') != ''
+- systemd_systemunitdir = get_option('systemdsystemunitdir')
+-else
+- systemd_systemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir')
++systemdsystemunitdir = get_option('systemdsystemunitdir')
++if systemdsystemunitdir != 'no'
++ assert(systemd_dep.found(), 'systemd required but not found, please provide a valid systemd system unit dir or disable it')
++ if get_option('systemdsystemunitdir') != ''
++ systemd_systemunitdir = get_option('systemdsystemunitdir')
++ else
++ systemd_systemunitdir = systemd_dep.get_pkgconfig_variable('systemdsystemunitdir')
++ endif
+ endif
+
+-if get_option('systemduserunitdir') != ''
+- systemd_userunitdir = get_option('systemduserunitdir')
+-else
+- systemd_userunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir',
+- define_variable: ['prefix', get_option('prefix')])
++systemduserunitdir = get_option('systemduserunitdir')
++if systemduserunitdir != 'no'
++ assert(systemd_dep.found(), 'systemd required but not found, please provide a valid systemd user unit dir or disable it')
++ if get_option('systemduserunitdir') != ''
++ systemd_userunitdir = get_option('systemduserunitdir')
++ else
++ systemd_userunitdir = systemd_dep.get_pkgconfig_variable('systemduserunitdir',
++ define_variable: ['prefix', get_option('prefix')])
++ endif
+ endif
+
+-configure_file(
+- input: 'gdm.service.in',
+- output: '@BASENAME@',
+- configuration: service_config,
+- install_dir: systemd_systemunitdir,
+- format: 'cmake'
+-)
++if systemdsystemunitdir != 'no'
++ configure_file(
++ input: 'gdm.service.in',
++ output: '@BASENAME@',
++ configuration: service_config,
++ install_dir: systemd_systemunitdir,
++ format: 'cmake'
++ )
++endif
+
+ gdm_gnome_session_wanted_targets = []
+ foreach component: gdm_gnome_user_session_wanted_components
+ gdm_gnome_session_wanted_targets += 'Wants=@0@.target'.format(component)
+ endforeach
+
+-configure_file(
+- input: 'session.conf.in',
+- output: 'session.conf',
+- configuration: {
+- 'requires_component': gdm_gnome_shell_component,
+- 'wants_required_components': '\n'.join(gdm_gnome_session_wanted_targets),
+- },
+- install_dir: systemd_userunitdir / 'gnome-session@gnome-login.target.d',
+-)
++if systemduserunitdir != 'no'
++ configure_file(
++ input: 'session.conf.in',
++ output: 'session.conf',
++ configuration: {
++ 'requires_component': gdm_gnome_shell_component,
++ 'wants_required_components': '\n'.join(gdm_gnome_session_wanted_targets),
++ },
++ install_dir: systemd_userunitdir / 'gnome-session@gnome-login.target.d',
++ )
++endif
+
+ # XSession
+ if get_option('gdm-xsession')
+diff --git a/data/pam-arch/gdm-launch-environment.pam b/data/pam-arch/gdm-launch-environment.pam
+index 20d1810a..d8910d0a 100644
+--- a/data/pam-arch/gdm-launch-environment.pam
++++ b/data/pam-arch/gdm-launch-environment.pam
+@@ -14,4 +14,5 @@ session optional pam_keyinit.so force revoke
+ session required pam_succeed_if.so audit quiet_success user in gdm:gnome-initial-setup
+ session optional pam_permit.so
+ -session optional pam_systemd.so
++-session optional pam_elogind.so
+ session required pam_env.so user_readenv=1
+diff --git a/libgdm/meson.build b/libgdm/meson.build
+index 3f8cafbb..83e95151 100644
+--- a/libgdm/meson.build
++++ b/libgdm/meson.build
+@@ -56,7 +56,7 @@ libgdm_deps = [
+ glib_dep,
+ gio_dep,
+ gio_unix_dep,
+- libsystemd_dep,
++ logind_dep,
+ libgdmcommon_dep,
+ ]
+
+diff --git a/meson.build b/meson.build
+index a729792c..e152c6ca 100644
+--- a/meson.build
++++ b/meson.build
+@@ -93,21 +93,30 @@ xdmcp_dep = cc.find_library('Xdmcp', required: get_option('xdmcp'))
+ if xdmcp_dep.found() and get_option('tcp-wrappers')
+ libwrap_dep = cc.find_library('libwrap')
+ endif
+-# systemd
+-systemd_dep = dependency('systemd')
+-libsystemd_dep = dependency('libsystemd')
+-if meson.version().version_compare('>= 0.53')
+- systemd_multiseat_x = find_program('systemd-multi-seat-x',
+- required: false,
+- dirs: [
+- systemd_dep.get_pkgconfig_variable('systemdutildir'),
+- '/lib/systemd',
+- '/usr/lib/systemd',
+- ])
++
++logind_provider = get_option('logind-provider')
++systemd_dep = dependency('systemd', required: false)
++if logind_provider == 'systemd'
++ libsystemd_dep = dependency('libsystemd')
++ logind_dep = libsystemd_dep
++ if meson.version().version_compare('>= 0.53')
++ systemd_multiseat_x = find_program('systemd-multi-seat-x',
++ required: false,
++ dirs: [
++ systemd_dep.get_pkgconfig_variable('systemdutildir'),
++ '/lib/systemd',
++ '/usr/lib/systemd',
++ ])
++ else
++ systemd_multiseat_x = find_program('systemd-multi-seat-x', required: false)
++ endif
++ systemd_x_server = systemd_multiseat_x.found()? systemd_multiseat_x.path() : '/lib/systemd/systemd-multi-seat-x'
+ else
+- systemd_multiseat_x = find_program('systemd-multi-seat-x', required: false)
++ elogind_dep = dependency('libelogind')
++ logind_dep = elogind_dep
++ systemd_x_server = 'disabled'
+ endif
+-systemd_x_server = systemd_multiseat_x.found()? systemd_multiseat_x.path() : '/lib/systemd/systemd-multi-seat-x'
++
+ # Plymouth
+ plymouth_dep = dependency('ply-boot-client', required: get_option('plymouth'))
+ # Check for Solaris auditing API (ADT)
+@@ -314,6 +323,7 @@ summary({
+ 'PAM Syslog': have_pam_syslog,
+ 'Supports PAM Extensions': pam_extensions_supported,
+ 'SeLinux': libselinux_dep.found(),
++ 'Logind Provider': get_option('logind-provider'),
+ 'Use GDM Xsession': get_option('gdm-xsession'),
+ 'Use UserDisplayServer': get_option('user-display-server'),
+ 'Use SystemdJournal': get_option('systemd-journal'),
+diff --git a/meson_options.txt b/meson_options.txt
+index 49550bc1..b01676da 100644
+--- a/meson_options.txt
++++ b/meson_options.txt
+@@ -13,6 +13,7 @@ option('initial-vt', type: 'integer', value: 1, description: 'Initial virtual te
+ option('ipv6', type: 'boolean', value: false, description: 'Enables compilation of IPv6 code.')
+ option('lang-file', type: 'string', value: '', description: 'File containing default language settings.')
+ option('libaudit', type: 'feature', value: 'auto', description: 'Add Linux audit support.')
++option('logind-provider', type: 'combo', choices: ['systemd', 'elogind'], value: 'systemd', description: 'Which logind library to use.')
+ option('log-dir', type: 'string', value: '/var/log/gdm', description: 'Log directory.')
+ option('pam-mod-dir', type: 'string', value: '', description: 'Directory to install PAM modules in.')
+ option('pam-prefix', type: 'string', value: '', description: 'Specify where PAM files go.')
+@@ -28,8 +29,8 @@ option('solaris', type: 'boolean', value: false, description: 'Build for Solaris
+ option('split-authentication', type: 'boolean', value: true, description: 'Enable multiple simultaneous PAM conversations during login.')
+ option('sysconfsubdir', type: 'string', value: 'gdm', description: 'Directory name used under sysconfdir.')
+ option('systemd-journal', type: 'boolean', value: true, description: 'Use journald support.')
+-option('systemdsystemunitdir', type: 'string', value: '', description: 'Directory for systemd service files.')
+-option('systemduserunitdir', type: 'string', value: '', description: 'Directory for systemd user service files.')
++option('systemdsystemunitdir', type: 'string', value: '', description: 'Directory for systemd service files, or \'no\' to disable.')
++option('systemduserunitdir', type: 'string', value: '', description: 'Directory for systemd user service files, or \'no\' to disable.')
+ option('tcp-wrappers', type: 'boolean', value: false, description: 'Use TCP wrappers.')
+ option('udev-dir', type: 'string', value: '', description: 'Directory for udev rules file.')
+ option('user', type: 'string', value: 'gdm', description: 'GDM\'s username.')
+--
+2.29.1
+
diff --git a/desktop/gnome/base/gdm/files/0004-gdm-CanGraphical-wait-meson.patch b/desktop/gnome/base/gdm/files/0004-gdm-CanGraphical-wait-meson.patch
new file mode 100644
index 0000000000..da1ce2b265
--- /dev/null
+++ b/desktop/gnome/base/gdm/files/0004-gdm-CanGraphical-wait-meson.patch
@@ -0,0 +1,160 @@
+--- a/meson.build 2021-03-21 16:32:37.222883748 +0100
++++ b/meson.build 2021-03-21 16:32:42.114763457 +0100
+@@ -38,6 +38,7 @@
+
+ # Dependencies
+ udev_dep = dependency('udev')
++gudev_dep = dependency('gudev-1.0')
+
+ glib_min_version = '2.56.0'
+
+
+--- a/data/meson.build 2021-03-21 16:07:53.023644342 +0100
++++ b/data/meson.build 2021-03-21 16:09:14.557724574 +0100
+@@ -161,6 +161,7 @@
+ # DBus service files
+ service_config = configuration_data()
+ service_config.set('sbindir', gdm_prefix / get_option('sbindir'))
++service_config.set('libexecdir', gdm_prefix / get_option('libexecdir'))
+ service_config.set('GDM_INITIAL_VT', get_option('initial-vt'))
+ service_config.set('LANG_CONFIG_FILE', lang_config_file)
+ if plymouth_dep.found()
+
+--- a/data/gdm.service.in
++++ b/data/gdm.service.in
+@@ -30,6 +30,7 @@ StandardError=inherit
+ EnvironmentFile=-@LANG_CONFIG_FILE@
+ ExecReload=/bin/kill -SIGHUP $MAINPID
+ KeyringMode=shared
++ExecStartPre=@libexecdir@/gdm-wait-for-drm
+
+ [Install]
+ Alias=display-manager.service
+
+--- a/utils/meson.build.ori 2021-03-21 16:15:47.036216779 +0100
++++ b/utils/meson.build 2021-03-21 16:15:25.328751199 +0100
+@@ -39,3 +39,16 @@
+ install_dir: get_option('libexecdir'),
+ )
+
++# gdm-wait-for-drm
++gdm_wait_for_drm_deps = [
++ glib_dep,
++ gudev_dep
++]
++
++gdm_wait_for_drm = executable('gdm-wait-for-drm',
++ 'gdm-wait-for-drm.c',
++ dependencies: gdm_wait_for_drm_deps,
++ include_directories: config_h_dir,
++ install: true,
++ install_dir: get_option('libexecdir'),
++)
+
+--- /dev/null
++++ b/utils/gdm-wait-for-drm.c
+@@ -0,0 +1,101 @@
++#include
++#include
++
++/*
++ * Workaround for LP: #1794280.
++ *
++ * That bug is because the DRM device isn't ready by the time GDM tries to
++ * start wayland/X.
++ * This is a script to add to ExecStartPre of gdm.service. It does the
++ * following:
++ *
++ * 1. Enumerate drm devices from udev, looking for a DRM master. If found,
++ * exit.
++ * 2. Connect to the 'uevent' signal of gudev, watching for the same to be
++ * added. Again exit if any are found.
++ * 3. If, after 10 seconds, we haven't seen anything, try to proceed anyway as
++ * a failsafe.
++ */
++
++static gboolean
++handle_device (GUdevDevice *device)
++{
++ const gchar * const * tags;
++ tags = g_udev_device_get_tags (device);
++ g_debug ("%s\n", g_udev_device_get_name (device));
++ if (g_strv_contains (tags, "master-of-seat"))
++ {
++ g_debug (" is seat master\n");
++ return TRUE;
++ }
++
++ return FALSE;
++}
++
++static void
++uevent_cb (GUdevClient *client G_GNUC_UNUSED,
++ gchar *action,
++ GUdevDevice *device,
++ gpointer user_data)
++{
++ GMainLoop *loop;
++
++ g_debug ("uevent action: %s\n", action);
++
++ loop = (GMainLoop *) user_data;
++
++ if (g_strcmp0 (action, "add") == 0)
++ {
++ if (handle_device (device))
++ {
++ g_debug (" this is good\n");
++ g_main_loop_quit (loop);
++ }
++ else
++ {
++ g_debug (" this is bad\n");
++ }
++ }
++}
++
++int
++main()
++{
++ const gchar * const subsystems[] = { "drm", NULL };
++
++ g_autoptr(GList) devices = NULL;
++ g_autoptr(GMainLoop) loop = NULL;
++ g_autoptr(GUdevClient) udev_client = NULL;
++ g_autoptr(GUdevEnumerator) enumerator = NULL;
++
++ loop = g_main_loop_new (NULL, FALSE);
++
++ udev_client = g_udev_client_new (subsystems);
++ enumerator = g_udev_enumerator_new (udev_client);
++ g_udev_enumerator_add_match_is_initialized (enumerator);
++ g_udev_enumerator_add_match_subsystem (enumerator, "drm");
++
++ devices = g_udev_enumerator_execute (enumerator);
++
++ g_debug ("enumerating devices...\n");
++
++ for (GList *l = devices; l != NULL; l = l->next)
++ {
++ g_autoptr(GUdevDevice) device = G_UDEV_DEVICE (l->data);
++
++ if (handle_device (device))
++ {
++ g_debug (" good enough for gdm\n");
++ return EXIT_SUCCESS;
++ }
++ }
++
++ g_signal_connect (udev_client, "uevent", G_CALLBACK (uevent_cb), loop);
++
++ /* after 10 seconds we try anyway */
++ g_timeout_add_seconds (10, (GSourceFunc) g_main_loop_quit, loop);
++
++ g_main_loop_run (loop);
++
++ return EXIT_SUCCESS;
++}
+--
+2.17.0
+
diff --git a/desktop/gnome/base/gdm/files/Xsession b/desktop/gnome/base/gdm/files/Xsession
new file mode 100644
index 0000000000..d5726cfcd2
--- /dev/null
+++ b/desktop/gnome/base/gdm/files/Xsession
@@ -0,0 +1,2 @@
+#!/bin/sh
+exec $@
diff --git a/desktop/gnome/base/gdm/files/gdm.sysusers b/desktop/gnome/base/gdm/files/gdm.sysusers
new file mode 100644
index 0000000000..a40ab96820
--- /dev/null
+++ b/desktop/gnome/base/gdm/files/gdm.sysusers
@@ -0,0 +1,2 @@
+g gdm 42 -
+u gdm 42 "GDM" /var/lib/gdm
\ No newline at end of file
diff --git a/desktop/gnome/base/gdm/files/gdm.tmpfiles b/desktop/gnome/base/gdm/files/gdm.tmpfiles
new file mode 100644
index 0000000000..a5ef733357
--- /dev/null
+++ b/desktop/gnome/base/gdm/files/gdm.tmpfiles
@@ -0,0 +1,15 @@
+d /var/cache/gdm 0755 gdm gdm
+d /var/lib/gdm 0755 gdm gdm
+d /var/lib/gdm/.local/share/applications 0755 gdm gdm
+d /run/gdm/greeter 0755 gdm gdm
+d /var/log/gdm 0755 - -
+
+d /var/lib/gdm/.config 0755 gdm gdm
+d /var/lib/gdm/.cache 0755 gdm gdm
+d /var/lib/gdm/.local 0755 gdm gdm
+d /var/lib/gdm/.local/share 0755 gdm gdm
+d /var/lib/gdm/.local/share/applications 0755 gdm gdm
+
+
+d /var/lib/gdm/.config/pulse 0755 gdm gdm
+C /var/lib/gdm/.config/pulse/client.conf - gdm gdm -
diff --git a/desktop/gnome/base/gdm/pspec.xml b/desktop/gnome/base/gdm/pspec.xml
new file mode 100644
index 0000000000..53b06d3546
--- /dev/null
+++ b/desktop/gnome/base/gdm/pspec.xml
@@ -0,0 +1,117 @@
+
+
+
+
+ gdm
+ https://gitlab.gnome.org/GNOME/gdm
+
+ Pisi Linux Admins
+ admins@pisilinux.org
+
+ GPLv2
+ GNOME Graphical Display Manager
+ A graphical login manager for your desktop, integrated within the GNOME desktop environment
+ https://download.gnome.org/sources/gdm/40/gdm-40.0.tar.xz
+
+ dconf-devel
+ gettext-devel
+ itstool
+ accountsservice-devel
+ elogind-devel
+ glib2-devel
+ gtk3-devel
+ iso-codes-devel
+ libSM-devel
+ libcanberra-devel
+ libcanberra-gtk3-devel
+ nss-devel
+ pam-devel
+ audit-devel
+ upower-devel
+ libdaemon-devel
+ gobject-introspection-devel
+ meson
+
+
+ 0000-Force-Xorg-use-on-the-login-screen.patch
+ 0001-pam-arch-Update-to-match-pambase-20200721.1-2.patch
+ 0002-Xsession-Don-t-start-ssh-agent-by-default.patch
+ 0003-enable-elogind-build.patch
+ 0004-gdm-CanGraphical-wait-meson.patch
+
+
+
+
+ gdm
+
+ lxdm
+ sddm
+ lightdm
+
+
+ pam
+ gtk3
+ glib2
+ libX11
+ libXau
+ libxcb
+ elogind
+ libXdmcp
+ gdk-pixbuf
+ libcanberra
+ accountsservice
+ libcanberra-gtk3
+ audit
+ keyutils
+ libgudev
+
+
+ /etc
+ /lib
+ /usr/bin
+ /usr/lib/girepository-1.0
+ /usr/lib/sysusers.d
+ /usr/lib/libgdm.so*
+ /usr/libexec
+ /usr/sbin
+ /usr/share/dconf
+ /usr/share/doc
+ /usr/share/gdm
+ /usr/share/glib-2.0
+ /usr/share/gnome-session
+ /usr/share/help
+ /usr/share/locale
+
+
+ gdm.sysusers
+
+
+ System.Service
+ System.Package
+
+
+
+
+ gdm-devel
+
+ gdm
+ glib2-devel
+ elogind-devel
+
+
+ /usr/include
+ /usr/lib/pkgconfig
+ /usr/share/gir-1.0
+
+
+
+
+
+ 2021-06-05
+ 40.0
+ First release for Pisi Linux
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
\ No newline at end of file
diff --git a/desktop/gnome/base/gdm/translations.xml b/desktop/gnome/base/gdm/translations.xml
new file mode 100644
index 0000000000..4c58d07589
--- /dev/null
+++ b/desktop/gnome/base/gdm/translations.xml
@@ -0,0 +1,8 @@
+
+
+
+ gdm
+ GNOME ekran yöneticisi
+ GDM, yerel veya uzak makinelerde farklı oturumlar açmayı sağlar.
+
+
\ No newline at end of file
diff --git a/desktop/gnome/base/gnome-initial-setup/actions.py b/desktop/gnome/base/gnome-initial-setup/actions.py
new file mode 100644
index 0000000000..7b4bbafdae
--- /dev/null
+++ b/desktop/gnome/base/gnome-initial-setup/actions.py
@@ -0,0 +1,24 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file http://www.gnu.org/licenses/gpl.txt
+
+from pisi.actionsapi import autotools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import shelltools
+from pisi.actionsapi import mesontools
+from pisi.actionsapi import get
+
+def setup():
+ mesontools.configure("-Dsoftware-sources=disabled \
+ -Dparental_controls=disabled \
+ -Dsystemd=false")
+
+def build():
+ mesontools.build()
+
+def install():
+ mesontools.install()
+
+ pisitools.dodoc("COPYING", "NEWS", "README*")
diff --git a/desktop/gnome/base/gnome-initial-setup/pspec.xml b/desktop/gnome/base/gnome-initial-setup/pspec.xml
new file mode 100644
index 0000000000..fff481185a
--- /dev/null
+++ b/desktop/gnome/base/gnome-initial-setup/pspec.xml
@@ -0,0 +1,93 @@
+
+
+
+
+ gnome-initial-setup
+ https://gitlab.gnome.org/GNOME/gnome-initial-setup
+
+ Pisi Linux Admins
+ admins@pisilinux.org
+
+ GPLv2
+ GNOME Initial Setup application.
+ After acquiring or installing a new system there are a few essential things to set up before use. gnome-initial-setup aims to provide a simple, easy, and safe way to prepare a new system.
+ https://download.gnome.org/sources/gnome-initial-setup/40/gnome-initial-setup-40.1.tar.xz
+
+ glib2-devel
+ gettext-devel
+ NetworkManager-devel
+ accountsservice-devel
+ gnome-desktop-devel
+ cheese-devel
+ libgweather-devel
+ webkit2gtk-devel
+ gnome-online-accounts-devel
+ gdm-devel
+ libpwquality-devel
+ vala-devel
+ mit-kerberos
+ libnma-devel
+ polkit-devel
+ librest-devel
+ libsecret-devel
+ ibus-devel
+ iso-codes-devel
+ geoclue-devel
+ pango-devel
+ meson
+ gnome-desktop-devel
+ libseccomp-devel
+ e2fsprogs-devel
+
+
+
+
+ gnome-initial-setup
+
+ gdm
+ gtk3
+ ibus
+ cairo
+ glib2
+ pango
+ cheese
+ libnma
+ polkit
+ geoclue
+ librest
+ json-glib
+ libsecret
+ fontconfig
+ gdk-pixbuf
+ webkit2gtk
+ libgweather
+ libpwquality
+ mit-kerberos
+ gnome-desktop
+ NetworkManager
+ accountsservice
+ gnome-online-accounts
+
+
+ /etc
+ /usr/libexec/gnome-initial-setup*
+ /usr/share/applications
+ /usr/share/gnome-session
+ /usr/share/gnome-shell
+ /usr/share/polkit-1
+ /usr/share/doc
+ /usr/share/glib-2.0
+ /usr/share/locale
+
+
+
+
+
+ 2021-04-21
+ 40.1
+ First release.
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
diff --git a/desktop/gnome/base/gnome-online-miners/actions.py b/desktop/gnome/base/gnome-online-miners/actions.py
new file mode 100644
index 0000000000..c743dc22ad
--- /dev/null
+++ b/desktop/gnome/base/gnome-online-miners/actions.py
@@ -0,0 +1,31 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file http://www.gnu.org/licenses/gpl.txt
+#
+# TODO: Add libzapojit (Hotmail&Skydrive) support.
+
+from pisi.actionsapi import autotools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import shelltools
+from pisi.actionsapi import get
+
+def setup():
+ shelltools.export("TRACKER_LIBS","-ltracker-sparql-3.0")
+ shelltools.export("TRACKER_CFLAGS","-I/usr/include/tracker-3.0")
+
+ autotools.autoreconf("-fi")
+ autotools.configure("--disable-silent-rules \
+ --disable-static \
+ --disable-windows-live")
+
+ pisitools.dosed("libtool", " -shared ", " -Wl,-O1,--as-needed -shared ")
+
+def build():
+ autotools.make()
+
+def install():
+ autotools.rawInstall("DESTDIR=%s" % get.installDIR())
+
+ pisitools.dodoc("ChangeLog", "COPYING", "NEWS", "README")
diff --git a/desktop/gnome/base/gnome-online-miners/files/tracker3-support.patch b/desktop/gnome/base/gnome-online-miners/files/tracker3-support.patch
new file mode 100644
index 0000000000..c948f65c79
--- /dev/null
+++ b/desktop/gnome/base/gnome-online-miners/files/tracker3-support.patch
@@ -0,0 +1,1554 @@
+From 53869ebc2783c9d08bb32d59c543ab692770c121 Mon Sep 17 00:00:00 2001
+From: Sam Thursfield
+Date: Fri, 15 May 2020 01:11:24 +0200
+Subject: [PATCH 1/5] Use GInitable interface for GomMiner class
+
+This allows for better error reporting.
+---
+ src/gom-application.c | 7 +++++-
+ src/gom-miner.c | 58 +++++++++++++++++++++++++++++--------------
+ 2 files changed, 45 insertions(+), 20 deletions(-)
+
+diff --git a/src/gom-application.c b/src/gom-application.c
+index fadd388..bfa99ec 100644
+--- a/src/gom-application.c
++++ b/src/gom-application.c
+@@ -229,10 +229,15 @@ gom_application_constructed (GObject *object)
+ {
+ GomApplication *self = GOM_APPLICATION (object);
+ const gchar *display_name;
++ GError *error = NULL;
+
+ G_OBJECT_CLASS (gom_application_parent_class)->constructed (object);
+
+- self->miner = g_object_new (self->miner_type, NULL);
++ self->miner = g_initable_new (self->miner_type, NULL, &error, NULL);
++
++ if (self->miner == NULL)
++ g_error ("%s", error->message);
++
+ display_name = gom_miner_get_display_name (self->miner);
+ gom_dbus_set_display_name (self->skeleton, display_name);
+ }
+diff --git a/src/gom-miner.c b/src/gom-miner.c
+index 7147b33..1dd9bb8 100644
+--- a/src/gom-miner.c
++++ b/src/gom-miner.c
+@@ -28,7 +28,11 @@
+
+ #include "gom-miner.h"
+
+-G_DEFINE_TYPE (GomMiner, gom_miner, G_TYPE_OBJECT)
++static void gom_miner_initable_interface_init (GInitableIface *iface);
++
++G_DEFINE_TYPE_WITH_CODE (GomMiner, gom_miner, G_TYPE_OBJECT,
++ G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE, gom_miner_initable_interface_init))
++
+
+ struct _GomMinerPrivate {
+ GoaClient *client;
+@@ -132,20 +136,21 @@ gom_miner_dispose (GObject *object)
+ }
+
+ static void
+-gom_miner_init_goa (GomMiner *self)
++gom_miner_init_goa (GomMiner *self,
++ GError **error)
+ {
+ GoaAccount *account;
+ GoaObject *object;
+ const gchar *provider_type;
+ GList *accounts, *l;
+ GomMinerClass *miner_class = GOM_MINER_GET_CLASS (self);
++ GError *inner_error = NULL;
+
+- self->priv->client = goa_client_new_sync (NULL, &self->priv->client_error);
++ self->priv->client = goa_client_new_sync (NULL, &inner_error);
+
+- if (self->priv->client_error != NULL)
++ if (inner_error)
+ {
+- g_critical ("Unable to create GoaClient: %s - indexing for %s will not work",
+- self->priv->client_error->message, miner_class->goa_provider_type);
++ g_propagate_error (error, inner_error);
+ return;
+ }
+
+@@ -170,16 +175,34 @@ gom_miner_init_goa (GomMiner *self)
+ g_list_free_full (accounts, g_object_unref);
+ }
+
+-static void
+-gom_miner_constructed (GObject *obj)
++static gboolean
++gom_miner_initable_init (GInitable *initable,
++ GCancellable *cancellable,
++ GError **error)
+ {
+- GomMiner *self = GOM_MINER (obj);
++ GError *inner_error = NULL;
++ GomMiner *self;
+
+- G_OBJECT_CLASS (gom_miner_parent_class)->constructed (obj);
++ self = GOM_MINER (initable);
+
+- gom_miner_init_goa (self);
++ self->priv->connection = tracker_sparql_connection_get (cancellable, &inner_error);
++ if (inner_error)
++ {
++ g_propagate_prefixed_error (error, inner_error, "Unable to connect to Tracker store: ");
++ return FALSE;
++ }
++
++ gom_miner_init_goa (self, &inner_error);
++ if (inner_error)
++ {
++ g_propagate_prefixed_error (error, inner_error, "Unable to connect to GNOME Online Accounts: ");
++ return FALSE;
++ }
++
++ return TRUE;
+ }
+
++
+ static void
+ gom_miner_init (GomMiner *self)
+ {
+@@ -187,14 +210,12 @@ gom_miner_init (GomMiner *self)
+
+ self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, GOM_TYPE_MINER, GomMinerPrivate);
+ self->priv->display_name = g_strdup ("");
++}
+
+- self->priv->connection = tracker_sparql_connection_get (NULL, &self->priv->connection_error);
+- if (self->priv->connection_error != NULL)
+- {
+- g_critical ("Unable to create TrackerSparqlConnection: %s - indexing for %s will not work",
+- self->priv->connection_error->message,
+- klass->goa_provider_type);
+- }
++static void
++gom_miner_initable_interface_init (GInitableIface *iface)
++{
++ iface->init = gom_miner_initable_init;
+ }
+
+ static void
+@@ -202,7 +223,6 @@ gom_miner_class_init (GomMinerClass *klass)
+ {
+ GObjectClass *oclass = G_OBJECT_CLASS (klass);
+
+- oclass->constructed = gom_miner_constructed;
+ oclass->dispose = gom_miner_dispose;
+
+ cleanup_pool = g_thread_pool_new (cleanup_job, NULL, 1, FALSE, NULL);
+--
+GitLab
+
+
+From a2b53970e1c1486a61a1522010e345732ed6ca54 Mon Sep 17 00:00:00 2001
+From: Sam Thursfield
+Date: Fri, 15 May 2020 01:19:58 +0200
+Subject: [PATCH 2/5] Initial port to Tracker 3
+
+Each miner now stores its data in a private Tracker database, under
+the $XDG_CACHE_HOME/gnome-online-miners/$busname directory.
+
+Each miner now supports the org.freedesktop.Tracker3.Endpoint D-Bus
+interface which apps can use to query data directly from the miners.
+---
+ configure.ac | 4 +-
+ src/gom-application.c | 4 +-
+ src/gom-miner.c | 120 +++++++++++++++++++++++++++++++++++++++++-
+ src/gom-miner.h | 1 +
+ src/gom-tracker.c | 2 +-
+ 5 files changed, 125 insertions(+), 6 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index e91e4af..8ee6315 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -21,7 +21,7 @@ AC_HEADER_STDC
+
+ GDATA_MIN_VERSION=0.15.2
+ GFBGRAPH_MIN_VERSION=0.2.2
+-GLIB_MIN_VERSION=2.35.1
++GLIB_MIN_VERSION=2.56.0
+ GOA_MIN_VERSION=3.13.3
+ GRILO_MIN_VERSION=0.3.0
+ ZAPOJIT_MIN_VERSION=0.0.2
+@@ -36,7 +36,7 @@ PKG_CHECK_MODULES(GIO, [gio-2.0 gio-unix-2.0])
+ PKG_CHECK_MODULES(GOA, [goa-1.0 >= $GOA_MIN_VERSION])
+ AC_DEFINE([GOA_API_IS_SUBJECT_TO_CHANGE], [], [We are aware that GOA's API can change])
+
+-PKG_CHECK_MODULES(TRACKER, [tracker-miner-2.0 tracker-sparql-2.0])
++PKG_CHECK_MODULES(TRACKER, [tracker-sparql-3.0])
+
+ # Facebook
+ AC_ARG_ENABLE([facebook], [AS_HELP_STRING([--enable-facebook], [Enable Facebook miner])], [], [enable_facebook=yes])
+diff --git a/src/gom-application.c b/src/gom-application.c
+index bfa99ec..86546ed 100644
+--- a/src/gom-application.c
++++ b/src/gom-application.c
+@@ -233,7 +233,9 @@ gom_application_constructed (GObject *object)
+
+ G_OBJECT_CLASS (gom_application_parent_class)->constructed (object);
+
+- self->miner = g_initable_new (self->miner_type, NULL, &error, NULL);
++ self->miner = g_initable_new (self->miner_type, NULL, &error,
++ "bus-name", g_application_get_application_id (G_APPLICATION (self)),
++ NULL);
+
+ if (self->miner == NULL)
+ g_error ("%s", error->message);
+diff --git a/src/gom-miner.c b/src/gom-miner.c
+index 1dd9bb8..f349d01 100644
+--- a/src/gom-miner.c
++++ b/src/gom-miner.c
+@@ -38,7 +38,9 @@ struct _GomMinerPrivate {
+ GoaClient *client;
+ GError *client_error;
+
++ gchar *bus_name;
+ TrackerSparqlConnection *connection;
++ TrackerEndpointDBus *endpoint;
+ GError *connection_error;
+
+ gchar *display_name;
+@@ -62,6 +64,14 @@ typedef struct {
+ gpointer service;
+ } InsertSharedContentData;
+
++typedef enum
++{
++ PROP_BUS_NAME = 1,
++ N_PROPERTIES
++} GomMinerProperty;
++
++static GParamSpec *obj_properties[N_PROPERTIES] = { NULL, };
++
+ static GThreadPool *cleanup_pool;
+
+ static void cleanup_job (gpointer data, gpointer user_data);
+@@ -135,6 +145,58 @@ gom_miner_dispose (GObject *object)
+ G_OBJECT_CLASS (gom_miner_parent_class)->dispose (object);
+ }
+
++static void
++gom_miner_init_database (GomMiner *self,
++ GCancellable *cancellable,
++ GError **error)
++{
++ TrackerSparqlConnectionFlags flags;
++ g_autoptr (GFile) store_path = NULL;
++ g_autoptr (GDBusConnection) bus = NULL;
++ GError *inner_error = NULL;
++
++ flags = TRACKER_SPARQL_CONNECTION_FLAGS_FTS_ENABLE_STEMMER |
++ TRACKER_SPARQL_CONNECTION_FLAGS_FTS_ENABLE_UNACCENT |
++ TRACKER_SPARQL_CONNECTION_FLAGS_FTS_ENABLE_STOP_WORDS |
++ TRACKER_SPARQL_CONNECTION_FLAGS_FTS_IGNORE_NUMBERS;
++
++ store_path = g_file_new_build_filename (g_get_user_cache_dir (),
++ "gnome-online-miners",
++ self->priv->bus_name,
++ NULL);
++
++ self->priv->connection = tracker_sparql_connection_new (flags,
++ store_path,
++ tracker_sparql_get_ontology_nepomuk (),
++ cancellable,
++ &inner_error);
++
++ if (inner_error)
++ {
++ g_propagate_error (error, inner_error);
++ return;
++ }
++
++ bus = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &inner_error);
++
++ if (inner_error)
++ {
++ g_propagate_error (error, inner_error);
++ return;
++ }
++
++ self->priv->endpoint = tracker_endpoint_dbus_new (self->priv->connection,
++ bus,
++ NULL, /* object path */
++ cancellable,
++ &inner_error);
++ if (inner_error)
++ {
++ g_propagate_error (error, inner_error);
++ return;
++ }
++}
++
+ static void
+ gom_miner_init_goa (GomMiner *self,
+ GError **error)
+@@ -185,10 +247,10 @@ gom_miner_initable_init (GInitable *initable,
+
+ self = GOM_MINER (initable);
+
+- self->priv->connection = tracker_sparql_connection_get (cancellable, &inner_error);
++ gom_miner_init_database (self, cancellable, &inner_error);
+ if (inner_error)
+ {
+- g_propagate_prefixed_error (error, inner_error, "Unable to connect to Tracker store: ");
++ g_propagate_prefixed_error (error, inner_error, "Unable to set up Tracker database: ");
+ return FALSE;
+ }
+
+@@ -212,6 +274,47 @@ gom_miner_init (GomMiner *self)
+ self->priv->display_name = g_strdup ("");
+ }
+
++static void
++gom_miner_set_property (GObject *object,
++ guint property_id,
++ const GValue *value,
++ GParamSpec *pspec)
++{
++ GomMiner *self = GOM_MINER (object);
++
++ switch ((GomMinerProperty) property_id)
++ {
++ case PROP_BUS_NAME:
++ g_free (self->priv->bus_name);
++ self->priv->bus_name = g_value_dup_string (value);
++ break;
++
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
++ break;
++ }
++}
++
++static void
++gom_miner_get_property (GObject *object,
++ guint property_id,
++ GValue *value,
++ GParamSpec *pspec)
++{
++ GomMiner *self = GOM_MINER (object);
++
++ switch ((GomMinerProperty) property_id)
++ {
++ case PROP_BUS_NAME:
++ g_value_set_string (value, self->priv->bus_name);
++ break;
++
++ default:
++ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
++ break;
++ }
++}
++
+ static void
+ gom_miner_initable_interface_init (GInitableIface *iface)
+ {
+@@ -224,6 +327,19 @@ gom_miner_class_init (GomMinerClass *klass)
+ GObjectClass *oclass = G_OBJECT_CLASS (klass);
+
+ oclass->dispose = gom_miner_dispose;
++ oclass->set_property = gom_miner_set_property;
++ oclass->get_property = gom_miner_get_property;
++
++ obj_properties[PROP_BUS_NAME] = g_param_spec_string ("bus-name",
++ "Bus Name",
++ "D-Bus name of the miner",
++ NULL /* default value */,
++ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE |
++ G_PARAM_STATIC_STRINGS);
++
++ g_object_class_install_properties (oclass,
++ N_PROPERTIES,
++ obj_properties);
+
+ cleanup_pool = g_thread_pool_new (cleanup_job, NULL, 1, FALSE, NULL);
+
+diff --git a/src/gom-miner.h b/src/gom-miner.h
+index 8f83139..5dcfc8d 100644
+--- a/src/gom-miner.h
++++ b/src/gom-miner.h
+@@ -61,6 +61,7 @@ typedef struct _GomMinerPrivate GomMinerPrivate;
+ typedef struct {
+ GomMiner *miner;
+ TrackerSparqlConnection *connection;
++ gchar *bus_name;
+
+ GoaAccount *account;
+ GHashTable *services;
+diff --git a/src/gom-tracker.c b/src/gom-tracker.c
+index 68818c4..5666c16 100644
+--- a/src/gom-tracker.c
++++ b/src/gom-tracker.c
+@@ -408,7 +408,7 @@ gom_tracker_utils_ensure_equipment_resource (TrackerSparqlConnection *connection
+ gchar *retval = NULL;
+ gchar *select = NULL;
+
+- g_return_val_if_fail (TRACKER_SPARQL_IS_CONNECTION (connection), NULL);
++ g_return_val_if_fail (TRACKER_IS_SPARQL_CONNECTION (connection), NULL);
+ g_return_val_if_fail (cancellable == NULL || G_IS_CANCELLABLE (cancellable), NULL);
+ g_return_val_if_fail (error == NULL || *error == NULL, NULL);
+ g_return_val_if_fail (make != NULL || model != NULL, NULL);
+--
+GitLab
+
+
+From 3e77eff8a677c1ecd9aa129094ed857da802d787 Mon Sep 17 00:00:00 2001
+From: Sam Thursfield
+Date: Fri, 15 May 2020 01:37:28 +0200
+Subject: [PATCH 3/5] Add DataObject class to our resources
+
+We need this to set nie:dataSource property. I don't understand
+how this worked in the past.
+---
+ src/gom-tracker.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/gom-tracker.c b/src/gom-tracker.c
+index 5666c16..63a4c29 100644
+--- a/src/gom-tracker.c
++++ b/src/gom-tracker.c
+@@ -208,7 +208,7 @@ gom_tracker_sparql_connection_insert_or_replace_triple (TrackerSparqlConnection
+ insert = g_string_new (NULL);
+ g_string_append_printf
+ (insert,
+- "INSERT OR REPLACE %s { <%s> a nie:InformationElement ; %s %s }",
++ "INSERT OR REPLACE %s { <%s> a nie:InformationElement, nie:DataObject ; %s %s }",
+ graph_str, resource, property_name, quoted);
+ g_free (quoted);
+
+--
+GitLab
+
+
+From e742a60cf9dea1391d1ff409ce5696d21f423bed Mon Sep 17 00:00:00 2001
+From: Sam Thursfield
+Date: Fri, 15 May 2020 02:13:11 +0200
+Subject: [PATCH 4/5] Organize data into content-based graphs
+
+Previously GOM used a graph per account and per resource but this
+cannot be done in Tracker 3.
+
+In Tracker 3, each graph is stored as a separate SQLite database
+and currently a maximum of ten graphs can be included in a single
+query due to SQLite's limitations.
+
+The new layout is modelled after how tracker-miner-fs uses graphs:
+we use a graph per content type (Contacts, Documents, Pictures),
+plus an extra graph to store accounts and folders/collections.
+---
+ src/gom-facebook-miner.c | 12 ++---
+ src/gom-flickr-miner.c | 24 +++++-----
+ src/gom-gdata-miner.c | 31 ++++++------
+ src/gom-media-server-miner.c | 10 ++--
+ src/gom-miner.c | 40 ++++++++++++----
+ src/gom-miner.h | 1 -
+ src/gom-owncloud-miner.c | 22 +++++----
+ src/gom-tracker.c | 93 +++++++++++++++++-------------------
+ src/gom-tracker.h | 14 +++++-
+ src/gom-zpj-miner.c | 22 ++++-----
+ 10 files changed, 150 insertions(+), 119 deletions(-)
+
+diff --git a/src/gom-facebook-miner.c b/src/gom-facebook-miner.c
+index ff42ca5..fc89096 100644
+--- a/src/gom-facebook-miner.c
++++ b/src/gom-facebook-miner.c
+@@ -70,7 +70,7 @@ account_miner_job_process_photo (GomAccountMinerJob *job,
+ (connection,
+ cancellable, error,
+ &resource_exists,
+- datasource_urn, identifier,
++ TRACKER_PICTURES_GRAPH, identifier,
+ "nfo:RemoteDataObject", class, NULL);
+
+ if (*error != NULL)
+@@ -239,7 +239,7 @@ account_miner_job_process_album (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:url", album_link);
+
+ if (*error != NULL)
+@@ -248,7 +248,7 @@ account_miner_job_process_album (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:description", album_description);
+
+ if (*error != NULL)
+@@ -257,7 +257,7 @@ account_miner_job_process_album (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:title", album_name);
+
+ if (*error != NULL)
+@@ -274,7 +274,7 @@ account_miner_job_process_album (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nco:creator", contact_resource);
+ g_free (contact_resource);
+
+@@ -284,7 +284,7 @@ account_miner_job_process_album (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:contentCreated", album_created_time);
+
+ if (*error != NULL)
+diff --git a/src/gom-flickr-miner.c b/src/gom-flickr-miner.c
+index 9ac338e..dc7349e 100644
+--- a/src/gom-flickr-miner.c
++++ b/src/gom-flickr-miner.c
+@@ -143,14 +143,14 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ (connection,
+ cancellable, error,
+ &resource_exists,
+- datasource_urn, identifier,
++ TRACKER_PICTURES_GRAPH, identifier,
+ "nfo:RemoteDataObject", class, NULL);
+
+ if (*error != NULL)
+ goto out;
+
+ gom_tracker_update_datasource (connection, datasource_urn,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_PICTURES_GRAPH, resource,
+ cancellable, error);
+
+ if (*error != NULL)
+@@ -166,7 +166,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ parent_resource_urn = gom_tracker_sparql_connection_ensure_resource
+ (connection, cancellable, error,
+ NULL,
+- datasource_urn, parent_identifier,
++ TRACKER_PICTURES_GRAPH, parent_identifier,
+ "nfo:RemoteDataObject", "nfo:DataContainer", NULL);
+ g_free (parent_identifier);
+
+@@ -176,7 +176,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:isPartOf", parent_resource_urn);
+ g_free (parent_resource_urn);
+
+@@ -187,7 +187,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:title", grl_media_get_title (entry->media));
+
+ if (*error != NULL)
+@@ -202,7 +202,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ created_time = modification_date = grl_media_get_creation_date (entry->media);
+ new_mtime = g_date_time_to_unix (modification_date);
+ mtime_changed = gom_tracker_update_mtime (connection, new_mtime,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_PICTURES_GRAPH, resource,
+ cancellable, error);
+
+ if (*error != NULL)
+@@ -221,7 +221,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:contentCreated", date);
+ g_free (date);
+ }
+@@ -233,7 +233,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:url", url);
+
+ if (*error != NULL)
+@@ -242,7 +242,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:description", grl_media_get_description (entry->media));
+
+ if (*error != NULL)
+@@ -254,7 +254,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:mimeType", mime);
+ g_free (mime);
+
+@@ -265,7 +265,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ contact_resource = gom_tracker_utils_ensure_contact_resource
+ (connection,
+ cancellable, error,
+- datasource_urn, grl_media_get_author (entry->media));
++ TRACKER_PICTURES_GRAPH, grl_media_get_author (entry->media));
+
+ if (*error != NULL)
+ goto out;
+@@ -273,7 +273,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nco:creator", contact_resource);
+ g_free (contact_resource);
+
+diff --git a/src/gom-gdata-miner.c b/src/gom-gdata-miner.c
+index 7872431..d0deb80 100644
+--- a/src/gom-gdata-miner.c
++++ b/src/gom-gdata-miner.c
+@@ -120,7 +120,7 @@ account_miner_job_process_entry (TrackerSparqlConnection *connection,
+ (connection,
+ cancellable, error,
+ &resource_exists,
+- datasource_urn, identifier,
++ TRACKER_DOCUMENTS_GRAPH, identifier,
+ "nfo:RemoteDataObject", class, NULL);
+
+ if (*error != NULL)
+@@ -187,7 +187,7 @@ account_miner_job_process_entry (TrackerSparqlConnection *connection,
+ parent_resource_urn = gom_tracker_sparql_connection_ensure_resource
+ (connection, cancellable, error,
+ NULL,
+- datasource_urn, parent_resource_id,
++ GOM_GRAPH, parent_resource_id,
+ "nfo:RemoteDataObject", "nfo:DataContainer", NULL);
+ g_free (parent_resource_id);
+
+@@ -219,7 +219,7 @@ account_miner_job_process_entry (TrackerSparqlConnection *connection,
+ gom_tracker_sparql_connection_toggle_favorite
+ (connection,
+ cancellable, error,
+- resource, starred);
++ TRACKER_PICTURES_GRAPH, resource, starred);
+
+ if (*error != NULL)
+ goto out;
+@@ -400,14 +400,14 @@ account_miner_job_process_photo (TrackerSparqlConnection *connection,
+ (connection,
+ cancellable, error,
+ &resource_exists,
+- datasource_urn, identifier,
++ TRACKER_PICTURES_GRAPH, identifier,
+ "nfo:RemoteDataObject", "nmm:Photo", NULL);
+
+ if (*error != NULL)
+ goto out;
+
+ gom_tracker_update_datasource (connection, datasource_urn,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_PICTURES_GRAPH, resource,
+ cancellable, error);
+ if (*error != NULL)
+ goto out;
+@@ -566,6 +566,7 @@ account_miner_job_process_photo (TrackerSparqlConnection *connection,
+ equipment_resource = gom_tracker_utils_ensure_equipment_resource (connection,
+ cancellable,
+ error,
++ TRACKER_PICTURES_GRAPH,
+ make,
+ model);
+
+@@ -665,7 +666,7 @@ account_miner_job_process_album (TrackerSparqlConnection *connection,
+ (connection,
+ cancellable, error,
+ &resource_exists,
+- datasource_urn, identifier,
++ TRACKER_PICTURES_GRAPH, identifier,
+ "nfo:RemoteDataObject", "nfo:DataContainer",
+ NULL);
+
+@@ -674,7 +675,7 @@ account_miner_job_process_album (TrackerSparqlConnection *connection,
+
+ gom_tracker_update_datasource
+ (connection, datasource_urn,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_PICTURES_GRAPH, resource,
+ cancellable, error);
+
+ if (*error != NULL)
+@@ -685,7 +686,7 @@ account_miner_job_process_album (TrackerSparqlConnection *connection,
+ */
+ new_mtime = gdata_entry_get_updated (GDATA_ENTRY (album));
+ mtime_changed = gom_tracker_update_mtime (connection, new_mtime,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_PICTURES_GRAPH, resource,
+ cancellable, error);
+
+ if (*error != NULL)
+@@ -703,7 +704,7 @@ account_miner_job_process_album (TrackerSparqlConnection *connection,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:url", alternate_uri);
+
+ if (*error != NULL)
+@@ -713,7 +714,7 @@ account_miner_job_process_album (TrackerSparqlConnection *connection,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:description", summary);
+
+ if (*error != NULL)
+@@ -723,7 +724,7 @@ account_miner_job_process_album (TrackerSparqlConnection *connection,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:title", title);
+
+ if (*error != NULL)
+@@ -743,7 +744,7 @@ account_miner_job_process_album (TrackerSparqlConnection *connection,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nco:creator", contact_resource);
+ g_free (contact_resource);
+
+@@ -755,7 +756,7 @@ account_miner_job_process_album (TrackerSparqlConnection *connection,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:contentCreated", date);
+ g_free (date);
+
+@@ -865,7 +866,7 @@ insert_shared_content_photos (TrackerSparqlConnection *connection,
+ if (!gom_tracker_sparql_connection_insert_or_replace_triple (connection,
+ cancellable,
+ &local_error,
+- datasource_urn,
++ TRACKER_PICTURES_GRAPH,
+ source_urn,
+ "nie:relatedTo",
+ photo_resource_urn))
+@@ -878,7 +879,7 @@ insert_shared_content_photos (TrackerSparqlConnection *connection,
+ if (!gom_tracker_sparql_connection_insert_or_replace_triple (connection,
+ cancellable,
+ &local_error,
+- datasource_urn,
++ TRACKER_PICTURES_GRAPH,
+ photo_resource_urn,
+ "nie:links",
+ source_urn))
+diff --git a/src/gom-media-server-miner.c b/src/gom-media-server-miner.c
+index 490869e..32e08c6 100644
+--- a/src/gom-media-server-miner.c
++++ b/src/gom-media-server-miner.c
+@@ -65,14 +65,14 @@ account_miner_job_process_photo (GomAccountMinerJob *job,
+ (connection,
+ cancellable, error,
+ &resource_exists,
+- datasource_urn, identifier,
++ TRACKER_PICTURES_GRAPH, identifier,
+ "nfo:RemoteDataObject", class, NULL);
+
+ if (*error != NULL)
+ goto out;
+
+ gom_tracker_update_datasource (connection, datasource_urn,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_PICTURES_GRAPH, resource,
+ cancellable, error);
+ if (*error != NULL)
+ goto out;
+@@ -81,7 +81,7 @@ account_miner_job_process_photo (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:url", photo->url);
+
+ if (*error != NULL)
+@@ -90,7 +90,7 @@ account_miner_job_process_photo (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:mimeType", photo->mimetype);
+
+ if (*error != NULL)
+@@ -99,7 +99,7 @@ account_miner_job_process_photo (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:title", photo->name);
+
+ if (*error != NULL)
+diff --git a/src/gom-miner.c b/src/gom-miner.c
+index f349d01..32892fa 100644
+--- a/src/gom-miner.c
++++ b/src/gom-miner.c
+@@ -376,7 +376,7 @@ gom_miner_ensure_datasource (GomMiner *self,
+ " <%s> a nie:DataSource ; nao:identifier \"%s\" . "
+ " <%s> a nie:InformationElement ; nie:rootElementOf <%s> ; nie:version \"%d\""
+ "}",
+- datasource_urn,
++ GOM_GRAPH,
+ datasource_urn, klass->miner_identifier,
+ root_element_urn, datasource_urn, klass->version);
+
+@@ -401,8 +401,8 @@ gom_account_miner_job_query_existing (GomAccountMinerJob *job,
+
+ select = g_string_new (NULL);
+ g_string_append_printf (select,
+- "SELECT ?urn nao:identifier(?urn) WHERE { ?urn nie:dataSource <%s> }",
+- job->datasource_urn);
++ "SELECT ?urn ?id WHERE { GRAPH <%s> { ?urn nie:dataSource <%s> ; nao:identifier ?id . } }",
++ GOM_GRAPH, job->datasource_urn);
+
+ cursor = tracker_sparql_connection_query (job->connection,
+ select->str,
+@@ -415,9 +415,21 @@ gom_account_miner_job_query_existing (GomAccountMinerJob *job,
+
+ while (tracker_sparql_cursor_next (cursor, cancellable, error))
+ {
+- g_hash_table_insert (job->previous_resources,
+- g_strdup (tracker_sparql_cursor_get_string (cursor, 1, NULL)),
+- g_strdup (tracker_sparql_cursor_get_string (cursor, 0, NULL)));
++ const gchar *urn, *identifier;
++
++ urn = tracker_sparql_cursor_get_string (cursor, 0, NULL);
++ identifier = tracker_sparql_cursor_get_string (cursor, 1, NULL);
++
++ if (identifier != NULL)
++ {
++ g_hash_table_insert (job->previous_resources,
++ g_strdup (identifier),
++ g_strdup (urn));
++ }
++ else
++ {
++ g_warning ("Missing identifier for urn %s", urn);
++ }
+ }
+
+ g_object_unref (cursor);
+@@ -489,16 +501,19 @@ gom_account_miner_job (GTask *task,
+ if (error != NULL)
+ goto out;
+
++ g_debug ("account miner: Querying existing accounts stored in database");
+ gom_account_miner_job_query_existing (job, &error);
+
+ if (error != NULL)
+ goto out;
+
++ g_debug ("account miner: Querying remote server");
+ gom_account_miner_job_query (job, &error);
+
+ if (error != NULL)
+ goto out;
+
++ g_debug ("account miner: Removing stale accounts");
+ gom_account_miner_job_cleanup_previous (job, &error);
+
+ if (error != NULL)
+@@ -752,10 +767,15 @@ cleanup_job (gpointer data,
+
+ /* find all our datasources in the tracker DB */
+ select = g_string_new (NULL);
+- g_string_append_printf (select, "SELECT ?datasource nie:version(?root) WHERE { "
+- "?datasource a nie:DataSource . "
+- "?datasource nao:identifier \"%s\" . "
+- "OPTIONAL { ?root nie:rootElementOf ?datasource } }",
++ g_string_append_printf (select,
++ "SELECT ?datasource nie:version(?root) WHERE { "
++ " GRAPH <%s> { "
++ " ?datasource a nie:DataSource . "
++ " ?datasource nao:identifier \"%s\" . "
++ " OPTIONAL { ?root nie:rootElementOf ?datasource } "
++ " }"
++ "}",
++ GOM_GRAPH,
+ klass->miner_identifier);
+
+ cursor = tracker_sparql_connection_query (self->priv->connection,
+diff --git a/src/gom-miner.h b/src/gom-miner.h
+index 5dcfc8d..8f83139 100644
+--- a/src/gom-miner.h
++++ b/src/gom-miner.h
+@@ -61,7 +61,6 @@ typedef struct _GomMinerPrivate GomMinerPrivate;
+ typedef struct {
+ GomMiner *miner;
+ TrackerSparqlConnection *connection;
+- gchar *bus_name;
+
+ GoaAccount *account;
+ GHashTable *services;
+diff --git a/src/gom-owncloud-miner.c b/src/gom-owncloud-miner.c
+index 34d303b..623f2e1 100644
+--- a/src/gom-owncloud-miner.c
++++ b/src/gom-owncloud-miner.c
+@@ -100,14 +100,14 @@ account_miner_job_process_file (GomAccountMinerJob *job,
+ (connection,
+ cancellable, error,
+ &resource_exists,
+- datasource_urn, identifier,
++ TRACKER_DOCUMENTS_GRAPH, identifier,
+ "nfo:RemoteDataObject", class, NULL);
+
+ if (*error != NULL)
+ goto out;
+
+ gom_tracker_update_datasource (connection, datasource_urn,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_DOCUMENTS_GRAPH, resource,
+ cancellable, error);
+
+ if (*error != NULL)
+@@ -117,7 +117,7 @@ account_miner_job_process_file (GomAccountMinerJob *job,
+ modification_time = g_date_time_new_from_timeval_local (&tv);
+ new_mtime = g_date_time_to_unix (modification_time);
+ mtime_changed = gom_tracker_update_mtime (connection, new_mtime,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_DOCUMENTS_GRAPH, resource,
+ cancellable, error);
+
+ if (*error != NULL)
+@@ -133,7 +133,7 @@ account_miner_job_process_file (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_DOCUMENTS_GRAPH, resource,
+ "nie:url", uri);
+
+ if (*error != NULL)
+@@ -156,7 +156,7 @@ account_miner_job_process_file (GomAccountMinerJob *job,
+ parent_resource_urn = gom_tracker_sparql_connection_ensure_resource
+ (connection, cancellable, error,
+ NULL,
+- datasource_urn, parent_identifier,
++ GOM_GRAPH, parent_identifier,
+ "nfo:RemoteDataObject", "nfo:DataContainer", NULL);
+ g_checksum_reset (checksum);
+ g_free (parent_identifier);
+@@ -168,7 +168,7 @@ account_miner_job_process_file (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_DOCUMENTS_GRAPH, resource,
+ "nie:isPartOf", parent_resource_urn);
+ g_free (parent_resource_urn);
+
+@@ -182,7 +182,7 @@ account_miner_job_process_file (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_DOCUMENTS_GRAPH, resource,
+ "nie:mimeType", mime);
+
+ if (*error != NULL)
+@@ -194,7 +194,7 @@ account_miner_job_process_file (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_DOCUMENTS_GRAPH, resource,
+ "nfo:fileName", display_name);
+
+ if (*error != NULL)
+@@ -416,6 +416,11 @@ query_owncloud (GomAccountMinerJob *job,
+ mount = g_volume_get_mount (volume);
+ if (mount == NULL)
+ {
++ g_autofree gchar *volume_name;
++
++ volume_name = g_volume_get_name (volume);
++ g_debug ("Mounting Online Account volume %s", volume_name);
++
+ data.error = error;
+
+ context = g_main_context_new ();
+@@ -436,6 +441,7 @@ query_owncloud (GomAccountMinerJob *job,
+ }
+
+ root = g_mount_get_root (mount);
++ g_debug ("Got volume from gnome-online-accounts: root is %s", g_file_peek_path (root));
+ account_miner_job_traverse_dir (job, connection, previous_resources, datasource_urn, root, TRUE, cancellable, error);
+
+ g_object_unref (root);
+diff --git a/src/gom-tracker.c b/src/gom-tracker.c
+index 63a4c29..0d1766c 100644
+--- a/src/gom-tracker.c
++++ b/src/gom-tracker.c
+@@ -26,16 +26,11 @@
+ #include "gom-tracker.h"
+ #include "gom-utils.h"
+
+-static gchar *
+-_tracker_utils_format_into_graph (const gchar *graph)
+-{
+- return (graph != NULL) ? g_strdup_printf ("INTO <%s> ", graph) : g_strdup ("");
+-}
+-
+ static gboolean
+ gom_tracker_sparql_connection_get_string_attribute (TrackerSparqlConnection *connection,
+ GCancellable *cancellable,
+ GError **error,
++ const gchar *graph,
+ const gchar *resource,
+ const gchar *attribute,
+ gchar **value)
+@@ -45,8 +40,8 @@ gom_tracker_sparql_connection_get_string_attribute (TrackerSparqlConnection *con
+ const gchar *string_value = NULL;
+ gboolean res;
+
+- g_string_append_printf (select, "SELECT ?val { <%s> %s ?val }",
+- resource, attribute);
++ g_string_append_printf (select, "SELECT ?val { GRAPH <%s> { <%s> %s ?val } }",
++ graph, resource, attribute);
+ cursor = tracker_sparql_connection_query (connection,
+ select->str,
+ cancellable, error);
+@@ -86,7 +81,8 @@ gom_tracker_sparql_connection_ensure_resource (TrackerSparqlConnection *connecti
+ const gchar *class,
+ ...)
+ {
+- GString *select, *insert, *inner;
++ GString *select, *inner;
++ gchar *insert;
+ va_list args;
+ const gchar *arg;
+ TrackerSparqlCursor *cursor;
+@@ -98,6 +94,8 @@ gom_tracker_sparql_connection_ensure_resource (TrackerSparqlConnection *connecti
+ gchar *key = NULL, *val = NULL;
+ gboolean exists = FALSE;
+
++ g_return_val_if_fail (graph != NULL, NULL);
++
+ /* build the inner query with all the classes */
+ va_start (args, class);
+ inner = g_string_new (NULL);
+@@ -112,7 +110,7 @@ gom_tracker_sparql_connection_ensure_resource (TrackerSparqlConnection *connecti
+ /* query if such a resource is already in the DB */
+ select = g_string_new (NULL);
+ g_string_append_printf (select,
+- "SELECT ?urn WHERE { ?urn %s }", inner->str);
++ "SELECT ?urn WHERE { GRAPH <%s> { ?urn %s } }", graph, inner->str);
+
+ cursor = tracker_sparql_connection_query (connection,
+ select->str,
+@@ -138,19 +136,12 @@ gom_tracker_sparql_connection_ensure_resource (TrackerSparqlConnection *connecti
+ }
+
+ /* not found, create the resource */
+- insert = g_string_new (NULL);
+- graph_str = _tracker_utils_format_into_graph (graph);
+-
+- g_string_append_printf (insert, "INSERT %s { _:res %s }",
+- graph_str, inner->str);
+- g_free (graph_str);
+- g_string_free (inner, TRUE);
+-
++ insert = g_strdup_printf ("INSERT INTO <%s> { _:res %s }",
++ graph, inner->str);
+ insert_res =
+- tracker_sparql_connection_update_blank (connection, insert->str,
++ tracker_sparql_connection_update_blank (connection, insert,
+ G_PRIORITY_DEFAULT, NULL, error);
+-
+- g_string_free (insert, TRUE);
++ g_free (insert);
+
+ if (*error != NULL)
+ goto out;
+@@ -194,10 +185,10 @@ gom_tracker_sparql_connection_insert_or_replace_triple (TrackerSparqlConnection
+ const gchar *property_value)
+ {
+ GString *insert;
+- gchar *graph_str, *quoted;
++ gchar *quoted;
+ gboolean retval = TRUE;
+
+- graph_str = _tracker_utils_format_into_graph (graph);
++ g_return_val_if_fail (graph != NULL, FALSE);
+
+ /* the "null" value must not be quoted */
+ if (property_value == NULL)
+@@ -208,8 +199,8 @@ gom_tracker_sparql_connection_insert_or_replace_triple (TrackerSparqlConnection
+ insert = g_string_new (NULL);
+ g_string_append_printf
+ (insert,
+- "INSERT OR REPLACE %s { <%s> a nie:InformationElement, nie:DataObject ; %s %s }",
+- graph_str, resource, property_name, quoted);
++ "INSERT OR REPLACE INTO <%s> { <%s> a nie:InformationElement, nie:DataObject ; %s %s }",
++ graph, resource, property_name, quoted);
+ g_free (quoted);
+
+ g_debug ("Insert or replace triple: query %s", insert->str);
+@@ -223,8 +214,6 @@ gom_tracker_sparql_connection_insert_or_replace_triple (TrackerSparqlConnection
+ if (*error != NULL)
+ retval = FALSE;
+
+- g_free (graph_str);
+-
+ return retval;
+ }
+
+@@ -271,6 +260,7 @@ gboolean
+ gom_tracker_sparql_connection_toggle_favorite (TrackerSparqlConnection *connection,
+ GCancellable *cancellable,
+ GError **error,
++ const gchar *graph,
+ const gchar *resource,
+ gboolean favorite)
+ {
+@@ -279,15 +269,15 @@ gom_tracker_sparql_connection_toggle_favorite (TrackerSparqlConnection *connecti
+ gboolean retval = TRUE;
+
+ if (favorite)
+- op_str = "INSERT OR REPLACE";
++ op_str = "INSERT OR REPLACE INTO";
+ else
+- op_str = "DELETE";
++ op_str = "DELETE FROM";
+
+ update = g_string_new (NULL);
+ g_string_append_printf
+ (update,
+- "%s { <%s> nao:hasTag nao:predefined-tag-favorite }",
+- op_str, resource);
++ "%s <%s> { <%s> nao:hasTag nao:predefined-tag-favorite }",
++ op_str, graph, resource);
+
+ g_debug ("Toggle favorite: query %s", update->str);
+
+@@ -321,9 +311,13 @@ gom_tracker_utils_ensure_contact_resource (TrackerSparqlConnection *connection,
+ mail_uri = g_strconcat ("mailto:", email, NULL);
+ select = g_string_new (NULL);
+ g_string_append_printf (select,
+- "SELECT ?urn WHERE { ?urn a nco:Contact . "
+- "?urn nco:hasEmailAddress ?mail . "
+- "FILTER (fn:contains(?mail, \"%s\" )) }", mail_uri);
++ "SELECT ?urn WHERE { "
++ " GRAPH <%s> { "
++ " ?urn a nco:Contact . "
++ " ?urn nco:hasEmailAddress ?mail . "
++ " FILTER (fn:contains(?mail, \"%s\" )) "
++ " }"
++ "}", TRACKER_CONTACTS_GRAPH, mail_uri);
+
+ cursor = tracker_sparql_connection_query (connection,
+ select->str,
+@@ -351,8 +345,9 @@ gom_tracker_utils_ensure_contact_resource (TrackerSparqlConnection *connection,
+ insert = g_string_new (NULL);
+
+ g_string_append_printf (insert,
+- "INSERT { <%s> a nco:EmailAddress ; nco:emailAddress \"%s\" . "
++ "INSERT INTO <%s> { <%s> a nco:EmailAddress ; nco:emailAddress \"%s\" . "
+ "_:res a nco:Contact ; nco:hasEmailAddress <%s> ; nco:fullname \"%s\" . }",
++ TRACKER_CONTACTS_GRAPH,
+ mail_uri, email,
+ mail_uri, fullname);
+
+@@ -397,6 +392,7 @@ gchar *
+ gom_tracker_utils_ensure_equipment_resource (TrackerSparqlConnection *connection,
+ GCancellable *cancellable,
+ GError **error,
++ const gchar *graph,
+ const gchar *make,
+ const gchar *model)
+ {
+@@ -416,7 +412,7 @@ gom_tracker_utils_ensure_equipment_resource (TrackerSparqlConnection *connection
+ equip_uri = tracker_sparql_escape_uri_printf ("urn:equipment:%s:%s:",
+ make != NULL ? make : "",
+ model != NULL ? model : "");
+- select = g_strdup_printf ("SELECT <%s> WHERE { }", equip_uri);
++ select = g_strdup_printf ("ASK { GRAPH <%s> { <%s> a nfo:Equipment } }", graph, equip_uri);
+
+ local_error = NULL;
+ cursor = tracker_sparql_connection_query (connection, select, cancellable, &local_error);
+@@ -436,20 +432,19 @@ gom_tracker_utils_ensure_equipment_resource (TrackerSparqlConnection *connection
+
+ if (res)
+ {
+- const gchar *cursor_uri;
+-
+- cursor_uri = tracker_sparql_cursor_get_string (cursor, 0, NULL);
+- if (g_strcmp0 (cursor_uri, equip_uri) == 0)
++ if (tracker_sparql_cursor_get_boolean (cursor, 0))
+ {
+- /* return the found resource */
+- retval = g_strdup (cursor_uri);
++ /* The resource exists */
++ retval = equip_uri;
++ equip_uri = NULL;
+ g_debug ("Found resource in the store: %s", retval);
+ goto out;
+ }
+ }
+
+ /* not found, create the resource */
+- insert = g_strdup_printf ("INSERT { <%s> a nfo:Equipment ; nfo:manufacturer \"%s\" ; nfo:model \"%s\" }",
++ insert = g_strdup_printf ("INSERT INTO <%s> { <%s> a nfo:Equipment ; nfo:manufacturer \"%s\" ; nfo:model \"%s\" }",
++ graph,
+ equip_uri,
+ make,
+ model);
+@@ -480,7 +475,7 @@ void
+ gom_tracker_update_datasource (TrackerSparqlConnection *connection,
+ const gchar *datasource_urn,
+ gboolean resource_exists,
+- const gchar *identifier,
++ const gchar *graph,
+ const gchar *resource,
+ GCancellable *cancellable,
+ GError **error)
+@@ -498,7 +493,7 @@ gom_tracker_update_datasource (TrackerSparqlConnection *connection,
+
+ res = gom_tracker_sparql_connection_get_string_attribute
+ (connection, cancellable, error,
+- resource, "nie:dataSource", &old_value);
++ graph, resource, "nie:dataSource", &old_value);
+ g_clear_error (error);
+
+ if (res)
+@@ -514,7 +509,7 @@ gom_tracker_update_datasource (TrackerSparqlConnection *connection,
+ if (set_datasource)
+ gom_tracker_sparql_connection_set_triple
+ (connection, cancellable, error,
+- identifier, resource,
++ graph, resource,
+ "nie:dataSource", datasource_urn);
+ }
+
+@@ -522,7 +517,7 @@ gboolean
+ gom_tracker_update_mtime (TrackerSparqlConnection *connection,
+ gint64 new_mtime,
+ gboolean resource_exists,
+- const gchar *identifier,
++ const gchar *graph,
+ const gchar *resource,
+ GCancellable *cancellable,
+ GError **error)
+@@ -536,7 +531,7 @@ gom_tracker_update_mtime (TrackerSparqlConnection *connection,
+ {
+ res = gom_tracker_sparql_connection_get_string_attribute
+ (connection, cancellable, error,
+- resource, "nie:contentLastModified", &old_value);
++ graph, resource, "nie:contentLastModified", &old_value);
+ g_clear_error (error);
+
+ if (res)
+@@ -552,7 +547,7 @@ gom_tracker_update_mtime (TrackerSparqlConnection *connection,
+ date = gom_iso8601_from_timestamp (new_mtime);
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection, cancellable, error,
+- identifier, resource,
++ graph, resource,
+ "nie:contentLastModified", date);
+ g_free (date);
+
+diff --git a/src/gom-tracker.h b/src/gom-tracker.h
+index 94a39e8..a5ae6fd 100644
+--- a/src/gom-tracker.h
++++ b/src/gom-tracker.h
+@@ -29,6 +29,14 @@
+
+ G_BEGIN_DECLS
+
++/* The graph where we store account meta information */
++#define GOM_GRAPH "tracker.api.gnome.org/ontology/v3/gnome-online-miners"
++
++/* Graphs where we store content information */
++#define TRACKER_CONTACTS_GRAPH "http://tracker.api.gnome.org/ontology/v3/tracker#Contacts"
++#define TRACKER_DOCUMENTS_GRAPH "http://tracker.api.gnome.org/ontology/v3/tracker#Documents"
++#define TRACKER_PICTURES_GRAPH "http://tracker.api.gnome.org/ontology/v3/tracker#Pictures"
++
+ gchar *gom_tracker_sparql_connection_ensure_resource (TrackerSparqlConnection *connection,
+ GCancellable *cancellable,
+ GError **error,
+@@ -57,6 +65,7 @@ gboolean gom_tracker_sparql_connection_set_triple (TrackerSparqlConnection *conn
+ gboolean gom_tracker_sparql_connection_toggle_favorite (TrackerSparqlConnection *connection,
+ GCancellable *cancellable,
+ GError **error,
++ const gchar *graph,
+ const gchar *resource,
+ gboolean favorite);
+
+@@ -69,20 +78,21 @@ gchar* gom_tracker_utils_ensure_contact_resource (TrackerSparqlConnection *conne
+ gchar *gom_tracker_utils_ensure_equipment_resource (TrackerSparqlConnection *connection,
+ GCancellable *cancellable,
+ GError **error,
++ const gchar *graph,
+ const gchar *make,
+ const gchar *model);
+
+ void gom_tracker_update_datasource (TrackerSparqlConnection *connection,
+ const gchar *datasource_urn,
+ gboolean resource_exists,
+- const gchar *identifier,
++ const gchar *graph,
+ const gchar *resource,
+ GCancellable *cancellable,
+ GError **error);
+ gboolean gom_tracker_update_mtime (TrackerSparqlConnection *connection,
+ gint64 new_mtime,
+ gboolean resource_exists,
+- const gchar *identifier,
++ const gchar *graph,
+ const gchar *resource,
+ GCancellable *cancellable,
+ GError **error);
+diff --git a/src/gom-zpj-miner.c b/src/gom-zpj-miner.c
+index 6dff947..1372de5 100644
+--- a/src/gom-zpj-miner.c
++++ b/src/gom-zpj-miner.c
+@@ -70,14 +70,14 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ (connection,
+ cancellable, error,
+ &resource_exists,
+- datasource_urn, identifier,
++ TRACKER_PICTURES_GRAPH, identifier,
+ "nfo:RemoteDataObject", class, NULL);
+
+ if (*error != NULL)
+ goto out;
+
+ gom_tracker_update_datasource (connection, datasource_urn,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_PICTURES_GRAPH, resource,
+ cancellable, error);
+
+ if (*error != NULL)
+@@ -86,7 +86,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ updated_time = zpj_skydrive_entry_get_updated_time (entry);
+ new_mtime = g_date_time_to_unix (updated_time);
+ mtime_changed = gom_tracker_update_mtime (connection, new_mtime,
+- resource_exists, identifier, resource,
++ resource_exists, TRACKER_PICTURES_GRAPH, resource,
+ cancellable, error);
+
+ if (*error != NULL)
+@@ -102,7 +102,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:url", identifier);
+
+ if (*error != NULL)
+@@ -119,7 +119,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ parent_resource_urn = gom_tracker_sparql_connection_ensure_resource
+ (connection, cancellable, error,
+ NULL,
+- datasource_urn, parent_identifier,
++ TRACKER_PICTURES_GRAPH, parent_identifier,
+ "nfo:RemoteDataObject", "nfo:DataContainer", NULL);
+ g_free (parent_identifier);
+
+@@ -129,7 +129,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:isPartOf", parent_resource_urn);
+ g_free (parent_resource_urn);
+
+@@ -142,7 +142,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:mimeType", mime);
+ g_free (mime);
+
+@@ -154,7 +154,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:description", zpj_skydrive_entry_get_description (entry));
+
+ if (*error != NULL)
+@@ -163,7 +163,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nfo:fileName", name);
+
+ if (*error != NULL)
+@@ -180,7 +180,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nco:creator", contact_resource);
+ g_free (contact_resource);
+
+@@ -192,7 +192,7 @@ account_miner_job_process_entry (GomAccountMinerJob *job,
+ gom_tracker_sparql_connection_insert_or_replace_triple
+ (connection,
+ cancellable, error,
+- datasource_urn, resource,
++ TRACKER_PICTURES_GRAPH, resource,
+ "nie:contentCreated", date);
+ g_free (date);
+
+--
+GitLab
+
+
+From 34259944dd9e6e167663c97080142f6e8b7f00f2 Mon Sep 17 00:00:00 2001
+From: Sam Thursfield
+Date: Mon, 27 Jul 2020 23:48:49 +0200
+Subject: [PATCH 5/5] Update for API changes in Tracker 2.99
+
+---
+ src/gom-miner.c | 3 ---
+ src/gom-tracker.c | 22 ++++++----------------
+ 2 files changed, 6 insertions(+), 19 deletions(-)
+
+diff --git a/src/gom-miner.c b/src/gom-miner.c
+index 32892fa..d9ccf67 100644
+--- a/src/gom-miner.c
++++ b/src/gom-miner.c
+@@ -382,7 +382,6 @@ gom_miner_ensure_datasource (GomMiner *self,
+
+ tracker_sparql_connection_update (self->priv->connection,
+ datasource_insert->str,
+- G_PRIORITY_DEFAULT,
+ cancellable,
+ error);
+
+@@ -469,7 +468,6 @@ gom_account_miner_job_cleanup_previous (GomAccountMinerJob *job,
+
+ tracker_sparql_connection_update (job->connection,
+ delete->str,
+- G_PRIORITY_DEFAULT,
+ cancellable,
+ error);
+
+@@ -709,7 +707,6 @@ cleanup_job_do_cleanup (CleanupJob *job, GCancellable *cancellable)
+
+ tracker_sparql_connection_update (self->priv->connection,
+ update->str,
+- G_PRIORITY_DEFAULT,
+ cancellable,
+ &error);
+ g_string_free (update, TRUE);
+diff --git a/src/gom-tracker.c b/src/gom-tracker.c
+index 0d1766c..5f49f73 100644
+--- a/src/gom-tracker.c
++++ b/src/gom-tracker.c
+@@ -138,9 +138,7 @@ gom_tracker_sparql_connection_ensure_resource (TrackerSparqlConnection *connecti
+ /* not found, create the resource */
+ insert = g_strdup_printf ("INSERT INTO <%s> { _:res %s }",
+ graph, inner->str);
+- insert_res =
+- tracker_sparql_connection_update_blank (connection, insert,
+- G_PRIORITY_DEFAULT, NULL, error);
++ insert_res = tracker_sparql_connection_update_blank (connection, insert, NULL, error);
+ g_free (insert);
+
+ if (*error != NULL)
+@@ -205,9 +203,7 @@ gom_tracker_sparql_connection_insert_or_replace_triple (TrackerSparqlConnection
+
+ g_debug ("Insert or replace triple: query %s", insert->str);
+
+- tracker_sparql_connection_update (connection, insert->str,
+- G_PRIORITY_DEFAULT, cancellable,
+- error);
++ tracker_sparql_connection_update (connection, insert->str, cancellable, error);
+
+ g_string_free (insert, TRUE);
+
+@@ -235,9 +231,7 @@ gom_tracker_sparql_connection_set_triple (TrackerSparqlConnection *connection,
+ "DELETE { <%s> %s ?val } WHERE { <%s> %s ?val }", resource,
+ property_name, resource, property_name);
+
+- tracker_sparql_connection_update (connection, delete->str,
+- G_PRIORITY_DEFAULT, cancellable,
+- error);
++ tracker_sparql_connection_update (connection, delete->str, cancellable, error);
+
+ g_string_free (delete, TRUE);
+ if (*error != NULL)
+@@ -281,9 +275,7 @@ gom_tracker_sparql_connection_toggle_favorite (TrackerSparqlConnection *connecti
+
+ g_debug ("Toggle favorite: query %s", update->str);
+
+- tracker_sparql_connection_update (connection, update->str,
+- G_PRIORITY_DEFAULT, cancellable,
+- error);
++ tracker_sparql_connection_update (connection, update->str, cancellable, error);
+
+ g_string_free (update, TRUE);
+
+@@ -351,9 +343,7 @@ gom_tracker_utils_ensure_contact_resource (TrackerSparqlConnection *connection,
+ mail_uri, email,
+ mail_uri, fullname);
+
+- insert_res =
+- tracker_sparql_connection_update_blank (connection, insert->str,
+- G_PRIORITY_DEFAULT, cancellable, error);
++ insert_res = tracker_sparql_connection_update_blank (connection, insert->str, cancellable, error);
+
+ g_string_free (insert, TRUE);
+
+@@ -450,7 +440,7 @@ gom_tracker_utils_ensure_equipment_resource (TrackerSparqlConnection *connection
+ model);
+
+ local_error = NULL;
+- tracker_sparql_connection_update (connection, insert, G_PRIORITY_DEFAULT, cancellable, &local_error);
++ tracker_sparql_connection_update (connection, insert, cancellable, &local_error);
+ if (local_error != NULL)
+ {
+ g_propagate_error (error, local_error);
+--
+GitLab
+
diff --git a/desktop/gnome/base/gnome-online-miners/pspec.xml b/desktop/gnome/base/gnome-online-miners/pspec.xml
new file mode 100644
index 0000000000..e93a7e2903
--- /dev/null
+++ b/desktop/gnome/base/gnome-online-miners/pspec.xml
@@ -0,0 +1,53 @@
+
+
+
+
+ gnome-online-miners
+ https://gitlab.gnome.org/GNOME/gnome-online-miners
+
+ Pisi Linux Admins
+ admin@pisilinux.org
+
+ GPLv2
+ GNOME Online Miners - crawls through your online content
+ GNOME Online Miners provides a set of crawlers that go through your online content and index them locally in Tracker
+ https://download.gnome.org/sources/gnome-online-miners/3.34/gnome-online-miners-3.34.0.tar.xz
+
+ intltool
+ libxslt-devel
+ docbook-xsl
+ glib2-devel
+ libgdata-devel
+ grilo-devel
+ tracker-devel
+ libgfbgraph-devel
+ gnome-online-accounts-devel
+ autoconf-archive
+
+
+ tracker3-support.patch
+
+
+
+
+ gnome-online-miners
+
+ glib2
+
+
+ /usr/lib
+ /usr/share/dbus-1
+ /usr/share/doc
+
+
+
+
+
+ 2021-06-06
+ 3.34.0
+ First release for Pisi Linux
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
diff --git a/desktop/gnome/base/gnome-user-docs/actions.py b/desktop/gnome/base/gnome-user-docs/actions.py
new file mode 100644
index 0000000000..d6acd75ac7
--- /dev/null
+++ b/desktop/gnome/base/gnome-user-docs/actions.py
@@ -0,0 +1,20 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#
+# Licensed under the GNU General Public License, version 3.
+# See the file http://www.gnu.org/licenses/gpl.txt
+
+from pisi.actionsapi import autotools
+from pisi.actionsapi import pisitools
+from pisi.actionsapi import get
+
+def setup():
+ autotools.configure()
+
+def build():
+ autotools.make()
+
+def install():
+ autotools.rawInstall("DESTDIR=%s" % get.installDIR())
+
+ pisitools.dodoc("COPYING", "NEWS", "README")
diff --git a/desktop/gnome/base/gnome-user-docs/pspec.xml b/desktop/gnome/base/gnome-user-docs/pspec.xml
new file mode 100644
index 0000000000..31db953bca
--- /dev/null
+++ b/desktop/gnome/base/gnome-user-docs/pspec.xml
@@ -0,0 +1,40 @@
+
+
+
+
+ gnome-user-docs
+ https://gitlab.gnome.org/GNOME/gnome-user-docs
+
+ Pisi Linux Admins
+ admins@pisilinux.org
+
+ CCPL-Attribution-3.0
+ data:doc
+ GNOME User Documentation
+ This package contains documents which are packaged together and shipped as gnome-user-docs in the core GNOME distribution.
+ https://download.gnome.org/sources/gnome-user-docs/40/gnome-user-docs-40.1.tar.xz
+
+ libxml2-devel
+ itstool
+
+
+
+
+ gnome-user-docs
+ data:doc
+
+ /usr/share/help
+ /usr/share/doc
+
+
+
+
+
+ 2021-06-07
+ 40.1
+ First release for Pisi Linux
+ Berk Çakar
+ berk2238@hotmail.com
+
+
+
diff --git a/desktop/misc/lightdm/pspec.xml b/desktop/misc/lightdm/pspec.xml
index c2c377d235..3275a6b359 100644
--- a/desktop/misc/lightdm/pspec.xml
+++ b/desktop/misc/lightdm/pspec.xml
@@ -42,6 +42,7 @@
lightdm
+ gdm
lxdm
sddm
diff --git a/desktop/misc/sddm/pspec.xml b/desktop/misc/sddm/pspec.xml
index 65d0c15b0d..3410493620 100644
--- a/desktop/misc/sddm/pspec.xml
+++ b/desktop/misc/sddm/pspec.xml
@@ -42,6 +42,7 @@
sddm
+ gdm
lightdm
lxdm
mdm