Skip to content

Releases: idursun/jjui

v0.9.3

30 Aug 19:03
089610e
Compare
Choose a tag to compare

What's Changed

Bug Fixes

  • ace_jump: Selection logic improved to fix navigation issues #285
  • megamerge: Changed revision removal order to ensure correct rebasing #291
  • megamerge: Descendant commits now preserved during merge operations #289
  • details: Escaped file names to prevent errors in the details view #290
  • revisions: Shortcuts disabled when no revisions are present to prevent crashes #286
  • inline_describe: Single row log graphs now display correctly #280

Full Changelog: v0.9.2...v0.9.3

v0.9.2

21 Aug 11:17
281b761
Compare
Choose a tag to compare

Mostly a maintenance release, but adds a new operation for supporting megamerge users.

Pressing M will start the mega merge operation, in which you can use space to add/remove parents.

image

Bug fixes

  • Make sure that the selected revision stays selected after refreshes
  • Fixed a bug in jj shell/exec so that commands always run inside the repository directory.

What's Changed

  • fix(fuzzy_file): Prevent crash if current revset is invalid. by @vic in #265
  • feat(fuzzy_input): More intuitive movement on history and different suggestions modes. by @vic in #254
  • fix(leader): Use tea.Sequence instead of our custom cmd sequencing. by @vic in #268
  • $checked_commit_ids expands to none() without checked commit by @glehmann in #271

Full Changelog: v0.9.1...v0.9.2

v0.9.1

04 Aug 19:34
19dbec6
Compare
Choose a tag to compare

This was supposed to be a maintenance release but it is packed with new features thanks to all the contributors!

Phew, another release which was supposed to be a minor maintenance release but to be honest, I didn't much other than implementing flash messages and lane tracing.

All the remaining features are implemented by contributors: @vic @zerowidth @penryu Thanks!

New Features

🎉 Flash messages

jjui now shows the output of the commands as flash messages. Success messages disappear after 4 seconds, and failure messages stay sticky and can be dismissed with esc.

image

🎉 Fuzzy file search

Pressing ctrl+t opens up the fuzzy file search. Choosing one file from the list will change the revset to show all changes made to that file. #203

Additionally, when the fuzzy file search is open, you can use ctrl+t again to turn on preview mode to see the contents of the file and the changes made to the file.

image

🎉 Ace jump

Similar to how vim's ace jump works, pressing f will highlight the first character of each change id (only non-hidden, non-conflicting, and non-root) or each commit id and typing the letters until an unambigous revision is found will jump the cursor to that revision.

image

🎉 (experimental) Lane tracing

This is an experimental feature and currently disabled by default, but you can enable it with the following configuration:

[ui.tracer]
enabled = true

When tracing is enabled, lanes that the currently selected revision in are highlighted and out of lane revisions are fainted.

image

🎉 Restore from evolog

While in the evolog view, you can now press r to restore the selected evolog into the target revision you select.

The operation will run equivalent of the following command:

jj restore --from <selected evolog commit id> --into <selected target revision change id> --restore-descendants

As a result of this new functionality, evolog key bindings turned into a table with the following defaults:

[keys.evolog]
  mode = ["v"]
  diff = ["d"]
  restore = ["r"]

🎉 Preview window at the bottom of the UI

Pressing shift+p will move the preview window to the bottom of the screen. This can be made the default position with the following configuration:

[ui.preview]
show_at_bottom = true
image

🎉 Force apply

Performing an operation on an immutable revision returned an error in jjui. Now you can use alt+enter to force the command to ignore immutable revisions. (i.e. add --ignore-immutable argument)

Default key binding configuration is like the following:

[keys]
force_apply = ["alt+enter"]

🎉 Log batching

Log batching will only load the first 50 revisions and load the next chunk if you scroll past the 50th revision. Previously, jjui loaded the whole logs before it displayed the revisions. This new method should reduce the start up times greatly if you are working with large repositories. It almost has no effect if you are working with small repositories.

This has been an experimental feature for a while, turned off by default, behind the experimental_log_batching_enabled configuration option.

In this release it is turned on by default, but the configuration location has been moved to the following and you can still turn it off if you like:

[revisions]
log_batching = false

Minor Changes

Light and Dark theme syntax

Theme configuration now allows choosing different themes for light and dark themes.

[ui.theme]
light = "my-light-theme"
dark = "my-dark-theme"

Previous syntax is still supported, which will set light and dark to be the same value.

[ui]
theme = "my-theme"

Conflict markers in details view

Details view now show conflict markers next to the conflicted files.

image

Make default log format and revset configurable

jjui reads and uses the default revset and the log format as they are configured in jj.

You can now override these values with the following configuration:

[revisions]
template = 'builtin_log_compact' # overrides jj's templates.log
revset = ""  # overrides jj's revsets.log

Confirmation dialogs show menu option shortcuts in the status bar

Previously, you needed to know pressing y for yes and n for no. These shortcuts now are displayed in the status bar.

New placeholders for commands

The following new place holders are added:

  • $commit_id
  • $checked_commit_ids
  • $checked_files

Stats

70 files changed with 4,120 additions and 841 deletions, in 90 commits by 4 contributors.

What's Changed

  • fix(details): Quote file paths when changing revset from details. by @vic in #204
  • feat: add command outputs as (auto-expiring) flash messages by @idursun in #206
  • feat(loader): Support JJUI_CONFIG_DIR environment var. by @vic in #207
  • feat(fuzzy_files): add ctrl+t fuzzy-file search. by @vic in #203
  • Dark and light theme support by @zerowidth in #201
  • feat(exec): add fuzzy search on command history by @vic in #210
  • Add github issue templates. by @vic in #213
  • feat(details): show conflicted files by @idursun in #215
  • feat(docs): Deploy to gh-pages. by @vic in #214
  • enhance fuzzy-file live preview. add contextual help and open file in editor by @vic in #220
  • fix(find_file): Make keys customizable on jjui config. by @vic in #224
  • fix(commands): don't create snapshots when only querying current state. by @vic in #225
  • feat(revisions): Ace jump to revision. f key on revisions view. by @vic in #226
  • fix(preview): Limit preview resize to range 5% up to 95%. by @vic in #234
  • feat(commands): Add $commit_id context placeholder. by @vic in #233
  • feat(revisions): Move to revision parent when toggle selection. by @vic in #232
  • fix(ace_jump): Correctly handle highligting for ambigous change_ids. by @vic in #231
  • fix(ace_jump): Allow jump only to revisions visible on screen by @vic in #230
  • feat(preview): Allow showing preview at bottom (config and toggle-key) by @vic in #238
  • fix(preview): Add P to help menu. by @vic in #239
  • chore(issue_template): Add implementation proposal template. by @vic in #242
  • fix(jj_exec): Tab key must only accept-suggestion if there are matches. by @vic in #245
  • feat(evolog): Restore descendants from selected evolog revision. by @vic in #236
  • feat(placeholders): Add $checked_files and $checked_commit_ids. by @vic in #246
  • feat(revert): Revert operation (R) with interactive target selection by @vic in #247
  • feat: make log format and revset configurable by @penryu in #252
  • feat(force_apply): keybinds for using --ignore-immutabe. by @vic in #255
  • feat(confirmation): Show key-bindings on confirmation dialog. by @vic in #256

New Contributors

Full Changelog: v0.9.0...v0.9.1

v0.9.0

21 Jul 22:24
139ffc6
Compare
Choose a tag to compare

Breaking changes

💥 preview.extra_args configuration option is removed in favour of preview commands (see below).

This change allows far more customisation opportunities than what extra_args offered.

💥 ui.highlight_dark and ui.highlight_light configuration options are removed

These have been replaced by the new theming system for more granular control over the UI's appearance.

Migration: You can now set "selected" = { bg = "your colour" } under [ui.colors] table in your config.toml or by creating a custom theme. See the new "Theme Support" feature below for details.

New Features

🎉 Theme support

You now have granular control over the application's appearance with a new theming system.

  • Load Custom Themes: Create your own .toml theme files and enable them with the ui.theme setting in your config.
  • Easy Overrides: Quickly tweak any colour from your loaded theme directly in your main config.toml under the [ui.colors] section.
  • Detailed Styling: Themes use selectors to target specific UI elements (like selected, border, or revisions title), allowing you to customise everything from text colours and styles to backgrounds.

Selected revision styled with italic and underline:

image

A complete theme example:

image

Read Themes page in the wiki for detailed information.

See discussion.

🎉 Leader key support

This release introduces a "Leader key" feature, inspired by Vim's <Leader> and Emacs' hydra. It acts as a prefix key (default: \) to navigate a tree of custom, mnemonic keymaps for your personal workflows.

  • Create Custom Shortcuts: Define key sequences in your config.toml under the [leader] table to execute any action possible in the UI.
  • Nested & Context-Aware: Keymaps can be nested (e.g., \na for "new after") and can be configured to appear only in specific contexts, such as when a revision is selected.
  • How it works: Press the leader key (\), then navigate the help menu with single-character key presses to trigger your custom command sequences.

This allows for powerful, user-defined workflows, such as editing a file from a specific revision or saving the current revset as an alias, directly from the UI.

Read Leader-Key page in the wiki for detailed information

🎉 Execute shell and jj commands directly from jjui

You can now execute jj and shell commands directly from the TUI.

  • : Run interactive jj commands. jjui will suspend, and the command will run directly in your terminal (e.g., : restore -i). You will return to jjui when the command finishes.
  • $ Run any shell command without leaving jjui. (e.g., $ man jj or $ htop)

Context-aware placeholders like $file and $change_id are supported in your commands.

🎉 Inline describe

You can now edit the description of a revision by pressing enter. This will load the description into an inline editor. You can accept the changes by pressing alt+enter or ctrl+S.

image

🎉 New shortcuts for menu items

You can now press the assigned shortcut to invoke an item in git, bookmarks and custom commands menus.

For example:

  • bmm: will choose and invoke bookmarks move 'main'
  • gpa: will choose git push --all
  • gpc: will choose git push --change
  • etc
image

🎉 Interactive jj duplicate

You can now duplicate one or more revisions directly from the UI.

  • Select the revision(s) you want to copy and press y (the default key) to enter "duplicate mode".
  • Choose a Destination: Navigate to the target revision where you want to place the copy.
  • Fine-tune Placement: The UI provides a live preview of the operation. Use sub-keys to control the exact placement:
    • a: Place the copy after the target revision.
    • b: Place the copy before the target revision.
    • d: Place the copy onto the target revision (i.e., --destination).
  • Confirm: Press Enter to execute the command.

Minor Changes

Introduced preview commands per item type

You can now define separate commands to show the contents of the selected item in the preview window.

The following are the default commands.

[preview]
revision_command = ["show", "--color", "always", "-r", "$change_id"]
oplog_command = ["op", "show", "$operation_id", "--color", "always"]
file_command = ["diff", "--color", "always", "-r", "$change_id", "$file"]

For example; I changed oplog_command to the following to see the tree at the selected op log entry.

[preview]
oplog_command = ["log", "--at-operation", "$operation_id", "--color", "always"]

Improvements to custom commands

  • Custom commands can now change the revset. For example, the following custom command will filter the view to only show descendants of the selected revision.
[custom_commands]
"show after revisions" = { key = ["M"], revset = "::$change_id" }
  • You can now use $revset place holder in your custom commands. Previously it was limited to $change_id, $operation_id and $file.

New CLI argument

  • Added support for --period or -p can be passed to override the auto_refresh_interval configuration. This can be handy when working with large repositories. (e.g. jjui --period 30) #148
  • Added support for --limit argument which is the equivalent of jj log --limit.

New items in the git menu

  • Added git push --change

Set bookmark

  • B will now auto complete the movable bookmarks when typing. This change makes it easy if you want to move a bookmark just by typing the name of it.

Details view

  • Details view stays open after restore or absorb command is applied.

K jumps to child revision

Similar to the J (jump to parent), now you can use K to move the child revision.

Fixes

  • Fixed: File names with spaces or back slashes caused errors on Windows. #164
  • Fixed: Diff view was not showing the output of files that had CRLF line endings.
  • Fixed: J movement was not working if the change id's were upper case.

What's Changed

  • go mod tidy & go fmt by @ilyagr in #161
  • ci: run go fmt and go mod tidy in CI by @ilyagr in #162
  • feat: add --period/-p CLI option by @ilyagr in #165
  • feat(git): add UI and test support for 'git push --change ' by @vic in #171
  • feat: Inline description editor by @idursun in #174
  • feat(leader): add Leader (vim/spacemacs) like commands. by @vic in #179
  • add predefined shortcuts to certain menu items in git, bookmarks and custom commands by @idursun in #180
  • feat: custom styling by @idursun in #183
  • feat(exec): Exec key : one-shot interactive jj commands. by @vic in #182
  • fix(exec_shell): Dont replace context values but set env. by @vic in #186
  • test: fix flaky test by @idursun in #185
  • Style revisions, evolog and oplog by @idursun in #189
  • feat(leader): Allow leader entries to specify context requirements. by @vic in #190
  • fix(revisions): Using J should work on uppercase templated change_id by @vic in #193
  • Use os.Getwd for getting the current dir by @ilyagr in #196
  • feat(status): Add editing history according to input mode. by @vic in #197
  • feat(revisions): K jumps to revision first child. by @vic in #199

Full Changelog: v0.8.12...v0.9.0

v0.8.12

04 Jul 11:05
dad9f6c
Compare
Choose a tag to compare

What's Changed

Improvements

Revset

  • Completions show on the second line as a list now. You can use tab/shift+tab to cycle forward/backward.
  • Loads and adds revset-aliases defined in your jj config to the list of completions.
  • Keeps the history. You can use up/down to cycle through revset history. History is only available during the session. (i.e. it's not persisted)

GIF

Squash

Got two new modifiers:

  • You can use e for keeping the source revision empty (--keep-emptied)
  • You can use i for running the squash operation in interactive mode (--interactive)
  • Squash key configuration has changed:
    [keys.squash]
      mode = ["S"]
      keep_emptied = ["e"]
      interactive = ["i"]

GIF

Rebase

Revisions to be moved are marked with move marker, and get updated according to the target. (i.e. branch/source will mark all revisions to be moved according to the target)

GIF

Minor

  • Details: Added absorb option to absorb changes in the selected files.
  • Help window is updated to have 3-columns now.
  • Changed auto refresh to proceed only when there's an actual change.
  • JJ's colour palette is loaded from jj config at start up and applied to change_id, rest, diff renamed, diff modified, diff removed. This is the first step towards implementing colour themes for jjui.

Fixes

  • Revisions view don't get stuck in loading state when the revset don't return any results.
  • Selections should be kept as is across auto refreshes.
  • Fixed various issues about bookmark management where delete bookmark menu items were not shown, and track/untrack items were shown incorrectly under certain circumstances #155 #156
  • Double width characters should not cause visual glitches #138
  • Fixed visual glitches when extending graph lines to accommodate graph overlays

Contributions

  • gitignore: add result for nix build . by @ilyagr in #133
  • CI and Nix: make nix flake check build the flake by @ilyagr in #132
  • build(nix): add git version to --version by @teto in #150
  • doc: Remove a duplicated maintainer mention by @Adda0 in #153
  • build(nix): allow building flake when self.dirtyRev is not defined by @ilyagr in #152
  • fixed display of empty revsets (#151) by @Gogopex in #154
  • fix: refresh SelectedFile on ToggleSelect by @IvanVergiliev in #158

New Contributors

Full Changelog: v0.8.11...v0.8.12

v0.8.11

17 Jun 12:30
80b87ce
Compare
Choose a tag to compare
  • 🎉 Added support for handling selected revisions (space) to rebase. For example, you can select one revision from each branch and get into rebase mode, set the source to be branch (b), and then move the cursor to main, hit enter. This will move all branches onto main.
  • 🎉 Added support for handling selected revisions to squash. Select multiple revisions and start squash (S) and move the cursor to the destination revisions and hit enter. This will squash all selected revisions into the destination revision.
  • Fixed visual glitch when the revision messages included CJK encoding. #130
  • Allow quit to be bound to the same key with cancel. #127 #116
  • Updated colours of git, bookmarks, custom commands windows to use Magenta. Previously these windows used bubbletea's default colour palette, which happened to use a shade of magenta as well. This is the first step for simplifying the colour palette of jjui.
  • Fixed a bug where jjui --config failed to start if the configuration file was missing.

What's Changed

Full Changelog: v0.8.10...v0.8.11

v0.8.10

11 Jun 20:36
e21b3ee
Compare
Choose a tag to compare

What's Changed

  • docs: add Homebrew as an installation method by @lvignoli in #84
  • Update instruction on installation for archlinux-based linux distros by @TeddyHuang-00 in #85
  • feat: support ~/.config and $XDG_CONFIG_HOME on macOS by @PrayagS in #86
  • Automatically add --allow-new argument to new local bookmarks by @idursun in #88
  • fix(revisions): set selected item on refresh by @idursun in #103
  • fix: snapshot working copy less often by @Jollywatt in #96
  • fix: highlight background colour seq calculation by @idursun in #106
  • fix: add --remote argument to bookmarks with multiple remotes by @idursun in #107
  • perf: make the preview pane more responsive when switching commit by @glehmann in #108
  • Add compilation instructions and add /jjui to .gitignore by @ilyagr in #112
  • Abandon command passes --retain-bookmarks by default
  • New key binding: @ jumps to working copy revision #111
  • New key binding: J jump to parent of the currently selected revision
  • New key binding: ctrl+z suspends jjui and returns to terminal. Typing fg should resume it.
  • jjui won't start and print an error message if the configuration file is malformed #114
  • When typing a bookmark name, spaces will be automatically replaced with - and the input box will expand if it exceeds the initial size.
  • Git: git push commands will be repeated per remote and --remote argument is always displayed.

New Contributors

Full Changelog: v0.8.8...v0.8.10

v0.8.9

11 Jun 20:28
3e68154
Compare
Choose a tag to compare
v0.8.9 Pre-release
Pre-release

What's Changed

  • docs: add Homebrew as an installation method by @lvignoli in #84
  • Update instruction on installation for archlinux-based linux distros by @TeddyHuang-00 in #85
  • feat: support ~/.config and $XDG_CONFIG_HOME on macOS by @PrayagS in #86
  • Automatically add --allow-new argument to new local bookmarks by @idursun in #88
  • fix(revisions): set selected item on refresh by @idursun in #103
  • fix: snapshot working copy less often by @Jollywatt in #96
  • fix: highlight background colour seq calculation by @idursun in #106
  • fix: add --remote argument to bookmarks with multiple remotes by @idursun in #107
  • perf: make the preview pane more responsive when switching commit by @glehmann in #108
  • Add compilation instructions and add /jjui to .gitignore by @ilyagr in #112
  • Abandon command passes --retain-bookmarks by default
  • New key binding: @ jumps to working copy revision #111
  • New key binding: J jump to parent of the currently selected revision
  • New key binding: ctrl+z suspends jjui and returns to terminal. Typing fg should resume it.
  • jjui won't start and print an error message if the configuration file is malformed #114
  • When typing a bookmark name, spaces will be automatically replaced with - and the input box will expand if it exceeds the initial size.
  • Git: git push commands will be repeated per remote and --remote argument is always displayed.

New Contributors

Full Changelog: v0.8.8...v0.8.9

v0.8.8

12 May 13:21
e9af1d7
Compare
Choose a tag to compare

Everything from 0.8.7

What's Changed

  • fix: allow build version to be set from ldflags by @lvignoli in #81

Experimental log batching

I've added an experimental feature that loads revisions in batches and request the next batch only if the cursor goes beyond the last loaded revision.

This should greatly improve the loading times, reduce the memory footprint and essentially make jjui usable with huge repositories.

I have done my best to hide this behind a configuration flag which can be enabled by adding the following to your configuration file:

experimental_log_batching_enabled = true

New Contributors

Full Changelog: v0.8.7...v0.8.8

v0.8.7

11 May 10:40
Compare
Choose a tag to compare

What's Changed

  • fix panic when trying to open details diff without a selected file by @sullyj3 in #71
  • feat: add an '(empty)' message to the diff view for empty diffs by @sullyj3 in #74
  • feat: show status bar when in diff view by @sullyj3 in #75
  • squash now auto selects the parent change rather than the one below #79
  • jjui shows repository location in the window title
  • fixes a bug where change ids were incorrectly identified for a specific template configuration #76

New Contributors

Full Changelog: v0.8.6...v0.8.7