Skip to content

Commit 6bc91ed

Browse files
committed
test(bash_env_saved): add "{,save_}set" to save/restore "set" options
1 parent 4411787 commit 6bc91ed

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

test/t/conftest.py

+44
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,7 @@ def __init__(self, bash: pexpect.spawn, sendintr: bool = False):
455455

456456
self.bash = bash
457457
self.cwd_changed: bool = False
458+
self.saved_set: Dict[str, bash_env_saved.saved_state] = {}
458459
self.saved_shopt: Dict[str, bash_env_saved.saved_state] = {}
459460
self.saved_variables: Dict[str, bash_env_saved.saved_state] = {}
460461
self.sendintr = sendintr
@@ -520,6 +521,30 @@ def _save_cwd(self):
520521
self.cwd_changed = True
521522
self._copy_variable("PWD", "%s_OLDPWD" % self.prefix)
522523

524+
def _check_set(self, name: str):
525+
if self.saved_set[name] != bash_env_saved.saved_state.ChangesDetected:
526+
return
527+
self._safe_assert(
528+
'[[ $(shopt -po %s) == "${%s_NEWSHOPT_%s}" ]]'
529+
% (name, self.prefix, name),
530+
)
531+
532+
def _unprotect_set(self, name: str):
533+
if name not in self.saved_set:
534+
self.saved_set[name] = bash_env_saved.saved_state.ChangesDetected
535+
self._safe_exec(
536+
"%s_OLDSHOPT_%s=$(shopt -po %s || true)"
537+
% (self.prefix, name, name),
538+
)
539+
else:
540+
self._check_set(name)
541+
542+
def _protect_set(self, name: str):
543+
self._safe_exec(
544+
"%s_NEWSHOPT_%s=$(shopt -po %s || true)"
545+
% (self.prefix, name, name),
546+
)
547+
523548
def _check_shopt(self, name: str):
524549
if (
525550
self.saved_shopt[name]
@@ -614,6 +639,13 @@ def _restore_env(self):
614639
self._unset_variable("%s_NEWSHOPT_%s" % (self.prefix, name))
615640
self.saved_shopt = {}
616641

642+
for name in self.saved_set:
643+
self._check_set(name)
644+
self._safe_exec('eval "$%s_OLDSHOPT_%s"' % (self.prefix, name))
645+
self._unset_variable("%s_OLDSHOPT_%s" % (self.prefix, name))
646+
self._unset_variable("%s_NEWSHOPT_%s" % (self.prefix, name))
647+
self.saved_set = {}
648+
617649
self.noexcept = False
618650
if self.captured_error:
619651
raise self.captured_error
@@ -625,6 +657,18 @@ def chdir(self, path: str):
625657
self._safe_exec("command cd -- %s" % shlex.quote(path))
626658
self._protect_variable("OLDPWD")
627659

660+
def set(self, name: str, value: bool):
661+
self._unprotect_set(name)
662+
if value:
663+
self._safe_exec("set -u %s" % name)
664+
else:
665+
self._safe_exec("set +o %s" % name)
666+
self._protect_set(name)
667+
668+
def save_set(self, name: str):
669+
self._unprotect_set(name)
670+
self.saved_set[name] = bash_env_saved.saved_state.ChangesIgnored
671+
628672
def shopt(self, name: str, value: bool):
629673
self._unprotect_shopt(name)
630674
if value:

0 commit comments

Comments
 (0)