refactor(linux-packages): switch Flatpak package counting to filesystem-based method

This commit is contained in:
utox39
2025-12-14 20:19:54 +01:00
parent c867ea69c6
commit 87d31a9112

View File

@@ -5,7 +5,7 @@ pub fn getPackagesInfo(allocator: std.mem.Allocator) ![]const u8 {
var packages_info = std.array_list.Managed(u8).init(allocator); var packages_info = std.array_list.Managed(u8).init(allocator);
defer packages_info.deinit(); defer packages_info.deinit();
const flatpak_packages = countFlatpakPackages(allocator) catch 0; const flatpak_packages = countFlatpakPackages() catch |err| if (err == error.FileNotFound) 0 else return err;
const nix_packages = countNixPackages(allocator) catch 0; const nix_packages = countNixPackages(allocator) catch 0;
const dpkg_packages = countDpkgPackages(allocator) catch |err| if (err == error.FileNotFound) 0 else return err; const dpkg_packages = countDpkgPackages(allocator) catch |err| if (err == error.FileNotFound) 0 else return err;
const pacman_packages = countPacmanPackages() catch |err| if (err == error.FileNotFound) 0 else return err; const pacman_packages = countPacmanPackages() catch |err| if (err == error.FileNotFound) 0 else return err;
@@ -36,19 +36,64 @@ pub fn getPackagesInfo(allocator: std.mem.Allocator) ![]const u8 {
return try allocator.dupe(u8, packages_info.items); return try allocator.dupe(u8, packages_info.items);
} }
fn countFlatpakPackages(allocator: std.mem.Allocator) !usize { fn countFlatpakPackages() !usize {
// flatpak list | wc -l const flatpak_apps = try countFlatpakApps();
const result = try std.process.Child.run(.{ .allocator = allocator, .argv = &[_][]const u8{ const flatpak_runtimes = try countFlatpakRuntimes();
"sh",
"-c",
"flatpak list | wc -l",
} });
const result_stdout = result.stdout;
const result_trimmed = std.mem.trim(u8, result_stdout, "\n");
defer allocator.free(result_stdout);
defer allocator.free(result.stderr);
return try std.fmt.parseInt(usize, result_trimmed, 10); return flatpak_apps + flatpak_runtimes;
}
fn countFlatpakApps() !usize {
var dir = try std.fs.openDirAbsolute("/var/lib/flatpak/app/", .{ .iterate = true });
defer dir.close();
var iter = dir.iterate();
var count: usize = 0;
while (try iter.next()) |e| {
if (e.kind != .directory) continue;
var sub_dir = try dir.openDir(e.name, .{});
defer sub_dir.close();
var current = sub_dir.openDir("current", .{}) catch continue;
defer current.close();
// If `current` was opened successfully, increment the count
count += 1;
}
return count;
}
fn countFlatpakRuntimes() !usize {
var dir = try std.fs.openDirAbsolute("/var/lib/flatpak/runtime/", .{ .iterate = true });
defer dir.close();
var iter = dir.iterate();
var counter: usize = 0;
while (try iter.next()) |e| {
if (std.mem.endsWith(u8, e.name, ".Locale") or std.mem.endsWith(u8, e.name, ".Debug")) continue;
var arch_dir = try dir.openDir(e.name, .{ .iterate = true });
defer arch_dir.close();
var arch_iter = arch_dir.iterate();
while (try arch_iter.next()) |arch_e| {
if (arch_e.kind != .directory) continue;
var sub_dir = try arch_dir.openDir(arch_e.name, .{ .iterate = true });
defer sub_dir.close();
var sub_iter = sub_dir.iterate();
while (try sub_iter.next()) |_| {
counter += 1;
}
}
}
return counter;
} }
fn countNixPackages(allocator: std.mem.Allocator) !usize { fn countNixPackages(allocator: std.mem.Allocator) !usize {