Skip to content

Commit b2a7ea2

Browse files
Matt Van Hornclaude
authored andcommitted
Packages: add AppImage counting
Scan ~/AppImages and ~/Applications for .AppImage files and include them in the packages count. Fixes #2179 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent b00593a commit b2a7ea2

6 files changed

Lines changed: 30 additions & 3 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ if(NOT BINARY_LINK_TYPE IN_LIST BINARY_LINK_TYPE_OPTIONS)
119119
message(FATAL_ERROR "BINARY_LINK_TYPE must be one of ${BINARY_LINK_TYPE_OPTIONS}")
120120
endif()
121121

122-
set(PACKAGE_MANAGERS AM APK BREW CHOCO DPKG EMERGE EOPKG FLATPAK GUIX LINGLONG LPKG LPKGBUILD MACPORTS NIX OPKG PACMAN PACSTALL PALUDIS PISI PKG PKGTOOL RPM SCOOP SNAP SOAR SORCERY WINGET XBPS)
122+
set(PACKAGE_MANAGERS AM APPIMAGE APK BREW CHOCO DPKG EMERGE EOPKG FLATPAK GUIX LINGLONG LPKG LPKGBUILD MACPORTS NIX OPKG PACMAN PACSTALL PALUDIS PISI PKG PKGTOOL RPM SCOOP SNAP SOAR SORCERY WINGET XBPS)
123123
foreach(package_manager ${PACKAGE_MANAGERS})
124124
if(package_manager STREQUAL "WINGET")
125125
option(PACKAGES_DISABLE_${package_manager} "Disable ${package_manager} package manager detection by default" ON)

doc/json_schema.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@
442442
"type": "string"
443443
},
444444
"packagesFormat": {
445-
"description": "Output format of the module `Packages`. See Wiki for formatting syntax\n 1. {all}: Number of all packages\n 2. {pacman}: Number of pacman packages\n 3. {pacman-branch}: Pacman branch on manjaro\n 4. {dpkg}: Number of dpkg packages\n 5. {rpm}: Number of rpm packages\n 6. {emerge}: Number of emerge packages\n 7. {eopkg}: Number of eopkg packages\n 8. {xbps}: Number of xbps packages\n 9. {nix-system}: Number of nix-system packages\n 10. {nix-user}: Number of nix-user packages\n 11. {nix-default}: Number of nix-default packages\n 12. {apk}: Number of apk packages\n 13. {pkg}: Number of pkg packages\n 14. {flatpak-system}: Number of flatpak-system app packages\n 15. {flatpak-user}: Number of flatpak-user app packages\n 16. {snap}: Number of snap packages\n 17. {brew}: Number of brew packages\n 18. {brew-cask}: Number of brew-cask packages\n 19. {macports}: Number of macports packages\n 20. {scoop-user}: Number of scoop-user packages\n 21. {scoop-global}: Number of scoop-global packages\n 22. {choco}: Number of choco packages\n 23. {pkgtool}: Number of pkgtool packages\n 24. {paludis}: Number of paludis packages\n 25. {winget}: Number of winget packages\n 26. {opkg}: Number of opkg packages\n 27. {am-system}: Number of am-system packages\n 28. {sorcery}: Number of sorcery packages\n 29. {lpkg}: Number of lpkg packages\n 30. {lpkgbuild}: Number of lpkgbuild packages\n 31. {guix-system}: Number of guix-system packages\n 32. {guix-user}: Number of guix-user packages\n 33. {guix-home}: Number of guix-home packages\n 34. {linglong}: Number of linglong packages\n 35. {pacstall}: Number of pacstall packages\n 36. {mport}: Number of mport packages\n 37. {am-user}: Number of am-user (aka appman) packages\n 38. {pkgsrc}: Number of pkgsrc packages\n 39. {hpkg-system}: Number of hpkg-system packages\n 40. {hpkg-user}: Number of hpkg-user packages\n 41. {pisi}: Number of pisi packages\n 42. {soar}: Number of soar packages\n 43. {kiss}: Number of kiss packages\n 44. {moss}: Number of moss packages\n 45. {nix-all}: Total number of all nix packages\n 46. {flatpak-all}: Total number of all flatpak app packages\n 47. {brew-all}: Total number of all brew packages\n 48. {guix-all}: Total number of all guix packages\n 49. {hpkg-all}: Total number of all hpkg packages",
445+
"description": "Output format of the module `Packages`. See Wiki for formatting syntax\n 1. {all}: Number of all packages\n 2. {pacman}: Number of pacman packages\n 3. {pacman-branch}: Pacman branch on manjaro\n 4. {dpkg}: Number of dpkg packages\n 5. {rpm}: Number of rpm packages\n 6. {emerge}: Number of emerge packages\n 7. {eopkg}: Number of eopkg packages\n 8. {xbps}: Number of xbps packages\n 9. {nix-system}: Number of nix-system packages\n 10. {nix-user}: Number of nix-user packages\n 11. {nix-default}: Number of nix-default packages\n 12. {apk}: Number of apk packages\n 13. {pkg}: Number of pkg packages\n 14. {flatpak-system}: Number of flatpak-system app packages\n 15. {flatpak-user}: Number of flatpak-user app packages\n 16. {snap}: Number of snap packages\n 17. {brew}: Number of brew packages\n 18. {brew-cask}: Number of brew-cask packages\n 19. {macports}: Number of macports packages\n 20. {scoop-user}: Number of scoop-user packages\n 21. {scoop-global}: Number of scoop-global packages\n 22. {choco}: Number of choco packages\n 23. {pkgtool}: Number of pkgtool packages\n 24. {paludis}: Number of paludis packages\n 25. {winget}: Number of winget packages\n 26. {opkg}: Number of opkg packages\n 27. {am-system}: Number of am-system packages\n 28. {sorcery}: Number of sorcery packages\n 29. {lpkg}: Number of lpkg packages\n 30. {lpkgbuild}: Number of lpkgbuild packages\n 31. {guix-system}: Number of guix-system packages\n 32. {guix-user}: Number of guix-user packages\n 33. {guix-home}: Number of guix-home packages\n 34. {linglong}: Number of linglong packages\n 35. {pacstall}: Number of pacstall packages\n 36. {mport}: Number of mport packages\n 37. {am-user}: Number of am-user (aka appman) packages\n 38. {appimage}: Number of appimage packages\n 39. {pkgsrc}: Number of pkgsrc packages\n 40. {hpkg-system}: Number of hpkg-system packages\n 41. {hpkg-user}: Number of hpkg-user packages\n 42. {pisi}: Number of pisi packages\n 43. {soar}: Number of soar packages\n 44. {kiss}: Number of kiss packages\n 45. {moss}: Number of moss packages\n 46. {nix-all}: Total number of all nix packages\n 47. {flatpak-all}: Total number of all flatpak app packages\n 48. {brew-all}: Total number of all brew packages\n 49. {guix-all}: Total number of all guix packages\n 50. {hpkg-all}: Total number of all hpkg packages",
446446
"type": "string"
447447
},
448448
"physicaldiskFormat": {

src/detection/packages/packages.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
typedef struct FFPackagesResult {
77
uint32_t amSystem;
88
uint32_t amUser;
9+
uint32_t appimage;
910
uint32_t apk;
1011
uint32_t brew;
1112
uint32_t brewCask;

src/detection/packages/packages_linux.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,21 @@ static uint32_t countFilesRecursive(FFstrbuf* baseDir, const char* dirname, cons
118118
return sum;
119119
}
120120

121+
static uint32_t getNumElementsBySuffix(FFstrbuf* baseDir, const char* dirname, const char* suffix) {
122+
uint32_t baseDirLength = baseDir->length;
123+
ffStrbufAppendS(baseDir, dirname);
124+
FF_AUTO_CLOSE_DIR DIR* dirp = opendir(baseDir->chars);
125+
ffStrbufSubstrBefore(baseDir, baseDirLength);
126+
if (dirp == NULL) return 0;
127+
uint32_t count = 0;
128+
struct dirent* entry;
129+
while ((entry = readdir(dirp)) != NULL) {
130+
if (entry->d_name[0] != '.' && ffStrEndsWithIgnCase(entry->d_name, suffix))
131+
++count;
132+
}
133+
return count;
134+
}
135+
121136
static uint32_t getXBPSImpl(FFstrbuf* baseDir) {
122137
DIR* dir = opendir(baseDir->chars);
123138
if (dir == NULL) {
@@ -497,6 +512,10 @@ static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts,
497512
if (!(options->disabled & FF_PACKAGES_FLAG_AM_BIT)) {
498513
packageCounts->amSystem = getAMSystem(baseDir);
499514
}
515+
if (!(options->disabled & FF_PACKAGES_FLAG_APPIMAGE_BIT)) {
516+
packageCounts->appimage += getNumElementsBySuffix(baseDir, "/AppImages", ".appimage");
517+
packageCounts->appimage += getNumElementsBySuffix(baseDir, "/Applications", ".appimage");
518+
}
500519
if (!(options->disabled & FF_PACKAGES_FLAG_SORCERY_BIT)) {
501520
packageCounts->sorcery += getNumStrings(baseDir, "/var/state/sorcery/packages", ":installed:", "sorcery");
502521
}

src/modules/packages/option.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ typedef enum __attribute__((__packed__)) FFPackagesFlags {
3737
FF_PACKAGES_FLAG_SOAR_BIT = 1ULL << 30,
3838
FF_PACKAGES_FLAG_KISS_BIT = 1ULL << 31,
3939
FF_PACKAGES_FLAG_MOSS_BIT = 1ULL << 32,
40+
FF_PACKAGES_FLAG_APPIMAGE_BIT = 1ULL << 33,
4041
FF_PACKAGES_FLAG_FORCE_UNSIGNED = UINT64_MAX,
4142
} FFPackagesFlags;
4243
static_assert(sizeof(FFPackagesFlags) == sizeof(uint64_t), "");

src/modules/packages/packages.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ bool ffPrintPackages(FFPackagesOptions* options) {
109109
FF_PRINT_PACKAGE_NAME(amSystem, "am")
110110
FF_PRINT_PACKAGE_NAME(amUser, "appman")
111111
}
112+
FF_PRINT_PACKAGE(appimage)
112113
FF_PRINT_PACKAGE(sorcery)
113114
FF_PRINT_PACKAGE(lpkg)
114115
FF_PRINT_PACKAGE(lpkgbuild)
@@ -166,6 +167,7 @@ bool ffPrintPackages(FFPackagesOptions* options) {
166167
FF_ARG(counts.pacstall, "pacstall"),
167168
FF_ARG(counts.mport, "mport"),
168169
FF_ARG(counts.amUser, "am-user"),
170+
FF_ARG(counts.appimage, "appimage"),
169171
FF_ARG(counts.pkgsrc, "pkgsrc"),
170172
FF_ARG(counts.hpkgSystem, "hpkg-system"),
171173
FF_ARG(counts.hpkgUser, "hpkg-user"),
@@ -220,8 +222,9 @@ void ffParsePackagesJsonObject(FFPackagesOptions* options, yyjson_val* module) {
220222
case 'A':
221223
if (false)
222224
;
223-
FF_TEST_PACKAGE_NAME(APK)
224225
FF_TEST_PACKAGE_NAME(AM)
226+
FF_TEST_PACKAGE_NAME(APPIMAGE)
227+
FF_TEST_PACKAGE_NAME(APK)
225228
break;
226229
case 'B':
227230
if (false)
@@ -352,6 +355,7 @@ void ffGeneratePackagesJsonConfig(FFPackagesOptions* options, yyjson_mut_doc* do
352355
if (false)
353356
;
354357
FF_TEST_PACKAGE_NAME(AM)
358+
FF_TEST_PACKAGE_NAME(APPIMAGE)
355359
FF_TEST_PACKAGE_NAME(APK)
356360
FF_TEST_PACKAGE_NAME(BREW)
357361
FF_TEST_PACKAGE_NAME(CHOCO)
@@ -407,6 +411,7 @@ bool ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy
407411
FF_APPEND_PACKAGE_COUNT(all)
408412
FF_APPEND_PACKAGE_COUNT(amSystem)
409413
FF_APPEND_PACKAGE_COUNT(amUser)
414+
FF_APPEND_PACKAGE_COUNT(appimage)
410415
FF_APPEND_PACKAGE_COUNT(apk)
411416
FF_APPEND_PACKAGE_COUNT(brew)
412417
FF_APPEND_PACKAGE_COUNT(brewCask)
@@ -508,6 +513,7 @@ FFModuleBaseInfo ffPackagesModuleInfo = {
508513
{"Number of pacstall packages", "pacstall"},
509514
{"Number of mport packages", "mport"},
510515
{"Number of am-user (aka appman) packages", "am-user"},
516+
{"Number of appimage packages", "appimage"},
511517
{"Number of pkgsrc packages", "pkgsrc"},
512518
{"Number of hpkg-system packages", "hpkg-system"},
513519
{"Number of hpkg-user packages", "hpkg-user"},

0 commit comments

Comments
 (0)