Promote job_control_t to an enum class

This commit is contained in:
ridiculousfish 2019-03-24 12:12:08 -07:00
parent 99d77c6049
commit 96b8ac7013
4 changed files with 34 additions and 30 deletions

View File

@ -76,24 +76,25 @@ const enum_map<status_cmd_t> status_enum_map[] = {
/// Values that may be returned from the test-feature option to status. /// Values that may be returned from the test-feature option to status.
enum { TEST_FEATURE_ON, TEST_FEATURE_OFF, TEST_FEATURE_NOT_RECOGNIZED }; enum { TEST_FEATURE_ON, TEST_FEATURE_OFF, TEST_FEATURE_NOT_RECOGNIZED };
int job_control_str_to_mode(const wchar_t *mode, wchar_t *cmd, io_streams_t &streams) { static maybe_t<job_control_t> job_control_str_to_mode(const wchar_t *mode, wchar_t *cmd,
io_streams_t &streams) {
if (std::wcscmp(mode, L"full") == 0) { if (std::wcscmp(mode, L"full") == 0) {
return JOB_CONTROL_ALL; return job_control_t::all;
} else if (std::wcscmp(mode, L"interactive") == 0) { } else if (std::wcscmp(mode, L"interactive") == 0) {
return JOB_CONTROL_INTERACTIVE; return job_control_t::interactive;
} else if (std::wcscmp(mode, L"none") == 0) { } else if (std::wcscmp(mode, L"none") == 0) {
return JOB_CONTROL_NONE; return job_control_t::none;
} }
streams.err.append_format(L"%ls: Invalid job control mode '%ls'\n", cmd, mode); streams.err.append_format(L"%ls: Invalid job control mode '%ls'\n", cmd, mode);
return -1; return none();
} }
struct status_cmd_opts_t { struct status_cmd_opts_t {
bool print_help = false; bool print_help{false};
int level = 1; int level{1};
int new_job_control_mode = -1; maybe_t<job_control_t> new_job_control_mode{};
const wchar_t *feature_name; const wchar_t *feature_name{};
status_cmd_t status_cmd = STATUS_UNDEF; status_cmd_t status_cmd{STATUS_UNDEF};
}; };
/// Note: Do not add new flags that represent subcommands. We're encouraging people to switch to /// Note: Do not add new flags that represent subcommands. We're encouraging people to switch to
@ -230,10 +231,11 @@ static int parse_cmd_opts(status_cmd_opts_t &opts, int *optind, //!OCLINT(high
if (!set_status_cmd(cmd, opts, STATUS_SET_JOB_CONTROL, streams)) { if (!set_status_cmd(cmd, opts, STATUS_SET_JOB_CONTROL, streams)) {
return STATUS_CMD_ERROR; return STATUS_CMD_ERROR;
} }
opts.new_job_control_mode = job_control_str_to_mode(w.woptarg, cmd, streams); auto job_mode = job_control_str_to_mode(w.woptarg, cmd, streams);
if (opts.new_job_control_mode == -1) { if (!job_mode) {
return STATUS_CMD_ERROR; return STATUS_CMD_ERROR;
} }
opts.new_job_control_mode = job_mode;
break; break;
} }
case 't': { case 't': {
@ -309,14 +311,14 @@ int builtin_status(parser_t &parser, io_streams_t &streams, wchar_t **argv) {
streams.out.append_format( streams.out.append_format(
_(L"Job control: %ls\n"), _(L"Job control: %ls\n"),
job_control_mode == JOB_CONTROL_INTERACTIVE job_control_mode == job_control_t::interactive
? _(L"Only on interactive jobs") ? _(L"Only on interactive jobs")
: (job_control_mode == JOB_CONTROL_NONE ? _(L"Never") : _(L"Always"))); : (job_control_mode == job_control_t::none ? _(L"Never") : _(L"Always")));
streams.out.append(parser.stack_trace()); streams.out.append(parser.stack_trace());
break; break;
} }
case STATUS_SET_JOB_CONTROL: { case STATUS_SET_JOB_CONTROL: {
if (opts.new_job_control_mode != -1) { if (opts.new_job_control_mode) {
// Flag form was used. // Flag form was used.
CHECK_FOR_UNEXPECTED_STATUS_ARGS(opts.status_cmd) CHECK_FOR_UNEXPECTED_STATUS_ARGS(opts.status_cmd)
} else { } else {
@ -326,12 +328,14 @@ int builtin_status(parser_t &parser, io_streams_t &streams, wchar_t **argv) {
args.size()); args.size());
return STATUS_INVALID_ARGS; return STATUS_INVALID_ARGS;
} }
opts.new_job_control_mode = job_control_str_to_mode(args[0].c_str(), cmd, streams); auto new_mode = job_control_str_to_mode(args[0].c_str(), cmd, streams);
if (opts.new_job_control_mode == -1) { if (!new_mode) {
return STATUS_CMD_ERROR; return STATUS_CMD_ERROR;
} }
opts.new_job_control_mode = new_mode;
} }
job_control_mode = opts.new_job_control_mode; assert(opts.new_job_control_mode && "Should have a new mode");
job_control_mode = *opts.new_job_control_mode;
break; break;
} }
case STATUS_FEATURES: { case STATUS_FEATURES: {
@ -403,17 +407,17 @@ int builtin_status(parser_t &parser, io_streams_t &streams, wchar_t **argv) {
} }
case STATUS_IS_FULL_JOB_CTRL: { case STATUS_IS_FULL_JOB_CTRL: {
CHECK_FOR_UNEXPECTED_STATUS_ARGS(opts.status_cmd) CHECK_FOR_UNEXPECTED_STATUS_ARGS(opts.status_cmd)
retval = job_control_mode != JOB_CONTROL_ALL; retval = job_control_mode != job_control_t::all;
break; break;
} }
case STATUS_IS_INTERACTIVE_JOB_CTRL: { case STATUS_IS_INTERACTIVE_JOB_CTRL: {
CHECK_FOR_UNEXPECTED_STATUS_ARGS(opts.status_cmd) CHECK_FOR_UNEXPECTED_STATUS_ARGS(opts.status_cmd)
retval = job_control_mode != JOB_CONTROL_INTERACTIVE; retval = job_control_mode != job_control_t::interactive;
break; break;
} }
case STATUS_IS_NO_JOB_CTRL: { case STATUS_IS_NO_JOB_CTRL: {
CHECK_FOR_UNEXPECTED_STATUS_ARGS(opts.status_cmd) CHECK_FOR_UNEXPECTED_STATUS_ARGS(opts.status_cmd)
retval = job_control_mode != JOB_CONTROL_NONE; retval = job_control_mode != job_control_t::none;
break; break;
} }
case STATUS_STACK_TRACE: { case STATUS_STACK_TRACE: {

View File

@ -1207,8 +1207,8 @@ parse_execution_result_t parse_execution_context_t::run_1_job(tnode_t<g::job> jo
shared_ptr<job_t> job = std::make_shared<job_t>(acquire_job_id(), block_io, parent_job); shared_ptr<job_t> job = std::make_shared<job_t>(acquire_job_id(), block_io, parent_job);
job->tmodes = tmodes; job->tmodes = tmodes;
job->set_flag(job_flag_t::JOB_CONTROL, job->set_flag(job_flag_t::JOB_CONTROL,
(job_control_mode == JOB_CONTROL_ALL) || (job_control_mode == job_control_t::all) ||
((job_control_mode == JOB_CONTROL_INTERACTIVE) && shell_is_interactive())); ((job_control_mode == job_control_t::interactive) && shell_is_interactive()));
job->set_flag(job_flag_t::FOREGROUND, !job_node_is_background(job_node)); job->set_flag(job_flag_t::FOREGROUND, !job_node_is_background(job_node));

View File

@ -79,7 +79,7 @@ bool is_block = false;
bool is_breakpoint = false; bool is_breakpoint = false;
bool is_login = false; bool is_login = false;
int is_event = 0; int is_event = 0;
int job_control_mode = JOB_CONTROL_INTERACTIVE; job_control_t job_control_mode = job_control_t::interactive;
int no_exec = 0; int no_exec = 0;
static int is_interactive = -1; static int is_interactive = -1;

View File

@ -38,10 +38,10 @@ enum process_type_t {
INTERNAL_EXEC INTERNAL_EXEC
}; };
enum { enum class job_control_t {
JOB_CONTROL_ALL, all,
JOB_CONTROL_INTERACTIVE, interactive,
JOB_CONTROL_NONE, none,
}; };
/// A proc_status_t is a value type that encapsulates logic around exited vs stopped vs signaled, /// A proc_status_t is a value type that encapsulates logic around exited vs stopped vs signaled,
@ -489,8 +489,8 @@ void set_proc_had_barrier(bool flag);
/// The current job control mode. /// The current job control mode.
/// ///
/// Must be one of JOB_CONTROL_ALL, JOB_CONTROL_INTERACTIVE and JOB_CONTROL_NONE. /// Must be one of job_control_t::all, job_control_t::interactive and job_control_t::none.
extern int job_control_mode; extern job_control_t job_control_mode;
/// If this flag is set, fish will never fork or run execve. It is used to put fish into a syntax /// If this flag is set, fish will never fork or run execve. It is used to put fish into a syntax
/// verifier mode where fish tries to validate the syntax of a file but doesn't actually do /// verifier mode where fish tries to validate the syntax of a file but doesn't actually do