From 7f1e2d2f03b6ec6de776f415c524f9ffecad952d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 8 Sep 2023 15:25:22 +0800 Subject: [PATCH] Packages (Windows): support winget packages count Guarded behind `--allow-slow-operations` --- src/detection/packages/packages.h | 1 + src/detection/packages/packages_windows.c | 34 ++++++++++++++++++++++- src/fastfetch.c | 3 +- src/modules/packages/packages.c | 5 +++- 4 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/detection/packages/packages.h b/src/detection/packages/packages.h index 77f8e6812..ae36b5078 100644 --- a/src/detection/packages/packages.h +++ b/src/detection/packages/packages.h @@ -27,6 +27,7 @@ typedef struct FFPackagesResult uint32_t rpm; uint32_t scoop; uint32_t snap; + uint32_t winget; uint32_t xbps; uint32_t all; //Make sure this goes last diff --git a/src/detection/packages/packages_windows.c b/src/detection/packages/packages_windows.c index 5b5343f79..bfd6a4c79 100644 --- a/src/detection/packages/packages_windows.c +++ b/src/detection/packages/packages_windows.c @@ -1,4 +1,5 @@ #include "packages.h" +#include "common/processing.h" #include "util/stringUtils.h" #include @@ -62,7 +63,7 @@ static void detectChoco(FF_MAYBE_UNUSED FFPackagesResult* result) result->choco = getNumElements(chocoPath, FILE_ATTRIBUTE_DIRECTORY, "choco"); } -static void detectPacman(FF_MAYBE_UNUSED FFPackagesResult* result) +static void detectPacman(FFPackagesResult* result) { const char* msystemPrefix = getenv("MSYSTEM_PREFIX"); if(!msystemPrefix) @@ -75,9 +76,40 @@ static void detectPacman(FF_MAYBE_UNUSED FFPackagesResult* result) result->pacman = getNumElements(pacmanPath, FILE_ATTRIBUTE_DIRECTORY, NULL); } +static void detectWinget(FFPackagesResult* result) +{ + FF_STRBUF_AUTO_DESTROY buffer = ffStrbufCreate(); + if (ffProcessAppendStdOut(&buffer, (char* []) { + "winget.exe", + "list", + "--disable-interactivity", + NULL, + })) + return; + + uint32_t index = ffStrbufFirstIndexS(&buffer, "--\r\n"); // Ignore garbage and table headers + if (index == buffer.length) + return; + + uint32_t count = 0; + for ( + index += strlen("--\r\n"); + (index = ffStrbufNextIndexC(&buffer, index, '\n')) < buffer.length; + ++index + ) + ++count; + + if (buffer.chars[buffer.length - 1] != '\n') // count last line + ++count; + + result->winget = count; +} + void ffDetectPackagesImpl(FFPackagesResult* result) { detectScoop(result); detectChoco(result); detectPacman(result); + if (instance.config.allowSlowOperations) + detectWinget(result); } diff --git a/src/fastfetch.c b/src/fastfetch.c index ef041ae3b..5bf30bfa5 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -129,7 +129,7 @@ static inline void printCommandHelp(const char* command) } else if(ffStrEqualsIgnCase(command, "packages-format")) { - constructAndPrintCommandHelpFormat("packages", "{2} (pacman){?3}[{3}]{?}, {4} (dpkg), {5} (rpm), {6} (emerge), {7} (eopkg), {8} (xbps), {9} (nix-system), {10} (nix-user), {11} (nix-default), {12} (apk), {13} (pkg), {14} (flatpak-system), {15} (flatpack-user), {16} (snap), {17} (brew), {18} (brew-cask), {19} (port), {20} (scoop), {21} (choco), {22} (pkgtool), {23} (paludis)", 23, + constructAndPrintCommandHelpFormat("packages", "{2} (pacman){?3}[{3}]{?}, {4} (dpkg), {5} (rpm), {6} (emerge), {7} (eopkg), {8} (xbps), {9} (nix-system), {10} (nix-user), {11} (nix-default), {12} (apk), {13} (pkg), {14} (flatpak-system), {15} (flatpack-user), {16} (snap), {17} (brew), {18} (brew-cask), {19} (port), {20} (scoop), {21} (choco), {22} (pkgtool), {23} (paludis), {24} (winget)", 24, "Number of all packages", "Number of pacman packages", "Pacman branch on manjaro", @@ -153,6 +153,7 @@ static inline void printCommandHelp(const char* command) "Number of choco packages", "Number of pkgtool packages", "Number of paludis packages" + "Number of winget packages" ); } else if(ffStrEqualsIgnCase(command, "shell-format")) diff --git a/src/modules/packages/packages.c b/src/modules/packages/packages.c index 1c1b67140..2129050fe 100644 --- a/src/modules/packages/packages.c +++ b/src/modules/packages/packages.c @@ -4,7 +4,7 @@ #include "modules/packages/packages.h" #include "util/stringUtils.h" -#define FF_PACKAGES_NUM_FORMAT_ARGS 22 +#define FF_PACKAGES_NUM_FORMAT_ARGS 24 void ffPrintPackages(FFPackagesOptions* options) { @@ -63,6 +63,7 @@ void ffPrintPackages(FFPackagesOptions* options) FF_PRINT_PACKAGE(choco) FF_PRINT_PACKAGE(pkgtool) FF_PRINT_PACKAGE(paludis) + FF_PRINT_PACKAGE(winget) putchar('\n'); } @@ -91,6 +92,8 @@ void ffPrintPackages(FFPackagesOptions* options) {FF_FORMAT_ARG_TYPE_UINT, &counts.scoop}, {FF_FORMAT_ARG_TYPE_UINT, &counts.choco}, {FF_FORMAT_ARG_TYPE_UINT, &counts.pkgtool}, + {FF_FORMAT_ARG_TYPE_UINT, &counts.paludis}, + {FF_FORMAT_ARG_TYPE_UINT, &counts.winget}, }); }