Skip to content

Releases: sultanofcardio/porcelain

Porcelain 0.9.0

Choose a tag to compare

@github-actions github-actions released this 03 Sep 06:18
0d772d3

Added

  • Search modes on the log filter — the commit search gains IntelliJ-style Match Case (Cc) and Regex (.*) toggles. Search is now literal and case-insensitive by default; it used to be handed to git log --grep raw, which silently treated every query as a case-sensitive regex — searching f.x matched fax
  • Custom date range — the Date filter's dropdown adds an After/Before date pair alongside the presets, sent to git as inclusive day bounds
  • Whole-history author filter — the User dropdown now lists every author in the repository (via git shortlog), most-commits first, with the configured user.name pinned to the top as "(me)". It used to offer only authors present in the loaded page
  • Collapse / Expand Linear Branches — the log's View Options menu can now collapse every collapsible linear run in one action, and expand them all back, matching the per-fragment click collapse
  • "In N branches" — the details pane for a single selected commit shows which local and remote branches contain it, loaded lazily with Show all / Hide
  • Paths filter — a Paths toolbar filter narrows the log to commits touching the given files or folders (one pathspec per line), alongside the file-history chip
  • Go to hash / branch / tag — a toolbar action (and ⌘G/Ctrl+G) opens a popup with branch/tag completion; free text resolves as a full or abbreviated commit hash and the log navigates to it, clearing any filters that would hide it
  • Graph modes — View Options gains Sort Topologically, First Parent Only, and No Merge Commits, mapped to git's --topo-order, --first-parent, and --no-merges
  • Long-edge stubs — edges spanning more than 30 rows collapse into a pair of arrow stubs, IntelliJ style; clicking a stub jumps to the edge's other end. "Show Long Edges" restores full drawing
  • Highlighters — My Commits (emphasizes commits by the configured user.name), Dim Merge Commits, and Fade Other Branches (the existing reachability dimming, now toggleable), all persisted
  • Presentation toggles — Compact References (first label + "+N"), Tag Names on/off, and Commit Timestamp (committer date instead of author date, now carried by the log format)
  • Multi-commit cherry-pick — selecting several commits offers "Cherry-Pick N Commits", applied oldest-first in one git cherry-pick invocation so the existing conflict banner covers a mid-sequence stop
  • Worktrees — a Worktrees command lists linked working trees with their branch and state (main, locked, prunable), opens one in a new window, creates one on a new branch, removes one (offering force when git refuses), and prunes records whose directories are gone
  • Git Operations popup — ⌘⌥G / Ctrl+Alt+G opens a quick list of the verbs reached for most: commit, push, update, search commits, blame, resolve conflicts, and worktrees. IntelliJ puts this on Alt+`
  • Search Commits — find a commit by message or by hash from the palette, then copy its revision
  • Diff ignore policies — the whitespace menu grows from two options to IntelliJ's four: do not ignore, ignore leading and trailing, ignore whitespaces, and ignore whitespaces and empty lines. The last two compare normalized copies of both sides, so re-indenting and re-wrapping stop reading as changes while the chunks still address the real lines
  • Apply non-conflicting changes and Resolve automatically — two merge-toolbar actions. The first takes every region only one side actually changed, which loses nothing by definition. The second combines both sides wherever their edits touch different base lines, and deliberately leaves anything overlapping for you: a region where both sides rewrote the same line is never auto-merged
  • Blame — "Annotate with Git Blame" in the editor context menu draws an author-and-date column beside every line, with a hover carrying the commit's subject, author, date, and short hash. Blame Options chooses how lines are coloured (by age, by author, or not at all), how names are written (initials, full name, or email), whether whitespace-only changes are ignored, and whether moved lines are followed within a file or across files. Uncommitted lines are marked as such rather than attributed to anyone
  • Protected branchesporcelain.push.protectedBranches (regular expressions, defaulting to main and master) refuses a force push outright instead of confirming it. Force push already used --force-with-lease, which declines when the remote moved in a way porcelain has not seen; the protected list is the guard in front of that
  • Update Project — one action that fetches and then brings the current branch up to date by merge or rebase, per porcelain.update.method, carrying uncommitted work across with an autostash and reporting the commits that arrived. porcelain.fetch.tags chooses whether tags come along
  • Push options and sync counts — set upstream while pushing a new branch, push tags, and skip pre-push hooks; incoming and outgoing counts per branch are read from already-fetched refs, so they cost no network round-trip
  • Per-hunk staging — individual hunks can be staged and unstaged: porcelain parses the file's diff, rebuilds a patch from just the chosen hunks (renumbering the ones that follow a skipped hunk), and lets git apply it with context still verified, so a file that changed underneath refuses rather than applying in the wrong place. A change can also be addressed by its line range rather than by hunk, which is how the diff surface reaches exactly the block pointed at: git merges changes closer together than its context width into one hunk, so addressing by hunk would take neighbouring blocks with it
  • Commit options — Sign-off beside Amend, plus a commit-options panel with Skip commit hooks and an Author override (rejected before reaching git if it looks like an option). An empty commit message is seeded from commit.template, or from git's own MERGE_MSG while a merge is in progress
  • Stash options and .gitignore — stash with keep-index, include-untracked, and a message; turn a stash into a branch; and add a path to .gitignore without duplicating an entry that is already there
  • Interactive rebase editor — "Interactively Rebase from Here..." on a commit opens a Rebasing Commits table: pick / reword / stop-to-edit / squash / fixup / drop per commit, inline message editing for reword and squash, move up/down to reorder, Reset to restore the loaded plan, and View Git Commands to read the exact git-rebase-todo before starting. Porcelain drives real git rebase -i through GIT_SEQUENCE_EDITOR, so hooks, rerere, and the merge machinery behave exactly as git intends; a conflict stops in the existing continue/abort/skip banner
  • Reword, Squash, Fixup, Undo Commit — edit any commit's message (an amend at HEAD, a reword rebase below it), fold a multi-selection into one commit under a combined message, commit the working tree as a fixup! of a chosen commit, and undo the tip commit while keeping its changes staged. All are disabled while another Git operation is in progress, with the reason shown
  • Branch and tag verbs — smart checkout (stash → switch → restore) when local changes block a swap, force-delete that first names the commits it would discard, reset-to-upstream on the checked-out branch, and a Recent section in the branch tree read from the reflog. Tags gain Checkout, Push Tag, Delete Tag, and Delete Tag on Remote, with the remote-bound pair disabled when the repository has no remote
  • Manage Remotes — a Name/URL table for adding, renaming, re-pointing, and removing remotes, reachable from the branch pane's settings menu. Remote names and URLs that look like git options are rejected before they reach the command line
  • Clean Up Branches — a table of local branches with last-commit date, tracked branch, and merge status, filtered by a directory-style prefix; merged branches are pre-selected and unmerged ones are only ever deleted with an explicit, counted force
  • Multi-branch filter — the Branch filter is now multi-select: the dropdown stays open while combining branches with checkboxes, and the log shows the union of everything reachable from the chosen refs, IntelliJ style. A plain click in the branch tree still replaces the filter with that one ref
  • Porcelain diff viewer — an optional JetBrains-style diff surface rendered in a webview, behind porcelain.diff.viewer. Paired centre gutter with each side's own line numbers, curved Bézier connectors between changed regions, per-side revision headers, a live difference count, a change stripe with click-to-jump, and a settings menu whose options apply to that window only and are forgotten when it closes
  • Per-window diff options — ignore whitespace, highlight granularity (line / word / character / off), collapse unchanged fragments and synchronised scrolling. VS Code's diffEditor.* equivalents are global settings, so these have no native counterpart
  • Unified view — the settings menu can switch the diff from side-by-side to a single-column unified layout: old lines then new lines for each change, folds and find included. Modified lines keep their modified colouring on both halves rather than posing as removed/added — an edited line is not an addition. Sync-scroll controls hide in unified mode (one column has nothing to synchronise), and single-file layouts for added or deleted files ignore the toggle

Changed

  • 3-way merge editor rebuilt on the diff stack — the merge editor is now three Porcelain diff panes on one shared scroll axis, in the IDEA order: yours on the left, the editable result in the middle, theirs on the right. node-diff3 runs once to seed the result buffer and the conflict regions; every accept, revert or keystroke after that is a splice into the result followed by a re-derive of the two live pair diffs. The verbs ride the gutter connectors — accept (/), ignore, revert to ba...
Read more

Porcelain 0.8.0

Choose a tag to compare

@sultanofcardio sultanofcardio released this 27 Aug 04:30
07748ba

First release under the Porcelain name, and the first release of this fork at
all. Nothing was ever published under the old name, so this carries everything:
the JetBrains-style workflow inherited from upstream plus the work done since.

Install

Download porcelain-0.8.0.vsix below, then either:

code --install-extension porcelain-0.8.0.vsix

or run Extensions: Install from VSIX… from the Command Palette.

Works in VS Code and Cursor alike. Needs VS Code 1.86 or later, for the
detached windows the diff surfaces use.

What is new in this fork

Compare Versions. Select two commits in the Git Log, right-click, and see
everything that differs between them. It is the net difference between the two
snapshots, always read oldest to newest whichever order you selected them in,
so work added and later reverted between them correctly shows as no change.

Floating diff windows. Diffs open in their own compact window instead of
competing with your code for editor space. A Changes window lists the files; a
single diff window is reused for every file you open, so diff tabs never pile
up. Pin one to keep it. The conflicts view and the three-way merge editor open
the same way. Set porcelain.diff.openIn to editorTab to keep everything in
the main window instead.

A Commit panel without staging. The checkboxes are the commit, so the
separate Staged group is gone and a file no longer appears twice. Merge
conflicts nest inside Changes the way IntelliJ shows them.

A log that reads like IntelliJ's. Columns are author, graph, summary,
relative date, hash. Commits outside the current branch are dimmed rather than
the rest being washed in blue.

Its own identity. New icon, and THIRD-PARTY-NOTICES.md ships in the
package carrying the Apache 2.0 notice for the bundled JetBrains icons, the
CC BY 4.0 attribution for Codicons, and the licence text of all 59 bundled npm
packages.

Coming from BranchShift

The extension ID is now sultanofcardio.porcelain and commands are
porcelain.*. This is a clean break with no aliases, so any keybindings bound
to branchshift.* need repointing.

Full detail in CHANGELOG.md.