1313#include <sys/stat.h>
1414
1515#define FF_PACKAGES_MODULE_NAME "Packages"
16- #define FF_PACKAGES_NUM_FORMAT_ARGS 14
16+ #define FF_PACKAGES_NUM_FORMAT_ARGS 15
1717
1818typedef struct PackageCounts
1919{
@@ -28,6 +28,7 @@ typedef struct PackageCounts
2828 uint32_t flatpak ;
2929 uint32_t snap ;
3030 uint32_t brew ;
31+ uint32_t port ;
3132
3233 FFstrbuf pacmanBranch ;
3334} PackageCounts ;
@@ -222,6 +223,41 @@ static uint32_t getBrewPackages(FFstrbuf* baseDir)
222223 return result ;
223224}
224225
226+ static uint32_t countMacPortsPackages (FFstrbuf * baseDir )
227+ {
228+ uint32_t result = 0 ;
229+ uint32_t baseDirLength = baseDir -> length ;
230+
231+ ffStrbufAppendS (baseDir , "/var/macports/software" );
232+ result += getNumElements (baseDir -> chars , DT_DIR );
233+ ffStrbufSubstrBefore (baseDir , baseDirLength );
234+
235+ return result ;
236+ }
237+
238+ static uint32_t getMacPortsPackages (FFstrbuf * baseDir )
239+ {
240+ uint32_t result = 0 ;
241+ uint32_t baseDirLength = baseDir -> length ;
242+
243+ const char * prefix = getenv ("MACPORTS_PREFIX" );
244+ bool prefixSet = ffStrSet (prefix );
245+
246+ if (prefixSet )
247+ {
248+ ffStrbufAppendS (baseDir , prefix );
249+ result += countMacPortsPackages (baseDir );
250+ ffStrbufSubstrBefore (baseDir , baseDirLength );
251+ }
252+
253+ ffStrbufAppendS (baseDir , "/opt/local" );
254+ if (!prefixSet || strcasecmp (baseDir -> chars , prefix ) != 0 )
255+ result += countMacPortsPackages (baseDir );
256+ ffStrbufSubstrBefore (baseDir , baseDirLength );
257+
258+ return result ;
259+ }
260+
225261#endif // __APPLE__
226262
227263#ifdef FF_HAVE_RPM
@@ -353,6 +389,7 @@ static void getPackageCounts(const FFinstance* instance, FFstrbuf* baseDir, Pack
353389
354390 //brew
355391 packageCounts -> brew += getBrewPackages (baseDir );
392+ packageCounts -> port += getMacPortsPackages (baseDir );
356393
357394 #endif // __APPLE__
358395}
@@ -421,7 +458,7 @@ void ffPrintPackages(FFinstance* instance)
421458
422459 ffStrbufDestroy (& baseDir );
423460
424- uint32_t all = counts .pacman + counts .dpkg + counts .rpm + counts .emerge + counts .xbps + counts .nixSystem + nixUser + counts .nixDefault + counts .apk + counts .flatpak + counts .snap + counts .brew ;
461+ uint32_t all = counts .pacman + counts .dpkg + counts .rpm + counts .emerge + counts .xbps + counts .nixSystem + nixUser + counts .nixDefault + counts .apk + counts .flatpak + counts .snap + counts .brew + counts . port ;
425462 if (all == 0 )
426463 {
427464 ffPrintError (instance , FF_PACKAGES_MODULE_NAME , 0 , & instance -> config .packages , "No packages from known package managers found" );
@@ -479,6 +516,7 @@ void ffPrintPackages(FFinstance* instance)
479516 FF_PRINT_PACKAGE (flatpak )
480517 FF_PRINT_PACKAGE (snap )
481518 FF_PRINT_PACKAGE (brew )
519+ FF_PRINT_PACKAGE (port )
482520
483521 //Fix linter warning of unused value of all
484522 (void ) all ;
@@ -503,7 +541,8 @@ void ffPrintPackages(FFinstance* instance)
503541 {FF_FORMAT_ARG_TYPE_UINT , & counts .apk },
504542 {FF_FORMAT_ARG_TYPE_UINT , & counts .flatpak },
505543 {FF_FORMAT_ARG_TYPE_UINT , & counts .snap },
506- {FF_FORMAT_ARG_TYPE_UINT , & counts .brew }
544+ {FF_FORMAT_ARG_TYPE_UINT , & counts .brew },
545+ {FF_FORMAT_ARG_TYPE_UINT , & counts .port }
507546 });
508547 }
509548
0 commit comments