Skip to content

Commit

Permalink
Skip variable assignments in status current command
Browse files Browse the repository at this point in the history
Fixes #6635
  • Loading branch information
krobelus committed Feb 23, 2020
1 parent ebde9a6 commit aa0e16b
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 2 deletions.
2 changes: 1 addition & 1 deletion src/builtin_fg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ int builtin_fg(parser_t &parser, io_streams_t &streams, wchar_t **argv) {
std::fwprintf(stderr, FG_MSG, job->job_id(), job->command_wcstr());
}

const wcstring ft = tok_first(job->command());
const wcstring ft = tok_command(job->command());
// For compatibility with fish 2.0's $_, now replaced with `status current-command`
if (!ft.empty()) parser.vars().set_one(L"_", ENV_EXPORT, ft);
reader_write_title(job->command(), parser);
Expand Down
2 changes: 1 addition & 1 deletion src/reader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2099,7 +2099,7 @@ void set_env_cmd_duration(struct timeval *after, struct timeval *before, env_sta
void reader_run_command(parser_t &parser, const wcstring &cmd) {
struct timeval time_before, time_after;

wcstring ft = tok_first(cmd);
wcstring ft = tok_command(cmd);

// For compatibility with fish 2.0's $_, now replaced with `status current-command`
if (!ft.empty()) parser.vars().set_one(L"_", ENV_GLOBAL, ft);
Expand Down
15 changes: 15 additions & 0 deletions src/tokenizer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -665,6 +665,21 @@ wcstring tok_first(const wcstring &str) {
return {};
}

wcstring tok_command(const wcstring &str) {
tokenizer_t t(str.c_str(), 0);
while (auto token = t.next()) {
if (token->type != token_type_t::string) {
return {};
}
wcstring text = t.text_of(*token);
if (variable_assignment_equals_pos(text)) {
continue;
}
return text;
}
return {};
}

bool move_word_state_machine_t::consume_char_punctuation(wchar_t c) {
enum { s_always_one = 0, s_rest, s_whitespace_rest, s_whitespace, s_alphanumeric, s_end };

Expand Down
3 changes: 3 additions & 0 deletions src/tokenizer.h
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,9 @@ class tokenizer_t {
/// returns the empty string.
wcstring tok_first(const wcstring &str);

/// Like to tok_first, but skip variable assignments like A=B.
wcstring tok_command(const wcstring &str);

/// Struct wrapping up a parsed pipe or redirection.
struct pipe_or_redir_t {
// The redirected fd, or -1 on overflow.
Expand Down
3 changes: 3 additions & 0 deletions tests/checks/status.fish
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,9 @@ status job-control none
status current-function
#CHECK: Not a function

a=b status current-command
#CHECK: status

function test_function
status current-function
end
Expand Down

0 comments on commit aa0e16b

Please sign in to comment.