From c16e054aaaf84dc31e7030b549d523685054d725 Mon Sep 17 00:00:00 2001 From: Jan Lindemann Date: Wed, 22 Jul 2026 22:42:18 +0200 Subject: [PATCH] App, lib, cmds: Remove unreachable code Remove dead code paths detected by the new warn_unreachable mypy rule. These include: - Removed always-false isinstance checks (ssh/util.py, templates.py) - Removed unreachable return statements after raise (FileContext.py) - Removed unreachable None checks for typed variables (Result.py, ExecContext.py, CmdGetAuthInfo.py) - Simplified __uri function by removing impossible None check (CopyContext.py) - Changed assert False to explicit error (Cmd.py) - Removed unreachable None case from match (App.py) - Removed redundant outer case _: pass (pkg_relations.py) - Restructured stdin write to avoid unreachable warning (AsyncSSH.py) Assisted-by: unsloth/Qwen3.6-35B-A3B-GGUF:IQ4_NL and pi.dev 0.81.1 Signed-off-by: Jan Lindemann --- src/python/jw/pkg/App.py | 2 +- src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py | 2 -- src/python/jw/pkg/cmds/projects/lib/pkg_relations.py | 2 -- src/python/jw/pkg/cmds/projects/lib/templates.py | 5 +---- src/python/jw/pkg/lib/Cmd.py | 3 +-- src/python/jw/pkg/lib/CopyContext.py | 4 +--- src/python/jw/pkg/lib/ExecContext.py | 4 +--- src/python/jw/pkg/lib/FileContext.py | 1 - src/python/jw/pkg/lib/Result.py | 2 -- src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py | 5 ++--- src/python/jw/pkg/lib/ec/ssh/util.py | 2 -- 11 files changed, 7 insertions(+), 25 deletions(-) diff --git a/src/python/jw/pkg/App.py b/src/python/jw/pkg/App.py index f46e8bc1..95cd2b85 100644 --- a/src/python/jw/pkg/App.py +++ b/src/python/jw/pkg/App.py @@ -85,7 +85,7 @@ class App(Base): return path case 'relative': return os.path.relpath(path) - case None | 'absolute': + case 'absolute': return os.path.abspath(path) case _: m = re.search(r'^make:(\S+)$', fmt) diff --git a/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py b/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py index 5571998f..b2d6dc8a 100644 --- a/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py +++ b/src/python/jw/pkg/cmds/projects/CmdGetAuthInfo.py @@ -90,8 +90,6 @@ class CmdGetAuthInfo(Cmd): # export for key, val in result.items(): if not getattr(args, key, None): continue - if val is None: - continue if args.only_values: print(val) continue diff --git a/src/python/jw/pkg/cmds/projects/lib/pkg_relations.py b/src/python/jw/pkg/cmds/projects/lib/pkg_relations.py index 954a77ec..ea1f64b3 100644 --- a/src/python/jw/pkg/cmds/projects/lib/pkg_relations.py +++ b/src/python/jw/pkg/cmds/projects/lib/pkg_relations.py @@ -161,8 +161,6 @@ def pkg_relations( expanded_dep[1] = '>>' case _: pass - case _: - pass dep_str = ' '.join(expanded_dep) if quote: dep_str = '"' + dep_str + '"' diff --git a/src/python/jw/pkg/cmds/projects/lib/templates.py b/src/python/jw/pkg/cmds/projects/lib/templates.py index 37fd3d2b..134135f2 100644 --- a/src/python/jw/pkg/cmds/projects/lib/templates.py +++ b/src/python/jw/pkg/cmds/projects/lib/templates.py @@ -66,10 +66,7 @@ def merge_values(*values: RenderValues) -> ListDict: rhs_dict = render_values_to_list_dict(rhs) for key, val in rhs_dict.items(): entry = ret.setdefault(key, []) - if isinstance(val, list): - entry += val - else: - entry.append(val) + entry += val return ret def format_list_dict( diff --git a/src/python/jw/pkg/lib/Cmd.py b/src/python/jw/pkg/lib/Cmd.py index 2d1375cb..0cca8e7c 100644 --- a/src/python/jw/pkg/lib/Cmd.py +++ b/src/python/jw/pkg/lib/Cmd.py @@ -88,8 +88,7 @@ class AbstractCmd(abc.ABC): self, cmds: Cmd | list[Cmd] | Types[Any] | list[Types[Any]] ) -> None: if isinstance(cmds, Cmd): - assert False - return + raise NotImplementedError('Single Cmd should be handled elsewhere') if isinstance(cmds, list): for cmd in cmds: self.add_subcommands(cmd) diff --git a/src/python/jw/pkg/lib/CopyContext.py b/src/python/jw/pkg/lib/CopyContext.py index 5e731736..9eefbdbe 100644 --- a/src/python/jw/pkg/lib/CopyContext.py +++ b/src/python/jw/pkg/lib/CopyContext.py @@ -12,9 +12,7 @@ class CopyContext: chroot = False ) -> None: - def __uri(ctx: FileContext | Uri | str) -> Uri | str | None: - if ctx is None: - return None + def __uri(ctx: FileContext | Uri | str) -> Uri | str: if isinstance(ctx, Uri): return ctx if isinstance(ctx, str): diff --git a/src/python/jw/pkg/lib/ExecContext.py b/src/python/jw/pkg/lib/ExecContext.py index 4ca033fc..7ee85b82 100644 --- a/src/python/jw/pkg/lib/ExecContext.py +++ b/src/python/jw/pkg/lib/ExecContext.py @@ -150,9 +150,7 @@ class ExecContext(Base): interactive = sys.stdin.isatty() else: interactive = False - if cmd_input is None: - cmd_input_bytes = None - elif isinstance(cmd_input, str): + if isinstance(cmd_input, str): cmd_input_bytes = cmd_input.encode(sys.stdout.encoding or 'utf-8') else: cmd_input_bytes = cmd_input diff --git a/src/python/jw/pkg/lib/FileContext.py b/src/python/jw/pkg/lib/FileContext.py index 49dc751b..5658db74 100644 --- a/src/python/jw/pkg/lib/FileContext.py +++ b/src/python/jw/pkg/lib/FileContext.py @@ -297,7 +297,6 @@ class FileContext(abc.ABC): except Exception as e: log(ERR, f'{self.log_name}: Failed to stat({path}) ({str(e)})') raise - return False async def is_dir(self, path: str, follow_symlinks = True) -> bool: return await self._is_dir(self._chroot(path), follow_symlinks = follow_symlinks) diff --git a/src/python/jw/pkg/lib/Result.py b/src/python/jw/pkg/lib/Result.py index f0a13a81..644fe186 100644 --- a/src/python/jw/pkg/lib/Result.py +++ b/src/python/jw/pkg/lib/Result.py @@ -159,8 +159,6 @@ class Result: if self.status == 0: return False err = self.stderr_str - if err is None: - return False import re return re.search(pattern, err) is not None diff --git a/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py b/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py index eacc31a3..a2fbb12f 100644 --- a/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py +++ b/src/python/jw/pkg/lib/ec/ssh/AsyncSSH.py @@ -210,9 +210,8 @@ class AsyncSSH(Base): except (BrokenPipeError, OSError): pass return - if proc.stdin is None: - return - proc.stdin.write(data) + if proc.stdin is not None: + proc.stdin.write(data) await proc.stdin.drain() async def _pump_stdout() -> None: diff --git a/src/python/jw/pkg/lib/ec/ssh/util.py b/src/python/jw/pkg/lib/ec/ssh/util.py index 854423e8..91b4040c 100644 --- a/src/python/jw/pkg/lib/ec/ssh/util.py +++ b/src/python/jw/pkg/lib/ec/ssh/util.py @@ -42,8 +42,6 @@ def join_cmd( """ ret: list[str] = [] for token in cmd: - if not isinstance(token, str): - token = str(token) if token in operators: ret.append(token) else: