diff options
author | Bryan Drewery <bryan@shatow.net> | 2022-11-09 23:12:39 +0300 |
---|---|---|
committer | Bryan Drewery <bryan@shatow.net> | 2022-11-10 02:06:20 +0300 |
commit | b6a430f0b30e6d8ffc5151951b41430870a9bfba (patch) | |
tree | f4efb184329e35309e79c9ae6cc0159d799d8a34 | |
parent | 03b9a770d3583bfaf9a596ce340f3d1bc5506e4b (diff) |
Add a mapfile_tee() and rework some mapfile_write() handling.
-rw-r--r-- | src/poudriere-sh/mapfile.c | 21 | ||||
-rw-r--r-- | src/share/poudriere/include/util.sh | 147 | ||||
-rw-r--r-- | test/mapfile.sh | 2 |
3 files changed, 108 insertions, 62 deletions
diff --git a/src/poudriere-sh/mapfile.c b/src/poudriere-sh/mapfile.c index 44053756..39b08815 100644 --- a/src/poudriere-sh/mapfile.c +++ b/src/poudriere-sh/mapfile.c @@ -538,27 +538,18 @@ mapfile_writecmd(int argc, char **argv) ret = _mapfile_write(md, handle, nflag, data); } else { /* Read from TTY */ - char *value; /* - * XXX: Using shell mapfile_cat_file until some changes from + * XXX: Using shell mapfile_tee until some changes from * copool branch make it in to avoid massive conflicts */ - /* Avoid adding our own newline by keeping any read. */ - const char *cmd = - "__mapfile_write_cat=\"$(mapfile_cat_file; echo .)\";" - "__mapfile_write_cat=\"${__mapfile_write_cat%.}\""; + char cmd[256]; - nflag = 1; + snprintf(cmd, sizeof(cmd), "mapfile_tee %s \"%s\";", + nflag == 1 ? "-n" : "", + handle); evalstring(cmd, 0); - if (exitstatus != 0) { - ret = exitstatus; - goto out; - } - value = lookupvar("__mapfile_write_cat"); - assert(value != NULL); - ret = _mapfile_write(md, handle, nflag, value); + ret = exitstatus; } -out: INTON; return (ret); diff --git a/src/share/poudriere/include/util.sh b/src/share/poudriere/include/util.sh index 9c278a42..5d08f1c4 100644 --- a/src/share/poudriere/include/util.sh +++ b/src/share/poudriere/include/util.sh @@ -386,47 +386,80 @@ critical_end() { fi # Read a file into the given variable. -read_file() { +_mapfile_read_file() { local -; set +x - [ $# -eq 2 ] || eargs read_file var_return file + [ $# -eq 2 ] || eargs _mapfile_read_file var_return file local var_return="$1" local file="$2" - local _data _line newline - local _ret - IFS + local handle mrf_data mrf_line newline + local ret IFS # var_return may be empty if only $_read_file_lines_read is being # used. - set +e - _data= + case "${file}" in + -|/dev/stdin) file="/dev/fd/0" ;; + esac + mrf_data= _read_file_lines_read=0 - _ret=0 - newline=$'\n' - - if [ ! -f "${file}" ]; then - if [ -n "${var_return}" ]; then - setvar "${var_return}" "" - fi - return 1 - fi - - if mapfile_builtin; then + ret=0 + if mapfile handle "${file}" "re"; then if [ -n "${var_return}" ]; then - while IFS= mapfile_read_loop "${file}" _line; do - _data="${_data:+${_data}${newline}}${_line}" + newline=$'\n' + while IFS= mapfile_read "${handle}" mrf_line; do + mrf_data="${mrf_data:+${mrf_data}${newline}}${mrf_line}" _read_file_lines_read=$((_read_file_lines_read + 1)) done else - while IFS= mapfile_read_loop "${file}" _line; do + while IFS= mapfile_read "${handle}" mrf_line; do _read_file_lines_read=$((_read_file_lines_read + 1)) done fi - if [ -n "${var_return}" ]; then - setvar "${var_return}" "${_data}" - fi - return 0 + mapfile_close "${handle}" || ret="$?" + else + ret="$?" + fi + if [ -n "${var_return}" ]; then + setvar "${var_return}" "${mrf_data}" + fi + return "${ret}" +} + +# Read a file into the given variable. +read_file() { + local -; set +x + [ $# -eq 2 ] || eargs read_file var_return file + local var_return="$1" + local file="$2" + local _data _line newline + local _ret - IFS + + # var_return may be empty if only $_read_file_lines_read is being + # used. + _ret=0 + + if mapfile_builtin; then + _mapfile_read_file "$@" || _ret="$?" + return "${_ret}" fi + _read_file_lines_read=0 + case "${file}" in + -|/dev/stdin) file="/dev/fd/0" ;; + *) + if [ ! -f "${file}" ]; then + if [ -n "${var_return}" ]; then + setvar "${var_return}" "" + fi + return 1 + fi + ;; + esac + + set +e + _data= + newline=$'\n' + if [ ${READ_FILE_USE_CAT:-0} -eq 1 ]; then if [ -n "${var_return}" ]; then _data="$(cat "${file}")" @@ -704,39 +737,31 @@ mapfile_read() { mapfile_write() { local -; set +x - [ $# -ge 1 ] || eargs mapfile_write handle [data] - local handle="$1" - local ret + [ $# -ge 1 ] || eargs mapfile_write [-n] handle [data] + local ret handle fd nflag flag OPTIND=1 - if [ $# -eq 1 ]; then + if [ "$#" -eq 1 ]; then ret=0 - _mapfile_write_from_stdin "$@" || ret="$?" + mapfile_tee "$@" || ret="$?" return "${ret}" fi - _mapfile_write "$@" -} - -_mapfile_write_from_stdin() { - [ $# -eq 1 ] || eargs _mapfile_write_from_stdin handle - local data - # . is to preserve newline - data="$(cat; echo .)" - data="${data%.}" - _mapfile_write "$@" -n "${data}" -} - -_mapfile_write() { - [ $# -ge 2 ] || eargs mapfile_write handle [-n] data - local handle="$1" + nflag= + while getopts "n" flag; do + case "${flag}" in + n) nflag=1 ;; + esac + done + shift $((OPTIND-1)) + [ $# -ge 2 ] || eargs mapfile_write [-n] handle data + handle="$1" shift - local fd if [ "${handle}" != "${_mapfile_handle}" ]; then err 1 "mapfile_write: Handle '${handle}' is not open, '${_mapfile_handle}' is" fi hash_get mapfile_fd "${handle}" fd || fd=8 - echo "$@" >&${fd} + echo ${nflag:+-n} "$@" >&${fd} } mapfile_close() { @@ -859,6 +884,36 @@ mapfile_cat_file() { return "${ret}" } +# Pipe to handle from STDIN. +mapfile_tee() { + local -; set +x + [ "$#" -ge 1 ] || eargs mapfile_tee [-n] handle... + local ret nflag flag handle data OPTIND=1 + + ret=0 + data= + nflag= + while getopts "n" flag; do + case "${flag}" in + n) nflag=1 ;; + esac + done + shift $((OPTIND-1)) + [ "$#" -ge 1 ] || eargs mapfile_tee [-n] handle... + + read_file data - || ret="$?" + ## . is to preserve newline + #data="$(cat; echo .)" + #data="${data%.}" + case "${data}" in + "") return "${ret}" ;; + esac + for handle in "$@"; do + mapfile_write ${nflag:+-n} "${handle}" "${data}" || ret="$?" + done + return "${ret}" +} + # Create a new temporary file and return a handle to it mapfile_mktemp() { local -; set +x diff --git a/test/mapfile.sh b/test/mapfile.sh index 084acb63..06986ef7 100644 --- a/test/mapfile.sh +++ b/test/mapfile.sh @@ -510,7 +510,7 @@ fi assert 0 "$?" "pipe exit status" assert_ret 0 mapfile_close "${handle}" [ ! -s "${TMP2}" ] - assert 0 "$?" "'cat <empty file> | mapfile_write' should not write anything" + assert 0 "$?" "'cat <empty file> | mapfile_write' should not write anything --"$'\n'"$(cat -vet "${TMP2}")" rm -f "${TMP}" "${TMP2}" } |