From e94e3fe6e1d30a856913992aafb35bc7dfa2912d Mon Sep 17 00:00:00 2001 From: "Danilo M." Date: Thu, 9 Jul 2026 17:22:55 +0200 Subject: feat: --info version-compare row; fix -i completion; release v1.2.6 --info/-i now prints a version-compare row between the header and the README: SBo .info version vs the hint's, greening the higher side (< / >), yellow on equal (=), '(no hint)' when no hint carries a version, skipped when the .info has no version. Header stays pinned, version row scrolls with the README. Completion: -i now completes package names (was flag-only); package-name completion for -n/-i drops the broken -maxdepth 2 .info scan for a param-expansion sweep of REPO_DIR/*/*/ dirs, ~7s -> ~60ms. Co-Authored-By: Claude Opus 4.8 --- mkhint | 46 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 6 deletions(-) (limited to 'mkhint') diff --git a/mkhint b/mkhint index 1d7c86d..ab952e8 100755 --- a/mkhint +++ b/mkhint @@ -45,7 +45,7 @@ if [[ ! -d $TMP_DIR ]]; then mkdir $TMP_DIR fi -readonly MKHINT_VERSION="1.2.5" +readonly MKHINT_VERSION="1.2.6" # Variables VERSION="" @@ -825,20 +825,52 @@ show_info() { local dir="${matches[0]%/}" local category; category=$(basename "$(dirname "$dir")") - # Green header on a TTY (same gate as --list). - local g_on="" g_off="" + # Green header on a TTY (same gate as --list). Yellow for the equal case. + local g_on="" g_off="" y_on="" y_off="" if [[ -n "$MKHINT_FORCE_COLOR" || -t 1 ]]; then if command -v tput &>/dev/null && tput setaf 2 &>/dev/null; then g_on=$(tput setaf 2); g_off=$(tput sgr0) + y_on=$(tput setaf 3); y_off=$(tput sgr0) else g_on=$'\033[32m'; g_off=$'\033[0m' + y_on=$'\033[33m'; y_off=$'\033[0m' fi fi local header="${g_on}${category}/${pkg}${g_off}" + # Version-compare row (body line 1, scrolls with README). Skip if the + # .info has no VERSION. Reuses _normalize_version + sort -V like --list. + local vrow="" + local sbo_ver="" + [[ -f "${dir}/${pkg}.info" ]] && \ + sbo_ver=$(grep "^VERSION" "${dir}/${pkg}.info" | cut -d '"' -f2) + if [[ -n "$sbo_ver" ]]; then + local hint_ver="" + [[ -f "${HINT_DIR%/}/${pkg}.hint" ]] && \ + hint_ver=$(grep "^VERSION" "${HINT_DIR%/}/${pkg}.hint" | cut -d '"' -f2) + if [[ -z "$hint_ver" ]]; then + vrow="SBo: ${sbo_ver} (no hint)" + else + local sn hn + sn=$(_normalize_version "$sbo_ver") + hn=$(_normalize_version "$hint_ver") + if [[ "$sn" == "$hn" ]]; then + vrow="${y_on}SBo: ${sbo_ver} = Hint: ${hint_ver}${y_off}" + else + local newer; newer=$(printf '%s\n%s\n' "$sn" "$hn" | sort -V | tail -1) + if [[ "$newer" == "$hn" ]]; then + vrow="SBo: ${sbo_ver} < Hint: ${g_on}${hint_ver}${g_off}" + else + vrow="SBo: ${g_on}${sbo_ver}${g_off} > Hint: ${hint_ver}" + fi + fi + fi + fi + local readme="${dir}/README" if [[ ! -f "$readme" ]]; then printf '%s\n' "$header" + [[ -n "$vrow" ]] && printf '%s\n' "$vrow" echo "(no README)" exit 0 fi @@ -851,16 +883,18 @@ show_info() { if [[ ! -t 1 || "$lines" -le "$rows" ]]; then printf '%s\n' "$header" + [[ -n "$vrow" ]] && printf '%s\n' "$vrow" cat "$readme" exit 0 fi - # Page: header as line 1 so it survives; pin it if pager is less. + # Page: header as line 1 so it survives; pin it if pager is less. The + # version row is body line 1 so it scrolls with the README. local pager="${PAGER:-less}" if [[ "$(basename "$pager")" == "less" ]]; then - { printf '%s\n' "$header"; cat "$readme"; } | less -R --header=1 + { printf '%s\n' "$header"; [[ -n "$vrow" ]] && printf '%s\n' "$vrow"; cat "$readme"; } | less -R --header=1 else - { printf '%s\n' "$header"; cat "$readme"; } | $pager + { printf '%s\n' "$header"; [[ -n "$vrow" ]] && printf '%s\n' "$vrow"; cat "$readme"; } | $pager fi exit 0 } -- cgit v1.2.3