From cbf33fa14b181362598dd98fb45332d012b6f0a2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Fri, 23 Apr 2021 16:23:13 +0530 Subject: [PATCH] Fix #3523 --- docs/changelog.rst | 3 +++ kitty/main.py | 3 +++ kitty/session.py | 21 ++++++++++++++++----- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index 2ff322d65..4f723464c 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -29,6 +29,9 @@ To update |kitty|, :doc:`follow the instructions `. - GNOME: Fix maximize state not being remembered when focus changes and window decorations are hidden (:iss:`3507`) +- Fix reading :option:`kitty --session` from ``STDIN`` not working when the + :option:`kitty --detach` option is used (:iss:`3523`) + 0.20.1 [2021-04-19] ---------------------- diff --git a/kitty/main.py b/kitty/main.py index 567ed224d..98ac20b3b 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -306,6 +306,9 @@ def _main() -> None: create_opts(cli_opts, debug_config=True) return if cli_opts.detach: + if cli_opts.session == '-': + from .session import PreReadSession + cli_opts.session = PreReadSession(sys.stdin.read()) detach() if cli_opts.replay_commands: from kitty.client import main as client_main diff --git a/kitty/session.py b/kitty/session.py index 1f2ab8fc7..2564a7b6b 100644 --- a/kitty/session.py +++ b/kitty/session.py @@ -137,6 +137,14 @@ def parse_session(raw: str, opts: Options, default_title: Optional[str] = None) yield finalize_session(ans) +class PreReadSession(str): + + def __new__(cls, val: str) -> 'PreReadSession': + ans: PreReadSession = str.__new__(cls, val) + ans.pre_read = True # type: ignore + return ans + + def create_sessions( opts: Options, args: Optional[CLIOptions] = None, @@ -146,12 +154,15 @@ def create_sessions( default_session: Optional[str] = None ) -> Generator[Session, None, None]: if args and args.session: - if args.session == '-': - f = sys.stdin + if isinstance(args.session, PreReadSession): + session_data = '' + str(args.session) else: - f = open(args.session) - with f: - session_data = f.read() + if args.session == '-': + f = sys.stdin + else: + f = open(args.session) + with f: + session_data = f.read() yield from parse_session(session_data, opts, getattr(args, 'title', None)) return if default_session and default_session != 'none':