From: zn@... Date: 2018-01-30T14:56:38+00:00 Subject: [ruby-core:85260] [Ruby trunk Feature#14386] Add option to let Kernel.#system raise error instead of returning false Issue #14386 has been updated by znz (Kazuhiro NISHIYAMA). How about using part after pid of `Process::Status#inspect`? ``` % ruby -ve 'begin;system(%q(ruby -e "exit(false)"), exception: true);rescue => e;p e;p Process.last_status;end' ruby 2.6.0dev (2018-01-30 trunk 62111) [x86_64-darwin16] # # % ruby -ve 'begin;system(%q(ruby -e "Process.kill(:TERM, Process.pid)"), exception: true);rescue;p $!;p $?;end' ruby 2.6.0dev (2018-01-30 trunk 62111) [x86_64-darwin16] # # ``` ```patch diff --git a/process.c b/process.c index 8b8268e9f1..6ad9216564 100644 --- a/process.c +++ b/process.c @@ -548,7 +548,8 @@ pst_pid(VALUE st) static void pst_message(VALUE str, rb_pid_t pid, int status) { - rb_str_catf(str, "pid %ld", (long)pid); + if (pid != (rb_pid_t)-1) + rb_str_catf(str, "pid %ld", (long)pid); if (WIFSTOPPED(status)) { int stopsig = WSTOPSIG(status); const char *signame = ruby_signal_name(stopsig); @@ -4090,8 +4091,10 @@ rb_f_system(int argc, VALUE *argv) status = PST2INT(rb_last_status_get()); if (status == EXIT_SUCCESS) return Qtrue; if (eargp->exception) { - rb_raise(rb_eRuntimeError, "Command failed with status (%d): %s", - WEXITSTATUS(status), RSTRING_PTR(eargp->invoke.sh.shell_script)); + VALUE str = rb_str_buf_new(0); + pst_message(str, (rb_pid_t)-1, status); + rb_raise(rb_eRuntimeError, "Command failed with%"PRIsVALUE": %s", + str, RSTRING_PTR(eargp->invoke.sh.shell_script)); } else { return Qfalse; ``` ---------------------------------------- Feature #14386: Add option to let Kernel.#system raise error instead of returning false https://bugs.ruby-lang.org/issues/14386#change-70021 * Author: k0kubun (Takashi Kokubun) * Status: Closed * Priority: Normal * Assignee: * Target version: ---------------------------------------- I sometimes write code like: ~~~ ruby system('git pull origin master') || raise('Failed to execute: git pull origin master') system('bundle check || bundle install') || raise('Failed to execute: bundle check || bundle install') ~~~ Using rake, we can simplify the above code to the following one, but there's no way to do that outside Rakefile. (Note that I just want to do the same thing as "bash -e", the error message is actually not important.) ~~~ ruby sh 'git pull origin master' sh 'bundle check || bundle install' ~~~ If we add the following option, we can simplify such code even when we're not on a rake task. I'm not sure whether it's a good name or not though. ~~~ ruby system 'git pull origin master', assert_status: true system 'bundle check || bundle install', assert_status: true # => RuntimeError: Command failed with status (1): bundle check || bundle install ~~~ -- https://bugs.ruby-lang.org/ Unsubscribe: