Skip to content

Commit 3b56200

Browse files
committed
Packages: adds option PACKAGES_REMOVE_DISABLED to remove disabled package managers from the build entirely
1 parent de95a62 commit 3b56200

12 files changed

Lines changed: 134 additions & 98 deletions

File tree

CMakeLists.txt

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,14 +134,33 @@ if(NOT BINARY_LINK_TYPE IN_LIST BINARY_LINK_TYPE_OPTIONS)
134134
message(FATAL_ERROR "BINARY_LINK_TYPE must be one of ${BINARY_LINK_TYPE_OPTIONS}")
135135
endif()
136136

137-
set(PACKAGE_MANAGERS AM APPIMAGE APK BREW CHOCO DPKG EMERGE EOPKG FLATPAK GUIX LINGLONG LPKG LPKGBUILD MACPORTS NIX OPKG PACMAN PACSTALL PALUDIS PISI PKG PKGTOOL RPM SCOOP SNAP SOAR SORCERY WINGET XBPS)
137+
set(PACKAGE_MANAGERS
138+
AM APK APPIMAGE
139+
BREW
140+
CARDS CHOCO
141+
DPKG
142+
EMERGE EOPKG
143+
FLATPAK
144+
GUIX
145+
HPKG
146+
KISS
147+
LINGLONG LPKG LPKGBUILD
148+
MACPORTS MOSS MPORT
149+
NIX
150+
OPKG
151+
PACMAN PACSTALL PALUDIS PISI PKG PKGSRC PKGTOOL
152+
RPM
153+
SCOOP SNAP SOAR SORCERY
154+
WINGET
155+
XBPS)
138156
foreach(package_manager ${PACKAGE_MANAGERS})
139157
if(package_manager STREQUAL "WINGET")
140158
option(PACKAGES_DISABLE_${package_manager} "Disable ${package_manager} package manager detection by default" ON)
141159
else()
142160
option(PACKAGES_DISABLE_${package_manager} "Disable ${package_manager} package manager detection by default" OFF)
143161
endif()
144162
endforeach()
163+
option(PACKAGES_REMOVE_DISABLED "Remove disabled package managers from the build entirely, instead of just skipping them at runtime" OFF)
145164

146165
if (LINUX)
147166
set(CUSTOM_PCI_IDS_PATH "" CACHE STRING "Custom path to file pci.ids, defaults to `/usr/share/hwdata/pci.ids`")
@@ -2021,7 +2040,10 @@ else()
20212040
list(TRANSFORM PACKAGES_DISABLE_LIST APPEND "_BIT")
20222041
list(JOIN PACKAGES_DISABLE_LIST " | " PACKAGES_DISABLE_LIST)
20232042
endif()
2024-
target_compile_definitions(libfastfetch PRIVATE FF_PACKAGES_DISABLE_LIST=${PACKAGES_DISABLE_LIST})
2043+
target_compile_definitions(libfastfetch PRIVATE "FF_PACKAGES_DISABLE_LIST=${PACKAGES_DISABLE_LIST}")
2044+
if(PACKAGES_REMOVE_DISABLED)
2045+
target_compile_definitions(libfastfetch PRIVATE FF_PACKAGES_REMOVE_DISABLED=1)
2046+
endif()
20252047

20262048
######################
20272049
# Executable targets #

src/detection/packages/packages.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ typedef struct FFPackagesResult {
5454
FFstrbuf pacmanBranch;
5555
} FFPackagesResult;
5656

57+
#if FF_PACKAGES_REMOVE_DISABLED
58+
#define FF_PACKAGES_IS_ENABLED(options, pkgName) ({ (void) options; !((FF_PACKAGES_DISABLE_LIST) & (FF_PACKAGES_FLAG_ ## pkgName ## _BIT)); })
59+
#else
60+
#define FF_PACKAGES_IS_ENABLED(options, pkgName) (!((options)->disabled & (FF_PACKAGES_FLAG_ ## pkgName ## _BIT)))
61+
#endif
62+
5763
const char* ffDetectPackages(FFPackagesResult* result, FFPackagesOptions* options);
5864
bool ffPackagesReadCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, const char* filePath, const char* packageId, uint32_t* result);
5965
bool ffPackagesWriteCache(FFstrbuf* cacheDir, FFstrbuf* cacheContent, uint32_t num_elements);

src/detection/packages/packages_apple.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ static uint32_t getMacPortsPackages(FFstrbuf* baseDir) {
2323

2424
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) {
2525
FF_STRBUF_AUTO_DESTROY baseDir = ffStrbufCreate();
26-
if (!(options->disabled & FF_PACKAGES_FLAG_BREW_BIT)) {
26+
if (FF_PACKAGES_IS_ENABLED(options, BREW)) {
2727
const char* prefix = getenv("HOMEBREW_PREFIX");
2828
if (ffStrSet(prefix)) {
2929
ffStrbufSetS(&baseDir, prefix);
@@ -36,7 +36,7 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
3636
}
3737
countBrewPackages(&baseDir, result);
3838
}
39-
if (!(options->disabled & FF_PACKAGES_FLAG_MACPORTS_BIT)) {
39+
if (FF_PACKAGES_IS_ENABLED(options, MACPORTS)) {
4040
const char* prefix = getenv("MACPORTS_PREFIX");
4141
if (ffStrSet(prefix)) {
4242
ffStrbufSetS(&baseDir, prefix);
@@ -46,7 +46,7 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
4646

4747
result->macports = getMacPortsPackages(&baseDir);
4848
}
49-
if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT)) {
49+
if (FF_PACKAGES_IS_ENABLED(options, NIX)) {
5050
ffStrbufSetS(&baseDir, FASTFETCH_TARGET_DIR_ROOT);
5151
result->nixDefault += ffPackagesGetNix(&baseDir, "/nix/var/nix/profiles/default");
5252
result->nixSystem += ffPackagesGetNix(&baseDir, "/run/current-system");

src/detection/packages/packages_bsd.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ static uint32_t getSQLite3Int(const char* dbPath, const char* query, const char*
1919
}
2020

2121
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) {
22-
if (!(options->disabled & FF_PACKAGES_FLAG_PKG_BIT)) {
22+
if (FF_PACKAGES_IS_ENABLED(options, PKG)) {
2323
result->pkg = getSQLite3Int(FASTFETCH_TARGET_DIR_ROOT "/var/db/pkg/local.sqlite", "SELECT count(*) FROM packages", "pkg");
2424
}
25-
if (!(options->disabled & FF_PACKAGES_FLAG_MPORT_BIT)) {
25+
if (FF_PACKAGES_IS_ENABLED(options, MPORT)) {
2626
result->mport = getSQLite3Int(FASTFETCH_TARGET_DIR_ROOT "/var/db/mport/master.db", "SELECT count(*) FROM packages", "mport");
2727
}
2828
}

src/detection/packages/packages_haiku.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) {
66
// TODO: Use the Package Kit C++ API instead (would account for disabled packages)
77

8-
if (!(options->disabled & FF_PACKAGES_FLAG_HPKG_BIT)) {
8+
if (FF_PACKAGES_IS_ENABLED(options, HPKG)) {
99
result->hpkgSystem = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/system/packages", false);
1010
result->hpkgUser = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/boot/home/config/packages", false);
1111
}

src/detection/packages/packages_linux.c

Lines changed: 34 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -459,93 +459,93 @@ static uint32_t getPacmanPackages(FFstrbuf* baseDir) {
459459
}
460460

461461
static void getPackageCounts(FFstrbuf* baseDir, FFPackagesResult* packageCounts, FFPackagesOptions* options) {
462-
if (!(options->disabled & FF_PACKAGES_FLAG_APK_BIT)) {
462+
if (FF_PACKAGES_IS_ENABLED(options, APK)) {
463463
packageCounts->apk += getNumStrings(baseDir, "/lib/apk/db/installed", "C:Q", "apk");
464464
}
465-
if (!(options->disabled & FF_PACKAGES_FLAG_DPKG_BIT)) {
465+
if (FF_PACKAGES_IS_ENABLED(options, DPKG)) {
466466
packageCounts->dpkg += getNumStrings(baseDir, "/var/lib/dpkg/status", "Status: install ok installed", "dpkg");
467467
}
468-
if (!(options->disabled & FF_PACKAGES_FLAG_LPKG_BIT)) {
468+
if (FF_PACKAGES_IS_ENABLED(options, LPKG)) {
469469
packageCounts->lpkg += getNumStrings(baseDir, "/opt/Loc-OS-LPKG/installed-lpkg/Listinstalled-lpkg.list", "\n", "lpkg");
470470
}
471-
if (!(options->disabled & FF_PACKAGES_FLAG_EMERGE_BIT)) {
471+
if (FF_PACKAGES_IS_ENABLED(options, EMERGE)) {
472472
packageCounts->emerge += countFilesRecursive(baseDir, "/var/db/pkg", "SIZE");
473473
}
474-
if (!(options->disabled & FF_PACKAGES_FLAG_EOPKG_BIT)) {
474+
if (FF_PACKAGES_IS_ENABLED(options, EOPKG)) {
475475
packageCounts->eopkg += getNumElements(baseDir, "/var/lib/eopkg/package", true);
476476
}
477-
if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) {
477+
if (FF_PACKAGES_IS_ENABLED(options, FLATPAK)) {
478478
packageCounts->flatpakSystem += getFlatpakPackages(baseDir, "/var/lib");
479479
}
480-
if (!(options->disabled & FF_PACKAGES_FLAG_KISS_BIT)) {
480+
if (FF_PACKAGES_IS_ENABLED(options, KISS)) {
481481
packageCounts->kiss += getNumElements(baseDir, "/var/db/kiss/installed", true);
482482
}
483-
if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT)) {
483+
if (FF_PACKAGES_IS_ENABLED(options, NIX)) {
484484
packageCounts->nixDefault += ffPackagesGetNix(baseDir, "/nix/var/nix/profiles/default");
485485
packageCounts->nixSystem += ffPackagesGetNix(baseDir, "/run/current-system");
486486
}
487-
if (!(options->disabled & FF_PACKAGES_FLAG_PACMAN_BIT)) {
487+
if (FF_PACKAGES_IS_ENABLED(options, PACMAN)) {
488488
packageCounts->pacman += getPacmanPackages(baseDir);
489489
}
490-
if (!(options->disabled & FF_PACKAGES_FLAG_LPKGBUILD_BIT)) {
490+
if (FF_PACKAGES_IS_ENABLED(options, LPKGBUILD)) {
491491
packageCounts->lpkgbuild += getNumElements(baseDir, "/opt/Loc-OS-LPKG/lpkgbuild/remove", false);
492492
}
493-
if (!(options->disabled & FF_PACKAGES_FLAG_PKGTOOL_BIT)) {
493+
if (FF_PACKAGES_IS_ENABLED(options, PKGTOOL)) {
494494
packageCounts->pkgtool += getNumElements(baseDir, "/var/log/packages", false);
495495
}
496-
if (!(options->disabled & FF_PACKAGES_FLAG_RPM_BIT)) {
496+
if (FF_PACKAGES_IS_ENABLED(options, RPM)) {
497497
// `Sigmd5` is the only table that doesn't contain the virtual `gpg-pubkey` package
498498
packageCounts->rpm += getSQLite3Int(baseDir, "/var/lib/rpm/rpmdb.sqlite", "SELECT count(*) FROM Sigmd5", "rpm");
499499
}
500-
if (!(options->disabled & FF_PACKAGES_FLAG_SNAP_BIT)) {
500+
if (FF_PACKAGES_IS_ENABLED(options, SNAP)) {
501501
packageCounts->snap += getSnap(baseDir);
502502
}
503-
if (!(options->disabled & FF_PACKAGES_FLAG_XBPS_BIT)) {
503+
if (FF_PACKAGES_IS_ENABLED(options, XBPS)) {
504504
packageCounts->xbps += getXBPS(baseDir, "/var/db/xbps");
505505
}
506-
if (!(options->disabled & FF_PACKAGES_FLAG_BREW_BIT)) {
506+
if (FF_PACKAGES_IS_ENABLED(options, BREW)) {
507507
packageCounts->brewCask += getNumElements(baseDir, "/home/linuxbrew/.linuxbrew/Caskroom", true);
508508
packageCounts->brew += getNumElements(baseDir, "/home/linuxbrew/.linuxbrew/Cellar", true);
509509
}
510-
if (!(options->disabled & FF_PACKAGES_FLAG_PALUDIS_BIT)) {
510+
if (FF_PACKAGES_IS_ENABLED(options, PALUDIS)) {
511511
packageCounts->paludis += countFilesRecursive(baseDir, "/var/db/paludis/repositories", "environment.bz2");
512512
}
513-
if (!(options->disabled & FF_PACKAGES_FLAG_OPKG_BIT)) {
513+
if (FF_PACKAGES_IS_ENABLED(options, OPKG)) {
514514
packageCounts->opkg += getNumStrings(baseDir, "/usr/lib/opkg/status", "Package:", "opkg"); // openwrt
515515
}
516-
if (!(options->disabled & FF_PACKAGES_FLAG_AM_BIT)) {
516+
if (FF_PACKAGES_IS_ENABLED(options, AM)) {
517517
packageCounts->amSystem = getAMSystem(baseDir);
518518
}
519-
if (!(options->disabled & FF_PACKAGES_FLAG_SORCERY_BIT)) {
519+
if (FF_PACKAGES_IS_ENABLED(options, SORCERY)) {
520520
packageCounts->sorcery += getNumStrings(baseDir, "/var/state/sorcery/packages", ":installed:", "sorcery");
521521
}
522-
if (!(options->disabled & FF_PACKAGES_FLAG_GUIX_BIT)) {
522+
if (FF_PACKAGES_IS_ENABLED(options, GUIX)) {
523523
packageCounts->guixSystem += getGuixPackages(baseDir, "/run/current-system/profile");
524524
}
525-
if (!(options->disabled & FF_PACKAGES_FLAG_LINGLONG_BIT)) {
525+
if (FF_PACKAGES_IS_ENABLED(options, LINGLONG)) {
526526
packageCounts->linglong += getNumElements(baseDir, "/var/lib/linglong/layers", true);
527527
}
528-
if (!(options->disabled & FF_PACKAGES_FLAG_PACSTALL_BIT)) {
528+
if (FF_PACKAGES_IS_ENABLED(options, PACSTALL)) {
529529
packageCounts->pacstall += getNumElements(baseDir, "/var/lib/pacstall/metadata", false);
530530
}
531-
if (!(options->disabled & FF_PACKAGES_FLAG_PISI_BIT)) {
531+
if (FF_PACKAGES_IS_ENABLED(options, PISI)) {
532532
packageCounts->pisi += getNumElements(baseDir, "/var/lib/pisi/package", true);
533533
}
534-
if (!(options->disabled & FF_PACKAGES_FLAG_PKGSRC_BIT)) {
534+
if (FF_PACKAGES_IS_ENABLED(options, PKGSRC)) {
535535
packageCounts->pkgsrc += getNumElements(baseDir, "/usr/pkg/pkgdb", DT_DIR);
536536
}
537-
if (!(options->disabled & FF_PACKAGES_FLAG_MOSS_BIT)) {
537+
if (FF_PACKAGES_IS_ENABLED(options, MOSS)) {
538538
packageCounts->moss += getSQLite3Int(baseDir, "/.moss/db/state", "SELECT COUNT(*) FROM state_selections WHERE state_id = (SELECT MAX(id) FROM state)", "moss");
539539
}
540-
if (!(options->disabled & FF_PACKAGES_FLAG_CARDS_BIT)) {
540+
if (FF_PACKAGES_IS_ENABLED(options, CARDS)) {
541541
packageCounts->cards += getNumElements(baseDir, "/var/lib/pkg/DB", true);
542542
}
543543
}
544544

545545
static void getPackageCountsRegular(FFstrbuf* baseDir, FFPackagesResult* packageCounts, FFPackagesOptions* options) {
546546
getPackageCounts(baseDir, packageCounts, options);
547547

548-
if (!(options->disabled & FF_PACKAGES_FLAG_PACMAN_BIT)) {
548+
if (FF_PACKAGES_IS_ENABLED(options, PACMAN)) {
549549
uint32_t baseDirLength = baseDir->length;
550550
ffStrbufAppendS(baseDir, FASTFETCH_TARGET_DIR_ETC "/pacman-mirrors.conf");
551551
if (ffParsePropFile(baseDir->chars, "Branch =", &packageCounts->pacmanBranch) && packageCounts->pacmanBranch.length == 0) {
@@ -600,13 +600,13 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
600600
// This is needed on openSUSE, which seems to use a proprietary database file
601601
// This method doesn't work on bedrock, so we do it here.
602602
#ifdef FF_HAVE_RPM
603-
if (!(options->disabled & FF_PACKAGES_FLAG_RPM_BIT) && result->rpm == 0) {
603+
if (FF_PACKAGES_IS_ENABLED(options, RPM) && result->rpm == 0) {
604604
result->rpm = getRpmFromLibrpm();
605605
}
606606
#endif
607607

608608
ffStrbufSet(&baseDir, &instance.state.platform.homeDir);
609-
if (!(options->disabled & FF_PACKAGES_FLAG_NIX_BIT)) {
609+
if (FF_PACKAGES_IS_ENABLED(options, NIX)) {
610610
// Count packages from $HOME/.nix-profile
611611
result->nixUser += ffPackagesGetNix(&baseDir, ".nix-profile");
612612

@@ -627,24 +627,24 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
627627
result->nixUser += ffPackagesGetNix(&userPkgsDir, instance.state.platform.userName.chars);
628628
}
629629

630-
if (!(options->disabled & FF_PACKAGES_FLAG_GUIX_BIT)) {
630+
if (FF_PACKAGES_IS_ENABLED(options, GUIX)) {
631631
result->guixUser += getGuixPackages(&baseDir, ".guix-profile");
632632
result->guixHome += getGuixPackages(&baseDir, ".guix-home/profile");
633633
}
634634

635-
if (!(options->disabled & FF_PACKAGES_FLAG_FLATPAK_BIT)) {
635+
if (FF_PACKAGES_IS_ENABLED(options, FLATPAK)) {
636636
result->flatpakUser = getFlatpakPackages(&baseDir, "/.local/share");
637637
}
638638

639-
if (!(options->disabled & FF_PACKAGES_FLAG_AM_BIT)) {
639+
if (FF_PACKAGES_IS_ENABLED(options, AM)) {
640640
result->amUser = getAMUser();
641641
}
642642

643-
if (!(options->disabled & FF_PACKAGES_FLAG_SOAR_BIT)) {
643+
if (FF_PACKAGES_IS_ENABLED(options, SOAR)) {
644644
result->soar += getSQLite3Int(&baseDir, ".local/share/soar/db/soar.db", "SELECT COUNT(DISTINCT pkg_id || pkg_name) FROM packages WHERE is_installed = true", "soar");
645645
}
646646

647-
if (!(options->disabled & FF_PACKAGES_FLAG_APPIMAGE_BIT)) {
647+
if (FF_PACKAGES_IS_ENABLED(options, APPIMAGE)) {
648648
result->appimage += getNumElementsBySuffix(&baseDir, "/AppImages", ".appimage");
649649
result->appimage += getNumElementsBySuffix(&baseDir, "/Applications", ".appimage");
650650
}

src/detection/packages/packages_nbsd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "common/io.h"
44

55
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) {
6-
if (!(options->disabled & FF_PACKAGES_FLAG_PKGSRC_BIT)) {
6+
if (FF_PACKAGES_IS_ENABLED(options, PKGSRC)) {
77
result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", true);
88
}
99
}

src/detection/packages/packages_obsd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "common/io.h"
44

55
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) {
6-
if (!(options->disabled & FF_PACKAGES_FLAG_PKG_BIT)) {
6+
if (FF_PACKAGES_IS_ENABLED(options, PKG)) {
77
result->pkg = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/var/db/pkg", true);
88
}
99
}

src/detection/packages/packages_sunos.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
#include <dirent.h>
33

44
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) {
5-
if (!(options->disabled & FF_PACKAGES_FLAG_PKG_BIT)) {
5+
if (FF_PACKAGES_IS_ENABLED(options, PKG)) {
66
yyjson_doc* doc = yyjson_read_file(FASTFETCH_TARGET_DIR_ROOT "/var/pkg/state/installed/catalog.attrs", YYJSON_READ_NOFLAG, NULL, NULL);
77
if (doc) {
88
yyjson_val* packageCount = yyjson_obj_get(yyjson_doc_get_root(doc), "package-count");
@@ -11,7 +11,7 @@ void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options)
1111
}
1212
}
1313
}
14-
if (!(options->disabled & FF_PACKAGES_FLAG_PKGSRC_BIT)) {
14+
if (FF_PACKAGES_IS_ENABLED(options, PKGSRC)) {
1515
result->pkgsrc = ffPackagesGetNumElements(FASTFETCH_TARGET_DIR_ROOT "/usr/pkg/pkgdb", true);
1616
}
1717
}

src/detection/packages/packages_windows.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -188,16 +188,16 @@ static void detectWinget(FFPackagesResult* result) {
188188
}
189189

190190
void ffDetectPackagesImpl(FFPackagesResult* result, FFPackagesOptions* options) {
191-
if (!(options->disabled & FF_PACKAGES_FLAG_SCOOP_BIT)) {
191+
if (FF_PACKAGES_IS_ENABLED(options, SCOOP)) {
192192
detectScoop(result);
193193
}
194-
if (!(options->disabled & FF_PACKAGES_FLAG_CHOCO_BIT)) {
194+
if (FF_PACKAGES_IS_ENABLED(options, CHOCO)) {
195195
detectChoco(result);
196196
}
197-
if (!(options->disabled & FF_PACKAGES_FLAG_PACMAN_BIT)) {
197+
if (FF_PACKAGES_IS_ENABLED(options, PACMAN)) {
198198
detectPacman(result);
199199
}
200-
if (!(options->disabled & FF_PACKAGES_FLAG_WINGET_BIT)) {
200+
if (FF_PACKAGES_IS_ENABLED(options, WINGET)) {
201201
detectWinget(result);
202202
}
203203
}

0 commit comments

Comments
 (0)