Permalink
Switch branches/tags
v2.2.0-alpha.00000000 v2.1.0-beta.20181015 v2.1.0-beta.20181008 v2.1.0-beta.20181001 v2.1.0-beta.20180924 v2.1.0-beta.20180917 v2.1.0-beta.20180910 v2.1.0-beta.20180904 v2.1.0-beta.20180827 v2.1.0-alpha.20180730 v2.1.0-alpha.20180702 v2.1.0-alpha.20180604 v2.1.0-alpha.20180507 v2.1.0-alpha.20180416 v2.1.0-alpha.00000000 v2.0.6 v2.0.6-rc.1 v2.0.5 v2.0.4 v2.0.3 v2.0.2 v2.0.1 v2.0.0 v2.0-rc.1 v2.0-beta.20180326 v2.0-beta.20180319 v2.0-beta.20180312 v2.0-beta.20180305 v2.0-alpha.20180212 v2.0-alpha.20180129 v2.0-alpha.20180122 v2.0-alpha.20180116 v2.0-alpha.20171218 v2.0-alpha.20171218-plus-left-join-fix v1.2-alpha.20171211 v1.2-alpha.20171204 v1.2-alpha.20171113 v1.2-alpha.20171026 v1.2-alpha.20170901 v1.1.9 v1.1.9-rc.1 v1.1.8 v1.1.7 v1.1.6 v1.1.5 v1.1.4 v1.1.3 v1.1.2 v1.1.1 v1.1.0 v1.1.0-rc.1 v1.1-beta.20170928 v1.1-beta.20170921 v1.1-beta.20170907 v1.1-alpha.20170817 v1.1-alpha.20170810 v1.1-alpha.20170803 v1.1-alpha.20170720 v1.1-alpha.20170713 v1.1-alpha.20170629 v1.1-alpha.20170622 v1.1-alpha.20170608 v1.1-alpha.20170601 v1.0.7 v1.0.6 v1.0.5 v1.0.4 v1.0.3 v1.0.2 v1.0.1 v1.0 v1.0-rc.3 v1.0-rc.2 v1.0-rc.1 v0.1-alpha beta-20170420 beta-20170413 beta-20170406 beta-20170330 beta-20170323 beta-20170309 beta-20170223 beta-20170216 beta-20170209 beta-20170126 beta-20170112 beta-20170105 beta-20161215 beta-20161208 beta-20161201 beta-20161110 beta-20161103 beta-20161027 beta-20161013 beta-20161006 beta-20160929 beta-20160915 beta-20160908 beta-20160829 beta-20160728
Nothing to show
Find file Copy path
Fetching contributors…
Cannot retrieve contributors at this time
executable file 52 lines (45 sloc) 2.32 KB
#!/usr/bin/env bash
# node-run.sh runs a command installed by NPM/Yarn. It looks for COMMAND in
# ./node_modules/bin, where NPM/Yarn install commands by default, then invokes
# it with the specified ARGS, if any.
#
# The reason for this script's existence is somewhat arcane. NodeJS strongly
# prefers non-blocking I/O, so if it detects that stdout or stderr is a Unix
# pipe, it will enable non-blocking I/O on that file descriptor [0]. The
# non-blocking I/O mode applies to every process that has a reference to that
# open file description [1]. Normally, this is not a problem: if stdout or
# stderr is a pipe, it is typically a single-purpose pipe created by a shell
# pipeline that is not shared with any other processes. In Docker, however, the
# stdout and stderr streams are named FIFOs, which look like anonymous pipes but
# are shared by all processes launched by the same shell. Launching a NodeJS
# process in Docker will thus make stdout and stderr non-blocking for all other
# processes invoked by the same shell.
#
# In CI, because we run NodeJS and `go test` in the same Docker shell, `go test`
# will intermittently drop output on the floor when a write fails with EAGAIN.
# `go-test-teamcity` interprets this missing output as an indication that the
# test panicked. Note that dropping output is reasonable behavior from `go
# test`--most programs simply cannot and should not handle non-blocking stdio
# streams [2]--and is arguably a bug in NodeJS [3].
#
# As a workaround, this script pipes NodeJS's stdout and stderr through `cat`,
# which prevents the actual stdout and stderr streams from being infected with
# non-blocking I/O.
#
# TODO(benesch): see if we can propagate isatty from the true stdout and stderr
# so that colors, etc. are supported.
# [0]: https://nodejs.org/docs/latest-v8.x/api/process.html#process_a_note_on_process_i_o
# [1]: See `man 2 open` for details on the difference between a file
# descriptor, an open file description, and a file.
# [2]: https://jdebp.eu/FGA/dont-set-shared-file-descriptors-to-non-blocking-mode.html
# [3]: https://github.com/nodejs/node/issues/14752
set -euo pipefail
[[ "${1-}" ]] || { echo "usage: $0 [-C CWD] COMMAND [ARGS...]" >&2; exit 1; }
while getopts "C:" opt; do
case $opt in
C) cd "$OPTARG" ;;
\?) exit 1;
esac
done
shift $((OPTIND-1))
"$@" > >(cat) 2> >(cat >&2)