Repository navigation
Harden launchers, configure initial layouts, and fix visible Git tab focus - #6
Conversation
Explicitly focus created or reused Git tabs while retaining workspace targets and bounded operations. Send paired focus events so consecutive layout toggles reload in an already-focused lazygit. Assert actual rendered diff and client keybinding behavior, cover focus timeout reuse and canonical paths, and document the session-wide focus boundary.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: d0ea6be1ef
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| # overrides and lazygit runtime upgrades. | ||
| printf '# keys: %s %s %s | lazygit: %s\n' \ | ||
| "$k_commit" "$k_zoom" "$k_settings" "$LAZYGIT_VERSION" | ||
| printf '%s\n' "$marker" |
There was a problem hiding this comment.
Avoid caching unresolved fallback bindings
When free-keys.py resolve transiently exits with status 2, generation substitutes the default keys but still writes this requested-key marker. The next launch sees the marker and unchanged mtimes and exits before retrying analysis, so a configured key can remain silently replaced even after the runtime recovers. Only cache the generated layer after successful analysis, or include the fallback/unresolved state in a marker that forces a later retry.
Useful? React with 👍 / 👎.
| DRIVER = """ | ||
| import launcher | ||
| launcher.COMMAND_TIMEOUT = 1.0 | ||
| launcher.LOCK_TIMEOUT = 0.3 |
There was a problem hiding this comment.
Give concurrent launchers enough time to acquire the test lock
The concurrent-reuse test requires both launchers to succeed, but every test driver allows a waiter only 300 ms while the first launcher performs several subprocess calls under the lock. On this checkout, the test failed on all three direct runs because the second process reached the busy-lock error after about 0.52 seconds; similarly loaded CI runners can therefore fail nondeterministically. Use a materially larger lock timeout here or synchronize the fake command so the test does not depend on sub-300-ms scheduling.
Useful? React with 👍 / 👎.
Opening Git could silently stall on a held launcher lock, and Herdr 0.9 could create or reuse a Git tab without switching the visible client. New tabs also inherited the compact sidebar layout, hiding the diff.
This change bounds launcher operations and reports failures, makes new tabs expanded by default, and explicitly switches the client to created or reused Git tabs. Reused panes preserve their layout and placement; consecutive
Upresses now reload the actual lazygit layout.Changes
Validation
prefix+shift+gswitching/reuse.c147c52: workflow run.Compatibility boundaries
Herdr 0.9 public tab focus is session-wide and can switch other attached clients. Strictly client-local routing requires upstream support. Remote reconnect and simultaneous-client UI behavior remain manual checks. Windows support is not claimed; the plugin version and minimum Herdr version remain unchanged.
The reported nested-shell deadlock chain was not reproduced; this PR fixes the demonstrated lock inheritance, unbounded waiting and silent failure behavior without claiming that exact root cause.
Refs #4, #5.