Skip to content

Commit aa67fda

Browse files
committed
Propagate dmenu command errors to user instead of failing silently.
1 parent 8719e6c commit aa67fda

File tree

3 files changed

+49
-35
lines changed

3 files changed

+49
-35
lines changed

keepmenu/__main__.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -140,18 +140,21 @@ def run(**kwargs):
140140
"""Start the background Manager and Dmenu runner processes.
141141
142142
"""
143-
server = Server()
144-
if kwargs.get('totp'):
145-
server.totp_flag.set()
146-
dmenu = DmenuRunner(server, **kwargs)
147-
dmenu.daemon = True
148-
server.start()
149-
dmenu.start()
143+
server = None
150144
try:
145+
server = Server()
146+
if kwargs.get('totp'):
147+
server.totp_flag.set()
148+
dmenu = DmenuRunner(server, **kwargs)
149+
dmenu.daemon = True
150+
server.start()
151+
dmenu.start()
151152
server.join()
152153
except KeyboardInterrupt:
153-
sys.exit()
154+
pass
154155
finally:
156+
if server is not None and server.is_alive():
157+
server.terminate()
155158
if exists(expanduser(keepmenu.AUTH_FILE)):
156159
os.remove(expanduser(keepmenu.AUTH_FILE))
157160

keepmenu/keepmenu.py

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -315,28 +315,31 @@ def _set_timer(self):
315315
self.cache_timer.start()
316316

317317
def run(self):
318-
while True:
319-
self.server.start_flag.wait()
320-
if self.server.kill_flag.is_set():
321-
break
322-
if not self.database or not self.database.kpo:
323-
pass
324-
elif self.server.args_flag.is_set():
325-
dargs = self.server.get_args()
326-
keepmenu.CLIPBOARD = dargs.get('clipboard', False) or keepmenu.CLIPBOARD
327-
self.menu_open_another_database(**dargs)
328-
self.server.args_flag.clear()
329-
330-
if self.server.totp_flag.is_set():
318+
try:
319+
while True:
320+
self.server.start_flag.wait()
321+
if self.server.kill_flag.is_set():
322+
break
323+
if not self.database or not self.database.kpo:
324+
pass
325+
elif self.server.args_flag.is_set():
326+
dargs = self.server.get_args()
327+
keepmenu.CLIPBOARD = dargs.get('clipboard', False) or keepmenu.CLIPBOARD
328+
self.menu_open_another_database(**dargs)
329+
self.server.args_flag.clear()
330+
331+
if self.server.totp_flag.is_set():
332+
self.server.totp_flag.clear()
333+
else:
334+
self.dmenu_run(self.server.totp_flag.is_set())
331335
self.server.totp_flag.clear()
332-
else:
333-
self.dmenu_run(self.server.totp_flag.is_set())
334-
self.server.totp_flag.clear()
335-
if self.server.cache_time_expired.is_set():
336-
self.server.kill_flag.set()
337-
if self.server.kill_flag.is_set():
338-
break
339-
self.server.start_flag.clear()
336+
if self.server.cache_time_expired.is_set():
337+
self.server.kill_flag.set()
338+
if self.server.kill_flag.is_set():
339+
break
340+
self.server.start_flag.clear()
341+
except (SystemExit, KeyboardInterrupt):
342+
self.server.kill_flag.set()
340343

341344
def cache_time(self):
342345
"""Kill keepmenu daemon when cache timer expires

keepmenu/menu.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
"""
44
from os.path import basename
55
import shlex
6+
import sys
67
from subprocess import run
78

89
import keepmenu
@@ -78,12 +79,19 @@ def dmenu_select(num_lines, prompt="Entries", inp=""):
7879
7980
"""
8081
cmd = dmenu_cmd(num_lines, prompt)
81-
res = run(cmd,
82-
capture_output=True,
83-
check=False,
84-
encoding=keepmenu.ENC,
85-
env=keepmenu.ENV,
86-
input=inp)
82+
try:
83+
res = run(cmd,
84+
capture_output=True,
85+
check=False,
86+
encoding=keepmenu.ENC,
87+
env=keepmenu.ENV,
88+
input=inp)
89+
except FileNotFoundError:
90+
print(f"dmenu command not found: {cmd[0]}", file=sys.stderr)
91+
sys.exit(1)
92+
if res.returncode != 0 and res.stderr:
93+
print(f"dmenu command error: {res.stderr.strip()}", file=sys.stderr)
94+
sys.exit(1)
8795
return res.stdout.rstrip('\n') if res.stdout is not None else None
8896

8997

0 commit comments

Comments
 (0)