diff --git a/src/detection/packages/packages.h b/src/detection/packages/packages.h index 47c948f8c..e96b0762c 100644 --- a/src/detection/packages/packages.h +++ b/src/detection/packages/packages.h @@ -37,7 +37,8 @@ typedef struct FFPackagesResult uint32_t pkgsrc; uint32_t pkgtool; uint32_t rpm; - uint32_t scoop; + uint32_t scoopUser; + uint32_t scoopGlobal; uint32_t snap; uint32_t soar; uint32_t sorcery; diff --git a/src/detection/packages/packages_windows.c b/src/detection/packages/packages_windows.c index 1d13e0798..f4a497dd4 100644 --- a/src/detection/packages/packages_windows.c +++ b/src/detection/packages/packages_windows.c @@ -34,23 +34,53 @@ static uint32_t getNumElements(const char* searchPath /* including `\*` suffix * return counter; } +static inline void wrapYyjsonFree(yyjson_doc** doc) +{ + assert(doc); + if (*doc) + yyjson_doc_free(*doc); +} + static void detectScoop(FFPackagesResult* result) { FF_STRBUF_AUTO_DESTROY scoopPath = ffStrbufCreateA(MAX_PATH + 3); + ffStrbufAppendS(&scoopPath, instance.state.platform.homeDir.chars); + ffStrbufAppendS(&scoopPath, ".config/scoop/config.json"); - if(ffFindExecutableInPath("scoop.cmd", &scoopPath) == NULL) + yyjson_val* root = NULL; + + yyjson_doc* __attribute__((__cleanup__(wrapYyjsonFree))) doc = yyjson_read_file(scoopPath.chars, 0, NULL, NULL); + if (doc) { - // C:\Users\$USER\scoop\shims\scoop.cmd - ffStrbufSubstrBeforeLastC(&scoopPath, '\\'); - ffStrbufSubstrBeforeLastC(&scoopPath, '\\'); + root = yyjson_doc_get_root(doc); + if (!yyjson_is_obj(root)) root = NULL; + } + + { + ffStrbufClear(&scoopPath); + if (root) + ffStrbufSetS(&scoopPath, yyjson_get_str(yyjson_obj_get(root, "root_path"))); + if (scoopPath.length == 0) + { + ffStrbufSet(&scoopPath, &instance.state.platform.homeDir); + ffStrbufAppendS(&scoopPath, "/scoop"); + } ffStrbufAppendS(&scoopPath, "/apps/*"); + result->scoopUser = getNumElements(scoopPath.chars, FILE_ATTRIBUTE_DIRECTORY, "scoop"); } - else + { - ffStrbufAppendS(&scoopPath, instance.state.platform.homeDir.chars); - ffStrbufAppendS(&scoopPath, "/scoop/apps/*"); + ffStrbufClear(&scoopPath); + if (root) + ffStrbufSetS(&scoopPath, yyjson_get_str(yyjson_obj_get(root, "global_path"))); + if (scoopPath.length == 0) + { + ffStrbufSetS(&scoopPath, getenv("ProgramData")); + ffStrbufAppendS(&scoopPath, "/scoop"); + } + ffStrbufAppendS(&scoopPath, "/apps/*"); + result->scoopGlobal = getNumElements(scoopPath.chars, FILE_ATTRIBUTE_DIRECTORY, "scoop"); } - result->scoop = getNumElements(scoopPath.chars, FILE_ATTRIBUTE_DIRECTORY, "scoop"); } static void detectChoco(FF_MAYBE_UNUSED FFPackagesResult* result) diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 4fb26080a..06c1817a3 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -23,6 +23,7 @@ void ffPrintPackages(FFPackagesOptions* options) uint32_t guixAll = counts.guixSystem + counts.guixUser + counts.guixHome; uint32_t hpkgAll = counts.hpkgSystem + counts.hpkgUser; uint32_t amAll = counts.amSystem + counts.amUser; + uint32_t scoopAll = counts.scoopUser + counts.scoopGlobal; if(options->moduleArgs.outputFormat.length == 0) { @@ -104,7 +105,15 @@ void ffPrintPackages(FFPackagesOptions* options) FF_PRINT_PACKAGE_NAME(brewCask, "brew-cask") } FF_PRINT_PACKAGE(macports) - FF_PRINT_PACKAGE(scoop) + if (options->combined) + { + FF_PRINT_PACKAGE_ALL(scoop); + } + else + { + FF_PRINT_PACKAGE_NAME(scoopUser, counts.scoopGlobal ? "scoop-user" : "scoop") + FF_PRINT_PACKAGE_NAME(scoopGlobal, "scoop-global") + } FF_PRINT_PACKAGE(choco) FF_PRINT_PACKAGE(pkgtool) FF_PRINT_PACKAGE(paludis) @@ -162,7 +171,8 @@ void ffPrintPackages(FFPackagesOptions* options) FF_FORMAT_ARG(counts.brew, "brew"), FF_FORMAT_ARG(counts.brewCask, "brew-cask"), FF_FORMAT_ARG(counts.macports, "macports"), - FF_FORMAT_ARG(counts.scoop, "scoop"), + FF_FORMAT_ARG(counts.scoopUser, "scoop-user"), + FF_FORMAT_ARG(counts.scoopGlobal, "scoop-global"), FF_FORMAT_ARG(counts.choco, "choco"), FF_FORMAT_ARG(counts.pkgtool, "pkgtool"), FF_FORMAT_ARG(counts.paludis, "paludis"), @@ -521,7 +531,8 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy FF_APPEND_PACKAGE_COUNT(pkgsrc) FF_APPEND_PACKAGE_COUNT(macports) FF_APPEND_PACKAGE_COUNT(rpm) - FF_APPEND_PACKAGE_COUNT(scoop) + FF_APPEND_PACKAGE_COUNT(scoopUser) + FF_APPEND_PACKAGE_COUNT(scoopGlobal) FF_APPEND_PACKAGE_COUNT(snap) FF_APPEND_PACKAGE_COUNT(soar) FF_APPEND_PACKAGE_COUNT(sorcery) @@ -558,7 +569,8 @@ static FFModuleBaseInfo ffModuleInfo = { {"Number of brew packages", "brew"}, {"Number of brew-cask packages", "brew-cask"}, {"Number of macports packages", "macports"}, - {"Number of scoop packages", "scoop"}, + {"Number of scoop-user packages", "scoop-user"}, + {"Number of scoop-global packages", "scoop-global"}, {"Number of choco packages", "choco"}, {"Number of pkgtool packages", "pkgtool"}, {"Number of paludis packages", "paludis"},