diff options
author | Bryan Drewery <bryan@shatow.net> | 2022-09-09 23:28:54 +0300 |
---|---|---|
committer | Bryan Drewery <bryan@shatow.net> | 2022-11-05 18:47:57 +0300 |
commit | 6c12bc766ce8cddbd4f732f0df5592e5c596b0e0 (patch) | |
tree | 5d60cf46461d723419e1034b1a7c978dd5a1b469 /src/share | |
parent | eab6c4c5162f9c45469700002ee638155d315b80 (diff) |
display: Fix sorting due to internally quoted values
Diffstat (limited to 'src/share')
-rw-r--r-- | src/share/poudriere/include/display.sh | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/share/poudriere/include/display.sh b/src/share/poudriere/include/display.sh index d18cd709..40e64fa8 100644 --- a/src/share/poudriere/include/display.sh +++ b/src/share/poudriere/include/display.sh @@ -32,16 +32,23 @@ display_setup() { } display_add() { - local arg + local arg line tab - # Add in newline - [ -n "${_DISPLAY_DATA}" ] && \ - _DISPLAY_DATA="${_DISPLAY_DATA} -" - # Quote all arguments + unset line + tab=$'\t' + # Ensure blank arguments and spaced-arguments are respected. + # This is mostly to deal with sorting later for arg do - _DISPLAY_DATA="${_DISPLAY_DATA} '${arg}'" + if [ -z "${arg}" ]; then + arg=" " + fi + line="${line:+${line}${tab}}${arg}" done + # Add in newline + if [ -n "${_DISPLAY_DATA}" ]; then + _DISPLAY_DATA="${_DISPLAY_DATA}"$'\n' + fi + _DISPLAY_DATA="${_DISPLAY_DATA:+${_DISPLAY_DATA}}${line}" return 0 } @@ -77,7 +84,9 @@ display_output() { fi header="${line}" fi - eval "set -- ${line}" + IFS=$'\t' + set -- ${line} + unset IFS cnt=0 for arg in "$@"; do hash_get lengths ${cnt} max_length || max_length=0 @@ -123,15 +132,19 @@ display_output() { if [ "${quiet}" -eq 0 ]; then stripansi "${header}" header stripansi "${format}" header_format - eval "set -- ${header}" + IFS=$'\t' + set -- ${header} + unset IFS printf "${header_format}\n" "$@" fi # Sort as configured in display_setup() echo "${_DISPLAY_DATA}" | tail -n +2 | \ - sort ${_DISPLAY_COLUMN_SORT} | \ + sort -t $'\t' ${_DISPLAY_COLUMN_SORT} | \ while mapfile_read_loop_redir line; do - eval "set -- ${line}" + IFS=$'\t' + set -- ${line} + unset IFS printf "${format}\n" "$@" done |