v0.7.0
jj-vcs/jjv0.7.0Feb 16, 2023by martinvonz
AI Summary
This update raises the Rust MSRV to 1.61.0, renames the `jj touchup` command to `jj diffedit`, changes the default log format to use the committer timestamp, and introduces template aliases and colored output support.
Key Highlights
- The minimum supported Rust version (MSRV) is now 1.61.0.
- The `jj touchup` command was renamed to `jj diffedit`.
- The default log format now uses the committer timestamp instead of the author timestamp.
- Template aliases can now be configured by `template-aliases.<name> = <expression>`.
- Background colors, bold text, and underlining are now supported.
Breaking Changes
- The minimum supported Rust version (MSRV) is now 1.61.0.
- The `jj touchup` command was renamed to `jj diffedit`.
- The `-i` option to `jj restore` was removed in favor of new `--from`/`--to` options to `jj diffedit`.
- The `description` template keyword is now empty if no description set.
- `template.log.graph` and `template.commit_summary` config keys were renamed.
- If a custom `templates.log` template is set, working-copy commit will no longer be highlighted automatically.
- `ui.relative-timestamps` option has been removed.
- The global `--no-commit-working-copy` is now called `--ignore-working-copy`.
- The builtin `jj update` and `jj up` aliases for `jj checkout` have been deleted.
- Change IDs are now rendered using letters from the end of the alphabet ('z' through 'k').
New Features
- `jj log --summary --patch` now shows both summary and diff outputs.
- `jj git push` now accepts multiple `--branch`/`--change` arguments.
- `jj config list` command prints values from config and `config edit` opens the config in an editor.
- `jj resolve --list` can now describe the complexity of conflicts.
- `jj duplicate` can now duplicate multiple changes in one go.
- `jj print` was renamed to `jj cat`.
- `jj workspace root` prints the root path of the current workspace.
- `[alias]` config section was renamed to `[aliases]`.
- `jj split` accepts creating empty commits when given a path.
- `jj rebase` and `jj new` now accept a `--allow-large-revsets` argument.
- `jj new` supports `--insert-before` and `--insert-after` arguments.
- `author`/`committer` templates now support `.username()`.
Full Release Notes
### Breaking changes
* The minimum supported Rust version (MSRV) is now 1.61.0.
* The `jj touchup` command was renamed to `jj diffedit`.
* The `-i` option to `jj restore` was removed in favor of new `--from`/`--to`
options to `jj diffedit`.
* To report the situation when a change id corresponds to multiple visible
commits, `jj log` now prints the change id in red and puts `??` after it.
Previously, it printed the word "divergent".
* `jj log` prefixes commit descriptions with "(empty)" when they contain no
change compared to their parents.
* The `author`/`committer` templates now display both name and email. Use
`author.name()`/`committer.name()` to extract the name.
* Storage of the "HEAD@git" reference changed and can now have conflicts.
Operations written by a new `jj` binary will have a "HEAD@git" reference that
is not visible to older binaries.
* The `description` template keyword is now empty if no description set.
Use `if(description, description, "(no description set)\n")` to get back
the previous behavior.
* The `template.log.graph` and `template.commit_summary` config keys were
renamed to `templates.log` and `templates.commit_summary` respectively.
* If a custom `templates.log` template is set, working-copy commit will
no longer be highlighted automatically. Wrap your template with
`label(if(current_working_copy, "working_copy"), ...)` to label the
working-copy entry.
* The `ui.relative-timestamps` option has been removed. Use the
`format_timestamp()` template alias instead. For details on showing relative
timestamps in `jj log` and `jj show`, see [the documentation](docs/config.md).
* `jj op log` now shows relative timestamps by default. To disable, set
`ui.oplog-relative-timestamps` to `false`.
* The global `--no-commit-working-copy` is now called `--ignore-working-copy`.
* The `diff.format` config option is now called `ui.diff.format`. The old name
is still supported for now.
* `merge-tools.<name>.edit-args` now requires `$left`/`$right` parameters.
The default is `edit-args = ["$left", "$right"]`.
* The builtin `jj update` and `jj up` aliases for `jj checkout` have been
deleted.
* Change IDs are now rendered using letters from the end of the alphabet (from
'z' through 'k') instead of the usual hex digits ('0' through '9' and 'a'
through 'f'). This is to clarify the distinction between change IDs and commit
IDs, and to allow more efficient lookup of unique prefixes. This change
doesn't affect the storage format; existing repositories will remain usable.
### New features
* The default log format now uses the committer timestamp instead of the author
timestamp.
* `jj log --summary --patch` now shows both summary and diff outputs.
* `jj git push` now accepts multiple `--branch`/`--change` arguments
* `jj config list` command prints values from config and `config edit` opens
the config in an editor.
* `jj debug config-schema` command prints out JSON schema for the jj TOML config
file format.
* `jj resolve --list` can now describe the complexity of conflicts.
* `jj resolve` now notifies the user of remaining conflicts, if any, on success.
This can be prevented by the new `--quiet` option.
* Per-repository configuration is now read from `.jj/repo/config.toml`.
* Background colors, bold text, and underlining are now supported. You can set
e.g. `color.error = { bg = "red", bold = true, underline = true }` in your
`~/.jjconfig.toml`.
* The `empty` condition in templates is true when the commit makes no change to
the three compared to its parents.
* `branches([needle])` revset function now takes `needle` as an optional
argument and matches just the branches whose name contains `needle`.
* `remote_branches([branch_needle[, remote_needle]])` now takes `branch_needle`
and `remote_needle` as optional arguments and matches just the branches whose
name contains `branch_needle` and remote contains `remote_needle`.
* `jj git fetch` accepts repeated `--remote` arguments.
* Default remotes can be configured for the `jj git fetch` and `jj git push`
operations ("origin" by default) using the `git.fetch` and `git.push`
configuration entries. `git.fetch` can be a list if multiple remotes must
be fetched from.
* `jj duplicate` can now duplicate multiple changes in one go. This preserves
any parent-child relationships between them. For example, the entire tree of
descendants of `abc` can be duplicated with `jj duplicate abc:`.
* `jj log` now highlights the shortest unique prefix of every commit and change
id and shows the rest in gray. To customize the length and style, use the
`format_short_id()` template alias. For details, see
[the documentation](docs/config.md).
* `jj print` was renamed to `jj cat`. `jj print` remains as an alias.
* In content that goes to the terminal, the ANSI escape byte (0x1b) is replaced
by a "␛" character. That prevents them from interfering with the ANSI escapes
jj itself writes.
* `jj workspace root` prints the root path of the current workspace.
* The `[alias]` config section was renamed to `[aliases]`. The old name is
still accepted for backwards compatibility for some time.
* Commands that draw an ASCII graph (`jj log`, `jj op log`, `jj obslog`) now
have different styles available by setting e.g. `ui.graph.style = "curved"`.
* `jj split` accepts creating empty commits when given a path. `jj split .`
inserts an empty commit between the target commit and its children if any,
and `jj split any-non-existent-path` inserts an empty commit between the
target commit and its parents.
* Command arguments to `ui.diff-editor`/`ui.merge-editor` can now be specified
inline without referring to `[merge-tools]` table.
* `jj rebase` now accepts a new `--allow-large-revsets` argument that allows the
revset in the `-d` argument to expand to several revisions. For example,
`jj rebase -s B -d B- -d C` now works even if `B` is a merge commit.
* `jj new` now also accepts a `--allow-large-revsets` argument that behaves
similarly to `jj rebase --allow-large-revsets`.
* `jj new --insert-before` inserts the new commit between the target commit and
its parents.
* `jj new --insert-after` inserts the new commit between the target commit and
its children.
* `author`/`committer` templates now support `.username()`, which leaves out the
domain information of `.email()`.
* It is now possible to change the author format of `jj log` with the
`format_short_signature()` template alias. For details, see
[the documentation](docs/config.md).
* Added support for template aliases. New symbols and functions can be
configured by `template-aliases.<name> = <expression>`. Be aware that
the template syntax isn't documented yet and is likely to change.
### Fixed bugs
* When sharing the working copy with a Git repo, we used to forget to export
branches to Git when only the working copy had changed. That's now fixed.
* Commit description set by `-m`/`--message` is now terminated with a newline
character, just like descriptions set by editor are.
* The `-R`/`--repository` path must be a valid workspace directory. Its
ancestor directories are no longer searched.
* Fixed a crash when trying to access a commit that's never been imported into
the jj repo from a Git repo. They will now be considered as non-existent if
referenced explicitly instead of crashing.
* Fixed handling of escaped characters in .gitignore (only keep trailing spaces
if escaped properly).
* `jj undo` now works after `jj duplicate`.
* `jj duplicate` followed by `jj rebase` of a tree containing both the original
and duplicate commit no longer crashes. The fix should also resolve any remaining
instances of https://github.com/martinvonz/jj/issues/27.
* Fix the output of `jj debug completion --help` by reversing fish and zsh text.
* Fixed edge case in `jj git fetch` when a pruned branch is a prefix of another
branch.
### Contributors
Thanks to the people who made this release happen!
* Aleksandr Mikhailov (@AM5800)
* Augie Fackler (@durin42)
* Benjamin Saunders (@Ralith)
* Daniel Ploch (@torquestomp)
* Danny Hooper (@hooper)
* David Barnett (@dbarnett)
* Glen Choo (@chooglen)
* Herby Gillot (@herbygillot)
* Ilya Grigoriev (@ilyagr)
* Luke Granger-Brown (@lukegb)
* Martin von Zweigbergk (@martinvonz)
* Michael Forster (@MForster)
* Philip Metzger (@PhilipMetzger)
* Ruben Slabbert (@rslabbert)
* Samuel Tardieu (@samueltardieu)
* Tal Pressman (@talpr)
* Vamsi Avula (@avamsi)
* Waleed Khan (@arxanas)
* Yuya Nishihara (@yuja)