ohmu
·
2026-10-15
1#include "packages.h"
2#include "common/io.h"
3#include "common/parsing.h"
4#include "common/processing.h"
5#include "common/strutil.h"
6
7static void countBrewPackages(FFstrbuf* baseDir, FFPackagesResult* result) {
8 uint32_t baseDirLength = baseDir->length;
9
10 ffStrbufAppendS(baseDir, "/Caskroom");
11 result->brewCask += ffPackagesGetNumElements(baseDir->chars, true);
12 ffStrbufSubstrBefore(baseDir, baseDirLength);
13
14 ffStrbufAppendS(baseDir, "/Cellar");
15 result->brew += ffPackagesGetNumElements(baseDir->chars, true);
16 ffStrbufSubstrBefore(baseDir, baseDirLength);
17}
18
19static uint32_t getMacPortsPackages(FFstrbuf* baseDir) {
20 ffStrbufAppendS(baseDir, "/var/macports/software");
21 return ffPackagesGetNumElements(baseDir->chars, true);
22}
23
24void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) {
25 FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreate();
26 if (FF_PACKAGES_IS_ENABLED(options, BREW)) {
27 const char* prefix = getenv("HOMEBREW_PREFIX");
28 if (ffStrSet(prefix)) {
29 ffStrbufSetS(&baseDir, prefix);
30 } else {
31#ifdef __aarch64__
32 ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_ROOT "/opt/homebrew");
33#else
34 ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_USR "/local");
35#endif
36 }
37 countBrewPackages(&baseDir, result);
38 }
39 if (FF_PACKAGES_IS_ENABLED(options, MACPORTS)) {
40 const char* prefix = getenv("MACPORTS_PREFIX");
41 if (ffStrSet(prefix)) {
42 ffStrbufSetS(&baseDir, prefix);
43 } else {
44 ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_ROOT "/opt/local");
45 }
46
47 result->macports = getMacPortsPackages(&baseDir);
48 }
49 if (FF_PACKAGES_IS_ENABLED(options, PKGSRC)) {
50 const char* prefix = getenv("PKG_DBDIR");
51 if (ffStrSet(prefix)) {
52 result->pkgsrc = ffPackagesGetNumElements(prefix, true);
53 } else {
54 result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", true);
55 }
56 }
57 if (FF_PACKAGES_IS_ENABLED(options, NIX)) {
58 ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_ROOT);
59 result->nixDefault += ffPackagesGetNix(&baseDir, "/nix/var/nix/profiles/default");
60 result->nixSystem += ffPackagesGetNix(&baseDir, "/run/current-system");
61 ffStrbufSet(&baseDir, &instance.state.platform.homeDir);
62 result->nixUser = ffPackagesGetNix(&baseDir, "/.nix-profile");
63 }
64}