Extend command::runner_t API
Use runner_t::wait_for_command instead of runner_t::wait(true)

The latter API has been removed.
Convert CxxTest test to custom test framework
Use constants for input, output, and error file descriptors
Change io::create_pipe API

We now return a tuple and always set FD_CLOEXEC.
Do not abort() if we fail to create a pipe

Failure to create a pipe does happen “in the wild” (with the error “too many open files”). Since majority of subprocess executions relate to gathering version control info we can probably ignore the failure, as not having version control info is better than crashing.

OTOH that pipe() fails does seem to be a symptom of a more serious issue.

The io::spawn implementation has also been updated to use io::create_pipe which sets FD_CLOEXEC, so there should be no reason to set this.
Set FD_CLOEXEC immediately after calling mkstemp()

There is still a race condition but it’s a little better than before.
Let command::runner_t use io::create_pipe
File descriptors without FD_CLOEXEC are closed before we execve()

No file descriptors (other than input/output) should be inherited by our child process. We set FD_CLOEXEC ourself, but system frameworks might not always set it, or there might be a race condition (e.g. with socket(), pipe(), mkstemp(), etc.).
Use io::exec() instead of system()

The motivation for this change is that we may enable MallocDebug when running tests, which is done via environment variables that we do not want to be passed on to the shell tools we execute.
Add loadHTMLString: API to HTML output view

This replaces the current HTML shown without adding to the history and will preserve scroll position.
Make htmlOutputView a public property of the HTML output window
Remove initWithRunner: method (refactor)
Add path::escape to use when passing paths to a shell interpreter
Use path::escape instead of local code
Add path::unescape to split a shell line into words
Variables set via requiredCommands are now shell escaped

Additionally we expect that any variable the user has set is properly shell escaped. Though this is only relevant if the value contains spaces or escape characters.

Currently bundle commands has not been updated to assume that the variables are already shell escaped, so this commit can cause issues with existing bundles.
Update kvdb dependency to version to 0.0.8