3172 lines · 116.5 KB · Markdown
RawDownload

Changelog

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.

[Unreleased]

Release highlights

Breaking changes

  • The minimum supported Rust version (MSRV) is now 1.84.0.

  • The git.push-branch-prefix config has been removed in favor of git.push-bookmark-prefix.

  • jj abandon no longer supports --summary to suppress the list of abandoned commits. The list won't show more than 10 commits to not clutter the console.

  • jj unsquash has been removed in favor of jj squash and jj diffedit --restore-descendants.

  • The jj untrack subcommand has been removed in favor of jj file untrack.

  • The following deprecated revset functions have been removed:

    • branches(), remote_branches(), tracked_remote_branches(), and untracked_remote_branches(), which were renamed to "bookmarks".
    • file() and conflict(), which were renamed to plural forms.
    • files(x, y, ..) with multiple patterns. Use files(x|y|..) instead.
  • The following deprecated template functions have been removed:

    • branches(), local_branches(), and remote_branches(), which were renamed to "bookmarks".
  • The flags --all and --tracked on jj git push by themself do not cause deleted bookmarks to be pushed anymore, as an additional safety measure. They can now be combined with --deleted instead.

Deprecations

  • core.watchman.register_snapshot_trigger has been renamed to core.watchman.register-snapshot-trigger for consistency with other configuration options.

  • jj backout is deprecated in favor of jj revert.

New features

  • jj sign can now sign with PKCS#12 certificates through the gpgsm backend.

  • jj sign will automatically use the gpg key associated with the author's email in the absence of a signing.key configuration.

  • Multiple user configs are now supported and are loaded in the following precedence order:

    • $HOME/.jjconfig.toml
    • $XDG_CONFIG_HOME/jj/config.toml
    • $XDG_CONFIG_HOME/jj/conf.d/*.toml
  • The JJ_CONFIG environment variable can now contain multiple paths separated by a colon (or semicolon on Windows).

  • The command jj config list now supports showing the origin of each variable via the builtin_config_list_detailed template.

  • jj config {edit,set,unset} now prompt when multiple config files are found.

  • jj diff -r now allows multiple revisions (as long as there are no gaps in the revset), such as jj diff -r 'mutable()'.

  • jj git push now accepts a --named NAME=REVISION argument to create a named bookmark and immediately push it.

  • The 'how to resolve conflicts' hint that is shown when conflicts appear can be hidden by setting hints.resolving-conflicts = false.

  • jj op diff and jj op log --op-diff now show changes to which commits correspond to working copies.

  • jj op log -d is now an alias for jj op log --op-diff.

  • jj bookmark move --to/--from can now be abbreviated to jj bookmark move -t/-f

  • A new command jj revert is added, which is similar to jj backout but adds the --destination, --insert-after, and --insert-before options to customize the location of reverted commits.

  • A new command jj git root is added, which prints the location of the Git directory of a repository using the Git backend.

  • In colocated repos, any files that jj considers added in the working copy will now show up in git diff (as if you had run git add --intent-to-add on them).

  • Reversing colors is now supported. For example, to highlight words by reversing colors rather than underlining, you can set colors."diff token"={ underline = false, reverse = true } in your config.

  • Added revsets.log-graph-prioritize, which can be used to configure which branch in the jj log graph is displayed on the left instead of @ (e.g. coalesce(description("megamerge\n"), trunk()))

Fixed bugs

  • jj log -p --stat now shows diff stats as well as the default color-words/git diff output. #5986

  • The built-in diff editor now correctly handles deleted files. #3702

  • The built-in diff editor now correctly retains the executable bit on newly added files when splitting. #3846

  • jj config set/--config value parsing rule is relaxed in a way that unquoted apostrophes are allowed. #5748

[0.27.0] - 2025-03-05

Release highlights

  • git.subprocess is now enabled by default, improving compatibility with Git fetches and pushes by spawning an external git process. Users can opt out of this by setting git.subprocess = false, but this will likely be removed in a future release. Please report any issues you run into.

Breaking changes

  • Bookmark name to be created/updated is now parsed as a revset symbol. Quotation may be needed in addition to shell quotes. Example: jj bookmark create -r@- "'name with space'"

  • jj bookmark create, jj bookmark set and jj bookmark move onto a hidden commit make it visible.

  • jj bookmark forget now untracks any corresponding remote bookmarks instead of forgetting them, since forgetting a remote bookmark can be unintuitive. The old behavior is still available with the new --include-remotes flag.

  • jj fix now always sets the working directory of invoked tools to be the workspace root, instead of the working directory of the jj fix.

  • The ui.allow-filesets configuration option has been removed. The "fileset" language has been enabled by default since v0.20.

  • templates.annotate_commit_summary is renamed to templates.file_annotate, and now has an implicit self parameter of type AnnotationLine, instead of Commit. All methods on Commit can be accessed with commit.method(), or self.commit().method().

Deprecations

  • This release takes the first steps to make target revision required in bookmark create, bookmark move and bookmark set. Those commands will display a warning if the user does not specify target revision explicitly. In the near future those commands will fail if target revision is not specified.

  • The signing.sign-all config option has been deprecated in favor of signing.behavior. The new option accepts drop (never sign), keep (preserve existing signatures), own (sign own commits), or force (sign all commits). Existing signing.sign-all = true translates to signing.behavior = "own", and false translates to "keep". Invalid configuration is now an error.

New features

  • The new jj sign and jj unsign commands allow for signing/unsigning commits. jj sign supports configuring the default revset through revsets.sign when no --revisions arguments are provided.

  • jj git fetch now supports string pattern syntax on --remote option and git.fetch configuration.

  • Template functions truncate_start() and truncate_end() gained an optional ellipsis parameter; passing this prepends or appends the ellipsis to the content if it is truncated to fit the maximum width.

  • Templates now support stringify(x) function and string method .escape_json(). The latter serializes the string in JSON format. It is useful for making machine-readable templates by escaping problematic characters like \n.

  • Templates now support trim(), trim_start() and trim_end() methods which remove whitespace from the start and end of a String type.

  • The description of commits backed out by jj backout can now be configured using templates.backout_description.

  • New AnnotationLine templater type. Used in templates.file_annotate. Provides self.commit(), .content(), .line_number(), and .first_line_in_hunk().

  • Templates now have format_short_operation_id(id) function for users to customize the default operation id representation.

  • The jj init/jj revert stubs that print errors can now be overridden with aliases. All of jj clone/init/revert add a hint to a generic error.

  • Help text is now colored (when stdout is a terminal).

  • Commands that used to suggest --ignore-immutable now print the number of immutable commits that would be rewritten if used and a link to the docs.

  • jj undo now shows a hint when undoing an undo operation that the user may be looking for jj op restore instead.

Fixed bugs

  • jj status now shows untracked files under untracked directories. #5389

  • Added workaround for the bug that untracked files are ignored when watchman is enabled. #5728

  • The signing.backends.ssh.allowed-signers configuration option will now expand ~/ to $HOME/. #5626

  • config-schema.json now allows arrays of strings for the settings ui.editor and ui.diff.tool.

  • config-schema.json now allows an array of strings or nested table for the ui.pager setting.

Contributors

Thanks to the people who made this release happen!

  • Alain Leufroy (@aleufroy)
  • Aleksey Kuznetsov (@zummenix)
  • Alexander Mikhailov (@AM5800)
  • Andrew Gilbert (@andyg0808)
  • Antoine Martin (@alarsyo)
  • Anton Bulakh (@necauqua)
  • Austin Seipp (@thoughtpolice)
  • Baltasar Dinis (@bsdinis)
  • Benjamin Tan (@bnjmnt4n)
  • Bryce Berger (@bryceberger)
  • Burak Varlı (@unexge)
  • David Rieber (@drieber)
  • Emily (@emilazy)
  • Evan Mesterhazy (@emesterhazy)
  • George Christou (@gechr)
  • HKalbasi (@HKalbasi)
  • Ilya Grigoriev (@ilyagr)
  • Jacob Hayes (@JacobHayes)
  • Jonathan Frere (@MrJohz)
  • Jonathan Tan (@jonathantanmy)
  • Josh Steadmon (@steadmon)
  • maan2003 (@maan2003)
  • Martin von Zweigbergk (@martinvonz)
  • Matthew Davidson (@KingMob)
  • Philip Metzger (@PhilipMetzger)
  • Philipp Albrecht (@pylbrecht)
  • Roman Timushev (@rtimush)
  • Samuel Tardieu (@samueltardieu)
  • Scott Taylor (@scott2000)
  • Stephan Hügel (@urschrei)
  • Vincent Ging Ho Yim (@cenviity)
  • Yuya Nishihara (@yuja)

[0.26.0] - 2025-02-05

Release highlights

  • Improved Git push/fetch compatibility by spawning an external git process. This can be enabled by the git.subprocess=true config knob, and will be the default in a future release.

  • jj log can now show cryptographic commit signatures. The output can be controlled by the ui.show-cryptographic-signatures=true config knob.

Breaking changes

  • jj abandon now deletes bookmarks pointing to the revisions to be abandoned. Use --retain-bookmarks to move bookmarks backwards. If deleted bookmarks were tracking remote bookmarks, the associated bookmarks (or branches) will be deleted from the remote on jj git push --all. #3505

  • jj init --git and jj init --git-repo have been removed. They were deprecated in early 2024. Use jj git init instead.

  • The following deprecated commands have been removed:

    • jj cat is replaced by jj file show.
    • jj chmod is replaced by jj file chmod.
    • jj files is replaced by jj file list.
  • The deprecated -l short alias for --limit in jj log, jj op log and jj obslog has been removed. The -n short alias can be used instead.

  • The deprecated --siblings options for jj split has been removed. jj split --parallel can be used instead.

  • The deprecated fix.tool-command config option has been removed.

  • In colocated repos, the Git index now contains the changes from all parents of the working copy instead of just the first parent (HEAD). 2-sided conflicts from the merged parents are now added to the Git index as conflicts as well.

  • The following change introduced in 0.25.0 is reverted:

    • jj config list now prints inline tables { key = value, .. } literally. Inner items of inline tables are no longer merged across configuration files.
  • jj resolve will now attempt to resolve all conflicted files instead of resolving the first conflicted file. To resolve a single file, pass a file path to jj resolve.

  • jj util mangen is replaced with jj util install-man-pages, which can install man pages for all jj subcommands to a given path.

  • In jj config list template, value is now typed as ConfigValue, not as String serialized in TOML syntax.

  • jj git remote add/set-url now converts relative Git remote path to absolute path.

  • jj log/op log now applies -n/--limit before the items are reversed. Rationale: It's more useful to see the N most recent commits/operations, and is more performant. The old behavior can be achieved by jj log .. | head. #5403

  • Upgraded scm-record from v0.4.0 to v0.5.0. See release notes at https://github.com/arxanas/scm-record/releases/tag/v0.5.0.

  • The builtin pager is switched to streampager. It can handle large inputs better and can be configured.

  • Conflicts materialized in the working copy before jj 0.19.0 may no longer be parsed correctly. If you are using version 0.18.0 or earlier, check out a non-conflicted commit before upgrading to prevent issues.

Deprecations

New features

  • jj git {push,clone,fetch} can now spawn an external git subprocess, via the git.subprocess = true config knob. This provides an alternative that, when turned on, fixes SSH bugs when interacting with Git remotes due to libgit2s limitations #4979.

  • jj describe now accepts --edit.

  • jj evolog and jj op log now accept --reversed.

  • jj restore now supports -i/--interactive selection.

  • jj file list now supports templating.

  • There is a new builtin_op_log_oneline template alias you can pass to jj op log -T for a more compact output. You can use format_operation_oneline and format_snapshot_operation_oneline to customize parts of it.

  • New template function config(name) to access to configuration variable from template.

  • New template function pad_centered() to center content within a minimum width.

  • Templater now supports list.filter(|x| ..) method.

  • The diff commit template keyword now supports custom formatting via diff.files(). For example, diff.files().map(|e| e.path().display()) prints changed file paths.

  • The diff.stat() template method now provides methods to get summary values.

  • jj log can now show cryptographic commit signatures. The output can be controlled by the ui.show-cryptographic-signatures=true config knob. The signature template can be customized using format_detailed_cryptographic_signature(signature) and format_short_cryptographic_signature(signature).

  • New git.sign-on-push config option to automatically sign commits which are being pushed to a Git remote.

  • New git.push-new-bookmarks config option to push new bookmarks without --allow-new.

  • jj status now shows untracked files when they reside directly under a tracked directory. There's still an issue that files under untracked directories aren't listed. #5389

  • New merge-tools.<TOOL>.diff-expected-exit-codes config option to suppress warnings from tools exiting with non-zero exit codes.

  • New fix.tools.TOOL.enabled config option to enable/disable tools. This is useful for defining disabled tools in user configuration that can be enabled in individual repositories with one config setting.

  • Added --into flag to jj restore, similarly to jj squash and jj absorb. It is equivalent to --to, but --into is the recommended name.

  • Italic text is now supported. You can set e.g. color.error = { fg = "red", italic = true } in your config.

  • New author_name/author_email/committer_name/committer_email(pattern) revset functions to match either name or email field explicitly.

  • New subject(pattern) revset function that matches first line of commit descriptions.

  • Conditional configuration now supports --when.commands to change configuration based on subcommand.

  • The Jujutsu documentation site now publishes a schema for the official configuration file, which can be integrated into your editor for autocomplete, inline errors, and more. Please see the documentation for more on this.

Fixed bugs

  • jj git fetch with multiple remotes will now fetch from all remotes before importing refs into the jj repo. This fixes a race condition where the treatment of a commit that is found in multiple fetch remotes depended on the order the remotes were specified.

  • Fixed diff selection by external tools with jj split/commit -i FILESETS. #5252

  • Conditional configuration now applies when initializing new repository. #5144

  • [diff.<format>] configuration now applies to .diff().<format>() commit template methods.

  • Conflicts at the end of files which don't end with a newline character are now materialized in a way that can be parsed correctly. #3968

  • Bookmark and remote names written by jj git clone to revset-aliases.'trunk()' are now escaped if necessary. #5359

Contributors

Thanks to the people who made this release happen!

  • Angel Ezquerra (@AngelEzquerra)
  • Antoine Martin (@alarsyo)
  • Anton Bulakh (@necauqua)
  • Austin Seipp (@thoughtpolice)
  • Baltasar Dinis (@bsdinis)
  • Benjamin Tan (@bnjmnt4n)
  • blinry (@blinry)
  • Bryce Berger (@bryceberger)
  • Charlie-83 (@Charlie-83)
  • Christian Stoitner (@cstoitner)
  • Evan Martin (@evmar)
  • George Christou (@gechr)
  • Ilya Grigoriev (@ilyagr)
  • Jakob Hellermann (@jakobhellermann)
  • JDSeiler (@JDSeiler)
  • Jonathan Frere (@MrJohz)
  • Jonathan Gilchrist (@jgilchrist)
  • Josh Steadmon (@steadmon)
  • Martin von Zweigbergk (@martinvonz)
  • Matt Kulukundis (@fowles)
  • Ollivier Robert (@keltia)
  • Philip Metzger (@PhilipMetzger)
  • Philipp Albrecht (@pylbrecht)
  • Robert Jackson (@rwjblue)
  • Samuel Tardieu (@samueltardieu)
  • Scott Taylor (@scott2000)
  • Stephen Jennings (@jennings)
  • Valentin Gatien-Baron (@v-gb)
  • Vincent Ging Ho Yim (@cenviity)
  • Waleed Khan (@arxanas)
  • Yuya Nishihara (@yuja)

[0.25.0] - 2025-01-01

Release highlights

It's the holidays, and this release was overall pretty quiet, without many major changes. Two select improvements:

  • Improvements to configuration management, including support for conditional variables in config files.

  • Large files in the working copy will no longer cause commands to fail; instead the large files will remain intact but untracked in the working copy.

Breaking changes

  • Configuration variables are no longer "stringly" typed. For example, true is not converted to a string "true", and vice versa.

  • The following configuration variables are now parsed strictly: colors.<labels>, git.abandon-unreachable-commits, git.auto-local-bookmark, git.push-bookmark-prefix, revsets.log, revsets.short-prefixes, signing.backend, operation.hostname, operation.username, ui.allow-init-native, ui.color, ui.default-description, ui.progress-indicator, ui.quiet, user.email, user.name

  • jj config list now prints inline tables { key = value, .. } literally.

Lines 1–500 of 3172.

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t