Jujutsu v0.39.0

v0.39.0
Added 14
  • Add `jj arrange` command to reorder and abandon revisions in a TUI
  • Add `jj bookmark advance` command to automatically move bookmarks forward to a target revision
  • Add support for push options in `jj git push` with the `--option` flag and `-o` short alias
  • Add `new_description` template evaluation in `jj new` to populate initial commit description
  • Add `first()`, `last()`, `get(index)`, `reverse()`, `skip(count)`, and `take(count)` methods on list types in templates
  • Add `builtin_draft_commit_description_with_diff` template that includes diff in commit description editor
Changed 7
  • Relative paths now used by `jj workspace add` to enable workspaces in containers or when moved together
  • `jj undo` now outputs what operation was undone in addition to the operation restored to
  • Bookmarks with two or more consecutive `-` characters no longer require quoting in revsets
  • `jj rebase --branch` and `jj rebase --source` now print a message instead of returning an error for empty revision sets
  • Changed Git representation of conflicted commits to include files from first side of conflict
  • Background snapshotting now suppresses stdout and stderr to avoid long hangs
  • `jj gerrit upload` no longer requires the `-r` flag and defaults to uploading current work
Fixed 3
  • Windows: use native file locks (LockFileEx) instead of polling with file creation
  • `jj` now safely detaches HEAD of alternate Git worktrees if their checked-out branch is moved or deleted
  • `jj file track --include-ignored` now works when fsmonitor.backend is set to watchman
Removed 3
  • Drop support for legacy index files written by jj < 0.33
  • Remove deprecated config options `core.fsmonitor` and `core.watchman.register-snapshot-trigger`
  • Remove deprecated command `jj op undo`
Deprecated 1
  • `jj debug snapshot` is deprecated in favor of `jj util snapshot` and will be removed in v0.45.0
About

jj is a Git-compatible version control system that is both simple and powerful. See the installation instructions to get started.

Release highlights
  • jj arrange command brings up a TUI where you can reorder and abandon revisions. #1531

  • jj bookmark advance automatically moves bookmarks forward to a target revision (defaults to @) using customization points revsets.bookmark-advance-from and revsets.bookmark-advance-to. It is heavily inspired by the longstanding community alias jj tug.

Breaking changes
  • Dropped support for legacy index files written by jj < 0.33. New index files will be created as needed.

  • The following deprecated config options have been removed:

    • core.fsmonitor
    • core.watchman.register-snapshot-trigger
  • The deprecated command jj op undo has been removed. Use jj op revert or jj undo/redo instead.

Deprecations
  • jj debug snapshot is deprecated in favor of jj util snapshot. Although this was an undocumented command in the first place, it will be removed after 6 months (v0.45.0) to give people time to migrate away.
New features
  • Add support for push options in jj git push with the --option flag. This allows users to pass options to the remote server when pushing commits. The short alias -o is also supported.

  • jj new now evaluates the new_description template to populate the initial commit description when no -m message is provided.

  • Templates now support first(), last(), get(index), reverse(), skip(count), and take(count) methods on list types for more flexible list manipulation.

  • New builtin_draft_commit_description_with_diff template that includes the diff in the commit description editor, making it easier to review changes while writing commit messages.

  • Revsets and templates now support name:x pattern aliases such as 'grep:x' = 'description(regex:x)'.

  • Filesets now support user aliases.

  • jj workspace add now links with relative paths. This enables workspaces to work inside containers or when moved together. Existing workspaces with absolute paths will continue to work as before.

  • jj undo now also outputs what operation was undone, in addition to the operation restored to.

  • Bookmarks with two or more consecutive - characters no longer need to be quoted in revsets. For example, jj diff -r '"foo--bar"' can now be written as jj diff -r foo--bar.

  • New flag --simplify-parents on jj rebase to apply the same transformation as jj simplify-parents on the rebased commits. #7711

  • jj rebase --branch and jj rebase --source will no longer return an error if the given argument resolves to an empty revision set (jj rebase --revisions already behaved this way). Instead, a message will be printed to inform the user why nothing has changed.

  • Changed Git representation of conflicted commits to include files from the first side of the conflict. This should prevent unchanged files from being highlighted as "added" in editors when checking out a conflicted commit in a colocated workspace.

  • New template function Timestamp::since(ts) that returns the TimestampRange between two timestamps. It can be used in conjunction with .duration() in order to obtain a human-friendly duration between two Timestamps.

  • Added new jj util snapshot command to manually or programmatically trigger a snapshot. This introduces an official alternative to the previously-undocumented jj debug snapshot command. The Watchman integration has also been updated to use this command instead.

  • Changed background snapshotting to suppress stdout and stderr to avoid long hangs.

  • jj gerrit upload now supports a variety of new flags documented in gerrit's documentation. This includes, for example, --reviewer=foo@example.com and --label=Auto-Submit.

  • jj gerrit upload now recognizes Change-Id explicitly set via the alternative trailer Link, and will generate a Link: <review-url>/id/<change-id> trailer if gerrit.review-url option is set.

  • jj gerrit upload no longer requires the -r flag, and will default to uploading what you're currently working on.

  • Templates now support Serialize operations on the result of map() and if(), when supported by the underlying type.

  • jj bookmark rename now supports --overwrite-existing to allow renaming a bookmark even if the new name already exists, effectively replacing the existing bookmark.

  • Conditional configuration based on environment variables with --when.environments. #8779

Fixed bugs
  • Windows: use native file locks (LockFileEx) instead of polling with file creation, fixing issues with "pending delete" semantics leaving lock files stuck.

  • jj now safely detaches the HEAD of alternate Git worktrees if their checked-out branch is moved or deleted during Git export.

  • jj file track --include-ignored now works when fsmonitor.backend="watchman". #8427

Contributors

Thanks to the people who made this release happen!

  • Aaron Christiansen (@AaronC81)
  • Andy Brenneke (@abrenneke)
  • Anton Älgmyr (@algmyr)
  • Austin Seipp (@thoughtpolice)
  • Benjamin Tan (@bnjmnt4n)
  • Bram Geron (@bgeron)
  • Bryce Berger (@bryceberger)
  • Caleb White (@calebdw)
  • countskm (@countdigi)
  • David Higgs (@higgsd)
  • Evan Simmons (@estk)
  • Fedor Sheremetyev (@sheremetyev)
  • Gaëtan Lehmann (@glehmann)
  • George Christou (@gechr)
  • Hubert Lefevre (@Paluche)
  • Ian (@chronologos)
  • Ilya Grigoriev (@ilyagr)
  • Jaen (@jaens)
  • Joseph Lou (@josephlou5)
  • Josh Steadmon (@steadmon)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Kulukundis (@fowles)
  • Matt Stark (@matts1)
  • max (@pr2502)
  • Nika Layzell (@mystor)
  • Philip Metzger (@PhilipMetzger)
  • Richard Smith (@zygoloid)
  • Scott Taylor (@scott2000)
  • Steve Klabnik (@steveklabnik)
  • Theodore Dubois (@tbodt)
  • William Phetsinorath (@shikanime)
  • xtqqczze (@xtqqczze)
  • Yuya Nishihara (@yuja)
View original

Upgraded? How did it go?

Discussion