v0.18.0

jj-vcs/jjv0.18.0Jun 6, 2024by martinvonz

AI Summary

Introduces the `jj fix` command for code formatting, adds new revsets (`reachable`, `mutable`, `immutable`), and improves config parsing for TOML keys.

Key Highlights

  • New `jj fix` command for automatic code formatting.
  • Revsets `reachable(srcs, domain)`, `mutable()`, and `immutable()` added.
  • Config parsing improved for TOML keys.
  • `jj branch list`/`tag list` now support templates.

Breaking Changes

  • `ui.default-revset` config dropped.
  • Template `commit_summary_no_branches` superseded by `templates.branch_list`.
  • `jj split` refuses to split empty commits.
  • `jj config` parse name as TOML keys.
  • `jj new` options `--insert-before`/`--after` must be set per commit.

New Features

  • `jj branch track` shows conflicts.
  • `jj new` supports both insert options simultaneously.
  • `jj git push` supports `--allow-empty-description`.
  • Conflict markers include explanations.
  • Prebuilt binaries for `aarch64-linux-unknown-musl`.

Full Release Notes

### Breaking changes

* Dropped support for `ui.default-revset` config (replaced by `revsets.log` in
  0.8.0).

* The `commit_summary_no_branches` template is superseded by
  `templates.branch_list`.

* `jj split` will now refuse to split an empty commit.

* `jj config list` now uses multi-line strings and single-quoted strings in the
  output when appropriate.

* `jj config get`/`list`/`set` now parse `name` argument as [TOML
  key](https://toml.io/en/v1.0.0#keys). Quote meta characters as needed.
  Example: `jj config get "revset-aliases.'trunk()'"`

* When updating the working copy away from an empty and undescribed commit, it
  is now abandoned even if it is a merge commit.

* If a new working-copy commit is created because the old one was abandoned, and
  the old commit was merge, then the new commit will now also be.
  [#2859](https://github.com/martinvonz/jj/issues/2859)

* `jj new`'s `--insert-before`/`--insert-after` options must now be set for each
  commit the new commit will be inserted before/after. Previously, those options
  were global flags and specifying them once would insert the new commit before/
  after all the specified commits.

### Deprecations

* Attempting to alias a built-in command now gives a warning, rather than being
  silently ignored.

### New features

* `jj branch list`/`tag list` now accept `-T`/`--template` option. The tag list
  prints commit summary along with the tag name by default.

* Conflict markers now include an explanation of what each part of the conflict
  represents.

* `ui.color = "debug"` prints active labels alongside the regular colored output.

* `jj branch track` now show conflicts if there are some.

* A new revset `reachable(srcs, domain)` will return all commits that are
  reachable from `srcs` within `domain`.

* There are now prebuilt binaries for `aarch64-linux-unknown-musl`.
  Note, these are cross compiled and currently untested.
  We plan on providing fully tested builds later once our CI system allows it.

* Added new revsets `mutable()` and `immutable()`.

* Upgraded `scm-record` from v0.2.0 to v0.3.0. See release notes at
  <https://github.com/arxanas/scm-record/releases/tag/v0.3.0>

* New command `jj fix` that can be configured to update commits by running code
  formatters (or similar tools) on changed files. The configuration schema and
  flags are minimal for now, with a number of improvements planned (for example,
  [#3800](https://github.com/martinvonz/jj/issues/3800) and
  [#3801](https://github.com/martinvonz/jj/issues/3801)).

* `jj new`'s `--insert-before` and `--insert-after` options can now be used
  simultaneously.

* `jj git push` now can push commits with empty descriptions with the
  `--allow-empty-description` flag

### Fixed bugs

* Previously, `jj git push` only made sure that the branch is in the expected
  location on the remote server when pushing a branch forward (as opposed to
  sideways or backwards). Now, `jj git push` makes a safety check in all cases
  and fails whenever `jj git fetch` would have introduced a conflict.

  In other words, previously branches that moved sideways or backward were
  pushed similarly to Git's `git push --force`; now they have protections
  similar to `git push --force-with-lease` (though not identical to it, to match
  the behavior of `jj git fetch`). Note also that because of the way `jj git
  fetch` works, `jj` does not suffer from the same problems as Git's `git push
  --force-with-lease` in situations when `git fetch` is run in the background.

* When the working copy commit becomes immutable, a new one is automatically created
  on top of it to avoid letting the user edit the immutable one.

* `jj config list` now properly escapes TOML keys (#1322).

* Files with conflicts are now checked out as executable if all sides of the
  conflict are executable.

* The progress bar (visible when using e.g. `jj git clone`) clears the
  remainder of the cursor row after drawing rather than clearing the entire row
  before drawing, eliminating the "flicker" effect seen on some terminals.

### Contributors

Thanks to the people who made this release happen!

* Alexander Potashev (@aspotashev)
* Austin Seipp (@thoughtpolice)
* Benjamin Tan (@bnjmnt4n)
* Charles Crete (@Cretezy)
* Daniel Ploch (@torquestomp)
* Danny Hooper (@hooper)
* Eidolon (@HybridEidolon)
* Glen Choo (@chooglen)
* Gregory Anders (@gpanders)
* Ilya Grigoriev (@ilyagr)
* jyn (@jyn514)
* Martin von Zweigbergk (@martinvonz)
* Matt Stark (@matts1)
* Matthew Davidson (@KingMob)
* Michael Gattozzi (@mgattozzi)
* mlcui (@mlcui-corp)
* Philip Metzger (@PhilipMetzger)
* Remo Senekowitsch (@senekor)
* Thomas Castiglione (@gulbanana)
* Théo Daron (@tdaron)
* tinger (@tingerrr)
* Waleed Khan (@arxanas)
* Yuya Nishihara (@yuja)