Skip to content

Fretwire 0.2.0

Choose a tag to compare

@olegklimakov olegklimakov released this 18 Aug 15:12

The second beta. Most of it is about reaching a remote from a Mac that is not
the one the app was built on: running the git you installed rather than the
one Apple ships, ssh remotes and the host keys they need, and failures that say
which failure they are. Plus a crash on a wedged pipe, the tabs you had open at
quit, and repository badges that use more than one letter.

New

  • Your git, and your PATH — a Mac app inherits launchd's environment, not the login shell's, so every command ran as /usr/bin/git with almost no PATH under it. The app now reads the login shell's PATH once per launch and runs the first git on it — or one named in Settings ▸ Git, else Apple's shim — which brings gh's credential helper, gpg for signed commits and a core.sshCommand along with it. Settings ▸ Git shows which git was chosen, its version, where it came from, and the whole search path.
  • SSH remotes — clone and publish over ssh rather than https. Both sheets show which transport they will write, preselected from whether this Mac has a key to offer and changeable in place, and Change URL… moves a remote that already exists. An ssh remote pushes with no token in its environment at all.
  • Host keys — a host this Mac had never spoken to failed with "Host key verification failed" and nothing to do about it, since ssh can only ask that question on a terminal. The failure card now offers to look: ssh-keyscan's fingerprints beside a link to the list the host publishes, and known_hosts appended to only once you say they match. A key that changed gets no such button, only the ssh-keygen -R command to copy — that is either a rekeyed server or someone in the middle, and the app cannot tell which.
  • A silent ssh agent is named as one — a push that went nowhere looked exactly like a slow one, and the timeout blamed the network. An operation that involves ssh and is still running after eight seconds asks the agent whether it answers at all; if it does not, the app says so, with a Stop and the command to see it for yourself.
  • Pushing a branch that has no upstream — creates it on the remote and records the upstream with it, so the toolbar's ahead/behind works and the next plain push lands. A one-off push to another remote publishes the branch there without quietly redirecting where it pulls from.
  • The tabs from last time — the repositories open at quit, and which one was in front, come back at launch. A restored tab is not a visit: it does not reshuffle the recents order, and a path that has since moved or been deleted is dropped instead of opening as an error tab.
  • Badges that tell repositories apart (#2) — the icon rail took the first letter of a name, so project-a, project-b and project-c all read "P". A badge now abbreviates the whole name, a letter from each of the first two words (project-a → PA, MyApp → MA). Where no rule can separate two names, it can be set by hand — letters and a colour, kept per repository, ahead of any icon found on disk.
  • Install with Homebrew (#1) — brew install --cask olegklimakov/fretwire/fretwire. Updates still arrive through the app.

Fixed

  • A wedged pipe no longer takes the app with it — when something held a child's output pipe open past the child itself — a lingering git-remote-https, an ssh ControlPersist master — the waiting thread was reclaimed by closing the descriptor under a read still in flight, and FileHandle answers that with an Objective-C exception no Swift catch can intercept. Output is read through DispatchIO now, where giving up on the rest is an ordinary cancel.
  • Remote failures say which failure they are — having no credentials at all was reported as "the remote rejected these credentials", which was both untrue and a dead end. Missing credentials, rejected credentials, a refused key, an unknown or changed host key and an unreachable host are now told apart, each naming the host git named, and a missing-credentials card offers to connect an account for it.
  • The detail column stays where it was put — opening a file from the commit-detail list re-divided the window, and the column collected a little more width with every file until it stood at its maximum.
  • "Use Default Icon" is offered to VoiceOver — the badge's context menu reaches VoiceOver as named actions, and the reset was missing from that list, so a custom badge could only be undone by reopening the sheet.

Requirements

  • macOS 14 or later.
  • A git — whichever comes first on your login shell's PATH, else Apple's. With none installed at all, the Welcome screen says so once, with the command that fixes it.

Not here yet

  • An interactive rebase editor. One commit at a time can be reworded, squashed or dropped; reordering a range still belongs in the terminal.
  • A command palette.

During the beta

Free, for any use. Licensing starts at 1.0: free for personal projects, paid per seat for commercial use — see the EULA.

The app updates itself — each update is checked against a signature before it is applied. Settings ▸ Updates decides how much of that happens on its own. Bug reports and requests go to the issue tracker.