Without this patch, when using lit's internal shell, if not on a lit
RUN line calls env, diff, or any of the other in-process shell
builtins that lit implements, lit accidentally searches for the latter
as an external executable. What's worse is that works fine when a
developer is testing on a platform where those executables are
available and behave as expected, but it then breaks on other
platforms.
not seems useful for some builtins, such as diff, so this patch
supports such uses. not --crash does not seem useful for builtins,
so this patch diagnoses such uses. In all cases, this patch ensures
shell builtins are found behind any sequence of env and not
commands.
not calling env calling an external command appears useful when
the env and external command are part of a lit substitution, as in
D65156. This patch supports that by looking through any sequence of
env and not commands, building the environment from the envs,
and storing the nots. The nots are then added back to the command
line without the envs to execute externally. This avoids the need
to replicate the not implementation, in particular the --crash
option, in lit.