Releases: martinvonz/jj
v0.19.0
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. Usejj branch move
to ensure that the target branch already exists.
#3584
Deprecations
-
Replacing
-l
shorthand for--limit
with-n
injj log
,jj op log
andjj obslog
. -
jj split --siblings
is deprecated in favor ofjj split --parallel
(to
matchjj parallelize
). -
A new
jj file
subcommand now replaces several existing uncategorized
commands, which are deprecated.jj file show
replacesjj cat
.jj file chmod
replacesjj chmod
.jj file list
replacesjj files
.
New features
-
Support background filesystem monitoring via watchman triggers enabled with
thecore.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 optionaldepth
argument;
like theancestors()
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
, replacingjj cat
.jj file chmod
replacingjj chmod
.jj file list
replacingjj 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 thatjj git push -c xyz -c abc
is now equivalent to
jj git push -c 'all:(xyz | abc)'
. -
jj prev
andjj 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 matchjj 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!
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Daniel Ploch (@torquestomp)
- Danny Hooper (@hooper)
- Ilya Grigoriev (@ilyagr)
- James Sully (@sullyj3)
- Jonathan Tan (@jonathantanmy)
- Kyle J Strand (@BatmanAoD)
- Manuel Caldeira (@KiitoX)
- Martin von Zweigbergk (@martinvonz)
- Matt Kulukundis (@fowles)
- Matt Stark (@matts1)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Scott Taylor (@scott2000)
- Simon Wollwage (@Kintaro)
- Tal Pressman (@tp-woven)
- Yuya Nishihara (@yuja)
v0.18.0
Breaking changes
-
Dropped support for
ui.default-revset
config (replaced byrevsets.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 parsename
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 fromsrcs
withindomain
. -
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()
andimmutable()
. -
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 wheneverjj git fetch
would have introduced a conflict.In other words, previously branches that moved sideways or backward were
pushed similarly to Git'sgit push --force
; now they have protections
similar togit push --force-with-lease
(though not identical to it, to match
the behavior ofjj git fetch
). Note also that because of the wayjj git fetch
works,jj
does not suffer from the same problems as Git'sgit push --force-with-lease
in situations whengit 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!
- Alexander Potashev (@aspotashev)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Charles Crete (@Cretezy)
- Daniel Ploch (@torquestomp)
- Danny Hooper (@hooper)
- Eidolon (@HybridEidolon)
- Glen Choo (@chooglen)
- Gregory Anders (@gpanders)
- Ilya Grigoriev (@ilyagr)
- jyn (@jyn514)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Matthew Davidson (@KingMob)
- Michael Gattozzi (@mgattozzi)
- mlcui (@mlcui-corp)
- Philip Metzger (@PhilipMetzger)
- Remo Senekowitsch (@senekor)
- Thomas Castiglione (@gulbanana)
- Théo Daron (@tdaron)
- tinger (@tingerrr)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)
v0.17.1
Fixed bugs
jj status
no longer scans through the entire history to look for ancestors with conflicts.
v0.17.0
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 ofjj 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 currentuser.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 theall:
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
andjj 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 thatsnapshot.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!
- Anton Älgmyr (@algmyr)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Cretezy (@Cretezy)
- Daniel Ploch (@torquestomp)
- Evan Mesterhazy (@emesterhazy)
- Ilya Grigoriev (@ilyagr)
- Martin von Zweigbergk (@martinvonz)
- Noah Mayr (@noahmayr)
- Jeremy O'Brien (@neutralinsomniac)
- Jonathan Lorimer (@JonathanLorimer)
- Philip Metzger (@PhilipMetzger)
- Poliorcetics (@poliorcetics)
- Rowan Walsh (@rowan-walsh)
- Scott Olson (@solson)
- Théo Daron (@Kaporos)
- Yuya Nishihara (@yuja)
v0.16.0
Deprecations
jj move
was deprecated in favor ofjj 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 intojj 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
defaultjj
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 wherejj 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
andjj 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
forjj 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!
- Aleksey Kuznetsov (@zummenix)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Tan (@bnjmnt4n)
- Chris Krycho (@chriskrycho)
- Christoph Koehler (@ckoehler)
- Daniel Ploch (@torquestomp)
- Evan Mesterhazy (@emesterhazy)
- Ilya Grigoriev (@ilyagr)
- Khionu Sybiern (@khionu)
- Martin von Zweigbergk (@martinvonz)
- Matthew Davidson (@KingMob)
- mrstanwell (@mrstanwell)
- Noah Mayr (@noahmayr)
- Patric Stout (@TrueBrain)
- Poliorcetics (@poliorcetics)
- Simon Wollwage (@Kintaro)
- Steve Klabnik (@steveklabnik)
- Tom Ward (@tomafro)
- TrashCan (@TrashCan69420)
- Yuya Nishihara (@yuja)
v0.15.1
No code changes (fixing Rust Cargo.toml stuff).
v0.15.0
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 injj 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 makejj 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 tojj 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 tojj 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!
- Aleksey Kuznetsov (@zummenix)
- Anton Bulakh (@necauqua)
- Anton Älgmyr (@algmyr)
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- Benjamin Tan (@bnjmnt4n)
- Daehyeok Mun (@daehyeok)
- Daniel Ploch (@torquestomp)
- Evan Mesterhazy (@emesterhazy)
- gulbanana (@gulbanana)
- Ilya Grigoriev (@ilyagr)
- Jonathan Tan (@jonathantanmy)
- Julien Vincent (@julienvincent)
- jyn (@jyn514)
- Martin von Zweigbergk (@martinvonz)
- Paulo Coelho (@prscoelho)
- Philip Metzger (@PhilipMetzger)
- Poliorcetics (@poliorcetics)
- Stephen Jennings (@jennings)
- Vladimir (@0xdeafbeef)
- Yuya Nishihara (@yuja)
v0.14.0
Deprecations
-
jj checkout
andjj merge
are both deprecated; usejj new
instead to
replace both of these commands in all instances.Rationale:
jj checkout
andjj merge
both implement identical
functionality, which is a subset ofjj new
.checkout
creates a new working
copy commit on top of a single specified revision, i.e. with one parent.
merge
creates a new working copy commit on top of at least two specified
revisions, i.e. with two or more parents.The only difference between these commands and
jj new
, which also creates
a new working copy commit, is thatnew
can create a working copy commit on
top of any arbitrary number of revisions, so it can handle both the previous
cases at once. The only actual difference between these three commands is the
command syntax and their name. These names were chosen to be familiar to users
of other version control systems, but we instead encourage all users to adopt
jj new
instead; it is more general and easier to remember than both of
these.jj checkout
andjj merge
will no longer be shown as part ofjj help
, but
will still function for now, emitting a warning about their deprecation.Deadline:
jj checkout
andjj merge
will be deleted and are expected
become a hard error later in 2024. -
jj init --git
andjj init --git-repo
are now deprecated and will be removed
in the near future.Use
jj git init
instead.
Breaking changes
-
(Minor) Diff summaries (e.g.
jj diff -s
) now useD
for "Deleted" instead
ofR
for "Removed". @joyously pointed out thatR
could also mean
"Renamed". -
jj util completion
now takes the shell as a positional argument, not a flag.
the previous behavior is deprecated, but supported for now. it will be removed
in the future.
New features
-
jj util completion
now supports powershell and elvish. -
Official binaries for macOS running on Apple Silicon (
aarch64-apple-darwin
)
are now available, alongside the existing macOS x86 binaries. -
New
jj op abandon
command is added to clean up the operation history. Git
refs and commit objects can be further compacted byjj util gc
. -
jj util gc
now removes unreachable operation, view, and Git objects. -
jj branch rename
will now warn if the renamed branch has a remote branch, since
those will have to be manually renamed outside ofjj
. -
jj git push
gained a--tracked
option, to push all the tracked branches. -
There's now a virtual root operation, similar to the virtual root
commit. It appears at the end ofjj op log
. -
jj config list
gained a--include-overridden
option to allow
printing overridden config values. -
jj config list
now accepts--user
or--repo
option to specify
config origin. -
New
jj config path
command to print the config file path without launching
an editor. -
jj tag list
command prints imported git tags. -
jj next
andjj prev
now prompt in the event of the next/previous commit
being ambiguous, instead of failing outright. -
jj resolve
now displays the file being resolved. -
jj workspace root
was aliased tojj root
, for ease of discoverability -
jj diff
no longer shows the contents of binary files. -
jj git
now has aninit
command that initializes a git backed repo. -
New template function
surround(prefix, suffix, content)
is added.
Fixed bugs
-
Fixed snapshots of symlinks in
gitignore
-d directory.
#2878 -
Fixed data loss in dirty working copy when checked-out branch is rebased or
abandoned by Git.
#2876
Contributors
Thanks to the people who made this release happen!
- Austin Seipp (@thoughtpolice)
- Benjamin Brittain (@benbrittain)
- Chris Krycho (@chriskrycho)
- Daehyeok Mun (@daehyeok)
- Daniel Ploch (@torquestomp)
- Essien Ita Essien (@essiene)
- Ikko Eltociear Ashimine (@eltociear)
- Ilya Grigoriev (@ilyagr)
- Jonathan Tan (@jonathantanmy)
- jyn (@jyn514)
- Martin von Zweigbergk (@martinvonz)
- Matt Stark (@matts1)
- Michael Pratt (prattmic)
- Philip Metzger (@PhilipMetzger)
- Stephen Jennings (@jennings)
- Valentin Gatien-Baron (@v-gb)
- vwkd (@vwkd)
- Yuya Nishihara (@yuja)
v0.13.0
Breaking changes
jj git fetch
no longer imports new remote branches as local branches. Set
git.auto-local-branch = true
to restore the old behavior.
New features
-
Information about new and resolved conflicts is now printed by every command.
-
jj branch
has gained a newrename
subcommand that allows changing a branch
name atomically.jj branch help rename
for details.
Fixed bugs
- Command aliases can now be loaded from repository config relative to the
current working directory.
#2414
Contributors
Thanks to the people who made this release happen!
- Austin Seipp (@thoughtpolice)
- Essien Ita Essien (@essiene)
- Gabriel Scherer (@gasche)
- Ilya Grigoriev (@ilyagr)
- Martin von Zweigbergk (@martinvonz)
- Philip Metzger (@PhilipMetzger)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)
v0.12.0
Breaking changes
-
The
remote_branches()
revset no longer includes branches exported to the Git
repository (so called Git-tracking branches.) -
jj branch set
no longer creates a new branch. Usejj branch create
instead. -
jj init --git
in an existing Git repository now errors and exits rather than
creating a second Git store.
New features
-
jj workspace add
can now take multiple--revision
arguments, which will
create a new workspace with its working-copy commit on top of all the parents,
as if you had runjj new r1 r2 r3 ...
. -
You can now set
git.abandon-unreachable-commits = false
to disable the
usual behavior where commits that became unreachable in the Git repo are
abandoned (#2504). -
jj new
gained a--no-edit
option to prevent editing the newly created
commit. For example,jj new a b --no-edit -m Merge
creates a merge commit
without affecting the working copy. -
jj rebase
now takes the flag--skip-empty
, which doesn't copy over commits
that would become empty after a rebase. -
There is a new
jj util gc
command for cleaning up the repository storage.
For now, it simply runsgit gc
on the backing Git repo (when using the Git
backend).
Fixed bugs
- Fixed another file conflict resolution issue where
jj status
would disagree
with the actual file content.
#2654
Contributors
Thanks to the people who made this release happen!
- Antoine Cezar (@AntoineCezar)
- Anton Bulakh (@necauqua)
- Austin Seipp (@thoughtpolice)
- Benjamin Saunders (@Ralith)
- Carlos Precioso (@cprecioso)
- Chris Krycho (@chriskrycho)
- Ilya Grigoriev (@ilyagr)
- Jason R. Coombs (@jaraco)
- Jesse Somerville (@jessesomerville)
- Łukasz Kurowski (@crackcomm)
- Martin von Zweigbergk (@martinvonz)
- mlcui (@mlcui-google)
- Philip Metzger (@PhilipMetzger)
- Waleed Khan (@arxanas)
- Yuya Nishihara (@yuja)