changeset 792:954d3607e87d

ports.subr: Parse a (local) index file for a package version
author Franz Glasner <fzglas.hg@dom66.de>
date Wed, 30 Oct 2024 00:48:32 +0100
parents 1ffb4e15151d
children 3b5a59b0840d
files share/local-bsdtools/ports.subr tests/ports.t
diffstat 2 files changed, 36 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/share/local-bsdtools/ports.subr	Tue Oct 29 22:44:49 2024 +0100
+++ b/share/local-bsdtools/ports.subr	Wed Oct 30 00:48:32 2024 +0100
@@ -319,3 +319,34 @@
     esac
     return 1
 }
+
+
+#:
+#: Parse a given index file for a package and yield its version.
+#:
+#: Args:
+#:   $1 (str): An existing index file
+#:   $2 (str): The package to search for
+#:
+#: Output (stdout):
+#:   The package version if found, or a null string
+#:
+#: Returns:
+#:   int: 0 if a matching package is found, 1 otherwise
+#:
+parse_index_file_for_package_version() {
+    # $1 $2
+
+    local pkgspec _rest
+
+    [ -r "${1}" ] || fatal "${EX_SOFTWARE}" "given index file \`${1}' is not readable (or does not exist)"
+
+    # Using grep to pre-select with BREs is at least one magnitude slower
+    while IFS='|' read -r pkgspec _rest; do
+        if [ "${pkgspec%-*}" = "${2}" ]; then
+            printf '%s' "${pkgspec##*-}"
+            return 0
+        fi
+    done <"${1}"
+    return 1
+}
--- a/tests/ports.t	Tue Oct 29 22:44:49 2024 +0100
+++ b/tests/ports.t	Wed Oct 30 00:48:32 2024 +0100
@@ -86,6 +86,11 @@
   /home/fag/ports/INDEX-[0-9]+ \(no-eol\) (re)
   $ unset VERSION_SOURCE
 
+  $ _pkgversion="$(parse_index_file_for_package_version "$(get_local_index_file)" 'pkg')"
+  $ [ -n "${_pkgversion}" ]
+  $ printf '%s' "${_pkgversion}"
+  \d+\.\d+(\.\d+) \(no-eol\) (re)
+
 
 Repositories
 ============