v0.20.0
jj-vcs/jjv0.20.0Aug 7, 2024by martinvonz
AI Summary
Switches to static libgit2 linking by default and renames `--skip-empty` to `--skip-emptied`, adding new revset and operation commands.
Key Highlights
- `jj` now links `libgit2` statically by default.
- New `jj operation diff` and `jj operation show` commands.
- String patterns now support case-insensitive matching and regex.
- New `tracked_remote_branches()` and `untracked_remote_branches()` revsets.
Breaking Changes
- `jj rebase --skip-empty` has been renamed to `jj rebase --skip-emptied`.
- The `immutable_heads()` set now includes untracked remote branches.
- The 'fileset' language is now enabled by default.
- The `jj fix` original configuration syntax is deprecated.
New Features
- File-by-file diff invocation mode for external tools.
- Word-level hunks highlighted with underline.
- New `.diff().<format>()` commit template methods.
- New `jj operation diff` and `jj operation show` commands.
- New `diff_contains()` revset function.
- New `git.private-commits` config setting.
Full Release Notes
### Note to packagers * `jj` now links `libgit2` statically by default. To use dynamic linking, you need to set the environment variable `LIBGIT2_NO_VENDOR=1` while compiling. ([#4163](https://github.com/martinvonz/jj/pull/4163)) ### Breaking changes * `jj rebase --skip-empty` has been renamed to `jj rebase --skip-emptied` * `jj backout --revision` has been renamed to `jj backout --revisions`. The short alias `-r` is still supported. * [The default `immutable_heads()` set](docs/config.md#set-of-immutable-commits) now includes `untracked_remote_branches()` with the assumption that untracked branches aren't managed by you. Therefore, untracked branches are no longer displayed in `jj log` by default. * Updated defaults for graph node symbol templates `templates.log_node` and `templates.op_log_node`. * [The "fileset" language](docs/filesets.md) is now enabled by default. It can still be disable by setting `ui.allow-filesets=false`. * On `jj git fetch`/`import`, commits referred to by `HEAD@git` are no longer preserved. If a checked-out named branch gets deleted locally or remotely, the corresponding commits will be abandoned. * `jj --at-op=@` no longer merges concurrent operations if explicitly specified. * `jj obslog -p` no longer shows diffs at non-partial squash operations. Previously, it showed the same diffs as the second predecessor. ### Deprecations * The original configuration syntax for `jj fix` is now deprecated in favor of one that allows defining multiple tools that can affect different filesets. These can be used in combination for now. See `jj help fix` for details. ### New features * External diff tools can now be configured to invoke the tool on each file individually instead of being passed a directory by setting `merge-tools.$TOOL.diff-invocation-mode="file-by-file"` in config.toml. * In git diffs, word-level hunks are now highlighted with underline. See [diff colors and styles](docs/config.md#diff-colors-and-styles) for customization. * New `.diff().<format>()` commit template methods are added. They can be used in order to show diffs conditionally. For example, `if(current_working_copy, diff.summary())`. * `jj git clone` and `jj git init` with an existing git repository adds the default branch of the remote as repository settings for `revset-aliases."trunk()"`.` * `jj workspace forget` now abandons the workspace's working-copy commit if it was empty. * `jj backout` now includes the backed out commit's subject in the new commit message. * `jj backout` can now back out multiple commits at once. * `jj git clone some/nested/path` now creates the full directory tree for nested destination paths if they don't exist. * String patterns now support case‐insensitive matching by suffixing any pattern kind with `-i`. `mine()` uses case‐insensitive matching on your email address unconditionally. Only ASCII case folding is currently implemented, but this will likely change in the future. * String patterns now support `regex:"pattern"`. * New `tracked_remote_branches()` and `untracked_remote_branches()` revset functions can be used to select tracked/untracked remote branches. * The `file()` revset function now accepts fileset as argument. * New `diff_contains()` revset function can be used to search diffs. * New command `jj operation diff` that can compare changes made between two operations. * New command `jj operation show` that can show the changes made in a single operation. * New config setting `git.private-commits` to prevent commits from being pushed. * [The default commit description template](docs/config.md#default-description) can now be configured by `templates.draft_commit_description`. * `jj fix` can now be configured to run different tools on different filesets. This simplifies the use case of configuring code formatters for specific file types. See `jj help fix` for details. * Added revset functions `author_date` and `committer_date`. * `jj describe` can now update the description of multiple commits. ### Fixed bugs * `jj status` will show different messages in a conflicted tree, depending on the state of the working commit. In particular, if a child commit fixes a conflict in the parent, this will be reflected in the hint provided by `jj status` * `jj diff --git` no longer shows the contents of binary files. * Windows binaries no longer require `vcruntime140.dll` to be installed (normally through Visual Studio.) * On quit, the builtin pager no longer waits for all outputs to be discarded. * `jj branch rename` no longer shows a warning in colocated repos. ### Contributors Thanks to the people who made this release happen! * Anton Älgmyr (@algmyr) * Austin Seipp (@thoughtpolice) * Benjamin Tan (@bnjmnt4n) * Daniel Ploch (@torquestomp) * Danny Hooper (@hooper) * Emily (@emilazy) * Essien Ita Essien (@essiene) * Erich Gubler (@ErichDonGubler) * Fedor Sheremetyev (@sheremetyev) * Ilya Grigoriev (@ilyagr) * Jonathan Tan (@jonathantanmy) * Julien Vincent (@julienvincent) * Martin von Zweigbergk (@martinvonz) * Matt Kulukundis (@fowles) * Matt Stark (@matts1) * mlcui (@mlcui-corp) * Philip Metzger (@PhilipMetzger) * Scott Taylor (@scott2000) * Skyler Grey (@Minion3665) * Stephen Jennings (@jennings) * Tim Janik (@tim-janik) * Vincent Ging Ho Yim (@cenviity) * Vladimír Čunát (@vcunat) * Vladimir (@0xdeafbeef) * Yuya Nishihara (@yuja)