From 47c33841a3c18ac4440538bd1027c40177c496e4 Mon Sep 17 00:00:00 2001 From: misuzu Date: Fri, 19 Nov 2021 00:10:49 +0200 Subject: [PATCH 1/2] Move Popen stuff to get_output --- direnv.py | 65 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/direnv.py b/direnv.py index 7796817..d643720 100644 --- a/direnv.py +++ b/direnv.py @@ -11,6 +11,21 @@ ANSI_ESCAPE_RE = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])') +def get_output(cmd, cwd, env=None): + process = subprocess.Popen( + cmd, + cwd=cwd, + env=env, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + returncode = process.wait() + return ( + returncode, + process.stdout.read().decode(), + ANSI_ESCAPE_RE.sub('', process.stderr.read().decode()), + ) + + class Direnv(object): def __init__(self): self._executor = concurrent.futures.ThreadPoolExecutor(max_workers=1) @@ -53,21 +68,16 @@ def _update_environment(self, file_path): env = {} env.update(os.environ) env.update(environment) - process = subprocess.Popen( + returncode, stdout, stderr = get_output( ['direnv', 'export', 'json'], - cwd=direnv_path, - env=env, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE) - returncode = process.wait() + direnv_path, + env) if returncode != 0: - sublime.status_message( - ANSI_ESCAPE_RE.sub('', process.stderr.read().decode())) + sublime.status_message(stderr) self._current_direnv_path = None return - data = process.stdout.read().decode() - data and environment.update(json.loads(data)) + stdout and environment.update(json.loads(stdout)) for key, value in environment.items(): prev = os.environ.get(key) @@ -75,7 +85,7 @@ def _update_environment(self, file_path): self._previous_environment[key] = prev os.environ[key] = value - if data or direnv_path != direnv_path_prev: + if stdout or direnv_path != direnv_path_prev: sublime.status_message("direnv: loaded %s" % direnv_path) def push(self, file_path): @@ -83,38 +93,37 @@ def push(self, file_path): future.add_done_callback(lambda f: f.result()) -class DirenvEventListener(sublime_plugin.ViewEventListener): - direnv = Direnv() +direnv = Direnv() + +class DirenvEventListener(sublime_plugin.ViewEventListener): def on_load(self): - self.direnv.push(self.view.file_name()) + direnv.push(self.view.file_name()) def on_activated(self): - self.direnv.push(self.view.file_name()) + direnv.push(self.view.file_name()) def on_post_save(self): - self.direnv.push(self.view.file_name()) + direnv.push(self.view.file_name()) class DirenvAllow(sublime_plugin.TextCommand): def run(self, edit): - process = subprocess.Popen( + returncode, stdout, stderr = get_output( ['direnv', 'allow'], - cwd=os.path.dirname(self.view.file_name()), - stderr=subprocess.PIPE) - returncode = process.wait() + os.path.dirname(self.view.file_name())) if returncode != 0: - sublime.status_message( - ANSI_ESCAPE_RE.sub('', process.stderr.read().decode())) + sublime.status_message(stderr) + else: + direnv.push(self.view.file_name()) class DirenvDeny(sublime_plugin.TextCommand): def run(self, edit): - process = subprocess.Popen( + returncode, stdout, stderr = get_output( ['direnv', 'deny'], - cwd=os.path.dirname(self.view.file_name()), - stderr=subprocess.PIPE) - returncode = process.wait() + os.path.dirname(self.view.file_name())) if returncode != 0: - sublime.status_message( - ANSI_ESCAPE_RE.sub('', process.stderr.read().decode())) + sublime.status_message(stderr) + else: + direnv.push(self.view.file_name()) From bae4a1f8b846ae1114b2ecc9e3c882a2851e8f95 Mon Sep 17 00:00:00 2001 From: misuzu Date: Fri, 19 Nov 2021 00:32:08 +0200 Subject: [PATCH 2/2] Do not set None values --- direnv.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/direnv.py b/direnv.py index d643720..8807eec 100644 --- a/direnv.py +++ b/direnv.py @@ -80,8 +80,10 @@ def _update_environment(self, file_path): stdout and environment.update(json.loads(stdout)) for key, value in environment.items(): + if key.startswith('DIRENV_') or value is None: + continue prev = os.environ.get(key) - if not key.startswith('DIRENV_') and prev != value: + if prev != value: self._previous_environment[key] = prev os.environ[key] = value