42156: new CHECK_RUNNING_JOBS option demanded by bash groupies

Also new job options.

Also suppress debug error if rows or columns are reported as zero as
this is normal without a physical terminal.
This commit is contained in:
Peter Stephenson 2017-12-22 20:00:54 +00:00
parent 349c95765a
commit 5f6a52c06c
7 changed files with 217 additions and 5 deletions

View file

@ -1,5 +1,15 @@
2017-12-22 Peter Stephenson <p.w.stephenson@ntlworld.com>
* dana: 42156 with tweak as per 42158: Doc/Zsh/options.yo,
Src/builtin.c, Src/options.c, Src/utils.c, Src/zsh.h,
Test/W02jobs.ztst: add CHECK_RUNNING_JOBS opion and job tests;
remove debug error when rows or columns are zero as this is
normal without a physical terminal.
* dana: 42156: Doc/Zsh/options.yo, Src/builtin.c,
Src/options.c, Src/zsh.h, Test/W02jobs.ztst: new
CHECK_RUNNING_JOBS option demanded by bash groupies.
* danda: 42155: Completion/Unix/Command/_ssh: various
improvements for OpenSSH.

View file

@ -817,7 +817,7 @@ zsh sessions will all have the new entries from their history lists
added to the history file, in the order that they exit.
The file will still be periodically re-written to trim it when the
number of lines grows 20% beyond the value specified by
tt($SAVEHIST) (see also the HIST_SAVE_BY_COPY option).
tt($SAVEHIST) (see also the tt(HIST_SAVE_BY_COPY) option).
)
pindex(BANG_HIST)
pindex(NO_BANG_HIST)
@ -1429,6 +1429,19 @@ ifnzman(the section Special Functions in noderef(Functions))\
ifzman(the section SPECIAL FUNCTIONS in zmanref(zshmisc))
is not counted for this purpose.
)
pindex(CHECK_RUNNING_JOBS)
pindex(NO_CHECK_RUNNING_JOBS)
pindex(CHECKRUNNINGJOBS)
pindex(NOCHECKRUNNINGJOBS)
cindex(exiting, checking running jobs when)
cindex(logging out, checking running jobs when)
item(tt(CHECK_RUNNING_JOBS) <Z>)(
Check for both running and suspended jobs when tt(CHECK_JOBS) is enabled.
When this option is disabled, zsh checks only for suspended jobs, which
matches the default behavior of bash.
This option has no effect unless tt(CHECK_JOBS) is set.
)
pindex(HUP)
pindex(NO_HUP)
pindex(NOHUP)
@ -1443,7 +1456,7 @@ pindex(LONGLISTJOBS)
pindex(NOLONGLISTJOBS)
cindex(jobs, list format)
item(tt(LONG_LIST_JOBS) (tt(-R)))(
List jobs in the long format by default.
Print job notifications in the long format by default.
)
pindex(MONITOR)
pindex(NO_MONITOR)

View file

@ -5594,7 +5594,8 @@ checkjobs(void)
for (i = 1; i <= maxjob; i++)
if (i != thisjob && (jobtab[i].stat & STAT_LOCKED) &&
!(jobtab[i].stat & STAT_NOPRINT))
!(jobtab[i].stat & STAT_NOPRINT) &&
(isset(CHECKRUNNINGJOBS) || jobtab[i].stat & STAT_STOPPED))
break;
if (i <= maxjob) {
if (jobtab[i].stat & STAT_STOPPED) {

View file

@ -111,6 +111,7 @@ static struct optname optns[] = {
{{NULL, "chasedots", OPT_EMULATE}, CHASEDOTS},
{{NULL, "chaselinks", OPT_EMULATE}, CHASELINKS},
{{NULL, "checkjobs", OPT_EMULATE|OPT_ZSH}, CHECKJOBS},
{{NULL, "checkrunningjobs", OPT_EMULATE|OPT_ZSH}, CHECKRUNNINGJOBS},
{{NULL, "clobber", OPT_EMULATE|OPT_ALL}, CLOBBER},
{{NULL, "combiningchars", 0}, COMBININGCHARS},
{{NULL, "completealiases", 0}, COMPLETEALIASES},

View file

@ -1832,7 +1832,7 @@ adjustlines(int signalled)
else
shttyinfo.winsize.ws_row = zterm_lines;
#endif /* TIOCGWINSZ */
if (zterm_lines <= 0) {
if (zterm_lines < 0) {
DPUTS(signalled, "BUG: Impossible TIOCGWINSZ rows");
zterm_lines = tclines > 0 ? tclines : 24;
}
@ -1856,7 +1856,7 @@ adjustcolumns(int signalled)
else
shttyinfo.winsize.ws_col = zterm_columns;
#endif /* TIOCGWINSZ */
if (zterm_columns <= 0) {
if (zterm_columns < 0) {
DPUTS(signalled, "BUG: Impossible TIOCGWINSZ cols");
zterm_columns = tccolumns > 0 ? tccolumns : 80;
}

View file

@ -2339,6 +2339,7 @@ enum {
CHASEDOTS,
CHASELINKS,
CHECKJOBS,
CHECKRUNNINGJOBS,
CLOBBER,
APPENDCREATE,
COMBININGCHARS,

186
Test/W02jobs.ztst Normal file
View file

@ -0,0 +1,186 @@
# Tests for interactive job control
%prep
if [[ $OSTYPE == cygwin ]]; then
ZTST_unimplemented='the zsh/zpty module does not work on Cygwin'
elif zmodload zsh/zpty 2> /dev/null; then
zpty_start() {
export PS1= PS2=
zpty -d
zpty zsh "${(q)ZTST_testdir}/../Src/zsh -fiV +Z"
}
zpty_input() {
zpty -w zsh "${(F)@}" $'\n'
}
zpty_stop() {
# exit twice in case of check_jobs
zpty -w zsh $'exit\nexit\n'
# zpty gives no output when piped without these braces (?)
{ zpty -r zsh } | sed $'/[^[:space:]]/!d; s/\r$//;'
zpty -d
:
}
else
ZTST_unimplemented='the zsh/zpty module is not available'
fi
%test
zpty_start
zpty_input 'setopt no_long_list_jobs'
zpty_input ': &'
zpty_input 'wait'
zpty_stop
0:job notification with no_long_list_jobs
*>\[1] [0-9]##
*>\[1] + done[[:space:]]##:
zpty_start
zpty_input 'setopt long_list_jobs'
zpty_input ': &'
zpty_input 'wait'
zpty_stop
0:job notification with long_list_jobs
*>\[1] [0-9]##
*>\[1] + [0-9]## done[[:space:]]##:
zpty_start
zpty_input 'setopt no_hup no_check_jobs'
zpty_input 'sleep 3 &'
zpty_stop
0:running job with no_hup + no_check_jobs
*>\[1] [0-9]##
zpty_start
zpty_input 'setopt no_check_jobs'
zpty_input 'sleep 3 &'
zpty_stop
0:running job with no_check_jobs
*>\[1] [0-9]##
*>zsh:*SIGHUPed*
zpty_start
zpty_input 'setopt check_jobs no_check_running_jobs'
zpty_input 'sleep 3 &'
zpty_stop
0:running job with check_jobs + no_check_running_jobs
*>\[1] [0-9]##
*>zsh:*SIGHUPed*
zpty_start
zpty_input 'setopt check_jobs check_running_jobs'
zpty_input 'sleep 3 &'
zpty_stop
0:running job with check_jobs + check_running_jobs
*>\[1] [0-9]##
*>zsh:*running jobs*
*>zsh:*SIGHUPed*
zpty_start
zpty_input 'setopt check_jobs no_check_running_jobs'
zpty_input 'sleep 3'
sleep 0.1
zpty_input $'\C-z'
zpty_stop
0:suspended job with check_jobs + no_check_running_jobs
*>zsh:*(stopped|suspended)*sleep*
*>zsh:*(stopped|suspended) jobs*
# no 'SIGHUPed' message for suspended jobs
zpty_start
zpty_input 'setopt check_jobs check_running_jobs'
zpty_input 'sleep 3'
sleep 0.1
zpty_input $'\C-z'
zpty_stop
0:suspended job with check_jobs + check_running_jobs
*>zsh:*(stopped|suspended)*sleep*
*>zsh:*(stopped|suspended) jobs*
# no 'SIGHUPed' message for suspended jobs
zpty_start
zpty_input 'sleep 5 & sleep 4 & sleep 3 &'
zpty_input 'jobs'
zpty_stop
0:`jobs` (misc.) with multiple running jobs
*>\[1] [0-9]##
*>\[2] [0-9]##
*>\[3] [0-9]##
*>\[1] running*sleep 5*
*>\[2] - running*sleep 4*
*>\[3] + running*sleep 3*
*>zsh:*SIGHUPed*
zpty_start
zpty_input 'sleep 3 &'
zpty_input 'jobs -l'
zpty_input 'jobs -p'
zpty_stop
0:`jobs -l` and `jobs -p` with running job
*>\[1] [0-9]##
*>\[1] + [0-9]## running*sleep*
*>\[1] + [0-9]## running*sleep*
*>zsh:*SIGHUPed*
zpty_start
zpty_input 'sleep 3 &'
zpty_input 'jobs -d'
zpty_stop
0:`jobs -d` with running job
*>\[1] [0-9]##
*>\[1] + running*sleep*
*>\(pwd : ?*\)
*>zsh:*SIGHUPed*
zpty_start
zpty_input 'sleep 3 &'
zpty_input 'jobs -r'
zpty_input 'print -- -'
zpty_input 'jobs -s'
zpty_stop
0:`jobs -r` and `jobs -s` with running job
*>\[1] [0-9]##
*>\[1] + running*sleep*
*>-
*>zsh:*SIGHUPed*
zpty_start
zpty_input 'sleep 5'
sleep 0.1
zpty_input $'\C-z'
zpty_input 'jobs -r'
zpty_input 'print -- -'
zpty_input 'jobs -s'
zpty_stop
0:`jobs -r` and `jobs -s` with suspended job
*>zsh:*(stopped|suspended)*sleep*
*>-
*>\[1] + (stopped|suspended)*sleep*
# no 'SIGHUPed' message for suspended jobs
zpty_start
zpty_input 'sleep 10 & sleep 9 & sleep 8 & sleep 7 &'
sleep 0.1
zpty_input 'kill %4'
sleep 0.1
zpty_input 'kill -HUP %3'
sleep 0.1
zpty_input 'kill -INT %2'
sleep 0.1
zpty_input 'kill -KILL %1'
sleep 0.1
zpty_stop
0:various `kill` signals with multiple running jobs
*>\[1] [0-9]##
*>\[2] [0-9]##
*>\[3] [0-9]##
*>\[4] [0-9]##
*>\[4] ? terminate*sleep*
*>\[3] ? hangup*sleep*
*>\[2] ? interrupt*sleep*
*>\[1] ? kill*sleep*
%clean
zmodload -ui zsh/zpty