aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/env.cpp37
-rw-r--r--tests/test4.in11
-rw-r--r--tests/test4.out2
3 files changed, 31 insertions, 19 deletions
diff --git a/src/env.cpp b/src/env.cpp
index 4f2004e2..3c73fb07 100644
--- a/src/env.cpp
+++ b/src/env.cpp
@@ -93,7 +93,8 @@ struct env_node_t
const var_entry_t *find_entry(const wcstring &key);
/* Returns the next scope to search in order, respecting the new_scope flag, or NULL if we're done. */
- env_node_t *next_scope_to_search(void);
+ env_node_t *next_scope_to_search();
+ const env_node_t *next_scope_to_search() const;
};
class variable_entry_t
@@ -195,11 +196,17 @@ const var_entry_t *env_node_t::find_entry(const wcstring &key)
return result;
}
-env_node_t *env_node_t::next_scope_to_search(void)
+env_node_t *env_node_t::next_scope_to_search()
{
return this->new_scope ? global_env : this->next;
}
+const env_node_t *env_node_t::next_scope_to_search() const
+{
+ return this->new_scope ? global_env : this->next;
+}
+
+
/**
Return the current umask value.
*/
@@ -1010,8 +1017,6 @@ env_var_t env_get_string(const wcstring &key, env_mode_flags_t mode)
bool env_exist(const wchar_t *key, env_mode_flags_t mode)
{
- env_node_t *env;
-
CHECK(key, false);
const bool has_scope = mode & (ENV_LOCAL | ENV_GLOBAL | ENV_UNIVERSAL);
@@ -1037,27 +1042,21 @@ bool env_exist(const wchar_t *key, env_mode_flags_t mode)
if (test_local || test_global)
{
- env = test_local ? top : global_env;
-
- while (env)
+ const env_node_t *env = test_local ? top : global_env;
+ while (env != NULL)
{
- var_table_t::iterator result = env->env.find(key);
-
+ if (env == global_env && ! test_global)
+ {
+ break;
+ }
+
+ var_table_t::const_iterator result = env->env.find(key);
if (result != env->env.end())
{
const var_entry_t &res = result->second;
return res.exportv ? test_exported : test_unexported;
}
-
- if (has_scope)
- {
- if (!test_global || env == global_env) break;
- env = global_env;
- }
- else
- {
- env = env->next_scope_to_search();
- }
+ env = env->next_scope_to_search();
}
}
diff --git a/tests/test4.in b/tests/test4.in
index f207e6b7..6d501455 100644
--- a/tests/test4.in
+++ b/tests/test4.in
@@ -177,3 +177,14 @@ true ; set -NOT_AN_OPTION 2> /dev/null ; echo 9 $status # no passthrough
false ; set foo (echo A; true) ; echo 10 $status $foo
true ; set foo (echo B; false) ; echo 11 $status $foo
true
+
+echo "Verify set -ql behavior" # see 2502
+function setql_check
+ set -l setql_foo val
+ if set -ql setql_foo
+ echo Pass
+ else
+ echo Fail
+ end
+end
+setql_check
diff --git a/tests/test4.out b/tests/test4.out
index 148d870c..f38fa96f 100644
--- a/tests/test4.out
+++ b/tests/test4.out
@@ -34,3 +34,5 @@ Verify that set passes through exit status, except when passed -n or -q or -e
9 1
10 0 A
11 1 B
+Verify set -ql behavior
+Pass