Re: Preserve DPUTS output in comptest-based tests
Mikael Magnusson <[email protected]> Wed, 17 Jun 2026 02:16:23 +0200
| Newsgroups | gmane.comp.shells.zsh.devel |
|---|---|
| Message-ID | <CAHYJk3TnmE4eRh_K_yEEAS9OPkCOBVgT71Lst2A5LZ7dOZt1AQ@mail.gmail.com> |
On Wed, Jun 17, 2026 at 1:55 AM Philippe Altherr <[email protected]> wrote: > > This ensures that if a DPUTS triggers during a comptest-based test, the test will fail. > > - Preserve DPUTS output in comptest-based tests > diff --git a/Test/comptest b/Test/comptest > index 39ad14768..d306198e1 100644 > --- a/Test/comptest > +++ b/Test/comptest > @@ -21,7 +21,7 @@ comptestinit () { > export PS1="<PROMPT>" > zpty zsh "$comptest_zsh -f +Z" > > - zpty -r zsh log1 "*<PROMPT>*" || { > + zpty_read log1 "*<PROMPT>*" || { > print "first prompt hasn't appeared." > return 1 > } this zpty call didn't use -m before, was that a bug? If so, you should probably mention it in the commit message, if not, mention why adding it is not a problem. > @@ -99,20 +99,41 @@ bindkey -a "^X" zle-finish > ' > } > > +zpty_read() { > + local logvar=$1 pattern=$2 > + zpty -r -m zsh $logvar $pattern > + local -i result=$? > + zpty_handle_dputs $logvar > + return result > +} > + > zpty_flush() { > local junk > if zpty -r -t zsh junk \*; then > + zpty_handle_dputs junk > (( ZTST_verbose > 2 )) && print -n -u $ZTST_fd "$*: ${(V)junk}" > while zpty -r -t zsh junk \* ; do > + zpty_handle_dputs junk > (( ZTST_verbose > 2 )) && print -n -u $ZTST_fd "${(V)junk}" > done > (( ZTST_verbose > 2 )) && print -u $ZTST_fd '' > fi > } > > +zpty_handle_dputs() { > + local -nu log=$1 > + local -i lastend=0 > + while (( ${(N)${log[lastend+1,-1]}#*(#b)((<->:|) *.c:<->: *[$'\r\n'])} )); do > + print -r "DPUTS:{${match[1][1,-2]}}" > + log[lastend+$mbegin[1],lastend+$mend[1]]="" > + [[ log[lastend+$mbegin[1]] != $'\n' ]] || log[lastend+$mbegin[1]]="" > + lastend+=$mbegin[1] > + done > +} ??? Can you at least write something about what mechanism you're trying to implement instead of just "handle DPUTS"? For example, at a glance a reader would wonder "If there is spurious DPUTS output, surely this will already fail the test because the test expects a certain output"? Maybe you could mention that some tests discarded zpty output without reading it, if that's indeed what is happening? > zpty_run() { > zpty -w zsh "$*" > - zpty -r -m zsh log "*<PROMPT>*" || { > + zpty_read log "*<PROMPT>*" || { > print "prompt hasn't appeared." > return 1 > } > @@ -130,7 +151,7 @@ comptesteval () { > > # zpty_flush Before comptesteval > zpty -w zsh ". ${(q)tmp}" > - zpty -r -m zsh log_eval "*<PROMPT>*" || { > + zpty_read log_eval "*<PROMPT>*" || { > print "prompt hasn't appeared." > return 1 > } > @@ -144,7 +165,7 @@ comptesteval () { > comptest () { > input="$*" > zpty -n -w zsh "$input"$'\C-Z' > - zpty -r -m zsh log "*<WIDGET><finish>*<PROMPT>*" || { > + zpty_read log "*<WIDGET><finish>*<PROMPT>*" || { > print "failed to invoke finish widget." > return 1 > } > @@ -184,7 +205,7 @@ zletest () { > zpty -n -w zsh "$input" > done > zpty -n -w zsh $'\C-X' > - zpty -r -m zsh log "*<WIDGET><finish>*<PROMPT>*" || { > + zpty_read log "*<WIDGET><finish>*<PROMPT>*" || { > print "failed to invoke finish widget." > return 1 > } ok, these ones all use -m so this is presumably not a change in behavior. -- Mikael Magnusson