Skip to content

Commit ca79bae

Browse files
committed
Packages (Windows): find scoop installation path by parsing scoop config file
1 parent b1f0248 commit ca79bae

File tree

3 files changed

+56
-13
lines changed

3 files changed

+56
-13
lines changed

src/detection/packages/packages.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ typedef struct FFPackagesResult
3737
uint32_t pkgsrc;
3838
uint32_t pkgtool;
3939
uint32_t rpm;
40-
uint32_t scoop;
40+
uint32_t scoopUser;
41+
uint32_t scoopGlobal;
4142
uint32_t snap;
4243
uint32_t soar;
4344
uint32_t sorcery;

src/detection/packages/packages_windows.c

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,23 +34,53 @@ static uint32_t getNumElements(const char* searchPath /* including `\*` suffix *
3434
return counter;
3535
}
3636

37+
static inline void wrapYyjsonFree(yyjson_doc** doc)
38+
{
39+
assert(doc);
40+
if (*doc)
41+
yyjson_doc_free(*doc);
42+
}
43+
3744
static void detectScoop(FFPackagesResult* result)
3845
{
3946
FF_STRBUF_AUTO_DESTROY scoopPath = ffStrbufCreateA(MAX_PATH + 3);
47+
ffStrbufAppendS(&scoopPath, instance.state.platform.homeDir.chars);
48+
ffStrbufAppendS(&scoopPath, ".config/scoop/config.json");
4049

41-
if(ffFindExecutableInPath("scoop.cmd", &scoopPath) == NULL)
50+
yyjson_val* root = NULL;
51+
52+
yyjson_doc* __attribute__((__cleanup__(wrapYyjsonFree))) doc = yyjson_read_file(scoopPath.chars, 0, NULL, NULL);
53+
if (doc)
4254
{
43-
// C:\Users\$USER\scoop\shims\scoop.cmd
44-
ffStrbufSubstrBeforeLastC(&scoopPath, '\\');
45-
ffStrbufSubstrBeforeLastC(&scoopPath, '\\');
55+
root = yyjson_doc_get_root(doc);
56+
if (!yyjson_is_obj(root)) root = NULL;
57+
}
58+
59+
{
60+
ffStrbufClear(&scoopPath);
61+
if (root)
62+
ffStrbufSetS(&scoopPath, yyjson_get_str(yyjson_obj_get(root, "root_path")));
63+
if (scoopPath.length == 0)
64+
{
65+
ffStrbufSet(&scoopPath, &instance.state.platform.homeDir);
66+
ffStrbufAppendS(&scoopPath, "/scoop");
67+
}
4668
ffStrbufAppendS(&scoopPath, "/apps/*");
69+
result->scoopUser = getNumElements(scoopPath.chars, FILE_ATTRIBUTE_DIRECTORY, "scoop");
4770
}
48-
else
71+
4972
{
50-
ffStrbufAppendS(&scoopPath, instance.state.platform.homeDir.chars);
51-
ffStrbufAppendS(&scoopPath, "/scoop/apps/*");
73+
ffStrbufClear(&scoopPath);
74+
if (root)
75+
ffStrbufSetS(&scoopPath, yyjson_get_str(yyjson_obj_get(root, "global_path")));
76+
if (scoopPath.length == 0)
77+
{
78+
ffStrbufSetS(&scoopPath, getenv("ProgramData"));
79+
ffStrbufAppendS(&scoopPath, "/scoop");
80+
}
81+
ffStrbufAppendS(&scoopPath, "/apps/*");
82+
result->scoopGlobal = getNumElements(scoopPath.chars, FILE_ATTRIBUTE_DIRECTORY, "scoop");
5283
}
53-
result->scoop = getNumElements(scoopPath.chars, FILE_ATTRIBUTE_DIRECTORY, "scoop");
5484
}
5585

5686
static void detectChoco(FF_MAYBE_UNUSED FFPackagesResult* result)

src/modules/packages/packages.c

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ void ffPrintPackages(FFPackagesOptions* options)
2323
uint32_t guixAll = counts.guixSystem + counts.guixUser + counts.guixHome;
2424
uint32_t hpkgAll = counts.hpkgSystem + counts.hpkgUser;
2525
uint32_t amAll = counts.amSystem + counts.amUser;
26+
uint32_t scoopAll = counts.scoopUser + counts.scoopGlobal;
2627

2728
if(options->moduleArgs.outputFormat.length == 0)
2829
{
@@ -104,7 +105,15 @@ void ffPrintPackages(FFPackagesOptions* options)
104105
FF_PRINT_PACKAGE_NAME(brewCask, "brew-cask")
105106
}
106107
FF_PRINT_PACKAGE(macports)
107-
FF_PRINT_PACKAGE(scoop)
108+
if (options->combined)
109+
{
110+
FF_PRINT_PACKAGE_ALL(scoop);
111+
}
112+
else
113+
{
114+
FF_PRINT_PACKAGE_NAME(scoopUser, counts.scoopGlobal ? "scoop-user" : "scoop")
115+
FF_PRINT_PACKAGE_NAME(scoopGlobal, "scoop-global")
116+
}
108117
FF_PRINT_PACKAGE(choco)
109118
FF_PRINT_PACKAGE(pkgtool)
110119
FF_PRINT_PACKAGE(paludis)
@@ -162,7 +171,8 @@ void ffPrintPackages(FFPackagesOptions* options)
162171
FF_FORMAT_ARG(counts.brew, "brew"),
163172
FF_FORMAT_ARG(counts.brewCask, "brew-cask"),
164173
FF_FORMAT_ARG(counts.macports, "macports"),
165-
FF_FORMAT_ARG(counts.scoop, "scoop"),
174+
FF_FORMAT_ARG(counts.scoopUser, "scoop-user"),
175+
FF_FORMAT_ARG(counts.scoopGlobal, "scoop-global"),
166176
FF_FORMAT_ARG(counts.choco, "choco"),
167177
FF_FORMAT_ARG(counts.pkgtool, "pkgtool"),
168178
FF_FORMAT_ARG(counts.paludis, "paludis"),
@@ -521,7 +531,8 @@ void ffGeneratePackagesJsonResult(FF_MAYBE_UNUSED FFPackagesOptions* options, yy
521531
FF_APPEND_PACKAGE_COUNT(pkgsrc)
522532
FF_APPEND_PACKAGE_COUNT(macports)
523533
FF_APPEND_PACKAGE_COUNT(rpm)
524-
FF_APPEND_PACKAGE_COUNT(scoop)
534+
FF_APPEND_PACKAGE_COUNT(scoopUser)
535+
FF_APPEND_PACKAGE_COUNT(scoopGlobal)
525536
FF_APPEND_PACKAGE_COUNT(snap)
526537
FF_APPEND_PACKAGE_COUNT(soar)
527538
FF_APPEND_PACKAGE_COUNT(sorcery)
@@ -558,7 +569,8 @@ static FFModuleBaseInfo ffModuleInfo = {
558569
{"Number of brew packages", "brew"},
559570
{"Number of brew-cask packages", "brew-cask"},
560571
{"Number of macports packages", "macports"},
561-
{"Number of scoop packages", "scoop"},
572+
{"Number of scoop-user packages", "scoop-user"},
573+
{"Number of scoop-global packages", "scoop-global"},
562574
{"Number of choco packages", "choco"},
563575
{"Number of pkgtool packages", "pkgtool"},
564576
{"Number of paludis packages", "paludis"},

0 commit comments

Comments
 (0)