Skip to content

Forkyard v1.1.0

Latest

Choose a tag to compare

@github-actions github-actions released this 15 Oct 21:31
· 2 commits to main since this release

Added

  • Crash reports: the app now keeps a redacted log (logs/forkyard.log in the data folder). If it
    panics or ends without shutting down, it saves a report there and offers it on the next start
    (View, Save…, Discard; also “Show crash reports” in the command palette). Nothing is uploaded.
  • Reflog: a view of where HEAD or a branch has pointed, newest first – including commits no branch
    reaches any more (shown, but without actions). Selecting an entry shows the commit; its menu creates a
    branch there, checks it out, resets the current branch to it (with undo) or copies the SHA. Open it
    from the command palette (“Show reflog”) or from a branch’s menu.
  • Bisect: “Start bisect …” on one or two commits in the graph. A bar above the graph shows “Step n of ~m”
    with Good, Bad, Skip and End, the rows mark good, bad and skipped commits, and the first bad commit is
    named as soon as it is certain. A bisect started on the command line is picked up, including its own terms.
  • Collapse merges: the arrow on a merge row (or ← / → on the selected merge) hides the commits the merge
    brought in and shows “+n commits”; “Collapse all merges” / “Expand all merges” (Ctrl+Shift+[ /
    Ctrl+Shift+]) also covers pages loaded later. Commits a branch or tag points to stay visible.
  • The graph marks commits of the checked-out branch that are not pushed yet (↑) and commits of its
    upstream that are not pulled yet (↓).
  • Image diff: besides side by side, images can be compared by swiping, as an onion skin (opacity
    slider) or as a pixel difference that highlights changed pixels and dims the rest. Images of
    different sizes are aligned at the top left; the last mode is remembered.
  • Ticket links: issue numbers and ticket keys in commit messages (details and graph) open in the
    browser. Sources: the repository's host (#123, on GitLab also !123), presets for Jira, Linear,
    YouTrack and Redmine, own patterns with an address template (Settings › Project › Ticket links),
    and a .forkyard/links.json in the repository
    ({ "version": 1, "rules": [{ "id": "ops", "pattern": "OPS-(\\d+)", "url": "https://ops.example/t/$1" }] }).
    Patterns are checked; the file only creates links and runs nothing.
  • Conflict preview: before a merge, rebase, cherry-pick or revert the app checks – without touching
    the working directory – whether Git would stop on conflicts, names the files (for a series also
    the first conflicting commit) and lets you go ahead anyway. The rebase tool shows the result live.
  • Partial stash: selected lines and hunks from the diff view can be stashed (“Stash selection …”);
    everything else stays in the index and the working directory. Undo restores the lines and drops
    the stash.
  • Rebase with dependent branches: “Move dependent branches along” rebases stacked branches in the
    same step (--update-refs); one undo resets all of them.
  • Push several branches and tags at once (“Push with more branches and tags …”), with “All or
    nothing” (--atomic) and a result per ref. Forcing a branch always uses --force-with-lease.
  • Delete a remote branch on its server: “Delete … on origin …” in the menu of a remote branch (sidebar
    and graph), “Delete … on remote …” on a local branch with an upstream, and “Delete branch on remote …”
    in the command palette. The prompt names remote and branch and the local branch that stays; if
    someone else already deleted it, the app says so and removes the stale remote branch.
  • Submodules can be moved to another folder (“Move …”).
  • After checkout (also of a new branch or a pull request), pull, merge, cherry-pick, revert, hard
    reset, a finished rebase, gitflow finish, bisect steps and undo/redo, changed submodules are
    updated in the background; a failure shows a warning. A submodule with commits checked out that
    no branch holds is left alone and named in the warning. Can be switched off per project.
  • Git LFS file locks: the Git LFS dialog lists the repository’s locks with a filter and unlocks
    your own or – after a prompt naming owner and file – other people’s locks. Changed files and the
    file list of a commit show a lock symbol with the owner, a right-click locks or unlocks files,
    and the commit panel warns when staged files are locked by someone else (committing stays
    possible). The list is read again after every fetch; a server without file locking says so
    instead of showing an empty list.
  • Custom commands: your own programs, Git commands and web addresses with placeholders (${repo},
    ${sha}, ${branch}, ${file}, ${remote}, ${input:<id>}) and an input form, in the command
    palette and the context menus of commits, branches, files and submodules (Settings → Custom
    commands, with import and export as JSON). Values are always passed as single arguments, never
    through a shell; a command can show the finished line before it runs, and runs can be cancelled.
    A repository can bring commands in .forkyard/commands.json; they only run after you approve
    exactly that version of the file. See docs/custom-commands.md.
  • Command line: forkyard --help and forkyard --version answer without opening a window. The
    Windows installers put the program folder on the PATH and remove it on uninstall, deb and rpm
    install /usr/bin/forkyard, and for the AppImage and the macOS app the command palette offers
    “Install command-line command”.
  • Statistics: a “Statistics” view per repository (toolbar or command palette) with commits by
    weekday and hour, commits over time, authors, a treemap of the most changed files, hotspots,
    knowledge per folder with bus factor, code age from git blame on the largest text files,
    and records. It runs as a cancellable background job for a period and branch; results are
    cached per commit and period (numbers only, never commit contents).
  • Hosts: Gitea and Forgejo (including Codeberg and self-hosted instances), Bitbucket Cloud and Azure
    DevOps join GitHub and GitLab – pull requests (list, read, create, change, comment, merge, close,
    check out) and issues; on Azure DevOps these are work items, which can also be created from the app.
    Remotes are recognised in their HTTPS and SSH forms (including ssh.dev.azure.com,
    vs-ssh.visualstudio.com and altssh.bitbucket.org). Tokens stay in the system keychain;
    Bitbucket signs in with the account e-mail and an API token.
  • Update check: once a day (and on “Check for updates…” in the command palette or Settings › About)
    the app asks GitHub for the newest stable release. A newer version shows up quietly in the status
    bar and once as a message with an excerpt of the release notes; “View release” opens the release
    page in the browser, “Skip this version” silences it. The request sends nothing but the app version
    in the user agent; drafts and prereleases are ignored, nothing is downloaded or installed. Turn it
    off under Settings › About › Check for updates automatically.

Changed

  • Redaction also removes bare GitHub (ghp_…, github_pat_…) and GitLab (glpat-…) tokens.
  • The app only offers what a host can do: merge methods, drafts, reviewers, labels, reopening, checking
    out pull requests from forks and the issue tracker follow the host (and the repository's settings).
  • Settings › "GitHub and GitLab" is now Settings › Hosts.
  • Redaction also removes Atlassian API tokens and Bitbucket app passwords (ATATT…, ATBB…).
  • Switching profiles and the author name hint only promise the profile identity when it is written to
    the gitconfig; a new profile takes over the active profile's gitconfig setting.
  • Ending the app with SIGTERM, SIGINT, SIGHUP or by closing the console counts as a clean exit.

Fixed

  • A host request whose network read is interrupted by a signal (for example when a Git process ends at
    the same moment) is retried and no longer reported as "not reachable".
  • Statistics: the code age is measured against today instead of the last commit, so a repository
    nobody touched for years no longer looks young; a cached result is sorted again against today.
  • Statistics: a renamed file or moved folder keeps its history from before the rename in hotspots,
    the treemap and knowledge per folder.
  • Statistics: knowledge per folder says what it measures – the share of changed lines per person.
  • Statistics left open past midnight are computed again for the new day instead of showing
    yesterday's period and code age as up to date.
  • Statistics of a repository without commits say "No commits yet" instead of pointing to a longer
    period.
  • Statistics: the dates under “Commits over time” no longer overlap when the period spans two years.
  • A failed commit signature is reported as a signing error instead of "not found".
  • Applying a stash restores its untracked files through the stash itself, and a patch from a stash
    includes them.
  • Partial patches keep an old last line without a final newline behind the lines it followed.
  • Backups and patch exports copy the index with its original timestamp, so files rewritten in the
    same instant are no longer seen as unchanged.
  • Opening a repository reads the LFS patterns from .gitattributes and no longer installs LFS hooks.
  • A remembered account also answers the credential prompts of git-lfs.
  • The rebase step counter counts only the commits that are replayed.
  • Resetting to a commit outside the loaded graph counts only the commits that really leave the branch.
  • New refs in freshly created ref folders are noticed without a reload.
  • "Load more" in the sidebar sits below the pull request rows.
  • The pull request view leaves out the labels block for hosts without labels.
  • A commit's changed files show the LFS lock symbol.
  • A local (file://) remote counts as an LFS server without file locking.
  • The reflog keeps its selection when new entries arrive and shows the highlighted entry in the commit
    panel when it opens.
  • A bisect started in a terminal is noticed.
  • A custom command's confirmation shows the full command line.
  • A cancelled first statistics run says so and offers to compute again.
  • The crash dialog no longer shows a doubled period, and a killed run's report lists its Git calls up
    to the next start.