Skip to content

v0.7.0

Compare
Choose a tag to compare
@martinvonz martinvonz released this 16 Feb 21:03
· 4689 commits to main since this release

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.

  • 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.

  • 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.

  • 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 #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!