aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--parser.cpp12
-rw-r--r--parser.h2
-rw-r--r--tests/test7.in8
-rw-r--r--tests/test7.out1
4 files changed, 17 insertions, 6 deletions
diff --git a/parser.cpp b/parser.cpp
index 72cd4be1..1824cebd 100644
--- a/parser.cpp
+++ b/parser.cpp
@@ -1309,11 +1309,13 @@ job_t *parser_t::job_get_from_pid( int pid )
\param j the job to which the process belongs to
\param tok the tokenizer to read options from
\param args the argument list to insert options into
+ \param args unskip whether we should ignore current_block->skip. Big hack because of our dumb handling of if statements.
*/
void parser_t::parse_job_argument_list( process_t *p,
job_t *j,
tokenizer *tok,
- std::vector<completion_t> &args )
+ std::vector<completion_t> &args,
+ bool unskip )
{
int is_finished=0;
@@ -1401,7 +1403,7 @@ void parser_t::parse_job_argument_list( process_t *p,
{
skip = 1;
}
- else if( current_block->skip )
+ else if( current_block->skip && ! unskip )
{
/*
If this command should be skipped, we do not expand the arguments
@@ -1505,7 +1507,7 @@ void parser_t::parse_job_argument_list( process_t *p,
Otherwise, bogus errors may be the result. (Do check
that token is string, though)
*/
- if( current_block->skip )
+ if( current_block->skip && ! unskip )
{
tok_next( tok );
if( tok_last_type( tok ) != TOK_STRING )
@@ -1965,7 +1967,7 @@ int parser_t::parse_job( process_t *p,
continue;
}
- if( use_function && !current_block->skip )
+ if( use_function && ( unskip || ! current_block->skip ))
{
bool nxt_forbidden=false;
wcstring forbid;
@@ -2267,7 +2269,7 @@ int parser_t::parse_job( process_t *p,
}
else
{
- parse_job_argument_list(p, j, tok, args);
+ parse_job_argument_list(p, j, tok, args, unskip);
}
}
diff --git a/parser.h b/parser.h
index 331ca520..ebcfe1c3 100644
--- a/parser.h
+++ b/parser.h
@@ -333,7 +333,7 @@ class parser_t {
parser_t(const parser_t&);
parser_t& operator=(const parser_t&);
- void parse_job_argument_list( process_t *p, job_t *j, tokenizer *tok, std::vector<completion_t>& );
+ void parse_job_argument_list( process_t *p, job_t *j, tokenizer *tok, std::vector<completion_t>&, bool );
int parse_job( process_t *p, job_t *j, tokenizer *tok );
void skipped_exec( job_t * j );
void eval_job( tokenizer *tok );
diff --git a/tests/test7.in b/tests/test7.in
index 910f8080..d642e71e 100644
--- a/tests/test7.in
+++ b/tests/test7.in
@@ -102,3 +102,11 @@ else if not_a_valid_command but it should be OK because a previous branch was ta
else if test ! -n "abc"
echo "epsilon 5.4"
end
+
+# Ensure builtins work
+# https://github.com/fish-shell/fish-shell/issues/359
+if not echo skip1 > /dev/null
+ echo "zeta 6.1"
+else if echo skip2 > /dev/null
+ echo "zeta 6.2"
+end
diff --git a/tests/test7.out b/tests/test7.out
index 903f1973..9e101b0e 100644
--- a/tests/test7.out
+++ b/tests/test7.out
@@ -24,3 +24,4 @@ yep4.2
delta4.1
delta4.2
epsilon5.2
+zeta 6.2