Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/freebsd/poudriere.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBryan Drewery <bryan@shatow.net>2022-11-09 23:12:39 +0300
committerBryan Drewery <bryan@shatow.net>2022-11-10 02:06:20 +0300
commitb6a430f0b30e6d8ffc5151951b41430870a9bfba (patch)
treef4efb184329e35309e79c9ae6cc0159d799d8a34
parent03b9a770d3583bfaf9a596ce340f3d1bc5506e4b (diff)
Add a mapfile_tee() and rework some mapfile_write() handling.
-rw-r--r--src/poudriere-sh/mapfile.c21
-rw-r--r--src/share/poudriere/include/util.sh147
-rw-r--r--test/mapfile.sh2
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}"
}