fix(remote-job): a job name is data, never a shell pattern
`status` built its job list with `for n in $names`, which word-splits AND globs. The second half is the bug: a job named `x*` was expanded against the caller's working directory, so the report described unrelated files there as jobs and never mentioned the one that ran — on a harness whose whole purpose is a report you can trust after the session that started the job is gone. Splitting stays (several names in one argument is the documented call shape); expansion goes. `tail` was honest-by-accident in the wrong direction: with no jobs it handed a literal `$JOBS/*.out` to tail, which reports a missing *file* — indistinguishable from a broken tool — and a missing name produced tail's errno rather than "no job called that". Both now say what is missing and exit 1. Red first: the name test reads the report from a directory containing an unrelated file, so the old glob is visible as a phantom job; both new tests fail against the previous code and pass against this one. Refs #60
This commit is contained in:
1 parent
d0587a5bc5
commit
8393dc1090
3 files changed
+48
-8
No files matched your search
@@ -122,6 +122,31 @@ until_done() {
|
||||
[[ "$output" == *38* ]] # the tail, not the head
|
||||
}
|
||||
|
||||
@test "status treats a job name as a name, not a pattern" {
|
||||
"$SCRIPT" start 'x*' -- bash -c 'echo star'
|
||||
until_done 'x*'
|
||||
touch "$TEST_TMP/anchor"
|
||||
# The report is read from a directory full of unrelated files on purpose: a name that is
|
||||
# expanded as a glob resolves against the CALLER's cwd, so the tool would describe `anchor`
|
||||
# as a job and never mention the one that really ran.
|
||||
run bash -c 'cd "$1" && "$2" status "$3"' _ "$TEST_TMP" "$SCRIPT" 'x*'
|
||||
[[ "$output" == " x*"*"DONE rc=0"* ]]
|
||||
[[ "$output" != *anchor* ]]
|
||||
}
|
||||
|
||||
@test "tail on an empty harness and on a missing job both say so" {
|
||||
# An unexpanded `*.out` reaching tail is reported as a missing FILE, which reads as a broken
|
||||
# script; the honest answer is that there is nothing to follow yet.
|
||||
run timeout 5 "$SCRIPT" tail
|
||||
[ "$status" -ne 0 ]
|
||||
[[ "$output" == *"no jobs"* ]]
|
||||
[[ "$output" != *".out"* ]]
|
||||
run timeout 5 "$SCRIPT" tail nosuchjob
|
||||
[ "$status" -ne 0 ]
|
||||
[[ "$output" == *"nosuchjob"* ]]
|
||||
[[ "$output" != *"No such file"* ]]
|
||||
}
|
||||
|
||||
@test "an unknown verb is a usage error" {
|
||||
run "$SCRIPT" frobnicate
|
||||
[ "$status" -eq 2 ]
|
||||
|
||||
Reference in new issue
Block a user