changeset 810:a59cc4bea000

fports: Add option "-f" to "fports detail": do not print the status with regard to repositories that do not have the package available
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 06 Nov 2024 01:17:23 +0100
parents 6cf3e1021862
children 32e457ff872f
files docs/man/man8/fports.rst sbin/fports
diffstat 2 files changed, 61 insertions(+), 20 deletions(-) [+]
line wrap: on
line diff
--- a/docs/man/man8/fports.rst	Tue Nov 05 18:42:40 2024 +0100
+++ b/docs/man/man8/fports.rst	Wed Nov 06 01:17:23 2024 +0100
@@ -15,7 +15,7 @@
 
 **fports deptree** [**-l** `maxlevel`\|\ **--maxlevel**\=\ `maxlevel`] [**-r**\|\ **--reverse**] [**-t**\|\ **--list**\|\ **--transitive**] `package` ...
 
-**fports detail**  [**-A**] [**-b**\|\ **--nofreebsd**\|\ **--no-freebsd**] [**-n**\|\ **--noauto**\|\ **--no-auto**] [**-m**\|\ **--mapped**] [`package` ...]
+**fports detail**  [**-A**] [**-b**\|\ **--nofreebsd**\|\ **--no-freebsd**] [**-f**\ |\ **--filter-unused**] [**-n**\|\ **--noauto**\|\ **--no-auto**] [**-m**\|\ **--mapped**] [`package` ...]
 
 
 Description
@@ -71,7 +71,7 @@
      that depend on a given `package`.
 
 
-**fports detail**  [**-A**] [**-b**\|\ **--nofreebsd**\|\ **--no-freebsd**] [**-n**\|\ **--noauto**\|\ **--no-auto**] [**-m**\|\ **--mapped**] [`package` ...]
+**fports detail**  [**-A**] [**-b**\|\ **--nofreebsd**\|\ **--no-freebsd**] [**-f**\ |\ **--filter-unused**] [**-n**\|\ **--noauto**\|\ **--no-auto**] [**-m**\|\ **--mapped**] [`package` ...]
 
   Print the status of all given or selected packages in the most
   detail possible.
@@ -93,6 +93,13 @@
      Automatically select all packages that are *not* installed from the
      standard FreeBSD repository.
 
+  .. option:: -f, filter-unused
+
+     Filter the output:
+
+     - Do not print the status with regard to repositories that do not
+       have the package available.
+
   .. option:: -n, --noauto, --no-auto
 
      Automatically select all packages that are *not* installed automatically.
--- a/sbin/fports	Tue Nov 05 18:42:40 2024 +0100
+++ b/sbin/fports	Wed Nov 06 01:17:23 2024 +0100
@@ -24,7 +24,7 @@
 USAGE: fports -h|--help
        fports -V|--version
        fports deptree [-l maxlevel|--maxlevel=maxlevel] [-r|--reverse] [-t|--list|--transitive] package...
-       fports detail [-A] [-b|--nofreebsd|--no-freebsd] [-n|--noauto|--no-auto] [-m|--mapped] [package...]
+       fports detail [-A] [-b|--nofreebsd|--no-freebsd] [-f|--filter-unused] [-n|--noauto|--no-auto] [-m|--mapped] [package...]
 
 GLOBAL OPTIONS:
 
@@ -344,7 +344,7 @@
 #: Implementation of the "detail" command.
 #:
 command_detail() {
-    local opt_noauto opt_mapped
+    local opt_nofreebsd  opt_filterunused opt_noauto opt_mapped opt_nofreebsd
     # $@
 
     local package \
@@ -354,11 +354,12 @@
           pkglabel pkgdescr pkgversion mapped_package
 
     do_sort=no
+    opt_filterunused=no
     opt_nofreebsd=no
     opt_noauto=no
     opt_mapped=no
-    while getopts "Abnm-:" opt; do
-        postprocess_getopts_for_long "Abnm-:" opt "nofreebsd" "no-freebsd" "noauto" "no-auto" "mapped" ""
+    while getopts "Abfnm-:" opt; do
+        postprocess_getopts_for_long "Abfnm-:" opt "nofreebsd" "no-freebsd" "filter-unused" "noauto" "no-auto" "mapped" ""
         case "${opt}" in
             A)
                 opt_nofreebsd=yes
@@ -371,6 +372,9 @@
                 opt_nofreebsd=yes
                 do_sort=yes
                 ;;
+            f|filter-unused)
+                opt_filterunused=yes
+                ;;
             n|noauto|no-auto)
                 # shellcheck disable=SC2034     # appears unused
                 opt_noauto=yes
@@ -396,6 +400,7 @@
     get_active_repositories repositories
     packagemapping=''
     init_package_mapping packagemapping
+    falist_set packagemapping "uwsginl" "uwsgi"
     indexfile="$(get_local_index_file)"
 
     if checkyesno opt_nofreebsd; then
@@ -426,7 +431,7 @@
     prev_package=''    # to skip duplicate packages
     while farray_tryget package packages "${idx}"; do
         if [ "${prev_package}" != "${package}" ]; then
-            _package_max_detail "${package}" "${packagemapping}" "${repositories}" "${indexfile}"
+            _package_max_detail "${package}" "${packagemapping}" "${repositories}" "${indexfile}" "${opt_filterunused}"
             prev_package="${package}"
         fi
         idx=$((idx + 1))
@@ -448,9 +453,11 @@
 #:   $2 (alist): The
 #:   $3 (array): The array with all the configured/active repositories
 #:   $4 (str, null): The local index file if it exists
+#:   $5 (bool): Flag whether to suppress details for repositories that do
+#:              not contain the package `$1`
 #:
 _package_max_detail() {
-    local package packagemapping repositories indexfile
+    local package packagemapping repositories indexfile opt_filterunused
 
     local instver instrepo repo title_printed _dummy \
           pkglabel pkgdescr pkgversion mapped_package
@@ -459,6 +466,7 @@
     packagemapping="${2}"
     repositories="${3}"
     indexfile="${4}"
+    opt_filterunused="${5}"
 
     # shellcheck disable=SC2034    # appears unused
     title_printed=no
@@ -471,9 +479,9 @@
 $(LC_ALL=C.UTF-8 "${PKG}" version -U -I -n "${package}" -v "${indexfile}")
 EOF_b1f225bd-d234-4a23-8a2a-40c2e5b7ff3c
         pkgversion="$(parse_index_file_for_package_version "${indexfile}" "${package}")"
-        print_detail_item "INDEX" "${pkgversion}" "${pkglabel}" "${pkgdescr}"
+        _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "INDEX" "${pkgversion}" "${pkglabel}" "${pkgdescr}"
     fi
-    farray_for_each repositories _package_repository_detail "${package}" 0
+    farray_for_each repositories _package_repository_detail "${package}" "${opt_filterunused}" 0
     mapped_package="$(get_package_mapping "${packagemapping}" "${package}")"
     if [ -n "${mapped_package}" ]; then
         printf '%18s %s\n' "--------------->" "${mapped_package}"
@@ -482,12 +490,33 @@
             pkglabel="$(LC_ALL=C.UTF-8 "${PKG}" version --test-version "${instver}" "${pkgversion}")"
             print_detail_item "INDEX" "${pkgversion}" "${pkglabel}" '' 19
         fi
-        farray_for_each repositories _mapped_package_repository_detail "${mapped_package}" "{instver}" 19
+        farray_for_each repositories _mapped_package_repository_detail "${mapped_package}" "{instver}" "${opt_filterunused}" 19
     fi
 }
 
 
 #:
+#: Args:
+#:   $1 (str): The repositorie's package label string
+#:   $2 (bool): The flag whether to filter package detail data
+#:
+#: Returns:
+#:   int: 0 (truthy) if the detail should be printed
+#:        1 (falsy) if printing should be suppressed
+#:
+_shall_print_package_detail_item() {
+    # $1 $2
+
+    # If filtering is disabled then print
+    checkyesnovalue "$2" || return 0
+    if [ -z "$1" ] || [ "$1" = '?' ]; then
+        return 1
+    fi
+    return 0
+}
+
+
+#:
 #: Array callback to print package details with regard to a repository.
 #:
 #: Args:
@@ -495,10 +524,11 @@
 #:   $2 (int): The current index
 #:   $3: The element value (i.e. repository name)
 #:   $4 (str): The (master) package name
-#:   $5 (int): The extra indent value to forward to called functions
+#:   $5 (flag): The global flat whether to filter repository printing
+#:   $6 (int, optional): The extra indent value to forward to called functions
 #:
 _package_repository_detail() {
-    local repositories idx reponame package extraindent
+    local repositories idx reponame package extraindent opt_filterunused
 
     local _dummy \
           pkglabel pkgdescr pkgversion
@@ -508,13 +538,14 @@
     idx="${2}"
     reponame="${3}"
     package="${4}"
-    extraindent="${5:-0}"
-
+    opt_filterunused="${5}"
+    extraindent="${6:-0}"
+    
     read -r _dummy  pkglabel pkgdescr <<EOF_19cf2d80-4eb9-4cda-bd4d-96b04e769206
 $(LC_ALL=C.UTF-8 "${PKG}" version -U -R -r "${reponame}" -n "${package}" -v)
 EOF_19cf2d80-4eb9-4cda-bd4d-96b04e769206
     pkgversion="$(LC_ALL=C.UTF-8 "${PKG}" rquery -U -r "${reponame}" '%v' "${package}")"
-    print_detail_item "${reponame}" "${pkgversion}" "${pkglabel}" "${pkgdescr}" "${extraindent}"
+    _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "${reponame}" "${pkgversion}" "${pkglabel}" "${pkgdescr}" "${extraindent}"
 }
 
 
@@ -528,10 +559,12 @@
 #:   $3: The element value (i.e. repository name)
 #:   $4 (str): The mapped package name
 #:   $5 (str): The parent package version
-#:   $6 (int): The extra indent value to forward to called functions
+#:   $6 (flag): The global flat whether to filter repository printing
+#:   $7 (int, optional): The extra indent value to forward to called functions
 #:
 _mapped_package_repository_detail() {
-    local repositories idx reponame package parent_pkgversion extraindent
+    local repositories idx reponame package parent_pkgversion \
+          opt_filterunused extraindent
 
     local _dummy \
           pkglabel pkgversion
@@ -542,11 +575,12 @@
     reponame="${3}"
     package="${4}"
     parent_pkgversion="${5}"
-    extraindent="${6:-0}"
+    opt_filterunused="${6}"
+    extraindent="${7:-0}"
 
     pkgversion="$(LC_ALL=C.UTF-8 "${PKG}" rquery -U -r "${reponame}" '%v' "${package}")"
     pkglabel="$(LC_ALL=C.UTF-8 "${PKG}" version --test-version "${parent_pkgversion}" "${pkgversion}")"
-    print_detail_item "${reponame}" "${pkgversion}" "${pkglabel}" '' "${extraindent}"
+    _shall_print_package_detail_item "${pkglabel}" "${opt_filterunused}" && print_detail_item "${reponame}" "${pkgversion}" "${pkglabel}" '' "${extraindent}"
 }