github jj-vcs/jj v0.41.0

6 hours ago

About

jj is a Git-compatible version control system that is both simple and powerful. See
the installation instructions to get started.

Release highlights

  • jj fix now supports formatting specific line ranges (allowing you to format
    only modified lines); see the configuration manual and notes below for more.

  • The new global flag --no-integrate-operation will let you run a command without
    impacting the repo state or the working copy, which is useful when automated tools
    may create snapshots in the background.

Breaking changes

  • The --pattern flag for file search now defaults to regex: instead of glob:.

  • jj git push --all/--tracked/-r REVSETS no longer fails when revisions to
    push are private or have conflicts. Bookmarks which aren't eligible to push
    will be skipped.

  • Branch/bookmark patterns passed to jj git clone are now saved to jj's repo
    settings file instead of .git/config. Git fetch refspecs are set to the
    default value.

Deprecations

  • In the templating language, the Operation type's .tags() function has been
    deprecated in favor of .attributes().

New features

  • The --pattern flag for file search now accepts various pattern kinds through
    kind:pattern syntax.

  • A new global flag --no-integrate-operation lets you run a command without
    impacting the repo state or the working copy.

  • A new config option diff.git.show-path-prefix can be used to suppress the
    a/ and b/ path prefixes in the diff --git output.

  • jj fix now supports line range-limited formatting via the fix.tools.<name>.line-range-arg
    and run-tool-if-zero-line-ranges configs. This allows running tools only on modified
    lines and fine-grained control over when the tool is run. If you have set the line-range-arg
    config, use --all-lines to match the previous behavior of formatting the entire file.

  • A new replace(pattern, content, replacement) template function is added
    which supports replacement of content in templates, using a lambda to format
    replacement text. It supports all string patterns, including regexes with
    capture groups (e.g. replace(regex:'(\w+) (\w+)', "hello world", |c| c.get(1) ++ " " ++ c.get(2))).

  • New ByteString template type for things like file content.

  • jj gerrit upload now supports the new options --message (-m), --edit
    and --merged. You can now also pass multiple hashtags by repeating the
    --hashtag option.

  • New remotes.<name>.fetch-bookmarks/fetch-tags options to configure
    default fetch targets.

  • JJ_PAGER can now override the ui.pager config, matching JJ_EDITOR for
    callers that need a jj-specific environment override.

Fixed bugs

  • Improving consistency with git handling of .gitignore, including /
    after entries and \r\r\n for MacOS files.

  • jj status filters untracked paths by fileset
    #9287

  • Improved performance for snapshotting, visibly improving jj status
    speed for large repositories.

  • Pre-existing Git submodule directories are no longer considered conflicts in
    checkouts. #8065.

  • Fixed a panic in jj gerrit upload when run without -r and the
    inferred revision was immutable. #9398

  • jj status respects path filters in working copy summaries.

  • jj git remote rename/remove now updates the trunk() alias.

  • Commands would sometimes incorrectly diagnose a stale working copy and suggest
    running jj op integrate when it would have no effect. This should now be
    much less likely to happen in practice.
    #9314

Contributors

Thanks to the people who made this release happen!

Don't miss a new jj release

NewReleases is sending notifications on new releases.