Conversation
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Batch G of the review fixes — graph, hosting, avatars, diff parsing: - G1: the graph's pager moves into GraphPaging, whose generation guard strands any in-flight page when the version poll reloads the list — no more scrambled lane order, no stale error killing the fresh list's paging, and one page in flight at a time. - G2: a detached HEAD's bare 'HEAD' chip dresses like any other chip, as Zed's is_head_ref renders it — plain wash, no check icon. - G3: one shared GitRemoteUrl parse (scheme, scp and bare spellings) behind both githubRepoSlug and GitRemote.isGithub, so an '@' buried in a path or a lookalike host can no longer pass for github.com and the picker's glyph agrees with the sidebar's permalink gate. - G4: avatar loads are single-flight per author (latecomers join the first fetch instead of racing it to the same .part file), downloads write under unique temp names, and the cache directory is pruned to a 5MB budget — oldest first — once per session. - G5: the patch parser reads 'new file mode'/'deleted file mode', so an empty added or deleted file — and a pure rename — say what they are instead of "Only the file's mode changed." Co-Authored-By: Spettro <spettro@eyed.to>
The Changes tab kept its LazyColumn composed even with zero rows, as a later sibling of the empty-state message inside the same Box. Compose hit-tests later siblings first, and an empty list's scrollable modifier still claims the pointer across its full fillMaxSize bounds — so every tap on 'View Branch Diff' and 'Initialize Repository' landed on an invisible, empty list and the buttons never fired, leaving both flows dead on device even after their actions were wired correctly. The list now leaves the composition entirely when there are no rows, making the empty state the topmost hit target. Both buttons work end to end on the emulator: View Branch Diff opens the 'Changes since master' merge-base tab with content, and Initialize Repository runs git init and redraws the panel as a fresh repository with its untracked files. Co-Authored-By: Spettro <spettro@eyed.to>
Remote ops through run_git_split came back 'git exited with 2' with
both streams empty, while the identical command in the app's own
terminal printed two 'fatal:' lines and exited 128. The split wrapper
parked stderr under \${TMPDIR:-/tmp} — and inside the app process
TMPDIR names the host cache directory, set by Android's runtime after
fork (invisible in /proc/<pid>/environ, which only shows the initial
environment) and nonexistent inside the fake root. dash failed the
redirection before git ever ran, carried on to print both markers, and
its own 'cannot create' complaint sat on a stderr pipe the capture
discards on success. Exit 2 is dash's redirection-failure status, not
git's.
Two independent guards, either sufficient: the fixed guest environment
now pins TMPDIR=/tmp alongside PATH and HOME — the inherited value is a
host path for the same reason the inherited PATH is — so git's own
temp-file use is safe too; and the split wrapper parks under /tmp
literally, refusing to trust whatever TMPDIR says by the time it runs.
A successful capture now also logs any stderr the wrapper's shell left
behind, so this class of silent failure shows its sentence in the log.
Regression tests run the real wrapper under a hostile TMPDIR: through
the host's /bin/sh directly, and through the whole run_git_split chain
with a real git fetch failing against a nonexistent remote — both must
keep git's words and git's exit status. On the emulator the panel strip
now reads "git fetch failed: fatal: '/nonexistent-repo' does not appear
to be a git repository", exit 128 in the log, matching the terminal.
Co-Authored-By: Spettro <spettro@eyed.to>A mutating command drops the cache's `scanned` flag, and whoever reads the state right then renders "Asking git…". When the rescan's snapshot came back identical — a failed push, a refused commit — the version counter never moved, the panel's poll never re-read, and that transient was the last thing it ever showed: tab switches and reopen included. The version now bumps for a flag flip too (scanned coming back, `ran` changing), while the diff gutter's generation stays content-only. Co-Authored-By: Spettro <spettro@eyed.to>
Co-Authored-By: Spettro <spettro@eyed.to>
Drop redundant markdown intros and duplicate fields, merge device/version info into single inputs, and move the PR testing gates into a comment. Co-Authored-By: Spettro <spettro@eyed.to>
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This branch turns the git panel from "stage, unstage, discard, commit" into the real Zed git panel: everything you can do from Zed's git panel on desktop, reachable by touch, keyboard, and mouse, backed by the same Rust engine-side logic as the rest of the app.
Remotes (pull / push / publish / fetch)
RemoteOutput,RemoteButton).--force-with-lease; pull offers plain and rebase. Remote URLs are parsed and validated engine-side (GitRemoteUrl.kt), and pull/push commands run under a deadline so a dead network can never hang the panel.The commit graph
The branch picker
Enterchecks out, a fresh name becomes Create Branch (off HEAD, orCtrl+Enteroff the default branch).Ctrl+Shift+Backspacedeletes with warnings,Ctrl+Shift+Icycles the all/local/remote filter.docs/SHORTCUTS.mddocuments the whole thing, plusCtrl+Gas a leader for two-step chords (fetch, push, pull, force-push, pull-with-rebase, diff) — every chord is also a palette command, so it works with no keyboard at all.Staging and commits
Ctrl+Shift+Enter, stage/unstage everything withCtrl+Space/Ctrl+Shift+Space,Ctrl+1/Ctrl+2switch Changes/History — and every mutation answers the panel's poll with its status.Housekeeping, for review convenience
.github/is that, not part of the feature).CoreBridge.kt,GitSession.ktshrank or moved logic) and added Rust modulesgit_branches.rs,git_remotes.rs,git_patch.rs; JNI bridge extended in lockstep, editor logic stays in Rust, UI in Kotlin.Testing
cd core && cargo test && cargo clippy./gradlew :app:testFullDebugUnitTestCtrl+Gchord timeout../gradlew assembleFullDebug assemblePlayDebug.Checklist
core/), UI in Kotlin (app/); JNI boundary changes moved both sides togetherdocs/SHORTCUTS.mdupdated