add function: search installed pkgs(flatpak and snap)
search-installed-flatpak-snap.patch
From f71ee413ea63670d99b36c9ec363b93c13176e88 Mon Sep 17 00:00:00 2001
From: Masato TOYOSHIMA <phoepsilonix@phoepsilonix.love>
Date: Sat, 5 Aug 2023 15:46:14 +0900
Subject: [PATCH] Include the flatpak,snap packages in the search for installed
packages.
---
src/database.vala | 22 +++++++++++++++++-----
src/flatpak_interface.vala | 1 +
src/flatpak_plugin.vala | 27 +++++++++++++++++++++++++++
src/snap_interface.vala | 1 +
src/snap_plugin.vala | 19 +++++++++++++++++++
5 files changed, 65 insertions(+), 5 deletions(-)
diff --git a/src/database.vala b/src/database.vala
index 088daa2..3205bc4 100644
--- a/src/database.vala
+++ b/src/database.vala
@@ -1126,12 +1126,24 @@ namespace Pamac {
return pkgs;
}
- public async GenericArray<unowned AlpmPackage> search_installed_pkgs_async (string search_string) {
+ public async GenericArray<unowned Package> search_installed_pkgs_async (string search_string) {
string search_string_down = search_string.down ();
- var pkgs = new GenericArray<unowned AlpmPackage> ();
+ var all_pkgs = new GenericArray<unowned Package> ();
+ var pkgs_alpm = new GenericArray<unowned AlpmPackage> ();
+ var pkgs_flatpak = new GenericArray<unowned FlatpakPackage> ();
+ var pkgs_snaps = new GenericArray<unowned SnapPackage> ();
try {
new Thread<int>.try ("search_installed_pkgs", () => {
- search_installed_pkgs_real (search_string_down, ref pkgs);
+ search_installed_pkgs_real (search_string_down, ref pkgs_alpm);
+ all_pkgs.extend(pkgs_alpm, null);
+ if (config.enable_flatpak) {
+ flatpak_plugin.search_installed_flatpaks(search_string_down, ref pkgs_flatpak);
+ all_pkgs.extend(pkgs_flatpak, null);
+ }
+ if (config.enable_snap) {
+ snap_plugin.search_installed_snaps(search_string_down, ref pkgs_snaps);
+ all_pkgs.extend(pkgs_snaps, null);
+ }
context.invoke (search_installed_pkgs_async.callback);
return 0;
});
@@ -1139,7 +1151,7 @@ namespace Pamac {
} catch (Error e) {
warning (e.message);
}
- return pkgs;
+ return all_pkgs;
}
void search_repos_pkgs_real (string search_string, ref GenericArray<unowned AlpmPackage> pkgs) {
diff --git a/src/flatpak_interface.vala b/src/flatpak_interface.vala
index c8c9f9a..0e49246 100644
--- a/src/flatpak_interface.vala
+++ b/src/flatpak_interface.vala
@@ -30,6 +30,7 @@ namespace Pamac {
public abstract void load_appstream_data ();
public abstract void get_remotes_names (ref GenericArray<unowned string> remotes_names);
public abstract void search_flatpaks (string search_string, ref GenericArray<unowned FlatpakPackage> pkgs);
+ public abstract void search_installed_flatpaks (string search_string, ref GenericArray<unowned FlatpakPackage> pkgs);
public abstract void search_uninstalled_flatpaks_sync (string[] search_terms, ref GenericArray<unowned FlatpakPackage> pkgs);
public abstract bool is_installed_flatpak (string name);
public abstract unowned FlatpakPackage? get_flatpak_by_app_id (string app_id);
diff --git a/src/flatpak_plugin.vala b/src/flatpak_plugin.vala
index 72afdf7..d37f1b5 100644
--- a/src/flatpak_plugin.vala
+++ b/src/flatpak_plugin.vala
@@ -638,6 +638,28 @@ namespace Pamac {
}
}
+ public void search_installed_flatpaks (string search_string, ref GenericArray<unowned FlatpakPackage> pkgs) {
+ lock (stores_table) {
+ foreach (unowned HashTable<unowned string, AppStream.Component> apps in stores_table) {
+ var iter = HashTableIter<unowned string, AppStream.Component> (apps);
+ unowned AppStream.Component app;
+ while (iter.next (null, out app)) {
+ string[] search_tokens = search_string.split (" ");
+ uint match_score = app.search_matches_all (search_tokens);
+ unowned AppStream.Bundle bundle = app.get_bundle (AppStream.BundleKind.FLATPAK);
+ unowned string bundle_id = bundle.get_id ();
+ string id = "%s".printf (bundle_id);
+ if (is_installed_flatpak(id) && (match_score > 0 || search_string in app.get_id ())) {
+ unowned FlatpakPackage? pkg = get_flatpak_from_app (app);
+ if (pkg != null) {
+ pkgs.add (pkg);
+ }
+ }
+ }
+ }
+ }
+ }
+
public void search_uninstalled_flatpaks_sync (string[] search_terms, ref GenericArray<unowned FlatpakPackage> pkgs) {
lock (stores_table) {
foreach (unowned HashTable<unowned string, AppStream.Component> apps in stores_table) {
diff --git a/src/snap_interface.vala b/src/snap_interface.vala
index 7d137f5..9182e78 100644
--- a/src/snap_interface.vala
+++ b/src/snap_interface.vala
@@ -28,6 +28,7 @@ namespace Pamac {
public signal void stop_downloading (string sender);
public abstract void search_snaps (string search_string, ref GenericArray<unowned SnapPackage> pkgs);
+ public abstract void search_installed_snaps (string search_string, ref GenericArray<unowned SnapPackage> pkgs);
public abstract void search_uninstalled_snaps_sync (string search_string, ref GenericArray<unowned SnapPackage> pkgs);
public abstract bool is_installed_snap (string name);
public abstract unowned SnapPackage? get_snap (string name);
diff --git a/src/snap_plugin.vala b/src/snap_plugin.vala
index 7dd6643..40ad155 100644
--- a/src/snap_plugin.vala
+++ b/src/snap_plugin.vala
@@ -289,6 +289,25 @@ namespace Pamac {
warning (e.message);
}
}
+
+ public void search_installed_snaps (string search_string, ref GenericArray<unowned SnapPackage> pkgs) {
+ try {
+ lock (search_snaps_cache) {
+ GenericArray<unowned Snapd.Snap>? found = search_snaps_cache.lookup (search_string);
+ if (found == null) {
+ found = client.find_sync (Snapd.FindFlags.NONE, search_string, null, null);
+ search_snaps_cache.insert (search_string, found);
+ }
+ foreach (unowned Snapd.Snap snap in found) {
+ if (snap.snap_type == Snapd.SnapType.APP && snap.install_date != null) {
+ pkgs.add (initialize_snap (snap));
+ }
+ }
+ }
+ } catch (Error e) {
+ warning (e.message);
+ }
+ }
public void search_uninstalled_snaps_sync (string search_string, ref GenericArray<unowned SnapPackage> pkgs) {
try {
--
2.41.0