# HG changeset patch # User Franz Glasner # Date 1730245712 -3600 # Node ID 954d3607e87d7c8cfe4908fedbc70a87c92e7de9 # Parent 1ffb4e15151d39c2f0e2909850d11a8132b5b3be ports.subr: Parse a (local) index file for a package version diff -r 1ffb4e15151d -r 954d3607e87d share/local-bsdtools/ports.subr --- 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 +} diff -r 1ffb4e15151d -r 954d3607e87d tests/ports.t --- 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 ============