Skip to content

Releases: martinvonz/jj

v0.22.0

02 Oct 17:27
Compare
Choose a tag to compare

Breaking changes

  • Fixing #4239 means the
    ordering of some messages have changed.

  • Invalid ui.graph.style configuration is now an error.

  • The builtin template branch_list has been renamed to bookmark_list as part
    of the jj branch deprecation.

Deprecations

  • jj branch has been deprecated in favor of jj bookmark.

    Rationale: Jujutsu's branches don't behave like Git branches, which a
    confused many newcomers, as they expected a similar behavior given the name.
    We've renamed them to "bookmarks" to match the actual behavior, as we think
    that describes them better, and they also behave similar to Mercurial's
    bookmarks.

  • jj obslog is now called jj evolution-log/jj evolog. jj obslog remains
    as an alias.

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

    Rationale: jj squash can be used in interactive mode to pull
    changes from one commit to another, including from a parent commit
    to a child commit. For fine-grained dependent diffs, such as when
    the parent and the child commits must successively modify the same
    location in a file, jj diffedit --restore-descendants can be used
    to set the parent commit to the desired content without altering the
    content of the child commit.

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

  • conflict() and file() revsets have been renamed to conflicts() and files()
    respectively. The old names are still around and will be removed in a future
    release.

New features

  • The new config option snapshot.auto-track lets you automatically track only
    the specified paths (all paths by default). Use the new jj file track
    command to manually tracks path that were not automatically tracked. There is
    no way to list untracked files yet. Use git status in a colocated workspace
    as a workaround.
    #323

  • jj fix now allows fixing unchanged files with the --include-unchanged-files flag. This
    can be used to more easily introduce automatic formatting changes in a new
    commit separate from other changes.

  • jj workspace add now accepts a --sparse-patterns=<MODE> option, which
    allows control of the sparse patterns for a newly created workspace: copy
    (inherit from parent; default), full (full working copy), or empty (the
    empty working copy).

  • New command jj workspace rename that can rename the current workspace.

  • jj op log gained an option to include operation diffs.

  • jj git clone now accepts a --remote <REMOTE NAME> option, which
    allows to set a name for the remote instead of using the default
    origin.

  • jj op undo now reports information on the operation that has been undone.

  • jj squash: the -k flag can be used as a shorthand for --keep-emptied.

  • CommitId / ChangeId template types now support .normal_hex().

  • jj commit and jj describe now accept --author option allowing to quickly change
    author of given commit.

  • jj diffedit, jj abandon, and jj restore now accept a --restore-descendants
    flag. When used, descendants of the edited or deleted commits will keep their original
    content.

  • jj git fetch -b <remote-git-branch-name> will now warn if the branch(es)
    can not be found in any of the specified/configured remotes.

  • jj split now lets the user select all changes in interactive mode. This may be used
    to keeping all changes into the first commit while keeping the current commit
    description for the second commit (the newly created empty one).

  • Author and committer names are now yellow by default.

Fixed bugs

  • Update working copy before reporting changes. This prevents errors during reporting
    from leaving the working copy in a stale state.

  • Fixed panic when parsing invalid conflict markers of a particular form.
    (#2611)

  • Editing a hidden commit now makes it visible.

  • The present() revset now suppresses missing working copy error. For example,
    present(@) evaluates to none() if the current workspace has no
    working-copy commit.

Contributors

Thanks to the people who made this release happen!

v0.21.0

04 Sep 17:15
Compare
Choose a tag to compare

Breaking changes

  • next/prev will no longer infer when to go into edit mode when moving from
    commit to commit. It now either follows the flags --edit|--no-edit or it
    gets the mode from ui.movement.edit.

Deprecations

  • jj untrack has been renamed to jj file untrack.

New features

  • Add new boolean config knob, ui.movement.edit for controlling the behaviour
    of prev/next. The flag turns edit mode on and off permanently when set
    respectively to true or false.

  • All diff formats except --name-only now include information about copies and
    moves. So do external diff tools in file-by-file mode. jj status also
    includes information about copies and moves.

  • Color-words diff has gained an option to display complex changes as separate
    lines
    . It's enabled by default. To
    restore the old behavior, set diff.color-words.max-inline-alternation = -1.

  • A tilde (~) at the start of the path will now be expanded to the user's home
    directory when configuring a signing.key for SSH commit signing.

  • When reconfiguring the author, warn that the working copy won't be updated

Fixed bugs

  • Release binaries for Intel Macs have been restored. They were previously
    broken due to using a sunset version of GitHub's macOS runners (but nobody had
    previously complained.)

Contributors

Thanks to the people who made this release happen!

v0.20.0

07 Aug 17:21
Compare
Choose a tag to compare

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)

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

v0.19.0

05 Jul 02:59
Compare
Choose a tag to compare

Breaking changes

  • In revset aliases, top-level kind:pattern expression is now parsed as
    modifier. Surround with parentheses if it should be parsed as string/file
    pattern.

  • Dropped support for automatic upgrade of repo formats used by versions before
    0.12.0.

  • jj fix now defaults to the broader revset -s reachable(@, mutable())
    instead of -s @.

  • Dropped support for deprecated jj branch delete/forget --glob option.

  • jj branch set now creates new branch if it doesn't exist. Use jj branch move to ensure that the target branch already exists.
    #3584

Deprecations

  • Replacing -l shorthand for --limit with -n in jj log, jj op log
    and jj obslog.

  • jj split --siblings is deprecated in favor of jj split --parallel (to
    match jj parallelize).

  • A new jj file subcommand now replaces several existing uncategorized
    commands, which are deprecated.

    • jj file show replaces jj cat.
    • jj file chmod replaces jj chmod.
    • jj file list replaces jj files.

New features

  • Support background filesystem monitoring via watchman triggers enabled with
    the core.watchman.register_snapshot_trigger = true config.

  • Show paths to config files when configuration errors occur.

  • jj fix now supports configuring the default revset for -s using the
    revsets.fix config.

  • The descendants() revset function now accepts an optional depth argument;
    like the ancestors() depth argument, it limits the depth of the set.

  • Revset/template aliases now support function overloading.
    #2966

  • Conflicted files are individually simplified before being materialized.

  • The jj file subcommand now contains several existing file utilities.

    • jj file show, replacing jj cat.
    • jj file chmod replacing jj chmod.
    • jj file list replacing jj files.
  • New command jj branch move let you update branches by name pattern or source
    revision.

  • New diff option jj diff --name-only allows for easier shell scripting.

  • In color-words diffs, hunks are now highlighted with underline. See diff
    colors and styles
    for customization.

  • jj git push -c <arg> can now accept revsets that resolve to multiple
    revisions. This means that jj git push -c xyz -c abc is now equivalent to
    jj git push -c 'all:(xyz | abc)'.

  • jj prev and jj next have gained a --conflict flag which moves you
    to the next conflict in a child commit.

  • New command jj git remote set-url that sets the url of a git remote.

  • Author timestamp is now reset when rewriting discardable commits (empty
    commits with no description) if authored by the current user.
    #2000

  • jj commit now accepts --reset-author option to match jj describe.

  • jj squash now accepts a --keep-emptied option to keep the source commit.

Fixed bugs

  • jj git push now ignores immutable commits when checking whether a
    to-be-pushed commit has conflicts, or has no description / committer / author
    set. #3029

  • jj will look for divergent changes outside the short prefix set even if it
    finds the change id inside the short prefix set.
    #2476

Contributors

Thanks to the people who made this release happen!

v0.18.0

06 Jun 10:52
Compare
Choose a tag to compare

Breaking changes

  • Dropped support for ui.default-revset config (replaced by revsets.log in
    0.8.0).

  • The commit_summary_no_branches template is superseded by
    templates.branch_list.

  • jj split will now refuse to split an empty commit.

  • jj config list now uses multi-line strings and single-quoted strings in the
    output when appropriate.

  • jj config get/list/set now parse name argument as TOML
    key
    . Quote meta characters as needed.
    Example: jj config get "revset-aliases.'trunk()'"

  • When updating the working copy away from an empty and undescribed commit, it
    is now abandoned even if it is a merge commit.

  • If a new working-copy commit is created because the old one was abandoned, and
    the old commit was merge, then the new commit will now also be.
    #2859

  • jj new's --insert-before/--insert-after options must now be set for each
    commit the new commit will be inserted before/after. Previously, those options
    were global flags and specifying them once would insert the new commit before/
    after all the specified commits.

Deprecations

  • Attempting to alias a built-in command now gives a warning, rather than being
    silently ignored.

New features

  • jj branch list/tag list now accept -T/--template option. The tag list
    prints commit summary along with the tag name by default.

  • Conflict markers now include an explanation of what each part of the conflict
    represents.

  • ui.color = "debug" prints active labels alongside the regular colored output.

  • jj branch track now show conflicts if there are some.

  • A new revset reachable(srcs, domain) will return all commits that are
    reachable from srcs within domain.

  • There are now prebuilt binaries for aarch64-linux-unknown-musl.
    Note, these are cross compiled and currently untested.
    We plan on providing fully tested builds later once our CI system allows it.

  • Added new revsets mutable() and immutable().

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

  • New command jj fix that can be configured to update commits by running code
    formatters (or similar tools) on changed files. The configuration schema and
    flags are minimal for now, with a number of improvements planned (for example,
    #3800 and
    #3801).

  • jj new's --insert-before and --insert-after options can now be used
    simultaneously.

  • jj git push now can push commits with empty descriptions with the
    --allow-empty-description flag

Fixed bugs

  • Previously, jj git push only made sure that the branch is in the expected
    location on the remote server when pushing a branch forward (as opposed to
    sideways or backwards). Now, jj git push makes a safety check in all cases
    and fails whenever jj git fetch would have introduced a conflict.

    In other words, previously branches that moved sideways or backward were
    pushed similarly to Git's git push --force; now they have protections
    similar to git push --force-with-lease (though not identical to it, to match
    the behavior of jj git fetch). Note also that because of the way jj git fetch works, jj does not suffer from the same problems as Git's git push --force-with-lease in situations when git fetch is run in the background.

  • When the working copy commit becomes immutable, a new one is automatically created
    on top of it to avoid letting the user edit the immutable one.

  • jj config list now properly escapes TOML keys (#1322).

  • Files with conflicts are now checked out as executable if all sides of the
    conflict are executable.

  • The progress bar (visible when using e.g. jj git clone) clears the
    remainder of the cursor row after drawing rather than clearing the entire row
    before drawing, eliminating the "flicker" effect seen on some terminals.

Contributors

Thanks to the people who made this release happen!

v0.17.1

07 May 15:41
Compare
Choose a tag to compare

Fixed bugs

  • jj status no longer scans through the entire history to look for ancestors with conflicts.

v0.17.0

01 May 17:11
Compare
Choose a tag to compare

Breaking changes

  • The default template aliases were replaced as follows:

    • builtin_op_log_root(op_id: OperationId) ->
      format_root_operation(root: Operation)
    • builtin_log_root(change_id: ChangeId, commit_id: CommitId) ->
      format_root_commit(root: Commit)
    • builtin_change_id_with_hidden_and_divergent_info ->
      format_short_change_id_with_hidden_and_divergent_info(commit: Commit)
  • The --revision option of jj rebase is renamed to --revisions. The short
    alias -r is still supported.

New features

  • The list of conflicted paths is printed whenever the working copy changes.
    This can be disabled with the --quiet option.

  • Commit objects in templates now have a mine() -> Boolean method analog to
    the same function in revsets. It evaluates to true if the email of the commit
    author matches the current user.email.

  • Commit objects in templates now have a contained_in(revset: String) -> Boolean method.

  • Operation objects in templates now have a snapshot() -> Boolean method that
    evaluates to true if the operation was a snapshot created by a non-mutating
    command (e.g. jj log).

  • Revsets and templates now support single-quoted raw string literals.

  • A new config option ui.always-allow-large-revsets has been added to
    allow large revsets expressions in some commands, without the all: prefix.

  • A new config option ui.allow-filesets has been added to enable "fileset"
    expressions
    . Note that filesets are currently experimental,
    but will be enabled by default in a future release.

  • A new global flag --ignore-immutable lets you rewrite immutable commits.

  • New command jj parallelize that rebases a set of revisions into siblings.

  • jj status now supports filtering by paths. For example, jj status . will
    only list changed files that are descendants of the current directory.

  • jj prev and jj next now work when the working copy revision is a merge.

  • jj squash now accepts a --use-destination-message/-u option that uses the
    description of the destination for the new squashed revision and discards the
    descriptions of the source revisions.

  • You can check whether Watchman fsmonitor is enabled or installed with the new
    jj debug watchman status command.

  • jj rebase now accepts revsets resolving to multiple revisions with the
    --revisions/-r option.

  • jj rebase -r now accepts --insert-after and --insert-before options to
    customize the location of the rebased revisions.

Fixed bugs

  • Revsets now support \-escapes in string literal.

  • The builtin diff editor now allows empty files to be selected during
    jj split.

  • Fixed a bug with jj split introduced in 0.16.0 that caused it to incorrectly
    rebase the children of the revision being split if they had other parents
    (i.e. if the child was a merge).

  • The snapshot.max-new-file-size option can now handle raw integer literals,
    interpreted as a number of bytes, where previously it could only handle string
    literals. This means that snapshot.max-new-file-size="1" and
    snapshot.max-new-file-size=1 are now equivalent.

  • jj squash <path> is now a no-op if the path argument didn't match any paths
    (it used to create new commits with bumped timestamp).
    #3334

Contributors

Thanks to the people who made this release happen!

v0.16.0

03 Apr 19:48
Compare
Choose a tag to compare

Deprecations

  • jj move was deprecated in favor of jj squash.

Breaking changes

  • The git_head template keyword now returns an optional value instead of a
    list of 0 or 1 element.

  • The jj sparse set --edit/--reset flags were split up into jj sparse edit/reset subcommands respectively.

  • The jj sparse subcommands now parse and print patterns as workspace-relative
    paths.

  • The jj log command no longer uses the default revset when a path is specified.

New features

  • Config now supports rgb hex colors (in the form #rrggbb) wherever existing color names are supported.

  • ui.default-command now accepts multiple string arguments, for more complex
    default jj commands.

  • Graph node symbols are now configurable via templates

    • templates.log_node
    • templates.op_log_node
  • jj log now includes synthetic nodes in the graph where some revisions were
    elided.

  • jj squash now accepts --from and --into (also aliased as --to) if -r
    is not specified. It can now be used for all use cases where jj move could
    previously be used. The --from argument accepts a revset that resolves to
    more than one revision.

  • Commit templates now support immutable keyword.

  • New template function coalesce(content, ..) is added.

  • Timestamps are now shown in local timezone and without milliseconds and
    timezone offset by default.

  • jj git push now prints messages from the remote.

  • jj branch list now supports a --conflicted/-c option to show only conflicted branches.

  • jj duplicate and jj abandon can now take more than a single -r argument,
    for consistency with other commands.

  • jj branch list now allows combining -r REVISIONS/NAMES and -a options.

  • --all is now named --all-remotes for jj branch list

  • There is a new global --quiet flag to silence commands' non-primary output.

  • jj split now supports a --siblings/-s option that splits the target
    revision into siblings with the same parents and children.

  • new function working_copies() for revsets to show the working copy commits of all workspaces.

Fixed bugs

None.

Contributors

Thanks to the people who made this release happen!

v0.15.1

07 Mar 05:22
Compare
Choose a tag to compare

No code changes (fixing Rust Cargo.toml stuff).

v0.15.0

06 Mar 22:12
Compare
Choose a tag to compare

Breaking changes

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

  • The on-disk index format changed. New index files will be created
    automatically, but it can fail if the repository is co-located and predates
    Git GC issues #815. If
    reindexing failed, you'll need to clean up corrupted operation history by
    jj op abandon ..<bad operation ID>.

  • Dropped support for the "legacy" graph-drawing style. Use "ascii" for a very
    similar result.

  • The default log output no longer lists all tagged heads. Set revsets.log = "@ | ancestors(immutable_heads().., 2) | heads(immutable_heads())" to restore
    the old behavior.

  • Dropped support for the deprecated : revset operator. Use :: instead.

  • jj rebase --skip-empty no longer abandons commits that were already empty
    before the rebase.

New features

  • Partial support for commit signing. Currently you can configure jj to "keep"
    commit signatures by making new ones for rewritten commits, and to sign new
    commits when they are created.

    This comes with out-of-the-box support for the following backends:

    • GnuPG
    • SSH

    Signature verification and an explicit sign command will hopefully come soon.

  • Templates now support logical operators: ||, &&, !

  • Templates now support the self keyword, which is the current commit in jj log/obslog templates.

  • jj show now accepts -T/--template option to render its output using
    template

  • jj config list now accepts -T/--template option.

  • jj git fetch now accepts -b as a shorthand for --branch, making it more
    consistent with other commands that accept a branch

  • In the templating language, Timestamps now have a .local() method for
    converting to the local timezone.

  • jj next/prev now infer --edit when you're already editing a non-head
    commit (a commit with children).

  • A new built-in pager named :builtin is available on all platforms,
    implemented with minus

  • Set config ui.log-synthetic-elided-nodes = true to make jj log include
    synthetic nodes in the graph where some revisions were elided
    (#1252,
    #2971). This may become the
    default depending on feedback.

  • When creating a new workspace, the sparse patterns are now copied over from
    the current workspace.

  • jj git init --colocate can now import an existing Git repository. This is
    equivalent to jj git init --git-repo=..

  • jj git fetch now automatically prints new remote branches and tags by default.

  • --verbose/-v is now --debug (no short option since it's not intended to be used often)

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

  • jj commit/diffedit/move/resolve/split/squash/unsquash now accept
    --tool=<NAME> option to override the default.
    #2575

  • Added completions for Nushell to jj util completion

  • jj branch list now supports a --tracked/-t option which can be used to
    show tracked branches only. Omits local Git-tracking branches by default.

  • Commands producing diffs now accept a --context flag for the number of
    lines of context to show.

  • jj commands with the -T/--template option now provide a hint containing
    defined template names when no argument is given, assisting the user in making
    a selection.

Fixed bugs

  • On Windows, symlinks in the repo are now supported when Developer Mode is enabled.
    When symlink support is unavailable, they will be materialized as regular files in the
    working copy (instead of resulting in a crash).
    #2

  • On Windows, the :builtin pager is now used by default, rather than being
    disabled entirely.

  • Auto-rebase now preserves the shape of history even for merge commits where
    one parent is an ancestor of another.
    #2600

Contributors

Thanks to the people who made this release happen!