bisect: make abort into a non-error 975ef64c parent 9b02f868

An aborted bisect is currently treated like an error. This means that once an abort is triggered, any follow-up code from the bisection CLI doesn't get run. Change the bisector to treat an aborted command as any other evaluation and have it return an aborted result when it encounters it. This could be important for many future developments (putting bisect status in the op-log, interactive bisects, querying the state of a currently running bisect), but right now, it's mostly important for printing the reminder text about the right place to restore to in the op-log :)

authored by Daniel Morsing

1
# Changelog
2
3
All notable changes to this project will be documented in this file.
4
5
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
and this project adheres
7
to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
8
9
## [Unreleased]
10
11
### Release highlights
12
13
* Per-repo and per-workspace config is now stored outside the repo, for security
14
reasons. This is not a breaking change because we automatically migrate
15
legacy repos to this new format. `.jj/repo/config.toml` and
16
`.jj/workspace-config.toml` should no longer be used.
17
18
### Breaking changes
19
20
* Deprecated `ui.always-allow-large-revsets` setting and `all:` revset modifier
21
have been removed.
22
23
* Legacy placeholder support used for unset `user.name` or `user.email` has been
24
removed. Commits containing these values will now be pushed with `jj git push`
25
without producing an error.
26
27
* If any side of a conflicted file is missing a terminating newline, then the
28
materialized file in the working copy will no longer be terminated by a
29
newline.
30
31
### Deprecations
32
33
* The revset function `diff_contains()` has been renamed to `diff_lines()`.
34
35
### New features
36
37
* `jj git fetch` now shows details of abandoned commits (change IDs and
38
descriptions) by default, matching the `jj abandon` output format.
39
[#3081](https://github.com/jj-vcs/jj/issues/3081)
40
41
* `jj workspace root` now accepts an optional `--name` argument to show
42
the root path of the specified workspace (defaults to the current one). When
43
given a workspace that was created before this release, it errors out.
44
45
* `jj git push --bookmark <name>` will now automatically track the bookmark if
46
it isn't tracked with any remote already.
47
48
* Add `git_web_url([remote])` template function that converts a git remote URL
49
to a web URL, suitable for opening in a browser. Defaults to the "origin"
50
remote.
51
52
* New `divergent()` revset function for divergent changes.
53
54
* String pattern values in revsets and templates can now be substituted by
55
aliases. For example, `grep(x) = description(regex:x)` now works.
56
57
* A new config option `remotes.<name>.auto-track-created-bookmarks` behaves
58
similarly to `auto-track-bookmarks`, but it only applies to bookmarks created
59
locally. Setting it to `"*"` is now the closest replacement for the deprecated
60
`git.push-new-bookmarks` option.
61
62
* `jj tag list` can now be filtered by revset.
63
64
* Conflict markers will use LF or CRLF as the line ending according to the
65
contents of the file.
66
[#7376](https://github.com/jj-vcs/jj/issues/7376)
67
68
* New *experimental* `jj git fetch --tag` flag to fetch tags in the same way as
69
bookmarks. If specified, tags won't be fetched implicitly, and only tags
70
matching the pattern will be fetched as `<name>@<remote>` tags. The fetched
71
remote tags will be tracked by the local tags of the same name.
72
73
### Fixed bugs
74
75
* `jj git init --colocate` now refuses to run inside a Git worktree, providing
76
a helpful error message with alternatives.
77
[#8052](https://github.com/jj-vcs/jj/issues/8052)
78
79
* `jj git push` now ensures that tracked remote bookmarks are updated even if
80
there are no mappings in the Git fetch refspecs.
81
[#5115](https://github.com/jj-vcs/jj/issues/5115)
82
83
* `jj git fetch`/`push` now forwards most of `git` stderr outputs such as
84
authentication requests. [#5760](https://github.com/jj-vcs/jj/issues/5760)
85
86
* Conflicted bookmarks and tags in `trunk()` will no longer generate verbose
87
warnings. The configured `trunk()` alias will temporarily be disabled.
88
[#8501](https://github.com/jj-vcs/jj/issues/8501)
89
90
* Dynamic shell completion for `jj config unset` now only completes
91
configuration options which are set.
92
[#7774](https://github.com/jj-vcs/jj/issues/7774)
93
94
* Dynamic shell completion no longer attempts to resolve aliases at the
95
completion position. This previously prevented a fully-typed alias from
96
being accepted on some shells and replaced it entirely with its expansion on
97
bash. Now, the completion will only resolve the alias, and suggest candidates
98
accordingly, after the cursor has been advanced to the next position.
99
[#7773](https://github.com/jj-vcs/jj/issues/7773)
100
101
* Setting the editor via `ui.editor`, `$EDITOR`, or `JJ_EDITOR` now respects shell quoting.
102
103
* `jj gerrit upload` will no longer swallow errors and surface if changes fail
104
to get pushed to gerrit.
105
[#8568](https://github.com/jj-vcs/jj/issues/8568)
106
107
* `jj file track --include-ignored` now works when `fsmonitor.backend="watchman"`.
108
[#8427](https://github.com/jj-vcs/jj/issues/8427)
109
110
* Conflict labels are now preserved correctly when restoring files from commits
111
with different conflict labels.
112
113
* The empty tree is now always written when the working copy is empty.
114
[#8480](https://github.com/jj-vcs/jj/issues/8480)
115
116
* When using the Watchman filesystem monitor, changes to .gitignore now trigger
117
a scan of the affected subtree so newly unignored files are discovered.
118
[#8427](https://github.com/jj-vcs/jj/issues/8427)
119
120
## [0.37.0] - 2026-01-07
121
122
### Release highlights
123
124
* A new syntax for referring to hidden and divergent change IDs is available:
125
`xyz/n` where `n` is a number. For instance, `xyz/0` refers to the latest
126
version of `xyz`, while `xyz/1` refers to the previous version of `xyz`.
127
This allows you to perform actions like `jj restore --from xyz/1 --to xyz` to
128
restore `xyz` to its previous contents, if you made a mistake.
129
130
For divergent changes, the numeric suffix will always be shown in the log,
131
allowing you to disambiguate them in a similar manner.
132
133
### Breaking changes
134
135
* [String patterns](docs/revsets.md#string-patterns) in revsets, command
136
arguments, and configuration are now parsed as globs by default. Use
137
`substring:` or `exact:` prefix as needed.
138
139
* `remotes.<name>.auto-track-bookmarks` is now parsed the same way they
140
are in revsets and can be combined with logical operators.
141
142
* `jj bookmark track`/`untrack` now accepts `--remote` argument. If omitted, all
143
remote bookmarks matching the bookmark names will be tracked/untracked. The
144
old `<bookmark>@<remote>` syntax is deprecated in favor of `<bookmark>
145
--remote=<remote>`.
146
147
* On Windows, symlinks that point to a path with `/` won't be supported. This
148
path is [invalid on Windows](https://learn.microsoft.com/en-us/windows/win32/fileio/naming-a-file#naming-conventions).
149
150
* The template alias `format_short_change_id_with_hidden_and_divergent_info(commit)`
151
has been replaced by `format_short_change_id_with_change_offset(commit)`.
152
153
* The following deprecated config options have been removed:
154
- `git.push-bookmark-prefix`
155
- `ui.default-description`
156
- `ui.diff.format`
157
- `ui.diff.tool`
158
159
* The deprecated `commit_id.normal_hex()` template method has been removed.
160
161
* Template expansion that did not produce a terminating newline will not be
162
fixed up to provide one by `jj log`, `jj evolog`, or `jj op log`.
163
164
* The `diff` conflict marker style can now use `\\\\\\\` markers to indicate
165
the continuation of a conflict label from the previous line.
166
167
### Deprecations
168
169
* The `git_head()` and `git_refs()` functions will be removed from revsets and
170
templates. `git_head()` should point to the `first_parent(@)` revision in
171
colocated repositories. `git_refs()` can be approximated as
172
`remote_bookmarks(remote=glob:*) | tags()`.
173
174
### New features
175
176
* Updated the executable bit representation in the local working copy to allow
177
ignoring executable bit changes on Unix. By default we try to detect the
178
filesystem's behavior, but this can be overridden manually by setting
179
`working-copy.exec-bit-change = "respect" | "ignore"`.
180
181
* `jj workspace add` now also works for empty destination directories.
182
183
* `jj git remote` family of commands now supports different fetch and push URLs.
184
185
* `[colors]` table now supports `dim = true` attribute.
186
187
* In color-words diffs, context line numbers are now rendered with decreased
188
intensity.
189
190
* Hidden and divergent commits can now be unambiguously selected using their
191
change ID combined with a numeric suffix. For instance, if there are two
192
commits with change ID `xyz`, then one can be referred to as `xyz/0` and the
193
other can be referred to as `xyz/1`. These suffixes are shown in the log when
194
necessary to make a change ID unambiguous.
195
196
* `jj util gc` now prunes unreachable files in `.jj/repo/store/extra` to save
197
disk space.
198
199
* Early version of a `jj file search` command for searching for a pattern in
200
files (like `git grep`).
201
202
* Conflict labels now contain information about where the sides of a conflict
203
came from (e.g. `nlqwxzwn 7dd24e73 "first line of description"`).
204
205
* `--insert-before` now accepts a revset that resolves to an empty set when
206
used with `--insert-after`. The behavior is similar to `--onto`.
207
208
* `jj tag list` now supports `--sort` option.
209
210
* `TreeDiffEntry` type now has a `display_diff_path()` method that formats
211
renames/copies appropriately.
212
213
* `TreeDiffEntry` now has a `status_char()` method that returns
214
single-character status codes (M/A/D/C/R).
215
216
* `CommitEvolutionEntry` type now has a `predecessors()` method which
217
returns the predecessor commits (previous versions) of the entry's commit.
218
219
* `CommitEvolutionEntry` type now has a `inter_diff()` method which
220
returns a `TreeDiff` between the entry's commit and its predecessor version.
221
Optionally accepts a fileset literal to limit the diff.
222
223
* `jj file annotate` now reports an error for non-files instead of succeeding
224
and displaying no content.
225
226
* `jj workspace forget` now warns about unknown workspaces instead of failing.
227
228
### Fixed bugs
229
230
* Broken symlink on Windows. [#6934](https://github.com/jj-vcs/jj/issues/6934).
231
232
* Fixed failure on exporting moved/deleted annotated tags to Git. Moved tags are
233
exported as lightweight tags.
234
235
* `jj gerrit upload` now correctly handles mixed explicit and implicit
236
Change-Ids in chains of commits ([#8219](https://github.com/jj-vcs/jj/pull/8219))
237
238
* `jj git push` now updates partially-pushed remote bookmarks accordingly.
239
[#6787](https://github.com/jj-vcs/jj/issues/6787)
240
241
* Fixed problem of loading large Git packfiles.
242
https://github.com/GitoxideLabs/gitoxide/issues/2265
243
244
* The builtin pager won't get stuck when stdin is redirected.
245
246
* `jj workspace add` now prevents creating an empty workspace name.
247
248
* Fixed checkout of symlinks pointing to themselves or `.git`/`.jj` on Unix. The
249
problem would still remain on Windows if symlinks are enabled.
250
[#8348](https://github.com/jj-vcs/jj/issues/8348)
251
252
* Fixed a bug where jj would fail to read git delta objects from pack files.
253
https://github.com/GitoxideLabs/gitoxide/issues/2344
254
255
### Contributors
256
257
Thanks to the people who made this release happen!
258
259
* Anton Älgmyr (@algmyr)
260
* Austin Seipp (@thoughtpolice)
261
* Bryce Berger (@bryceberger)
262
* Carlos Knippschild (@chuim)
263
* Cole Helbling (@cole-h)
264
* David Higgs (@higgsd)
265
* Eekle (@Eekle)
266
* Gaëtan Lehmann (@glehmann)
267
* Ian Wrzesinski (@isuffix)
268
* Ilya Grigoriev (@ilyagr)
269
* Julian Howes (@jlnhws)
270
* Kaiyi Li (@06393993)
271
* Lukas Krejci (@metlos)
272
* Martin von Zweigbergk (@martinvonz)
273
* Matt Stark (@matts1)
274
* Ori Avtalion (@salty-horse)
275
* Scott Taylor (@scott2000)
276
* Shaoxuan (Max) Yuan (@ffyuanda)
277
* Stephen Jennings (@jennings)
278
* Steve Fink (@hotsphink)
279
* Steve Klabnik (@steveklabnik)
280
* Theo Buehler (@botovq)
281
* Thomas Castiglione (@gulbanana)
282
* Vincent Ging Ho Yim (@cenviity)
283
* xtqqczze (@xtqqczze)
284
* Yuantao Wang (@0WD0)
285
* Yuya Nishihara (@yuja)
286
287
## [0.36.0] - 2025-12-03
288
289
### Release highlights
290
291
* The documentation has moved from <https://jj-vcs.github.io/jj/> to
292
<https://docs.jj-vcs.dev/>.
293
294
301 redirects are being issued towards the new domain, so any existing links
295
should not be broken.
296
297
* Fixed race condition that could cause divergent operations when running
298
concurrent `jj` commands in colocated repositories. It is now safe to
299
continuously run e.g. `jj log` without `--ignore-working-copy` in one
300
terminal while you're running other commands in another terminal.
301
[#6830](https://github.com/jj-vcs/jj/issues/6830)
302
303
* `jj` now ignores `$PAGER` set in the environment and uses `less -FRX` on most
304
platforms (`:builtin` on Windows). See [the docs](docs/config.md#pager) for
305
more information, and [#3502](https://github.com/jj-vcs/jj/issues/3502) for
306
motivation.
307
308
### Breaking changes
309
310
* In [filesets or path patterns](docs/filesets.md#file-patterns), glob matching
311
is enabled by default. You can use `cwd:"path"` to match literal paths.
312
313
* In the following commands, [string pattern
314
arguments](docs/revsets.md#string-patterns) are now parsed the same way they
315
are in revsets and can be combined with logical operators: `jj bookmark
316
delete`/`forget`/`list`/`move`, `jj tag delete`/`list`, `jj git
317
clone`/`fetch`/`push`
318
319
* In the following commands, unmatched bookmark/tag names is no longer an
320
error. A warning will be printed instead: `jj bookmark
321
delete`/`forget`/`move`/`track`/`untrack`, `jj tag delete`, `jj git
322
clone`/`push`
323
324
* The default string pattern syntax in revsets will be changed to `glob:` in a
325
future release. You can opt in to the new default by setting
326
`ui.revsets-use-glob-by-default=true`.
327
328
* Upgraded `scm-record` from v0.8.0 to v0.9.0. See release notes at
329
<https://github.com/arxanas/scm-record/releases/tag/v0.9.0>.
330
331
* The minimum supported Rust version (MSRV) is now 1.89.
332
333
* On macOS, the deprecated config directory `~/Library/Application Support/jj`
334
is not read anymore. Use `$XDG_CONFIG_HOME/jj` instead (defaults to
335
`~/.config/jj`).
336
337
* Sub-repos are no longer tracked. Any directory containing `.jj` or `.git`
338
is ignored. Note that Git submodules are unaffected by this.
339
340
### Deprecations
341
342
* The `--destination`/`-d` arguments for `jj rebase`, `jj split`, `jj revert`,
343
etc. were renamed to `--onto`/`-o`. The reasoning is that `--onto`,
344
`--insert-before`, and `--insert-after` are all destination arguments, so
345
calling one of them `--destination` was confusing and unclear. The old names
346
will be removed at some point in the future, but we realize that they are
347
deep in muscle memory, so you can expect an unusually long deprecation period.
348
349
* `jj describe --edit` is deprecated in favor of `--editor`.
350
351
* The config options `git.auto-local-bookmark` and `git.push-new-bookmarks` are
352
deprecated in favor of `remotes.<name>.auto-track-bookmarks`. For example:
353
354
```toml
355
[remotes.origin]
356
auto-track-bookmarks = "glob:*"
357
```
358
359
For more details, refer to
360
[the docs](docs/config.md#automatic-tracking-of-bookmarks).
361
362
* The flag `--allow-new` on `jj git push` is deprecated. In order to push new
363
bookmarks, please track them with `jj bookmark track`. Alternatively, consider
364
setting up an auto-tracking configuration to avoid the chore of tracking
365
bookmarks manually. For example:
366
367
```toml
368
[remotes.origin]
369
auto-track-bookmarks = "glob:*"
370
```
371
372
For more details, refer to
373
[the docs](docs/config.md#automatic-tracking-of-bookmarks).
374
375
### New features
376
377
* `jj commit`, `jj describe`, `jj squash`, and `jj split` now accept
378
`--editor`, which ensures an editor will be opened with the commit
379
description even if one was provided via `--message`/`-m`.
380
381
* All `jj` commands show a warning when the provided `fileset` expression
382
doesn't match any files.
383
384
* Added `files()` template function to `DiffStats`. This supports per-file stats
385
like `lines_added()` and `lines_removed()`
386
387
* Added `join()` template function. This is different from `separate()` in that
388
it adds a separator between all arguments, even if empty.
389
390
* `RepoPath` template type now has a `absolute() -> String` method that returns
391
the absolute path as a string.
392
393
* Added `format_path(path)` template that controls how file paths are printed
394
with `jj file list`.
395
396
* New built-in revset aliases `visible()` and `hidden()`.
397
398
* Unquoted `*` is now allowed in revsets. `bookmarks(glob:foo*)` no longer
399
needs quoting.
400
401
* `jj prev/next --no-edit` now generates an error if the working-copy has some
402
children.
403
404
* A new config option `remotes.<name>.auto-track-bookmarks` can be set to a
405
string pattern. New bookmarks matching it will be automatically tracked for
406
the specified remote. See
407
[the docs](docs/config.md#automatic-tracking-of-bookmarks).
408
409
* `jj log` now supports a `--count` flag to print the number of commits instead
410
of displaying them.
411
412
* `Commit` type now has a `conflicted_files()` method that returns a list of
413
files with merge conflicts.
414
415
* `TreeEntry` type now has a `conflict_side_count()` method that returns the number
416
of sides in a merge conflict (1 for non-conflicted files, 2 or more for
417
conflicts).
418
419
### Fixed bugs
420
421
* `jj fix` now prints a warning if a tool failed to run on a file.
422
[#7971](https://github.com/jj-vcs/jj/issues/7971)
423
424
* Shell completion now works with non‑normalized paths, fixing the previous
425
panic and allowing prefixes containing `.` or `..` to be completed correctly.
426
[#6861](https://github.com/jj-vcs/jj/issues/6861)
427
428
* Shell completion now always uses forward slashes to complete paths, even on
429
Windows. This renders completion results viable when using jj in Git Bash.
430
[#7024](https://github.com/jj-vcs/jj/issues/7024)
431
432
* Unexpected keyword arguments now return a parse failure for the `coalesce()`
433
and `concat()` templating functions.
434
435
* Nushell completion script documentation add `-f` option, to keep it up to
436
date.
437
[#8007](https://github.com/jj-vcs/jj/issues/8007)
438
439
* Ensured that with Git submodules, remnants of your submodules do not show up
440
in the working copy after running `jj new`.
441
[#4349](https://github.com/jj-vcs/jj/issues/4349)
442
443
### Contributors
444
445
Thanks to the people who made this release happen!
446
447
* abgox (@abgox)
448
* ase (@adamse)
449
* Björn Kautler (@Vampire)
450
* Bryce Berger (@bryceberger)
451
* Chase Naples (@cnaples79)
452
* David Higgs (@higgsd)
453
* edef (@edef1c)
454
* Evan Mesterhazy (@emesterhazy)
455
* Fedor (@sheremetyev)
456
* Gaëtan Lehmann (@glehmann)
457
* George Christou (@gechr)
458
* Hubert Lefevre (@Paluche)
459
* Ilya Grigoriev (@ilyagr)
460
* Jonas Greitemann (@jgreitemann)
461
* Joseph Lou (@josephlou5)
462
* Julia DeMille (@judemille)
463
* Kaiyi Li (@06393993)
464
* Kyle Lippincott (@spectral54)
465
* Lander Brandt (@landaire)
466
* Lucio Franco (@LucioFranco)
467
* Luke Randall (@lukerandall)
468
* Martin von Zweigbergk (@martinvonz)
469
* Matt Stark (@matts1)
470
* Mitchell Skaggs (@magneticflux-)
471
* Peter Schilling (@schpet)
472
* Philip Metzger (@PhilipMetzger)
473
* QingyaoLin (@QingyaoLin)
474
* Remo Senekowitsch (@senekor)
475
* Scott Taylor (@scott2000)
476
* Stephen Jennings (@jennings)
477
* Steve Klabnik (@steveklabnik)
478
* Tejas Sanap (@whereistejas)
479
* Tommi Virtanen (@tv42)
480
* Velociraptor115 (@Velociraptor115)
481
* Vincent Ging Ho Yim (@cenviity)
482
* Yuya Nishihara (@yuja)
483
484
## [0.35.0] - 2025-11-05
485
486
### Release highlights
487
488
* Workspaces can now have their own separate configuration. For instance, you
489
can use `jj config set --workspace` to update a configuration option only in
490
the current workspace.
491
492
* After creating a local bookmark, it is now possible to use `jj bookmark track`
493
to associate the bookmark with a specific remote before pushing it. When
494
pushing a tracked bookmark, it is not necessary to use `--allow-new`.
495
496
* The new `jj git colocation enable` and `jj git colocation disable` commands
497
allow converting between colocated and non-colocated workspaces.
498
499
### Breaking changes
500
501
* The `remote_bookmarks(remote=pattern)` revset now includes Git-tracking
502
bookmarks if the specified `pattern` matches `git`. The default is
503
`remote=~exact:"git"` as before.
504
505
* The deprecated flag `--summary` of `jj abandon` has been removed.
506
507
* The deprecated command `jj backout` has been removed, use `jj revert` instead.
508
509
* The following deprecated config options have been removed:
510
- `signing.sign-all`
511
- `core.watchman.register_snapshot_trigger`
512
- `diff.format`
513
514
### Deprecations
515
516
* `jj bisect run --command <cmd>` is deprecated in favor of
517
`jj bisect run -- <cmd>`.
518
519
* `jj metaedit --update-committer-timestamp` was renamed to
520
`jj metaedit --force-rewrite` since the old name (and help text)
521
incorrectly suggested that the committer name and email would _not_
522
be updated.
523
524
### New features
525
526
* Workspaces may have an additional layered configuration, located at
527
`.jj/workspace-config.toml`. `jj config` subcommands which took layer options
528
like `--repo` now also support `--workspace`.
529
530
* `jj bookmark track` can now associate new local bookmarks with remote.
531
Tracked bookmarks can be pushed without `--allow-new`.
532
[#7072](https://github.com/jj-vcs/jj/issues/7072)
533
534
* The new `jj git colocation` command provides sub-commands to show the
535
colocation state (`status`), to convert a non-colocated workspace into
536
a colocated workspace (`enable`), and vice-versa (`disable`).
537
538
* New `jj tag set`/`delete` commands to create/update/delete tags locally.
539
Created/updated tags are currently always exported to Git as lightweight
540
tags. If you would prefer them to be exported as annotated tags, please give
541
us feedback on [#7908](https://github.com/jj-vcs/jj/issues/7908).
542
543
* Templates now support a `.split(separator, [limit])` method on strings to
544
split a string into a list of substrings.
545
546
* `-G` is now available as a short form of `--no-graph` in `jj log`, `jj evolog`,
547
`jj op log`, `jj op show` and `jj op diff`.
548
549
* `jj metaedit` now accepts `-m`/`--message` option to non-interactively update
550
the change description.
551
552
* The `CryptographicSignature.key()` template method now also works for SSH
553
signatures and returns the corresponding public key fingerprint.
554
555
* Added `template-aliases.empty_commit_marker`. Users can override this value in
556
their config to change the "(empty)" label on empty commits.
557
558
* Add support for `--when.workspaces` config scopes.
559
560
* Add support for `--when.hostnames` config scopes. This allows configuration to
561
be conditionally applied based on the hostname set in `operation.hostname`.
562
563
* `jj bisect run` accepts the command and arguments to pass to the command
564
directly as positional arguments, such as
565
`jj bisect --range=..main -- cargo check --all-targets`.
566
567
* Divergent changes are no longer marked red in immutable revisions. Since the
568
revision is immutable, the user shouldn't take any action, so the red color
569
was unnecessarily alarming.
570
571
* New commit template keywords `local`/`remote_tags` to show only local/remote
572
tags. These keywords may be useful in non-colocated Git repositories where
573
local and exported `@git` tags can point to different revisions.
574
575
* `jj git clone` now supports the `--branch` option to specify the branch(es)
576
to fetch during clone. If present, the first matching branch is used as the
577
working-copy parent.
578
579
* Revsets now support logical operators in string patterns.
580
581
* `jj file track` now accepts an `--include-ignored` flag to track files that
582
are ignored by `.gitignore` or exceed the `snapshot.max-new-file-size` limit.
583
[#2837](https://github.com/jj-vcs/jj/issues/2837)
584
585
### Fixed bugs
586
587
* `jj metaedit --author-timestamp` twice with the same value no longer
588
edits the change twice in some cases.
589
590
* `jj squash`: fixed improper revision rebase when both `--insert-after` and
591
`--insert-before` were used.
592
593
* `jj undo` can now revert "fetch"/"import" operation that involves tag updates.
594
[#6325](https://github.com/jj-vcs/jj/issues/6325)
595
596
* Fixed parsing of `files(expr)` revset expression including parentheses.
597
[#7747](https://github.com/jj-vcs/jj/issues/7747)
598
599
* Fixed `jj describe --stdin` to append a final newline character.
600
601
### Contributors
602
603
Thanks to the people who made this release happen!
604
605
* Alpha Chen (@kejadlen)
606
* Angel Ezquerra (@AngelEzquerra)
607
* ase (@adamse)
608
* Austin Seipp (@thoughtpolice)
609
* Benjamin Brittain (@benbrittain)
610
* bipul (@bipulmgr)
611
* Brian Schroeder (@bts)
612
* Bryce Berger (@bryceberger)
613
* Cole Helbling (@cole-h)
614
* Daniel Luz (@mernen)
615
* David Higgs (@higgsd)
616
* Defelo (@Defelo)
617
* Fedor (@sheremetyev)
618
* Gabriel Goller (@kaffarell)
619
* Gaëtan Lehmann (@glehmann)
620
* George Christou (@gechr)
621
* Ilya Grigoriev (@ilyagr)
622
* Isaac Corbrey (@icorbrey)
623
* James Coman (@jamescoman)
624
* Joseph Lou (@josephlou5)
625
* Lander Brandt (@landaire)
626
* Martin von Zweigbergk (@martinvonz)
627
* Michael Chirico (@MichaelChirico)
628
* Owen Brooks (@owenbrooks)
629
* Peter Schilling (@schpet)
630
* Philip Metzger (@PhilipMetzger)
631
* Remo Senekowitsch (@senekor)
632
* Ross Smyth (@RossSmyth)
633
* Scott Taylor (@scott2000)
634
* Steve Fink (@hotsphink)
635
* Steve Klabnik (@steveklabnik)
636
* Theo Buehler (@botovq)
637
* Theodore Dubois (@tbodt)
638
* Theodore Keloglou (@sirodoht)
639
* Yuya Nishihara (@yuja)
640
641
## [0.34.0] - 2025-10-01
642
643
### Release highlights
644
645
* Support for uploading changes to Gerrit Code Review with `jj gerrit upload`.
646
This lets you submit trees or multiple stacks of work at once. Support
647
for fetching changes, submitting changes, and other operations is not yet
648
implemented. This should be considered experimental, and we welcome feedback
649
on using it.
650
651
* Support for automated bisection using `jj bisect run`; this will continuously
652
bisect a commit range until a given commit is found to trigger a bug.
653
654
### Breaking changes
655
656
* Git-based repositories are now colocated by default. Configure `git.colocate =
657
false` to keep the previous behavior.
658
659
* Conflicts written by jj < 0.11 are no longer supported. They will now appear
660
as regular files with a `.jjconflict` suffix and JSON contents.
661
662
* The minimum supported Rust version (MSRV) is now 1.88.
663
664
### Deprecations
665
666
* Various flags on `jj describe` and `jj commit` have been deprecated in favor
667
of `jj metaedit`. They are:
668
* `describe`: `--author`, `--reset-author`, `--no-edit`
669
* `commit`: `--author`, `--reset-author`
670
671
* The storage format of remote bookmarks and tags has changed. Remote bookmarks
672
will be written in both old and new formats to retain forward compatibility.
673
Git-tracking tags are also recorded for future native tagging support. This
674
change should be transparent, but let us know if you see anything odd.
675
676
### New features
677
678
* The new command `jj bisect run` uses binary search to find a commit that
679
introduced a bug.
680
681
* The default editor on Unix is now `nano` instead of `pico`.
682
683
* New config option `merge.hunk-level = "word"` to enable word-level merging.
684
685
* New config option `merge.same-change = "keep"` to disable lossy resolution
686
rule for same-change conflicts.
687
[#6369](https://github.com/jj-vcs/jj/issues/6369)
688
689
* Templates now support a `replace()` method on strings for pattern-based
690
string replacement with optional limits. Supports all string patterns, including
691
regex with capture groups (e.g. `"hello world".replace(regex:'(\w+) (\w+)', "$2 $1")`).
692
693
* A new builtin `hyperlink(url, text)` template alias creates clickable
694
hyperlinks using [OSC8 escape sequences](https://github.com/Alhadis/OSC8-Adoption)
695
for terminals that support them.
696
697
* Added a new conditional configuration `--when.platforms` to include
698
settings only on certain platforms.
699
700
* External diff commands now support substitution variable `$width` for the
701
number of available terminal columns.
702
703
* The new `jj gerrit upload` command allows you to upload given revisions to an
704
instance of Gerrit Code Review.
705
706
* `jj bookmark create/set/move` use the working copy as a default again and
707
no longer require an explicit revision argument. This walks back a
708
deprecation from `jj 0.26`, as the community feedback was mostly negative.
709
Instead, bookmarking an empty revision now produces a warning, to help you
710
catch the case where you meant to bookmark the parent revision.
711
712
* The revset function `exactly(x, n)` will now evaluate `x` and error if it does
713
not have exactly `n` elements.
714
715
* `jj util exec` now matches the exit status of the program it runs, and
716
doesn't print anything.
717
718
* `jj config get` now supports displaying array and table config values.
719
720
* `jj util exec` sets the environment variable `JJ_WORKSPACE_ROOT`
721
722
### Fixed bugs
723
724
* Fetching repositories that have submodules no longer errors even if
725
`submodule.recurse=true` is set in `.gitconfig` (but jj still isn't able to
726
fetch the submodules or to operate on them).
727
728
### Contributors
729
730
Thanks to the people who made this release happen!
731
732
* Angel Ezquerra (@AngelEzquerra)
733
* Anton Älgmyr (@algmyr)
734
* Antonin Delpeuch (@wetneb)
735
* Austin Seipp (@thoughtpolice)
736
* Benjamin Tan (@bnjmnt4n)
737
* Conner Petzold (@ConnerPetzold)
738
* Daniel Luz (@mernen)
739
* Daniele Sassoli (@DanieleSassoli)
740
* David Barsky (@davidbarsky)
741
* Dinu Blanovschi (@dnbln)
742
* Gaëtan Lehmann (@glehmann)
743
* George Christou (@gechr)
744
* Ian Wrzesinski (@isuffix)
745
* Ilya Grigoriev (@ilyagr)
746
* Isaac Corbrey (@icorbrey)
747
* Ivan Petkov (@ipetkov)
748
* Jonas Fierlings (@PigeonF)
749
* loudgolem (@phanirithvij)
750
* Martin von Zweigbergk (@martinvonz)
751
* Matt Stark (@matts1)
752
* Matt T. Proud (@matttproud)
753
* Michael Pratt (@prattmic)
754
* MochikoNyan (@MochikoNyan)
755
* Philip Metzger (@PhilipMetzger)
756
* Reilly Brogan (@ReillyBrogan)
757
* Remo Senekowitsch (@senekor)
758
* Reuven Lazarus (@rlazarus)
759
* Scott Taylor (@scott2000)
760
* Stephen Jennings (@jennings)
761
* Steven Sherry (@Steven0351)
762
* Theo Buehler (@botovq)
763
* Yuya Nishihara (@yuja)
764
765
## [0.33.0] - 2025-09-03
766
767
### Release highlights
768
769
* `jj undo` is now *sequential*: invoking it multiple times in sequence
770
repeatedly undoes actions in the operation log. Previously, `jj undo` would
771
only undo *the most recent* operation in the operation log. As a result, a new
772
`jj redo` command has been added.
773
774
* Experimental support for improving query performance over filesets and file
775
queries (like `jj log path/to/file.txt`) has been added. This is not enabled
776
by default. To enable this, you must use the `jj debug index-changed-paths`
777
command.
778
779
### Breaking changes
780
781
* `jj evolog` templates now accept `CommitEvolutionEntry` as context type. To
782
get `Commit` properties, use `commit.<method>()`. To customize the default
783
output, set `templates.evolog` instead of `templates.log`.
784
785
* `jj op show` now uses `templates.op_show` configuration for its default template
786
instead of `templates.op_log`.
787
788
* The deprecated config option `git.auto-local-branch` has been removed. Use
789
`git.auto-local-bookmark` instead.
790
791
* The deprecated `Signature.username()` template method has been removed. Use
792
`Signature.email().local()` instead.
793
794
* The deprecated `--config-toml` flag has been removed. Use
795
`--config=NAME=VALUE` or `--config-file=PATH` instead.
796
797
* `jj undo` can now undo multiple operations progressively by calling it
798
repeatedly, whereas previously, running `jj undo` twice was previously a no-op
799
(it only undid the last change).
800
801
* `jj git fetch` will now only fetch the refspec patterns configured on remotes
802
when the `--branch` option is omitted. Only simple refspec patterns are
803
currently supported, and anything else (like refspecs which rename branches)
804
will be ignored.
805
806
* The `conflict` label used for coloring log graph nodes was renamed to
807
`conflicted`.
808
809
### Deprecations
810
811
* The on-disk index format has changed. `jj` will write index files in both old
812
and new formats, so old `jj` versions should be able to read these index
813
files. This compatibility layer will be removed in a future release.
814
815
* `jj op undo` is deprecated in favor of `jj op revert`. (`jj undo` is still
816
available, but with new semantics. See also the breaking changes above.)
817
818
* The argument `<operation>` of `jj undo` is deprecated in favor of
819
`jj op revert <operation>`.
820
821
* The `--what` flag on `jj undo` is deprecated. Consider using
822
`jj op restore --what` instead.
823
824
### New features
825
826
* The new command `jj redo` can progressively redo operations that were
827
previously undone by multiple calls to `jj undo`.
828
829
* Templates now support `any()` and `all()` methods on lists to check whether
830
any or all elements satisfy a predicate. Example: `parents.any(|c| c.mine())`
831
returns true if any parent commit is authored by the user.
832
833
* Add experimental support for indexing changed paths, which will speed up `jj
834
log PATH` query, `jj file annotate`, etc. The changed-path index can be
835
enabled by `jj debug index-changed-paths` command. Indexing may take tens of
836
minutes depending on the number of merge commits. The indexing command UI is
837
subject to change. [#4674](https://github.com/jj-vcs/jj/issues/4674)
838
839
* `jj config list` now supports `-T'json(self) ++ "\n"'` serialization output.
840
841
* `jj file show` now accepts `-T`/`--template` option to insert file metadata.
842
843
* The template language now allows arbitrary whitespace between any operators.
844
845
* The new configuration option `git.colocate=boolean` controls whether or not
846
Git repositories are colocated by default.
847
848
* Both `jj git clone` and `jj git init` now take a `--no-colocate` flag to
849
disable colocation (in case `git.colocate` is set to `true`.)
850
851
* `jj git remote add` and `jj git clone` now support `--fetch-tags` to control
852
when tags are fetched for all subsequent fetches.
853
854
* `jj git fetch` now supports `--tracked` to fetch only tracked bookmarks.
855
856
* `jj diff --stat` now shows the change in size to binary files.
857
858
* `jj interdiff`, `jj evolog -p`, and `jj op log -p` now show diff of commit
859
descriptions.
860
861
* `jj log` and `jj op log` output can now be anonymized with the
862
`builtin_log_redacted` and `builtin_op_log_redacted` templates.
863
864
* `jj git init` now checks for an `upstream` remote in addition to `origin` when
865
setting the repository-level `trunk()` alias. The `upstream` remote takes
866
precedence over `origin` if both exist.
867
868
* Add the `jj metaedit` command, which modifies a revision's metadata. This can
869
be used to generate a new change-id, which may help resolve some divergences.
870
It also has options to modify author name, email and timestamp, as well as to
871
modify committer timestamp.
872
873
* Filesets now support case-insensitive glob patterns with the `glob-i:`,
874
`cwd-glob-i:`, and `root-glob-i:` pattern kinds. For example, `glob-i:"*.rs"`
875
will match both `file.rs` and `FILE.RS`.
876
877
* `jj op show` now accepts `-T`/`--template` option to customize the operation
878
output using template expressions, similar to `jj op log`. Also added
879
`--no-op-diff` flag to suppress the operation diff.
880
881
* A nearly identical string pattern system as revsets is now supported in the
882
template language, and is exposed as `string.match(pattern)`.
883
884
* Merge tools can use the `$path` argument to learn where the file they
885
are merging will end up in the repository.
886
887
### Fixed bugs
888
889
* `jj git clone` now correctly fetches all tags, unless `--fetch-tags` is
890
explicitly specified, in which case the specified option will apply for both
891
the initial clone and subsequent fetches.
892
893
* Operation and working-copy state files are now synchronized to disk on save.
894
This will mitigate data corruption on system crash.
895
[#4423](https://github.com/jj-vcs/jj/issues/4423)
896
897
### Packaging changes
898
899
* The test suite no longer optionally uses Taplo CLI or jq, and packagers can
900
remove them as dependencies if present.
901
902
### Contributors
903
904
* Austin Seipp (@thoughtpolice)
905
* Benjamin Tan (@bnjmnt4n)
906
* Christian Hufnagel (@OvidiusCicero)
907
* Clément (@drawbu)
908
* Daniel Luz (@mernen)
909
* Emily (@emilazy)
910
* Evan Martin (@evmar)
911
* Gaëtan Lehmann (@glehmann)
912
* George Christou (@gechr)
913
* Graham Christensen (@grahamc)
914
* Hegui Dai (@Natural-selection1)
915
* Ian Wrzesinski (@isuffix)
916
* Ilya Grigoriev (@ilyagr)
917
* Isaac Corbrey (@icorbrey)
918
* Ivan Petkov (@ipetkov)
919
* Joaquín Triñanes (@JoaquinTrinanes)
920
* Kaiyi Li (@06393993)
921
* Martin von Zweigbergk (@martinvonz)
922
* Nigthknight (@nigthknight)
923
* Nikhil Marathe (@nikhilm)
924
* Remo Senekowitsch (@senekor)
925
* Tijs-B (@Tijs-B)
926
* Yuya Nishihara (@yuja)
927
928
## [0.32.0] - 2025-08-06
929
930
### Breaking changes
931
932
* In revsets, symbol expressions (such as change ID prefix) no longer resolve to
933
multiple revisions, and error out if resolved to more than one revisions. Use
934
`change_id(prefix)` or `bookmarks(exact:name)` to query divergent changes or
935
conflicted bookmarks. Commands like `jj rebase` no longer require `all:` to
936
specify multiple destination revisions.
937
938
* `jj op abandon` now discards previous versions of a change (or predecessors)
939
if they become unreachable from the operation history. The evolution history
940
is truncated accordingly.
941
942
Once `jj op abandon` and `jj util gc` are run in a repository, old versions of
943
`jj` might get "commit not found" error on `jj evolog`.
944
945
* `commit.working_copies()` template method now returns `List<WorkspaceRef>`
946
947
* The previously predefined `amend` alias has been removed. You can restore it
948
by setting the config `aliases.amend = ["squash"]`.
949
950
### Deprecations
951
952
* The `all:` revset modifier and `ui.always-allow-large-revsets` setting is
953
planned to be removed in a future release.
954
[#6016](https://github.com/jj-vcs/jj/issues/6016)
955
956
* Rename the `core.fsmonitor` and `core.watchman` settings to
957
`fsmonitor.backend`, and `fsmonitor.watchman` respectively.
958
959
### New features
960
961
* `jj workspace list` now accepts `-T`/`--template` option to customize its
962
output via templates.
963
964
* Added `templates.workspace_list` template to customize the output of
965
`jj workspace list`.
966
967
* `jj fix` now buffers the standard error stream from subprocesses and emits
968
the output from each all at once. The file name is printed before the output.
969
970
* `jj status` now collapses fully untracked directories into one line.
971
It still fully traverses them while snapshotting but they won't clutter up
972
the output with all of their contents.
973
974
* Add the `working-copy.eol-conversion` config which is similar to the git
975
`core.autocrlf` config. A heuristics is used to detect if a file is a binary
976
file to prevent the EOL conversion from changing binary files unexpectedly.
977
978
* Add a `.parents()` method to the
979
[`Operation`](docs/templates.md#operation-type) type in the templating
980
language.
981
982
* Merge tools config can now explicitly forbid using them as diff editors or
983
diff formatters. Built-in tools that do not function well as diff editing
984
tools or as diff formatters will now report an error when used as such.
985
986
* `jj diffedit` now accepts filesets to edit only the specified paths.
987
988
* AnnotationLine objects in templates now have a `original_line_number() ->
989
Integer` method.
990
991
* Commit templates now support `.files()` to list all existing files at that
992
revision.
993
994
* Glob patterns now support `{foo,bar}` syntax. There may be subtle behavior
995
changes as we use the [globset](https://crates.io/crates/globset) library now.
996
997
* The new `bisect(x)` revset function can help bisect a range of commits to
998
find when a bug was introduced.
999
1000
* New `first_parent()` and `first_ancestors()` revset functions which are
1001
similar to `parents()` and `ancestors()`, but only traverse the first parent
1002
of each commit (similar to Git's `--first-parent` option).
1003
1004
* New `signing.backends.ssh.revocation-list` config for specifying a list of revoked
1005
public keys for commit signature verification.
1006
1007
* `jj fix` commands now replace `$root` with the workspace's root path. This is
1008
useful for tools stored inside the workspace.
1009
1010
### Fixed bugs
1011
1012
* Fixed an error in `jj util gc` caused by the empty blob being missing from
1013
the Git store. [#7062](https://github.com/jj-vcs/jj/issues/7062)
1014
1015
* `jj op diff -p` and `jj op log -p` now show content diffs from the first
1016
predecessor only. [#7090](https://github.com/jj-vcs/jj/issues/7090)
1017
1018
* `jj git fetch` no longer shows `NaN%` progress when connecting to slow remotes.
1019
[#7155](https://github.com/jj-vcs/jj/issues/7155)
1020
1021
### Contributors
1022
1023
Thanks to the people who made this release happen!
1024
1025
* adamnemecek (@adamnemecek)
1026
* Alexander Kobjolke (@jakalx)
1027
* Apromixately (@Apromixately)
1028
* Austin Seipp (@thoughtpolice)
1029
* Bryce Berger (@bryceberger)
1030
* Daniel Danner (@dnnr)
1031
* Daniel Luz (@mernen)
1032
* Evan Martin (@evmar)
1033
* George Christou (@gechr)
1034
* George Elliott-Hunter (@george-palmsens)
1035
* Hubert Głuchowski (@afishhh)
1036
* Ilya Grigoriev (@ilyagr)
1037
* Jade Lovelace (@lf-)
1038
* Jake Martin (@jake-m-commits)
1039
* Jan Klass (@Kissaki)
1040
* Joaquín Triñanes (@JoaquinTrinanes)
1041
* Josh Steadmon (@steadmon)
1042
* Kaiyi Li (@06393993)
1043
* Martin von Zweigbergk (@martinvonz)
1044
* Nigthknight (@nigthknight)
1045
* Ori Avtalion (@salty-horse)
1046
* Pablo Brasero (@pablobm)
1047
* Pavan Kumar Sunkara (@pksunkara)
1048
* Philip Metzger (@PhilipMetzger)
1049
* phoebe (@phoreverpheebs)
1050
* Remo Senekowitsch (@senekor)
1051
* Scott Taylor (@scott2000)
1052
* Stephen Jennings (@jennings)
1053
* Theo Buehler (@botovq)
1054
* Tyarel8 (@Tyarel8)
1055
* Yuya Nishihara (@yuja)
1056
1057
## [0.31.0] - 2025-07-02
1058
1059
### Breaking changes
1060
1061
* Revset expressions like `hidden_id | description(x)` now [search the specified
1062
hidden revision and its ancestors](docs/revsets.md#hidden-revisions) as well
1063
as all visible revisions.
1064
1065
* Commit templates no longer normalize `description` by appending final newline
1066
character. Use `description.trim_end() ++ "\n"` if needed.
1067
1068
### Deprecations
1069
1070
* The `git.push-bookmark-prefix` setting is deprecated in favor of
1071
`templates.git_push_bookmark`, which supports templating. The old setting can
1072
be expressed in template as `"<prefix>" ++ change_id.short()`.
1073
1074
### New features
1075
1076
* New `change_id(prefix)`/`commit_id(prefix)` revset functions to explicitly
1077
query commits by change/commit ID prefix.
1078
1079
* The `parents()` and `children()` revset functions now accept an optional
1080
`depth` argument. For instance, `parents(x, 3)` is equivalent to `x---`, and
1081
`children(x, 3)` is equivalent to `x+++`.
1082
1083
* `jj evolog` can now follow changes from multiple revisions such as divergent
1084
revisions.
1085
1086
* `jj diff` now accepts `-T`/`--template` option to customize summary output.
1087
1088
* Log node templates are now specified in toml rather than hardcoded.
1089
1090
* Templates now support `json(x)` function to serialize values in JSON format.
1091
1092
* The ANSI 256-color palette can be used when configuring colors. For example,
1093
`colors."diff removed token" = { bg = "ansi-color-52", underline = false }`
1094
will apply a dark red background on removed words in diffs.
1095
1096
### Fixed bugs
1097
1098
* `jj file annotate` can now process files at a hidden revision.
1099
1100
* `jj op log --op-diff` no longer fails at displaying "reconcile divergent
1101
operations." [#4465](https://github.com/jj-vcs/jj/issues/4465)
1102
1103
* `jj util gc --expire=now` now passes the corresponding flag to `git gc`.
1104
1105
* `change_id`/`commit_id.shortest()` template functions now take conflicting
1106
bookmark and tag names into account.
1107
[#2416](https://github.com/jj-vcs/jj/issues/2416)
1108
1109
* Fixed lockfile issue on stale file handles observed with NFS.
1110
1111
### Packaging changes
1112
1113
* `aarch64-windows` builds (release binaries and `main` snapshots) are now provided.
1114
1115
### Contributors
1116
1117
Thanks to the people who made this release happen!
1118
1119
* Anton Älgmyr (@algmyr)
1120
* Austin Seipp (@thoughtpolice)
1121
* Benjamin Brittain (@benbrittain)
1122
* Cyril Plisko (@imp)
1123
* Daniel Luz (@mernen)
1124
* Gaëtan Lehmann (@glehmann)
1125
* Gilad Woloch (@giladwo)
1126
* Greg Morenz (@gmorenz)
1127
* Igor Velkov (@iav)
1128
* Ilya Grigoriev (@ilyagr)
1129
* Jade Lovelace (@lf-)
1130
* Jonas Greitemann (@jgreitemann)
1131
* Josh Steadmon (@steadmon)
1132
* juemrami (@juemrami)
1133
* Kaiyi Li (@06393993)
1134
* Lars Francke (@lfrancke)
1135
* Martin von Zweigbergk (@martinvonz)
1136
* Osama Qarem (@osamaqarem)
1137
* Philip Metzger (@PhilipMetzger)
1138
* raylu (@raylu)
1139
* Scott Taylor (@scott2000)
1140
* Vincent Ging Ho Yim (@cenviity)
1141
* Yuya Nishihara (@yuja)
1142
1143
## [0.30.0] - 2025-06-04
1144
1145
### Release highlights
1146
1147
* The experimental support from release 0.29.0 for transferring the change ID
1148
to/from Git remotes has been enabled by default. The change ID is stored in
1149
the Git commit itself (in a commit header called `change-id`), which means
1150
it will be transferred by regular `git push` etc. Please let us know if you
1151
run into any problems with it. You can disable it setting
1152
`git.write-change-id-header`. Note that some Git remotes (e.g GitLab) and
1153
some Git commands (e.g. `git rebase`) do not preserve the change ids when
1154
they rewrite commits.
1155
1156
* `jj rebase` now automatically abandons divergent commits if another commit
1157
with the same change ID is already present in the destination with identical
1158
changes.
1159
1160
* `jj split` has gained `--message`, `--insert-before`, `--insert-after`, and
1161
`--destination` options.
1162
1163
* `jj evolog` can show associated operations for commits created by new jj
1164
versions.
1165
1166
### Breaking changes
1167
1168
* The old `libgit2` code path for fetches and pushes has been removed,
1169
and the `git.subprocess` setting along with it.
1170
1171
* In templates, bookmark/tag/remote names are now formatted in revset symbol
1172
notation. The type of `bookmark.remote()` is changed to `Option<_>`.
1173
`bookmark.remote() == "foo"` still works, but `bookmark.remote().<method>()`
1174
might need `if(bookmark.remote(), ..)` to suppress error.
1175
1176
* `jj rebase` now automatically abandons divergent commits if another commit
1177
with the same change ID is already present in the destination with identical
1178
changes. To keep these divergent commits, use the `--keep-divergent` flag.
1179
1180
* The deprecated `--skip-empty` flag for `jj rebase` has been removed. Use the
1181
`--skip-emptied` flag instead.
1182
1183
* The deprecated `jj branch` subcommands have been removed. Use the `jj
1184
bookmark` subcommands instead.
1185
1186
* `jj util completion` now requires the name of the shell as a positional
1187
argument and no longer produces Bash completions by default. The deprecated
1188
optional arguments for different shells have been removed.
1189
1190
* External diff tools are now run in the temporary directory containing
1191
the before (`left`) and after (`right`) directories, making diffs appear
1192
more pleasing for tools that display file paths prominently. Users can
1193
opt out of this by setting `merge-tools.<tool>.diff-do-chdir = false`,
1194
but this will likely be removed in a future release. Please report any
1195
issues you run into.
1196
1197
* The minimum supported Rust version (MSRV) is now 1.85.0.
1198
1199
### Deprecations
1200
1201
* The `ui.diff.format` and `ui.diff.tool` config options have been merged as
1202
`ui.diff-formatter`. The builtin format can be specified as `:<format>`
1203
(e.g. `ui.diff-formatter=":git"` for Git diffs.)
1204
1205
* The `.normal_hex()` method will be removed from the `CommitId` template type.
1206
It's useful only for the `ChangeId` type.
1207
1208
### New features
1209
1210
* `jj split` has gained a `--message` option to set the description of the
1211
commit with the selected changes.
1212
1213
* `jj split` has gained the ability to place the revision with the selected
1214
changes anywhere in the revision tree with the `--insert-before`,
1215
`--insert-after` and `--destination` command line flags.
1216
1217
* Added `git.track-default-bookmark-on-clone` setting to control whether to
1218
track the default remote bookmark on `jj git clone`.
1219
1220
* Templates can now do arithmetic on integers with the `+`, `-`, `*`, `/`, and
1221
`%` infix operators.
1222
1223
* Evolution history is now stored in the operation log. `jj evolog` can show
1224
associated operations for commits created by new jj versions.
1225
1226
### Fixed bugs
1227
1228
* Work around a git issue that could cause subprocess operations to hang if the
1229
`core.fsmonitor` gitconfig is set in the global or system gitconfigs.
1230
[#6440](https://github.com/jj-vcs/jj/issues/6440)
1231
1232
* `jj parallelize` can now parallelize groups of changes that _start_ with an
1233
immutable change, but do not contain any other immutable changes.
1234
1235
* `jj` will no longer warn about deprecated paths on macOS if the configured
1236
XDG directory is the deprecated one (~/Library/Application Support).
1237
1238
* The builtin diff editor now correctly handles splitting changes where a file
1239
is replaced by a directory of the same name.
1240
[#5189](https://github.com/jj-vcs/jj/issues/5189)
1241
1242
### Packaging changes
1243
1244
* Due to the removal of the `libgit2` code path, packagers should remove any
1245
dependencies on `libgit2`, `libssh2`, Zlib, OpenSSL, and `pkg-config`, and
1246
ensure they are not setting the Cargo `git2` or `vendored-openssl` features.
1247
1248
### Contributors
1249
1250
Thanks to the people who made this release happen!
1251
1252
* Alper Cugun (@alper)
1253
* Austin Seipp (@thoughtpolice)
1254
* Benjamin Brittain (@benbrittain)
1255
* Benjamin Tan (@bnjmnt4n)
1256
* Bryce Berger (@bryceberger)
1257
* Colin Nelson (@orthros)
1258
* Doug Stephen (@dljsjr)
1259
* Emily (@emilazy)
1260
* Eyvind Bernhardsen (@eyvind)
1261
* Felix Geisendörfer (@felixge)
1262
* Gaëtan Lehmann (@glehmann)
1263
* Ilya Grigoriev (@ilyagr)
1264
* Isaac Corbrey (@icorbrey)
1265
* Jonas Greitemann (@jgreitemann)
1266
* Josep Mengual (@truita)
1267
* kkoang (@kkoang)
1268
* Manuel Mendez (@mmlb)
1269
* Marshall Bowers (@maxdeviant)
1270
* Martin von Zweigbergk (@martinvonz)
1271
* Mateus Auler (@mateusauler)
1272
* Michael Pratt (@prattmic)
1273
* Nicole Patricia Mazzuca (@strega-nil)
1274
* Philip Metzger (@PhilipMetzger)
1275
* Scott Taylor (@scott2000)
1276
* T6 (@tjjfvi)
1277
* Vincent Ging Ho Yim (@cenviity)
1278
* Winter (@winterqt)
1279
* Yuya Nishihara (@yuja)
1280
1281
## [0.29.0] - 2025-05-07
1282
1283
### Release highlights
1284
1285
* Experimental support for transferring the change ID to/from Git remotes behind configuration
1286
setting `git.write-change-id-header`. If this is enabled, the change ID will be stored in the Git
1287
commit itself (in a commit header called `change-id`), which means it will be transferred by
1288
regular `git push` etc. This is an evolving feature that currently defaults to "false". This
1289
default will likely change in the future as we gain confidence with forge support and user
1290
expectations.
1291
1292
### Breaking changes
1293
1294
* `jj git push -c`/`--change` no longer moves existing local bookmarks.
1295
1296
* The `editor-*.jjdescription` files passed to your editor by e.g. `jj describe`
1297
are now written to your system's temporary directory instead of `.jj/repo/`.
1298
1299
### Deprecations
1300
1301
* `git.subprocess = false` has been deprecated, and the old `libgit2`
1302
code path for fetches and pushes will be removed entirely in 0.30.
1303
Please report any remaining issues you have with the Git
1304
subprocessing path.
1305
1306
* `ui.default-description` has been deprecated, and will be migrated to
1307
`template-aliases.default_commit_description`. Please also consider using
1308
[`templates.draft_commit_description`](docs/config.md#default-description),
1309
and/or [`templates.commit_trailers`](docs/config.md#commit-trailers).
1310
1311
* On macOS, config.toml files in `~/Library/Application Support/jj` are
1312
deprecated; one should instead use `$XDG_CONFIG_HOME/jj`
1313
(defaults to `~/.config/jj`)
1314
1315
### New features
1316
1317
* Color-words diff has gained [an option to compare conflict pairs without
1318
materializing](docs/config.md#color-words-diff-options).
1319
1320
* `jj show` patches can now be suppressed with `--no-patch`.
1321
1322
* Added `ui.bookmark-list-sort-keys` setting to configure default sort keys for the
1323
`jj bookmark list` command.
1324
1325
* New `signed` revset function to filter for cryptographically signed commits.
1326
1327
* `jj describe`, `jj commit`, `jj new`, `jj squash` and `jj split` add the
1328
commit trailers, configured in the `commit_trailers` template, to the commit
1329
description. Use cases include DCO Sign Off and Gerrit Change Id.
1330
1331
* Added `duplicate_description` template, which allows [customizing the descriptions
1332
of the commits `jj duplicate` creates](docs/config.md#duplicate-commit-description).
1333
1334
* `jj absorb` can now squash a deleted file if it was added by one of the
1335
destination revisions.
1336
1337
* Added `ui.streampager.show-ruler` setting to configure whether the ruler should be
1338
shown when the builtin pager starts up.
1339
1340
* `jj git fetch` now warns instead of erroring for unknown `git.fetch` remotes
1341
if other remotes are available.
1342
1343
* Commit objects in templates now have `trailers() -> List<Trailer>`, the Trailer
1344
objects have `key() -> String` and `value() -> String`.
1345
1346
* `jj config edit` will now roll back to previous version if a syntax error has been introduced in the new config.
1347
1348
* When using dynamic command-line completion, revision names will be completed
1349
in more complex expressions. For example, typing
1350
`jj log -r first-bookmark..sec` and then pressing Tab could complete the
1351
expression to `first-bookmark..second-bookmark`.
1352
1353
### Fixed bugs
1354
1355
* Fixed crash on change-delete conflict resolution.
1356
[#6250](https://github.com/jj-vcs/jj/issues/6250)
1357
1358
* The builtin diff editor now tries to preserve unresolved conflicts.
1359
[#4963](https://github.com/jj-vcs/jj/issues/4963)
1360
1361
* Fixed bash and zsh shell completion when completing aliases of multiple arguments.
1362
[#5377](https://github.com/jj-vcs/jj/issues/5377)
1363
1364
### Packaging changes
1365
1366
* Jujutsu now uses
1367
[`zlib-rs`](https://github.com/trifectatechfoundation/zlib-rs), a
1368
fast compression library written in Rust. Packagers should remove any
1369
dependency on CMake and drop the `packaging` Cargo feature.
1370
1371
### Contributors
1372
1373
Thanks to the people who made this release happen!
1374
1375
* Aleksey Kuznetsov (@zummenix)
1376
* Austin Seipp (@thoughtpolice)
1377
* Benjamin Brittain (@benbrittain)
1378
* Benjamin Tan (@bnjmnt4n)
1379
* Caleb White (@calebdw)
1380
* Daniel Luz (@mernen)
1381
* Emily (@emilazy)
1382
* Emily (@neongreen)
1383
* Gaëtan Lehmann (@glehmann)
1384
* George Christou (@gechr)
1385
* Ilya Grigoriev (@ilyagr)
1386
* Jacob Hayes (@JacobHayes)
1387
* Jonas Greitemann (@jgreitemann)
1388
* Josh Steadmon (@steadmon)
1389
* Martin von Zweigbergk (@martinvonz)
1390
* Mateus Auler (@mateusauler)
1391
* Nicole Patricia Mazzuca (@strega-nil)
1392
* Nils Koch (@nilskch)
1393
* Philip Metzger (@PhilipMetzger)
1394
* Remo Senekowitsch (@senekor)
1395
* Sam (@Samasaur1)
1396
* Steve Fink (@hotsphink)
1397
* Théo Daron (@tdaron)
1398
* TimerErTim (@TimerErTim)
1399
* Vincent Ging Ho Yim (@cenviity)
1400
* Winter (@winterqt)
1401
* Yuya Nishihara (@yuja)
1402
1403
## [0.28.2] - 2025-04-07
1404
1405
### Fixed bugs
1406
1407
* Fixed problem that old commits could be re-imported from Git.
1408
https://github.com/GitoxideLabs/gitoxide/issues/1928
1409
1410
## [0.28.1] - 2025-04-04
1411
1412
### Security fixes
1413
1414
* Fixed SHA-1 collision attacks not being detected.
1415
([GHSA-794x-2rpg-rfgr](https://github.com/jj-vcs/jj/security/advisories/GHSA-794x-2rpg-rfgr))
1416
1417
### Fixed bugs
1418
1419
* Resolved some potential build issues for packagers.
1420
[#6232](https://github.com/jj-vcs/jj/pull/6232)
1421
1422
* Fix a bug with `:ours` and `:theirs` merge tools involving conflicted trees
1423
with more than two sides. [#6227](https://github.com/jj-vcs/jj/pull/6227)
1424
1425
### Contributors
1426
1427
Thanks to the people who made this release happen!
1428
1429
* Emily (@emilazy)
1430
* Ilya Grigoriev (@ilyagr)
1431
* Nicole Patricia Mazzuca (@strega-nil)
1432
* Scott Taylor (@scott2000)
1433
* Yuya Nishihara (@yuja)
1434
1435
## [0.28.0] - 2025-04-02
1436
1437
### Release highlights
1438
1439
* jj's configuration can now be split into multiple files more easily.
1440
1441
* `jj resolve` now accepts built-in tools `:ours` and `:theirs`.
1442
1443
* In colocated repos, newly-created files will now appear in `git diff`.
1444
1445
* A long-standing bug relating to empty files in the built-in diff editor was
1446
fixed. [#3702](https://github.com/jj-vcs/jj/issues/3702)
1447
1448
### Breaking changes
1449
1450
* The minimum supported Rust version (MSRV) is now 1.84.0.
1451
1452
* The `git.push-branch-prefix` config has been removed in favor of
1453
`git.push-bookmark-prefix`.
1454
1455
* `jj abandon` no longer supports `--summary` to suppress the list of abandoned
1456
commits. The list won't show more than 10 commits to not clutter the console.
1457
1458
* `jj unsquash` has been removed in favor of `jj squash` and
1459
`jj diffedit --restore-descendants`.
1460
1461
* The `jj untrack` subcommand has been removed in favor of `jj file untrack`.
1462
1463
* The following deprecated revset functions have been removed:
1464
- `branches()`, `remote_branches()`, `tracked_remote_branches()`, and
1465
`untracked_remote_branches()`, which were renamed to "bookmarks".
1466
- `file()` and `conflict()`, which were renamed to plural forms.
1467
- `files(x, y, ..)` with multiple patterns. Use `files(x|y|..)` instead.
1468
1469
* The following deprecated template functions have been removed:
1470
- `branches()`, `local_branches()`, and `remote_branches()`, which were
1471
renamed to "bookmarks".
1472
1473
* The flags `--all` and `--tracked` on `jj git push` by themself do not cause
1474
deleted bookmarks to be pushed anymore, as an additional safety measure. They
1475
can now be combined with `--deleted` instead.
1476
1477
### Deprecations
1478
1479
* `core.watchman.register_snapshot_trigger` has been renamed to `core.watchman.register-snapshot-trigger` for consistency with other configuration options.
1480
1481
* `jj backout` is deprecated in favor of `jj revert`.
1482
1483
### New features
1484
1485
* `jj sign` can now sign with PKCS#12 certificates through the `gpgsm` backend.
1486
1487
* `jj sign` will automatically use the gpg key associated with the author's email
1488
in the absence of a `signing.key` configuration.
1489
1490
* Multiple user configs are now supported and are loaded in the following precedence order:
1491
- `$HOME/.jjconfig.toml`
1492
- `$XDG_CONFIG_HOME/jj/config.toml`
1493
- `$XDG_CONFIG_HOME/jj/conf.d/*.toml`
1494
1495
* The `JJ_CONFIG` environment variable can now contain multiple paths separated
1496
by a colon (or semicolon on Windows).
1497
1498
* The command `jj config list` now supports showing the origin of each variable
1499
via the `builtin_config_list_detailed` template.
1500
1501
* `jj config {edit,set,unset}` now prompt when multiple config files are found.
1502
1503
* `jj diff -r` now allows multiple revisions (as long as there are no gaps in
1504
the revset), such as `jj diff -r 'mutable()'`.
1505
1506
* `jj git push` now accepts a `--named NAME=REVISION` argument to create a named
1507
bookmark and immediately push it.
1508
1509
* The 'how to resolve conflicts' hint that is shown when conflicts appear can
1510
be hidden by setting `hints.resolving-conflicts = false`.
1511
1512
* `jj op diff` and `jj op log --op-diff` now show changes to which commits
1513
correspond to working copies.
1514
1515
* `jj op log -d` is now an alias for `jj op log --op-diff`.
1516
1517
* `jj bookmark move --to/--from` can now be abbreviated to `jj bookmark move -t/-f`
1518
1519
* `jj bookmark list` now supports `--sort` option. Similar to `git branch --sort`.
1520
See `jj bookmark list --help` for more details.
1521
1522
* A new command `jj revert` is added, which is similar to `jj backout` but
1523
adds the `--destination`, `--insert-after`, and `--insert-before` options to
1524
customize the location of reverted commits.
1525
1526
* A new command `jj git root` is added, which prints the location of the Git
1527
directory of a repository using the Git backend.
1528
1529
* In colocated repos, any files that jj considers added in the working copy will
1530
now show up in `git diff` (as if you had run `git add --intent-to-add` on
1531
them).
1532
1533
* Reversing colors is now supported. For example, to highlight words by
1534
reversing colors rather than underlining, you can set
1535
`colors."diff token"={ underline = false, reverse = true }` in your config.
1536
1537
* Added `revsets.log-graph-prioritize`, which can be used to configure
1538
which branch in the `jj log` graph is displayed on the left instead of `@`
1539
(e.g. `coalesce(description("megamerge\n"), trunk())`)
1540
1541
* `jj resolve` now accepts new built-in merge tools `:ours` and `:theirs`.
1542
These merge tools accept side #1 and side #2 of the conflict respectively.
1543
1544
### Fixed bugs
1545
1546
* `jj log -p --stat` now shows diff stats as well as the default color-words/git
1547
diff output. [#5986](https://github.com/jj-vcs/jj/issues/5986)
1548
1549
* The built-in diff editor now correctly handles deleted files.
1550
[#3702](https://github.com/jj-vcs/jj/issues/3702)
1551
1552
* The built-in diff editor now correctly retains the executable bit on newly
1553
added files when splitting. [#3846](https://github.com/jj-vcs/jj/issues/3846)
1554
1555
* `jj config set`/`--config` value parsing rule is relaxed in a way that
1556
unquoted apostrophes are allowed.
1557
[#5748](https://github.com/jj-vcs/jj/issues/5748)
1558
1559
* `jj fix` could previously create new conflicts when a descendant of a fixed
1560
revision was already correctly formatted.
1561
1562
### Contributors
1563
1564
Thanks to the people who made this release happen!
1565
1566
* Aleksey Kuznetsov (@zummenix)
1567
* Anton Älgmyr (@algmyr)
1568
* Austin Seipp (@thoughtpolice)
1569
* Baltasar Dinis (@bsdinis)
1570
* Benjamin Tan (@bnjmnt4n)
1571
* Brandon Hall (@tenkabuto)
1572
* Caleb White (@calebdw)
1573
* Daniel Luz (@mernen)
1574
* David Rieber (@drieber)
1575
* demize (@demize)
1576
* Emily (@emilazy)
1577
* Evan Mesterhazy (@emesterhazy)
1578
* Fedor Sheremetyev (@sheremetyev)
1579
* George Christou (@gechr)
1580
* Ilya Grigoriev (@ilyagr)
1581
* Jakob Hellermann (@jakobhellermann)
1582
* Jo Liss (@joliss)
1583
* Joachim Desroches (@jedesroches)
1584
* Johannes Altmanninger (@krobelus)
1585
* Jonathan Gilchrist (@jgilchrist)
1586
* Kenyon Ralph (@kenyon)
1587
* Lucas Garron (@lgarron)
1588
* Martin von Zweigbergk (@martinvonz)
1589
* Nick Pupko (@npupko)
1590
* Philip Metzger (@PhilipMetzger)
1591
* Raphael Borun Das Gupta (@das-g)
1592
* Remo Senekowitsch (@senekor)
1593
* Robin Stocker (@robinst)
1594
* Scott Taylor (@scott2000)
1595
* Siva Mahadevan (@svmhdvn)
1596
* Vincent Ging Ho Yim (@cenviity)
1597
* Yuya Nishihara (@yuja)
1598
1599
## [0.27.0] - 2025-03-05
1600
1601
### Release highlights
1602
1603
* `git.subprocess` is now enabled by default, improving compatibility with Git
1604
fetches and pushes by spawning an external `git` process. Users can opt out
1605
of this by setting `git.subprocess = false`, but this will likely be removed
1606
in a future release. Please report any issues you run into.
1607
1608
### Breaking changes
1609
1610
* Bookmark name to be created/updated is now parsed as [a revset
1611
symbol](docs/revsets.md#symbols). Quotation may be needed in addition to shell
1612
quotes. Example: `jj bookmark create -r@- "'name with space'"`
1613
1614
* `jj bookmark create`, `jj bookmark set` and `jj bookmark move` onto a hidden
1615
commit make it visible.
1616
1617
* `jj bookmark forget` now untracks any corresponding remote bookmarks instead
1618
of forgetting them, since forgetting a remote bookmark can be unintuitive.
1619
The old behavior is still available with the new `--include-remotes` flag.
1620
1621
* `jj fix` now always sets the working directory of invoked tools to be the
1622
workspace root, instead of the working directory of the `jj fix`.
1623
1624
* The `ui.allow-filesets` configuration option has been removed.
1625
[The "fileset" language](docs/filesets.md) has been enabled by default since v0.20.
1626
1627
* `templates.annotate_commit_summary` is renamed to `templates.file_annotate`,
1628
and now has an implicit `self` parameter of type `AnnotationLine`, instead of
1629
`Commit`. All methods on `Commit` can be accessed with `commit.method()`, or
1630
`self.commit().method()`.
1631
1632
### Deprecations
1633
1634
* This release takes the first steps to make target revision required in
1635
`bookmark create`, `bookmark move` and `bookmark set`. Those commands will display
1636
a warning if the user does not specify target revision explicitly. In the near
1637
future those commands will fail if target revision is not specified.
1638
1639
* The `signing.sign-all` config option has been deprecated in favor of
1640
`signing.behavior`. The new option accepts `drop` (never sign), `keep` (preserve
1641
existing signatures), `own` (sign own commits), or `force` (sign all commits).
1642
Existing `signing.sign-all = true` translates to `signing.behavior = "own"`, and
1643
`false` translates to `"keep"`. Invalid configuration is now an error.
1644
1645
### New features
1646
1647
* The new `jj sign` and `jj unsign` commands allow for signing/unsigning commits.
1648
`jj sign` supports configuring the default revset through `revsets.sign` when
1649
no `--revisions` arguments are provided.
1650
1651
* `jj git fetch` now supports [string pattern syntax](docs/revsets.md#string-patterns)
1652
on `--remote` option and `git.fetch` configuration.
1653
1654
* Template functions `truncate_start()` and `truncate_end()` gained an optional
1655
`ellipsis` parameter; passing this prepends or appends the ellipsis to the
1656
content if it is truncated to fit the maximum width.
1657
1658
* Templates now support `stringify(x)` function and string method
1659
`.escape_json()`. The latter serializes the string in JSON format. It is
1660
useful for making machine-readable templates by escaping problematic
1661
characters like `\n`.
1662
1663
* Templates now support `trim()`, `trim_start()` and `trim_end()` methods
1664
which remove whitespace from the start and end of a `String` type.
1665
1666
* The description of commits backed out by `jj backout` can now be configured
1667
using `templates.backout_description`.
1668
1669
* New `AnnotationLine` templater type. Used in `templates.file_annotate`.
1670
Provides `self.commit()`, `.content()`, `.line_number()`, and
1671
`.first_line_in_hunk()`.
1672
1673
* Templates now have `format_short_operation_id(id)` function for users to
1674
customize the default operation id representation.
1675
1676
* The `jj init`/`jj revert` stubs that print errors can now be overridden with
1677
aliases. All of `jj clone/init/revert` add a hint to a generic error.
1678
1679
* Help text is now colored (when stdout is a terminal).
1680
1681
* Commands that used to suggest `--ignore-immutable` now print the number of
1682
immutable commits that would be rewritten if used and a link to the docs.
1683
1684
* `jj undo` now shows a hint when undoing an undo operation that the user may
1685
be looking for `jj op restore` instead.
1686
1687
### Fixed bugs
1688
1689
* `jj status` now shows untracked files under untracked directories.
1690
[#5389](https://github.com/jj-vcs/jj/issues/5389)
1691
1692
* Added workaround for the bug that untracked files are ignored when watchman is
1693
enabled. [#5728](https://github.com/jj-vcs/jj/issues/5728)
1694
1695
* The `signing.backends.ssh.allowed-signers` configuration option will now
1696
expand `~/` to `$HOME/`.
1697
[#5626](https://github.com/jj-vcs/jj/pull/5626)
1698
1699
* `config-schema.json` now allows arrays of strings for the settings `ui.editor`
1700
and `ui.diff.tool`.
1701
1702
* `config-schema.json` now allows an array of strings or nested table for the
1703
`ui.pager` setting.
1704
1705
### Contributors
1706
1707
Thanks to the people who made this release happen!
1708
1709
* Alain Leufroy (@aleufroy)
1710
* Aleksey Kuznetsov (@zummenix)
1711
* Alexander Mikhailov (@AM5800)
1712
* Andrew Gilbert (@andyg0808)
1713
* Antoine Martin (@alarsyo)
1714
* Anton Bulakh (@necauqua)
1715
* Austin Seipp (@thoughtpolice)
1716
* Baltasar Dinis (@bsdinis)
1717
* Benjamin Tan (@bnjmnt4n)
1718
* Bryce Berger (@bryceberger)
1719
* Burak Varlı (@unexge)
1720
* David Rieber (@drieber)
1721
* Emily (@emilazy)
1722
* Evan Mesterhazy (@emesterhazy)
1723
* George Christou (@gechr)
1724
* HKalbasi (@HKalbasi)
1725
* Ilya Grigoriev (@ilyagr)
1726
* Jacob Hayes (@JacobHayes)
1727
* Jonathan Frere (@MrJohz)
1728
* Jonathan Tan (@jonathantanmy)
1729
* Josh Steadmon (@steadmon)
1730
* maan2003 (@maan2003)
1731
* Martin von Zweigbergk (@martinvonz)
1732
* Matthew Davidson (@KingMob)
1733
* Philip Metzger (@PhilipMetzger)
1734
* Philipp Albrecht (@pylbrecht)
1735
* Roman Timushev (@rtimush)
1736
* Samuel Tardieu (@samueltardieu)
1737
* Scott Taylor (@scott2000)
1738
* Stephan Hügel (@urschrei)
1739
* Vincent Ging Ho Yim (@cenviity)
1740
* Yuya Nishihara (@yuja)
1741
1742
## [0.26.0] - 2025-02-05
1743
1744
### Release highlights
1745
1746
* Improved Git push/fetch compatibility by spawning an external `git` process.
1747
This can be enabled by the `git.subprocess=true` config knob, and will be the
1748
default in a future release.
1749
1750
* `jj log` can now show cryptographic commit signatures. The output can be
1751
controlled by the `ui.show-cryptographic-signatures=true` config knob.
1752
1753
### Breaking changes
1754
1755
* `jj abandon` now deletes bookmarks pointing to the revisions to be abandoned.
1756
Use `--retain-bookmarks` to move bookmarks backwards. If deleted bookmarks
1757
were tracking remote bookmarks, the associated bookmarks (or branches) will be
1758
deleted from the remote on `jj git push --all`.
1759
[#3505](https://github.com/jj-vcs/jj/issues/3505)
1760
1761
* `jj init --git` and `jj init --git-repo` have been removed. They were
1762
deprecated in early 2024. Use `jj git init` instead.
1763
1764
* The following deprecated commands have been removed:
1765
- `jj cat` is replaced by `jj file show`.
1766
- `jj chmod` is replaced by `jj file chmod`.
1767
- `jj files` is replaced by `jj file list`.
1768
1769
* The deprecated `-l` short alias for `--limit` in `jj log`, `jj op log`
1770
and `jj obslog` has been removed. The `-n` short alias can be used instead.
1771
1772
* The deprecated `--siblings` options for `jj split` has been removed.
1773
`jj split --parallel` can be used instead.
1774
1775
* The deprecated `fix.tool-command` config option has been removed.
1776
1777
* In colocated repos, the Git index now contains the changes from all parents
1778
of the working copy instead of just the first parent (`HEAD`). 2-sided
1779
conflicts from the merged parents are now added to the Git index as conflicts
1780
as well.
1781
1782
* The following change introduced in 0.25.0 is reverted:
1783
- `jj config list` now prints inline tables `{ key = value, .. }` literally.
1784
Inner items of inline tables are no longer merged across configuration
1785
files.
1786
1787
* `jj resolve` will now attempt to resolve all conflicted files instead of
1788
resolving the first conflicted file. To resolve a single file, pass a file
1789
path to `jj resolve`.
1790
1791
* `jj util mangen` is replaced with `jj util install-man-pages`, which can
1792
install man pages for all `jj` subcommands to a given path.
1793
1794
* In `jj config list` template, `value` is now typed as `ConfigValue`, not as
1795
`String` serialized in TOML syntax.
1796
1797
* `jj git remote add`/`set-url` now converts relative Git remote path to
1798
absolute path.
1799
1800
* `jj log`/`op log` now applies `-n`/`--limit` *before* the items are reversed.
1801
Rationale: It's more useful to see the N most recent commits/operations, and
1802
is more performant. The old behavior can be achieved by `jj log .. | head`.
1803
[#5403](https://github.com/jj-vcs/jj/issues/5403)
1804
1805
* Upgraded `scm-record` from v0.4.0 to v0.5.0. See release notes at
1806
<https://github.com/arxanas/scm-record/releases/tag/v0.5.0>.
1807
1808
* The builtin pager is switched to
1809
[streampager](https://github.com/markbt/streampager/). It can handle large
1810
inputs better and can be configured.
1811
1812
* Conflicts materialized in the working copy before `jj 0.19.0` may no longer
1813
be parsed correctly. If you are using version 0.18.0 or earlier, check out a
1814
non-conflicted commit before upgrading to prevent issues.
1815
1816
### Deprecations
1817
1818
### New features
1819
1820
* `jj git {push,clone,fetch}` can now spawn an external `git` subprocess, via
1821
the `git.subprocess = true` config knob. This provides an alternative that,
1822
when turned on, fixes SSH bugs when interacting with Git remotes due to
1823
`libgit2`s limitations [#4979](https://github.com/jj-vcs/jj/issues/4979).
1824
1825
* `jj describe` now accepts `--edit`.
1826
1827
* `jj evolog` and `jj op log` now accept `--reversed`.
1828
1829
* `jj restore` now supports `-i`/`--interactive` selection.
1830
1831
* `jj file list` now supports templating.
1832
1833
* There is a new `builtin_op_log_oneline` template alias you can pass to `jj op
1834
log -T` for a more compact output. You can use `format_operation_oneline` and
1835
`format_snapshot_operation_oneline` to customize parts of it.
1836
1837
* New template function `config(name)` to access to configuration variable from
1838
template.
1839
1840
* New template function `pad_centered()` to center content within a minimum
1841
width.
1842
1843
* Templater now supports `list.filter(|x| ..)` method.
1844
1845
* The `diff` commit template keyword now supports custom formatting via
1846
`diff.files()`. For example, `diff.files().map(|e| e.path().display())` prints
1847
changed file paths.
1848
1849
* The `diff.stat()` template method now provides methods to get summary values.
1850
1851
* `jj log` can now show cryptographic commit signatures. The output can be
1852
controlled by the `ui.show-cryptographic-signatures=true` config knob. The
1853
signature template can be customized using
1854
`format_detailed_cryptographic_signature(signature)` and
1855
`format_short_cryptographic_signature(signature)`.
1856
1857
* New `git.sign-on-push` config option to automatically sign commits which are
1858
being pushed to a Git remote.
1859
1860
* New `git.push-new-bookmarks` config option to push new bookmarks without
1861
`--allow-new`.
1862
1863
* `jj status` now shows untracked files when they reside directly under a
1864
tracked directory. There's still an issue that files under untracked
1865
directories aren't listed. [#5389](https://github.com/jj-vcs/jj/issues/5389)
1866
1867
* New `merge-tools.<TOOL>.diff-expected-exit-codes` config option to suppress
1868
warnings from tools exiting with non-zero exit codes.
1869
1870
* New `fix.tools.TOOL.enabled` config option to enable/disable tools. This is
1871
useful for defining disabled tools in user configuration that can be enabled
1872
in individual repositories with one config setting.
1873
1874
* Added `--into` flag to `jj restore`, similarly to `jj squash` and `jj
1875
absorb`. It is equivalent to `--to`, but `--into` is the recommended name.
1876
1877
* Italic text is now supported. You can set e.g. `colors.error = { fg = "red",
1878
italic = true }` in your config.
1879
1880
* New `author_name`/`author_email`/`committer_name`/`committer_email(pattern)`
1881
revset functions to match either name or email field explicitly.
1882
1883
* New `subject(pattern)` revset function that matches first line of commit
1884
descriptions.
1885
1886
* Conditional configuration now supports `--when.commands` to change
1887
configuration based on subcommand.
1888
1889
* The Jujutsu documentation site now publishes a schema for the official
1890
configuration file, which can be integrated into your editor for autocomplete,
1891
inline errors, and more.
1892
Please [see the documentation](docs/config.md#json-schema-support) for more
1893
on this.
1894
1895
### Fixed bugs
1896
1897
* `jj git fetch` with multiple remotes will now fetch from all remotes before
1898
importing refs into the jj repo. This fixes a race condition where the
1899
treatment of a commit that is found in multiple fetch remotes depended on the
1900
order the remotes were specified.
1901
1902
* Fixed diff selection by external tools with `jj split`/`commit -i FILESETS`.
1903
[#5252](https://github.com/jj-vcs/jj/issues/5252)
1904
1905
* Conditional configuration now applies when initializing new repository.
1906
[#5144](https://github.com/jj-vcs/jj/issues/5144)
1907
1908
* `[diff.<format>]` configuration now applies to `.diff().<format>()` commit
1909
template methods.
1910
1911
* Conflicts at the end of files which don't end with a newline character are
1912
now materialized in a way that can be parsed correctly.
1913
[#3968](https://github.com/jj-vcs/jj/issues/3968)
1914
1915
* Bookmark and remote names written by `jj git clone` to
1916
`revset-aliases.'trunk()'` are now escaped if necessary.
1917
[#5359](https://github.com/jj-vcs/jj/issues/5359)
1918
1919
### Contributors
1920
1921
Thanks to the people who made this release happen!
1922
1923
* Angel Ezquerra (@AngelEzquerra)
1924
* Antoine Martin (@alarsyo)
1925
* Anton Bulakh (@necauqua)
1926
* Austin Seipp (@thoughtpolice)
1927
* Baltasar Dinis (@bsdinis)
1928
* Benjamin Tan (@bnjmnt4n)
1929
* blinry (@blinry)
1930
* Bryce Berger (@bryceberger)
1931
* Charlie-83 (@Charlie-83)
1932
* Christian Stoitner (@cstoitner)
1933
* Evan Martin (@evmar)
1934
* George Christou (@gechr)
1935
* Ilya Grigoriev (@ilyagr)
1936
* Jakob Hellermann (@jakobhellermann)
1937
* JDSeiler (@JDSeiler)
1938
* Jonathan Frere (@MrJohz)
1939
* Jonathan Gilchrist (@jgilchrist)
1940
* Josh Steadmon (@steadmon)
1941
* Martin von Zweigbergk (@martinvonz)
1942
* Matt Kulukundis (@fowles)
1943
* Ollivier Robert (@keltia)
1944
* Philip Metzger (@PhilipMetzger)
1945
* Philipp Albrecht (@pylbrecht)
1946
* Robert Jackson (@rwjblue)
1947
* Samuel Tardieu (@samueltardieu)
1948
* Scott Taylor (@scott2000)
1949
* Stephen Jennings (@jennings)
1950
* Valentin Gatien-Baron (@v-gb)
1951
* Vincent Ging Ho Yim (@cenviity)
1952
* Waleed Khan (@arxanas)
1953
* Yuya Nishihara (@yuja)
1954
1955
## [0.25.0] - 2025-01-01
1956
1957
### Release highlights
1958
1959
It's the holidays, and this release was overall pretty quiet, without many major
1960
changes. Two select improvements:
1961
1962
* Improvements to configuration management, including support for [conditional
1963
variables](docs/config.md#conditional-variables) in config files.
1964
1965
* Large files in the working copy will no longer cause commands to fail; instead
1966
the large files will remain intact but untracked in the working copy.
1967
1968
### Breaking changes
1969
1970
* Configuration variables are no longer "stringly" typed. For example, `true` is
1971
not converted to a string `"true"`, and vice versa.
1972
1973
* The following configuration variables are now parsed strictly:
1974
`colors.<labels>`, `git.abandon-unreachable-commits`,
1975
`git.auto-local-bookmark`, `git.push-bookmark-prefix`, `revsets.log`,
1976
`revsets.short-prefixes`, `signing.backend`, `operation.hostname`,
1977
`operation.username`, `ui.allow-init-native`, `ui.color`,
1978
`ui.default-description`, `ui.progress-indicator`, `ui.quiet`, `user.email`,
1979
`user.name`
1980
1981
* `jj config list` now prints inline tables `{ key = value, .. }` literally.
1982
Inner items of inline tables are no longer merged across configuration files.
1983
See [the table syntax
1984
documentation](docs/config.md#dotted-style-and-headings) for
1985
details.
1986
1987
* `jj config edit --user` now opens a file even if `$JJ_CONFIG` points to a
1988
directory. If there are multiple config files, the command will fail.
1989
1990
* `jj config set` no longer accepts a bare string value that looks like a TOML
1991
expression. For example, `jj config set NAME '[foo]'` must be quoted as `jj
1992
config set NAME '"[foo]"'`.
1993
1994
* The deprecated `[alias]` config section is no longer respected. Move command
1995
aliases to the `[aliases]` section.
1996
1997
* `jj absorb` now abandons the source commit if it becomes empty and has no
1998
description.
1999
2000
### Deprecations
2001
2002
* `--config-toml=TOML` is deprecated in favor of `--config=NAME=VALUE` and
2003
`--config-file=PATH`.
2004
2005
* The `Signature.username()` template method is deprecated for
2006
`Signature.email().local()`.
2007
2008
### New features
2009
2010
* `jj` command no longer fails due to new working-copy files larger than the
2011
`snapshot.max-new-file-size` config option. It will print a warning and large
2012
files will be left untracked.
2013
2014
* Configuration files now support [conditional
2015
variables](docs/config.md#conditional-variables).
2016
2017
* New command options `--config=NAME=VALUE` and `--config-file=PATH` to set
2018
string value without quoting and to load additional configuration from files.
2019
2020
* Templates now support the `>=`, `>`, `<=`, and `<` relational operators for
2021
`Integer` types.
2022
2023
* A new Email template type is added. `Signature.email()` now returns an Email
2024
template type instead of a String.
2025
2026
* Adds a new template alias `commit_timestamp(commit)` which defaults to the
2027
committer date.
2028
2029
* Conflict markers are now allowed to be longer than 7 characters, allowing
2030
conflicts to be materialized and parsed correctly in files which already
2031
contain lines that look like conflict markers.
2032
2033
* New `$marker_length` variable to allow merge tools to support longer conflict
2034
markers (equivalent to "%L" for Git merge drivers).
2035
2036
* `jj describe` now accepts a `JJ: ignore-rest` line that ignores everything
2037
below it, similar to a "scissor line" in git. When editing multiple commits,
2038
only ignore until the next `JJ: describe` line.
2039
2040
### Fixed bugs
2041
2042
* The `$NO_COLOR` environment variable must now be non-empty to be respected.
2043
2044
* Fixed incompatible rendering of empty hunks in git/unified diffs.
2045
[#5049](https://github.com/jj-vcs/jj/issues/5049)
2046
2047
* Fixed performance of progress bar rendering when fetching from Git remote.
2048
[#5057](https://github.com/jj-vcs/jj/issues/5057)
2049
2050
* `jj config path --user` no longer creates new file at the default config path.
2051
2052
* On Windows, workspace paths (printed by `jj root`) no longer use UNC-style
2053
`\\?\` paths unless necessary.
2054
2055
* On Windows, `jj git clone` now converts local Git remote path to
2056
slash-separated path.
2057
2058
* `jj resolve` no longer removes the executable bit on resolved files when using
2059
an external merge tool.
2060
2061
### Contributors
2062
2063
Thanks to the people who made this release happen!
2064
2065
* Alex Stefanov (@umnikos)
2066
* Anton Älgmyr (@algmyr)
2067
* Austin Seipp (@thoughtpolice)
2068
* Benjamin Tan (@bnjmnt4n)
2069
* Bryce Berger (@bryceberger)
2070
* Daniel Ploch (@torquestomp)
2071
* David Crespo (@david-crespo)
2072
* George Tsiamasiotis (@gtsiam)
2073
* Jochen Kupperschmidt (@homeworkprod)
2074
* Keane Nguyen (@keanemind)
2075
* Martin von Zweigbergk (@martinvonz)
2076
* Matt Kulukundis (@fowles)
2077
* Milo Moisson (@mrnossiom)
2078
* petricavalry (@petricavalry)
2079
* Philip Metzger (@PhilipMetzger)
2080
* Remo Senekowitsch (@senekor)
2081
* Scott Taylor (@scott2000)
2082
* Shane Sveller (@shanesveller)
2083
* Stephen Jennings (@jennings)
2084
* Tim Janik (@tim-janik)
2085
* Vamsi Avula (@avamsi)
2086
* Waleed Khan (@arxanas)
2087
* Yuya Nishihara (@yuja)
2088
2089
## [0.24.0] - 2024-12-04
2090
2091
### Release highlights
2092
2093
* New [`jj absorb`](https://jj-vcs.github.io/jj/latest/cli-reference/#jj-absorb) command automatically squashes changes from the current commit into relevant ancestor commits.
2094
2095
* Experimental dynamic shell completions have been added; see [the docs](https://jj-vcs.github.io/jj/latest/install-and-setup/#command-line-completion) for configuration.
2096
2097
* [`jj duplicate`](https://jj-vcs.github.io/jj/latest/cli-reference/#jj-duplicate) now accepts `--destination`/`--insert-before`/`--insert-after`.
2098
2099
* Some deprecated commands have been removed (`jj move`, `jj checkout`, `jj merge`).
2100
2101
### Breaking changes
2102
2103
* `jj move` has been removed. It was deprecated in 0.16.0.
2104
2105
* `jj checkout` and the built-in alias `jj co` have been removed.
2106
It was deprecated in 0.14.0.
2107
2108
* `jj merge` has been removed. It was deprecated in 0.14.0.
2109
2110
* `jj git push` no longer pushes new bookmarks by default. Use `--allow-new` to
2111
bypass this restriction.
2112
2113
* Lines prefixed with "JJ:" in commit descriptions and in sparse patterns (from
2114
`jj sparse edit`) are now stripped even if they are not immediately followed
2115
by a space. [#5004](https://github.com/jj-vcs/jj/issues/5004)
2116
2117
### Deprecations
2118
2119
### New features
2120
2121
* Templates now support the `==` and `!=` logical operators for `Boolean`,
2122
`Integer`, and `String` types.
2123
2124
* New command `jj absorb` that moves changes to stack of mutable revisions.
2125
2126
* New command `jj util exec` that can be used for arbitrary aliases.
2127
2128
* `jj rebase -b` can now be used with the `--insert-after` and `--insert-before`
2129
options, like `jj rebase -r` and `jj rebase -s`.
2130
2131
* A preview of improved shell completions was added. Please refer to the
2132
[documentation](https://jj-vcs.github.io/jj/latest/install-and-setup/#command-line-completion)
2133
to activate them. They additionally complete context-dependent, dynamic values
2134
like bookmarks, aliases, revisions, operations and files.
2135
2136
* Added the config setting `snapshot.auto-update-stale` for automatically
2137
running `jj workspace update-stale` when applicable.
2138
2139
* `jj duplicate` now accepts `--destination`, `--insert-after` and
2140
`--insert-before` options to customize the location of the duplicated
2141
revisions.
2142
2143
* `jj log` now displays the working-copy branch first.
2144
2145
* New `fork_point()` revset function can be used to obtain the fork point
2146
of multiple commits.
2147
2148
* The `tags()` revset function now takes an optional `pattern` argument,
2149
mirroring that of `bookmarks()`.
2150
2151
* Several commands now support `-f/-t` shorthands for `--from/--to`:
2152
- `diff`
2153
- `diffedit`
2154
- `interdiff`
2155
- `op diff`
2156
- `restore`
2157
2158
* New `ui.conflict-marker-style` config option to change how conflicts are
2159
materialized in the working copy. The default option ("diff") renders
2160
conflicts as a snapshot with a list of diffs to apply to the snapshot.
2161
The new "snapshot" option renders conflicts as a series of snapshots, showing
2162
each side and base of the conflict. The new "git" option replicates Git's
2163
"diff3" conflict style, meaning it is more likely to work with external tools,
2164
but it doesn't support conflicts with more than 2 sides.
2165
2166
* New `merge-tools.<TOOL>.conflict-marker-style` config option to override the
2167
conflict marker style used for a specific merge tool.
2168
2169
* New `merge-tools.<TOOL>.merge-conflict-exit-codes` config option to allow a
2170
merge tool to exit with a non-zero code to indicate that not all conflicts
2171
were resolved.
2172
2173
* `jj simplify-parents` now supports configuring the default revset when no
2174
`--source` or `--revisions` arguments are provided with the
2175
`revsets.simplify-parents` config.
2176
2177
### Fixed bugs
2178
2179
* `jj config unset <TABLE-NAME>` no longer removes a table (such as `[ui]`.)
2180
2181
### Contributors
2182
2183
Thanks to the people who made this release happen!
2184
2185
* Austin Seipp (@thoughtpolice)
2186
* Benjamin Tan (@bnjmnt4n)
2187
* Daniel Ploch (@torquestomp)
2188
* Emily (@neongreen)
2189
* Essien Ita Essien (@essiene)
2190
* Herman J. Radtke III (@hjr3)
2191
* Ilya Grigoriev (@ilyagr)
2192
* Joaquín Triñanes (@JoaquinTrinanes)
2193
* Lars Francke (@lfrancke)
2194
* Luke Randall (@lukerandall)
2195
* Martin von Zweigbergk (@martinvonz)
2196
* Nathanael Huffman (@nathanaelhuffman)
2197
* Philip Metzger (@PhilipMetzger)
2198
* Remo Senekowitsch (@senekor)
2199
* Robin Stocker (@robinst)
2200
* Scott Taylor (@scott2000)
2201
* Shane Sveller (@shanesveller)
2202
* Tim Janik (@tim-janik)
2203
* Yuya Nishihara (@yuja)
2204
2205
## [0.23.0] - 2024-11-06
2206
2207
### Security fixes
2208
2209
* Fixed path traversal by cloning/checking out crafted Git repository containing
2210
`..`, `.jj`, `.git` paths.
2211
([GHSA-88h5-6w7m-5w56](https://github.com/jj-vcs/jj/security/advisories/GHSA-88h5-6w7m-5w56);CVE-2024-51990)
2212
2213
### Breaking changes
2214
2215
* Revset function names can no longer start with a number.
2216
2217
* Evaluation error of `revsets.short-prefixes` configuration is now reported.
2218
2219
* The `HEAD@git` symbol no longer resolves to the Git HEAD revision. Use
2220
`git_head()` or `@-` revset expression instead. The `git_head` template
2221
keyword now returns a boolean.
2222
2223
* Help command doesn't work recursively anymore, i.e. `jj workspace help root`
2224
doesn't work anymore.
2225
2226
* The color label `op_log` from the `[colors]` config section now **only**
2227
applies to the op log and not to the other places operations are displayed. In
2228
almost all cases, if you configured `op_log` before, you should use the new
2229
`operation` label instead.
2230
2231
* Default operation log template now shows end times of operations instead of
2232
start times.
2233
2234
### Deprecations
2235
2236
* `git.auto-local-bookmark` replaces `git.auto-local-branch`. The latter remains
2237
supported for now (at lower precedence than the former).
2238
2239
### New features
2240
2241
* Added diff options to ignore whitespace when comparing lines. Whitespace
2242
changes are still highlighted.
2243
2244
* New command `jj simplify-parents` will remove redundant parent edges.
2245
2246
* `jj squash` now supports `-f/-t` shorthands for `--from/--[in]to`.
2247
2248
* Initial support for shallow Git repositories has been implemented. However,
2249
deepening the history of a shallow repository is not yet supported.
2250
2251
* `jj git clone` now accepts a `--depth <DEPTH>` option, which
2252
allows to clone the repository with a given depth.
2253
2254
* New command `jj file annotate` that annotates files line by line. This is similar
2255
in functionality to `git blame`. Invoke the command with `jj file annotate <file_path>`.
2256
The output can be customized via the `templates.annotate_commit_summary`
2257
config variable.
2258
2259
* `jj bookmark list` gained a `--remote REMOTE` option to display bookmarks
2260
belonging to a remote. This option can be combined with `--tracked` or
2261
`--conflicted`.
2262
2263
* New command `jj config unset` that unsets config values. For example,
2264
`jj config unset --user user.name`.
2265
2266
* `jj help` now has the flag `--keyword` (shorthand `-k`), which can give help
2267
for some keywords (e.g. `jj help -k revsets`). To see a list of the available
2268
keywords you can do `jj help --help`.
2269
2270
* New `at_operation(op, expr)` revset can be used in order to query revisions
2271
based on historical state.
2272
2273
* String literals in filesets, revsets and templates now support hex bytes
2274
(with `\e` as escape / shorthand for `\x1b`).
2275
2276
* New `coalesce(revsets...)` revset which returns commits in the first revset
2277
in the `revsets` list that does not evaluate to `none()`.
2278
2279
* New template function `raw_escape_sequence(...)` preserves escape sequences.
2280
2281
* Timestamp objects in templates now have `after(date) -> Boolean` and
2282
`before(date) -> Boolean` methods for comparing timestamps to other dates.
2283
2284
* New template functions `pad_start()`, `pad_end()`, `truncate_start()`, and
2285
`truncate_end()` are added.
2286
2287
* Add a new template alias `builtin_log_compact_full_description()`.
2288
2289
* Added the config settings `diff.color-words.context` and `diff.git.context` to
2290
control the default number of lines of context shown.
2291
2292
### Fixed bugs
2293
2294
* Error on `trunk()` revset resolution is now handled gracefully.
2295
[#4616](https://github.com/jj-vcs/jj/issues/4616)
2296
2297
* Updated the built-in diff editor `scm-record` to version
2298
[0.4.0](https://github.com/arxanas/scm-record/releases/tag/v0.4.0), which
2299
includes multiple fixes.
2300
2301
### Contributors
2302
2303
Thanks to the people who made this release happen!
2304
2305
* Alec Snyder (@allonsy)
2306
* Arthur Grillo (Grillo-0)
2307
* Austin Seipp (@thoughtpolice)
2308
* Benjamin Tan (@bnjmnt4n)
2309
* Dave Townsend (@Mossop)
2310
* Daniel Ploch (@torquestomp)
2311
* Emily (@neongreen)
2312
* Essien Ita Essien (@essiene)
2313
* Fedor Sheremetyev (@sheremetyev)
2314
* Ilya Grigoriev (@ilyagr)
2315
* Jakub Okoński (@farnoy)
2316
* Jcparkyn (@Jcparkyn)
2317
* Joaquín Triñanes (@JoaquinTrinanes)
2318
* Lukas Wirth (@Veykril)
2319
* Marco Neumann (@crepererum)
2320
* Martin von Zweigbergk (@martinvonz)
2321
* Matt Stark (@matts1)
2322
* Philip Metzger (@PhilipMetzger)
2323
* Philipp Albrecht (@pylbrecht)
2324
* Remo Senekowitsch (@senekor)
2325
* Richard Macklin (@rmacklin)
2326
* Robin Stocker (@robinst)
2327
* Samuel Tardieu (@samueltardieu)
2328
* Sora (@SoraTenshi)
2329
* Stephen Jennings (@jennings)
2330
* Theodore Ehrenborg (@TheodoreEhrenborg)
2331
* Vamsi Avula (@avamsi)
2332
* Vincent Ging Ho Yim (@cenviity)
2333
* Yuya Nishihara (@yuja)
2334
2335
## [0.22.0] - 2024-10-02
2336
2337
### Breaking changes
2338
2339
* Fixing [#4239](https://github.com/jj-vcs/jj/issues/4239) means the
2340
ordering of some messages have changed.
2341
2342
* Invalid `ui.graph.style` configuration is now an error.
2343
2344
* The builtin template `branch_list` has been renamed to `bookmark_list` as part
2345
of the `jj branch` deprecation.
2346
2347
### Deprecations
2348
2349
* `jj branch` has been deprecated in favor of `jj bookmark`.
2350
2351
**Rationale:** Jujutsu's branches don't behave like Git branches, which a
2352
confused many newcomers, as they expected a similar behavior given the name.
2353
We've renamed them to "bookmarks" to match the actual behavior, as we think
2354
that describes them better, and they also behave similar to Mercurial's
2355
bookmarks.
2356
2357
* `jj obslog` is now called `jj evolution-log`/`jj evolog`. `jj obslog` remains
2358
as an alias.
2359
2360
* `jj unsquash` has been deprecated in favor of `jj squash` and
2361
`jj diffedit --restore-descendants`.
2362
2363
**Rationale:** `jj squash` can be used in interactive mode to pull
2364
changes from one commit to another, including from a parent commit
2365
to a child commit. For fine-grained dependent diffs, such as when
2366
the parent and the child commits must successively modify the same
2367
location in a file, `jj diffedit --restore-descendants` can be used
2368
to set the parent commit to the desired content without altering the
2369
content of the child commit.
2370
2371
* The `git.push-branch-prefix` config has been deprecated in favor of
2372
`git.push-bookmark-prefix`.
2373
2374
* `conflict()` and `file()` revsets have been renamed to `conflicts()` and `files()`
2375
respectively. The old names are still around and will be removed in a future
2376
release.
2377
2378
### New features
2379
2380
* The new config option `snapshot.auto-track` lets you automatically track only
2381
the specified paths (all paths by default). Use the new `jj file track`
2382
command to manually tracks path that were not automatically tracked. There is
2383
no way to list untracked files yet. Use `git status` in a colocated workspace
2384
as a workaround.
2385
[#323](https://github.com/jj-vcs/jj/issues/323)
2386
2387
* `jj fix` now allows fixing unchanged files with the `--include-unchanged-files` flag. This
2388
can be used to more easily introduce automatic formatting changes in a new
2389
commit separate from other changes.
2390
2391
* `jj workspace add` now accepts a `--sparse-patterns=<MODE>` option, which
2392
allows control of the sparse patterns for a newly created workspace: `copy`
2393
(inherit from parent; default), `full` (full working copy), or `empty` (the
2394
empty working copy).
2395
2396
* New command `jj workspace rename` that can rename the current workspace.
2397
2398
* `jj op log` gained an option to include operation diffs.
2399
2400
* `jj git clone` now accepts a `--remote <REMOTE NAME>` option, which
2401
allows to set a name for the remote instead of using the default
2402
`origin`.
2403
2404
* `jj op undo` now reports information on the operation that has been undone.
2405
2406
* `jj squash`: the `-k` flag can be used as a shorthand for `--keep-emptied`.
2407
2408
* CommitId / ChangeId template types now support `.normal_hex()`.
2409
2410
* `jj commit` and `jj describe` now accept `--author` option allowing to quickly change
2411
author of given commit.
2412
2413
* `jj diffedit`, `jj abandon`, and `jj restore` now accept a `--restore-descendants`
2414
flag. When used, descendants of the edited or deleted commits will keep their original
2415
content.
2416
2417
* `jj git fetch -b <remote-git-branch-name>` will now warn if the branch(es)
2418
can not be found in any of the specified/configured remotes.
2419
2420
* `jj split` now lets the user select all changes in interactive mode. This may be used
2421
to keeping all changes into the first commit while keeping the current commit
2422
description for the second commit (the newly created empty one).
2423
2424
* Author and committer names are now yellow by default.
2425
2426
### Fixed bugs
2427
2428
* Update working copy before reporting changes. This prevents errors during reporting
2429
from leaving the working copy in a stale state.
2430
2431
* Fixed panic when parsing invalid conflict markers of a particular form.
2432
([#2611](https://github.com/jj-vcs/jj/pull/2611))
2433
2434
* Editing a hidden commit now makes it visible.
2435
2436
* The `present()` revset now suppresses missing working copy error. For example,
2437
`present(@)` evaluates to `none()` if the current workspace has no
2438
working-copy commit.
2439
2440
### Contributors
2441
2442
Thanks to the people who made this release happen!
2443
2444
* Austin Seipp (@thoughtpolice)
2445
* Danny Hooper (@hooper)
2446
* Emily Shaffer (@nasamuffin)
2447
* Essien Ita Essien (@essiene)
2448
* Ethan Brierley (@eopb)
2449
* Ilya Grigoriev (@ilyagr)
2450
* Kevin Liao (@kevincliao)
2451
* Lukas Wirth (@Veykril)
2452
* Martin von Zweigbergk (@martinvonz)
2453
* Mateusz Mikuła (@mati865)
2454
* mlcui (@mlcui-corp)
2455
* Philip Metzger (@PhilipMetzger)
2456
* Samuel Tardieu (@samueltardieu)
2457
* Stephen Jennings (@jennings)
2458
* Tyler Goffinet (@qubitz)
2459
* Vamsi Avula (@avamsi)
2460
* Yuya Nishihara (@yuja)
2461
2462
## [0.21.0] - 2024-09-04
2463
2464
### Breaking changes
2465
2466
* `next/prev` will no longer infer when to go into edit mode when moving from
2467
commit to commit. It now either follows the flags `--edit|--no-edit` or it
2468
gets the mode from `ui.movement.edit`.
2469
2470
### Deprecations
2471
2472
* `jj untrack` has been renamed to `jj file untrack`.
2473
2474
### New features
2475
2476
* Add new boolean config knob, `ui.movement.edit` for controlling the behavior
2477
of `prev/next`. The flag turns `edit` mode `on` and `off` permanently when set
2478
respectively to `true` or `false`.
2479
2480
* All diff formats except `--name-only` now include information about copies and
2481
moves. So do external diff tools in file-by-file mode. `jj status` also
2482
includes information about copies and moves.
2483
2484
* Color-words diff has gained [an option to display complex changes as separate
2485
lines](docs/config.md#color-words-diff-options). It's enabled by default. To
2486
restore the old behavior, set `diff.color-words.max-inline-alternation = -1`.
2487
2488
* A tilde (`~`) at the start of the path will now be expanded to the user's home
2489
directory when configuring a `signing.key` for SSH commit signing.
2490
2491
* When reconfiguring the author, warn that the working copy won't be updated
2492
2493
* `jj rebase -s` can now be used with the `--insert-after` and `--insert-before`
2494
options, like `jj rebase -r`.
2495
2496
### Fixed bugs
2497
2498
* Release binaries for Intel Macs have been restored. They were previously
2499
broken due to using a sunset version of GitHub's macOS runners (but nobody had
2500
previously complained.)
2501
2502
### Contributors
2503
2504
Thanks to the people who made this release happen!
2505
2506
* Aaron Bull Schaefer (@elasticdog)
2507
* Austin Seipp (@thoughtpolice)
2508
* Benjamin Tan (@bnjmnt4n)
2509
* Raniz Daniel Raneland (@Raniz85)
2510
* Daniel Ploch (@torquestomp)
2511
* Essien Ita Essien (@essiene)
2512
* Ilya Grigoriev (@ilyagr)
2513
* Kaleb Pace (@kalebpace)
2514
* Marie (@NyCodeGHG)
2515
* Marijan Smetko (@InCogNiTo124)
2516
* Martin von Zweigbergk (@martinvonz)
2517
* Matt Kulukundis (@fowles)
2518
* Scott Taylor (@scott2000)
2519
* Stephen Jennings (@jennings)
2520
* tingerrr (@tingerrr)
2521
* Yuya Nishihara (@yuja)
2522
2523
## [0.20.0] - 2024-08-07
2524
2525
### Note to packagers
2526
2527
* `jj` now links `libgit2` statically by default. To use dynamic linking, you
2528
need to set the environment variable `LIBGIT2_NO_VENDOR=1` while compiling.
2529
([#4163](https://github.com/jj-vcs/jj/pull/4163))
2530
2531
### Breaking changes
2532
2533
* `jj rebase --skip-empty` has been renamed to `jj rebase --skip-emptied`
2534
2535
* `jj backout --revision` has been renamed to `jj backout --revisions`.
2536
The short alias `-r` is still supported.
2537
2538
* [The default `immutable_heads()` set](docs/config.md#set-of-immutable-commits)
2539
now includes `untracked_remote_branches()` with the assumption that untracked
2540
branches aren't managed by you. Therefore, untracked branches are no longer
2541
displayed in `jj log` by default.
2542
2543
* Updated defaults for graph node symbol templates `templates.log_node` and
2544
`templates.op_log_node`.
2545
2546
* [The "fileset" language](docs/filesets.md) is now enabled by default. It can
2547
still be disabled by setting `ui.allow-filesets=false`.
2548
2549
* On `jj git fetch`/`import`, commits referred to by `HEAD@git` are no longer
2550
preserved. If a checked-out named branch gets deleted locally or remotely, the
2551
corresponding commits will be abandoned.
2552
2553
* `jj --at-op=@` no longer merges concurrent operations if explicitly specified.
2554
2555
* `jj obslog -p` no longer shows diffs at non-partial squash operations.
2556
Previously, it showed the same diffs as the second predecessor.
2557
2558
### Deprecations
2559
2560
* The original configuration syntax for `jj fix` is now deprecated in favor of
2561
one that allows defining multiple tools that can affect different filesets.
2562
These can be used in combination for now. See `jj help fix` for details.
2563
2564
### New features
2565
2566
* Define `immutable_heads()` revset alias in terms of a new `builtin_immutable_heads()`.
2567
This enables users to redefine `immutable_heads()` as they wish, but still
2568
have `builtin_immutable_heads()` which should not be redefined.
2569
2570
* External diff tools can now be configured to invoke the tool on each file
2571
individually instead of being passed a directory by setting
2572
`merge-tools.$TOOL.diff-invocation-mode="file-by-file"` in config.toml.
2573
2574
* In git diffs, word-level hunks are now highlighted with underline. See [diff
2575
colors and styles](docs/config.md#diff-colors-and-styles) for customization.
2576
2577
* New `.diff().<format>()` commit template methods are added. They can be used
2578
in order to show diffs conditionally. For example,
2579
`if(current_working_copy, diff.summary())`.
2580
2581
* `jj git clone` and `jj git init` with an existing git repository adds the
2582
default branch of the remote as repository settings for
2583
`revset-aliases."trunk()"`.`
2584
2585
* `jj workspace forget` now abandons the workspace's working-copy commit if it
2586
was empty.
2587
2588
* `jj backout` now includes the backed out commit's subject in the new commit
2589
message.
2590
2591
* `jj backout` can now back out multiple commits at once.
2592
2593
* `jj git clone some/nested/path` now creates the full directory tree for
2594
nested destination paths if they don't exist.
2595
2596
* String patterns now support case‐insensitive matching by suffixing any
2597
pattern kind with `-i`. `mine()` uses case‐insensitive matching on your email
2598
address unconditionally. Only ASCII case folding is currently implemented,
2599
but this will likely change in the future.
2600
2601
* String patterns now support `regex:"pattern"`.
2602
2603
* New `tracked_remote_branches()` and `untracked_remote_branches()` revset
2604
functions can be used to select tracked/untracked remote branches.
2605
2606
* The `file()` revset function now accepts fileset as argument.
2607
2608
* New `diff_contains()` revset function can be used to search diffs.
2609
2610
* New command `jj operation diff` that can compare changes made between two
2611
operations.
2612
2613
* New command `jj operation show` that can show the changes made in a single
2614
operation.
2615
2616
* New config setting `git.private-commits` to prevent commits from being pushed.
2617
2618
* [The default commit description template](docs/config.md#default-description)
2619
can now be configured by `templates.draft_commit_description`.
2620
2621
* `jj fix` can now be configured to run different tools on different filesets.
2622
This simplifies the use case of configuring code formatters for specific file
2623
types. See `jj help fix` for details.
2624
2625
* Added revset functions `author_date` and `committer_date`.
2626
2627
* `jj describe` can now update the description of multiple commits.
2628
2629
### Fixed bugs
2630
2631
* `jj status` will show different messages in a conflicted tree, depending
2632
on the state of the working commit. In particular, if a child commit fixes
2633
a conflict in the parent, this will be reflected in the hint provided
2634
by `jj status`
2635
2636
* `jj diff --git` no longer shows the contents of binary files.
2637
2638
* Windows binaries no longer require `vcruntime140.dll` to be installed
2639
(normally through Visual Studio.)
2640
2641
* On quit, the builtin pager no longer waits for all outputs to be discarded.
2642
2643
* `jj branch rename` no longer shows a warning in colocated repos.
2644
2645
### Contributors
2646
2647
Thanks to the people who made this release happen!
2648
2649
* Anton Älgmyr (@algmyr)
2650
* Austin Seipp (@thoughtpolice)
2651
* Benjamin Tan (@bnjmnt4n)
2652
* Daniel Ploch (@torquestomp)
2653
* Danny Hooper (@hooper)
2654
* Emily (@emilazy)
2655
* Essien Ita Essien (@essiene)
2656
* Fedor Sheremetyev (@sheremetyev)
2657
* Ilya Grigoriev (@ilyagr)
2658
* Jonathan Tan (@jonathantanmy)
2659
* Julien Vincent (@julienvincent)
2660
* Martin von Zweigbergk (@martinvonz)
2661
* Matt Kulukundis (@fowles)
2662
* Matt Stark (@matts1)
2663
* mlcui (@mlcui-corp)
2664
* Philip Metzger (@PhilipMetzger)
2665
* Scott Taylor (@scott2000)
2666
* Skyler Grey (@Minion3665)
2667
* Stephen Jennings (@jennings)
2668
* Tim Janik (@tim-janik)
2669
* Vincent Ging Ho Yim (@cenviity)
2670
* Vladimír Čunát (@vcunat)
2671
* Vladimir (@0xdeafbeef)
2672
* Yuya Nishihara (@yuja)
2673
2674
## [0.19.0] - 2024-07-03
2675
2676
### Breaking changes
2677
2678
* In revset aliases, top-level `kind:pattern` expression is now parsed as
2679
modifier. Surround with parentheses if it should be parsed as string/file
2680
pattern.
2681
2682
* Dropped support for automatic upgrade of repo formats used by versions before
2683
0.12.0.
2684
2685
* `jj fix` now defaults to the broader revset `-s reachable(@, mutable())`
2686
instead of `-s @`.
2687
2688
* Dropped support for deprecated `jj branch delete`/`forget` `--glob` option.
2689
2690
* `jj branch set` now creates new branch if it doesn't exist. Use `jj branch
2691
move` to ensure that the target branch already exists.
2692
[#3584](https://github.com/jj-vcs/jj/issues/3584)
2693
2694
### Deprecations
2695
2696
* Replacing `-l` shorthand for `--limit` with `-n` in `jj log`, `jj op log`
2697
and `jj obslog`.
2698
2699
* `jj split --siblings` is deprecated in favor of `jj split --parallel` (to
2700
match `jj parallelize`).
2701
2702
* A new `jj file` subcommand now replaces several existing uncategorized
2703
commands, which are deprecated.
2704
- `jj file show` replaces `jj cat`.
2705
- `jj file chmod` replaces `jj chmod`.
2706
- `jj file list` replaces `jj files`.
2707
2708
### New features
2709
2710
* Support background filesystem monitoring via watchman triggers enabled with
2711
the `core.watchman.register_snapshot_trigger = true` config.
2712
2713
* Show paths to config files when configuration errors occur.
2714
2715
* `jj fix` now supports configuring the default revset for `-s` using the
2716
`revsets.fix` config.
2717
2718
* The `descendants()` revset function now accepts an optional `depth` argument;
2719
like the `ancestors()` depth argument, it limits the depth of the set.
2720
2721
* Revset/template aliases now support function overloading.
2722
[#2966](https://github.com/jj-vcs/jj/issues/2966)
2723
2724
* Conflicted files are individually simplified before being materialized.
2725
2726
* The `jj file` subcommand now contains several existing file utilities.
2727
- `jj file show`, replacing `jj cat`.
2728
- `jj file chmod` replacing `jj chmod`.
2729
- `jj file list` replacing `jj files`.
2730
2731
* New command `jj branch move` let you update branches by name pattern or source
2732
revision.
2733
2734
* New diff option `jj diff --name-only` allows for easier shell scripting.
2735
2736
* In color-words diffs, hunks are now highlighted with underline. See [diff
2737
colors and styles](docs/config.md#diff-colors-and-styles) for customization.
2738
2739
* `jj git push -c <arg>` can now accept revsets that resolve to multiple
2740
revisions. This means that `jj git push -c xyz -c abc` is now equivalent to
2741
`jj git push -c 'all:(xyz | abc)'`.
2742
2743
* `jj prev` and `jj next` have gained a `--conflict` flag which moves you
2744
to the next conflict in a child commit.
2745
2746
* New command `jj git remote set-url` that sets the url of a git remote.
2747
2748
* Author timestamp is now reset when rewriting discardable commits (empty
2749
commits with no description) if authored by the current user.
2750
[#2000](https://github.com/jj-vcs/jj/issues/2000)
2751
2752
* `jj commit` now accepts `--reset-author` option to match `jj describe`.
2753
2754
* `jj squash` now accepts a `--keep-emptied` option to keep the source commit.
2755
2756
### Fixed bugs
2757
2758
* `jj git push` now ignores immutable commits when checking whether a
2759
to-be-pushed commit has conflicts, or has no description / committer / author
2760
set. [#3029](https://github.com/jj-vcs/jj/issues/3029)
2761
2762
* `jj` will look for divergent changes outside the short prefix set even if it
2763
finds the change id inside the short prefix set.
2764
[#2476](https://github.com/jj-vcs/jj/issues/2476)
2765
2766
### Contributors
2767
2768
Thanks to the people who made this release happen!
2769
2770
* Austin Seipp (@thoughtpolice)
2771
* Benjamin Tan (@bnjmnt4n)
2772
* Daniel Ploch (@torquestomp)
2773
* Danny Hooper (@hooper)
2774
* Ilya Grigoriev (@ilyagr)
2775
* James Sully (@sullyj3)
2776
* Jonathan Tan (@jonathantanmy)
2777
* Kyle J Strand (@BatmanAoD)
2778
* Manuel Caldeira (@KiitoX)
2779
* Martin von Zweigbergk (@martinvonz)
2780
* Matt Kulukundis (@fowles)
2781
* Matt Stark (@matts1)
2782
* mlcui (@mlcui-corp)
2783
* Philip Metzger (@PhilipMetzger)
2784
* Scott Taylor (@scott2000)
2785
* Simon Wollwage (@Kintaro)
2786
* Tal Pressman (@tp-woven)
2787
* Yuya Nishihara (@yuja)
2788
2789
## [0.18.0] - 2024-06-05
2790
2791
### Breaking changes
2792
2793
* Dropped support for `ui.default-revset` config (replaced by `revsets.log` in
2794
0.8.0).
2795
2796
* The `commit_summary_no_branches` template is superseded by
2797
`templates.branch_list`.
2798
2799
* `jj split` will now refuse to split an empty commit.
2800
2801
* `jj config list` now uses multi-line strings and single-quoted strings in the
2802
output when appropriate.
2803
2804
* `jj config get`/`list`/`set` now parse `name` argument as [TOML
2805
key](https://toml.io/en/v1.0.0#keys). Quote meta characters as needed.
2806
Example: `jj config get "revset-aliases.'trunk()'"`
2807
2808
* When updating the working copy away from an empty and undescribed commit, it
2809
is now abandoned even if it is a merge commit.
2810
2811
* If a new working-copy commit is created because the old one was abandoned, and
2812
the old commit was merge, then the new commit will now also be.
2813
[#2859](https://github.com/jj-vcs/jj/issues/2859)
2814
2815
* `jj new`'s `--insert-before`/`--insert-after` options must now be set for each
2816
commit the new commit will be inserted before/after. Previously, those options
2817
were global flags and specifying them once would insert the new commit before/
2818
after all the specified commits.
2819
2820
### Deprecations
2821
2822
* Attempting to alias a built-in command now gives a warning, rather than being
2823
silently ignored.
2824
2825
### New features
2826
2827
* `jj branch list`/`tag list` now accept `-T`/`--template` option. The tag list
2828
prints commit summary along with the tag name by default.
2829
2830
* Conflict markers now include an explanation of what each part of the conflict
2831
represents.
2832
2833
* `ui.color = "debug"` prints active labels alongside the regular colored
2834
output.
2835
2836
* `jj branch track` now show conflicts if there are some.
2837
2838
* A new revset `reachable(srcs, domain)` will return all commits that are
2839
reachable from `srcs` within `domain`.
2840
2841
* There are now prebuilt binaries for `aarch64-linux-unknown-musl`.
2842
Note, these are cross compiled and currently untested.
2843
We plan on providing fully tested builds later once our CI system allows it.
2844
2845
* Added new revsets `mutable()` and `immutable()`.
2846
2847
* Upgraded `scm-record` from v0.2.0 to v0.3.0. See release notes at
2848
<https://github.com/arxanas/scm-record/releases/tag/v0.3.0>
2849
2850
* New command `jj fix` that can be configured to update commits by running code
2851
formatters (or similar tools) on changed files. The configuration schema and
2852
flags are minimal for now, with a number of improvements planned (for example,
2853
[#3800](https://github.com/jj-vcs/jj/issues/3800) and
2854
[#3801](https://github.com/jj-vcs/jj/issues/3801)).
2855
2856
* `jj new`'s `--insert-before` and `--insert-after` options can now be used
2857
simultaneously.
2858
2859
* `jj git push` now can push commits with empty descriptions with the
2860
`--allow-empty-description` flag
2861
2862
### Fixed bugs
2863
2864
* Previously, `jj git push` only made sure that the branch is in the expected
2865
location on the remote server when pushing a branch forward (as opposed to
2866
sideways or backwards). Now, `jj git push` makes a safety check in all cases
2867
and fails whenever `jj git fetch` would have introduced a conflict.
2868
2869
In other words, previously branches that moved sideways or backward were
2870
pushed similarly to Git's `git push --force`; now they have protections
2871
similar to `git push --force-with-lease` (though not identical to it, to match
2872
the behavior of `jj git fetch`). Note also that because of the way `jj git
2873
fetch` works, `jj` does not suffer from the same problems as Git's `git push
2874
--force-with-lease` in situations when `git fetch` is run in the background.
2875
2876
* When the working copy commit becomes immutable, a new one is automatically
2877
created
2878
on top of it to avoid letting the user edit the immutable one.
2879
2880
* `jj config list` now properly escapes TOML keys (#1322).
2881
2882
* Files with conflicts are now checked out as executable if all sides of the
2883
conflict are executable.
2884
2885
* The progress bar (visible when using e.g. `jj git clone`) clears the
2886
remainder of the cursor row after drawing rather than clearing the entire row
2887
before drawing, eliminating the "flicker" effect seen on some terminals.
2888
2889
### Contributors
2890
2891
Thanks to the people who made this release happen!
2892
2893
* Alexander Potashev (@aspotashev)
2894
* Austin Seipp (@thoughtpolice)
2895
* Benjamin Tan (@bnjmnt4n)
2896
* Charles Crete (@Cretezy)
2897
* Daniel Ploch (@torquestomp)
2898
* Danny Hooper (@hooper)
2899
* Eidolon (@HybridEidolon)
2900
* Glen Choo (@chooglen)
2901
* Gregory Anders (@gpanders)
2902
* Ilya Grigoriev (@ilyagr)
2903
* jyn (@jyn514)
2904
* Martin von Zweigbergk (@martinvonz)
2905
* Matt Stark (@matts1)
2906
* Matthew Davidson (@KingMob)
2907
* Michael Gattozzi (@mgattozzi)
2908
* mlcui (@mlcui-corp)
2909
* Philip Metzger (@PhilipMetzger)
2910
* Remo Senekowitsch (@senekor)
2911
* Thomas Castiglione (@gulbanana)
2912
* Théo Daron (@tdaron)
2913
* tinger (@tingerrr)
2914
* Waleed Khan (@arxanas)
2915
* Yuya Nishihara (@yuja)
2916
2917
## [0.17.1] - 2024-05-07
2918
2919
### Fixed bugs
2920
2921
* `jj status` no longer scans through the entire history to look for ancestors
2922
with conflicts.
2923
2924
## [0.17.0] - 2024-05-01
2925
2926
### Breaking changes
2927
2928
* The default template aliases were replaced as follows:
2929
* `builtin_op_log_root(op_id: OperationId)` ->
2930
`format_root_operation(root: Operation)`
2931
* `builtin_log_root(change_id: ChangeId, commit_id: CommitId)` ->
2932
`format_root_commit(root: Commit)`
2933
* `builtin_change_id_with_hidden_and_divergent_info` ->
2934
`format_short_change_id_with_hidden_and_divergent_info(commit: Commit)`
2935
2936
* The `--revision` option of `jj rebase` is renamed to `--revisions`. The short
2937
alias `-r` is still supported.
2938
2939
### New features
2940
2941
* The list of conflicted paths is printed whenever the working copy changes.
2942
This can be disabled with the `--quiet` option.
2943
2944
* Commit objects in templates now have a `mine() -> Boolean` method analog to
2945
the same function in revsets. It evaluates to true if the email of the commit
2946
author matches the current `user.email`.
2947
2948
* Commit objects in templates now have a `contained_in(revset: String) ->
2949
Boolean` method.
2950
2951
* Operation objects in templates now have a `snapshot() -> Boolean` method that
2952
evaluates to true if the operation was a snapshot created by a non-mutating
2953
command (e.g. `jj log`).
2954
2955
* Revsets and templates now support single-quoted raw string literals.
2956
2957
* A new config option `ui.always-allow-large-revsets` has been added to
2958
allow large revsets expressions in some commands, without the `all:` prefix.
2959
2960
* A new config option `ui.allow-filesets` has been added to enable ["fileset"
2961
expressions](docs/filesets.md). Note that filesets are currently experimental,
2962
but will be enabled by default in a future release.
2963
2964
* A new global flag `--ignore-immutable` lets you rewrite immutable commits.
2965
2966
* New command `jj parallelize` that rebases a set of revisions into siblings.
2967
2968
* `jj status` now supports filtering by paths. For example, `jj status .` will
2969
only list changed files that are descendants of the current directory.
2970
2971
* `jj prev` and `jj next` now work when the working copy revision is a merge.
2972
2973
* `jj squash` now accepts a `--use-destination-message/-u` option that uses the
2974
description of the destination for the new squashed revision and discards the
2975
descriptions of the source revisions.
2976
2977
* You can check whether Watchman fsmonitor is enabled or installed with the new
2978
`jj debug watchman status` command.
2979
2980
* `jj rebase` now accepts revsets resolving to multiple revisions with the
2981
`--revisions`/`-r` option.
2982
2983
* `jj rebase -r` now accepts `--insert-after` and `--insert-before` options to
2984
customize the location of the rebased revisions.
2985
2986
### Fixed bugs
2987
2988
* Revsets now support `\`-escapes in string literal.
2989
2990
* The builtin diff editor now allows empty files to be selected during
2991
`jj split`.
2992
2993
* Fixed a bug with `jj split` introduced in 0.16.0 that caused it to incorrectly
2994
rebase the children of the revision being split if they had other parents
2995
(i.e. if the child was a merge).
2996
2997
* The `snapshot.max-new-file-size` option can now handle raw integer literals,
2998
interpreted as a number of bytes, where previously it could only handle string
2999
literals. This means that `snapshot.max-new-file-size="1"` and
3000
`snapshot.max-new-file-size=1` are now equivalent.
3001
3002
* `jj squash <path>` is now a no-op if the path argument didn't match any paths
3003
(it used to create new commits with bumped timestamp).
3004
[#3334](https://github.com/jj-vcs/jj/issues/3334)
3005
3006
### Contributors
3007
3008
Thanks to the people who made this release happen!
3009
3010
* Anton Älgmyr (@algmyr)
3011
* Anton Bulakh (@necauqua)
3012
* Austin Seipp (@thoughtpolice)
3013
* Benjamin Tan (@bnjmnt4n)
3014
* Cretezy (@Cretezy)
3015
* Daniel Ploch (@torquestomp)
3016
* Evan Mesterhazy (@emesterhazy)
3017
* Ilya Grigoriev (@ilyagr)
3018
* Martin von Zweigbergk (@martinvonz)
3019
* Noah Mayr (@noahmayr)
3020
* Jeremy O'Brien (@neutralinsomniac)
3021
* Jonathan Lorimer (@JonathanLorimer)
3022
* Philip Metzger (@PhilipMetzger)
3023
* Poliorcetics (@poliorcetics)
3024
* Rowan Walsh (@rowan-walsh)
3025
* Scott Olson (@solson)
3026
* Théo Daron (@tdaron)
3027
* Yuya Nishihara (@yuja)
3028
3029
## [0.16.0] - 2024-04-03
3030
3031
### Deprecations
3032
3033
* `jj move` was deprecated in favor of `jj squash`.
3034
3035
### Breaking changes
3036
3037
* The `git_head` template keyword now returns an optional value instead of a
3038
list of 0 or 1 element.
3039
3040
* The `jj sparse set --edit`/`--reset` flags were split up into `jj sparse
3041
edit`/`reset` subcommands respectively.
3042
3043
* The `jj sparse` subcommands now parse and print patterns as workspace-relative
3044
paths.
3045
3046
* The `jj log` command no longer uses the default revset when a path is
3047
specified.
3048
3049
### New features
3050
3051
* Config now supports rgb hex colors (in the form `#rrggbb`) wherever existing
3052
color names are supported.
3053
3054
* `ui.default-command` now accepts multiple string arguments, for more complex
3055
default `jj` commands.
3056
3057
* Graph node symbols are now configurable via templates
3058
* `templates.log_node`
3059
* `templates.op_log_node`
3060
3061
* `jj log` now includes synthetic nodes in the graph where some revisions were
3062
elided.
3063
3064
* `jj squash` now accepts `--from` and `--into` (also aliased as `--to`) if `-r`
3065
is not specified. It can now be used for all use cases where `jj move` could
3066
previously be used. The `--from` argument accepts a revset that resolves to
3067
more than one revision.
3068
3069
* Commit templates now support `immutable` keyword.
3070
3071
* New template function `coalesce(content, ..)` is added.
3072
3073
* Timestamps are now shown in local timezone and without milliseconds and
3074
timezone offset by default.
3075
3076
* `jj git push` now prints messages from the remote.
3077
3078
* `jj branch list` now supports a `--conflicted/-c` option to show only
3079
conflicted branches.
3080
3081
* `jj duplicate` and `jj abandon` can now take more than a single `-r` argument,
3082
for consistency with other commands.
3083
3084
* `jj branch list` now allows combining `-r REVISIONS`/`NAMES` and `-a` options.
3085
3086
* `--all` is now named `--all-remotes` for `jj branch list`
3087
3088
* There is a new global `--quiet` flag to silence commands' non-primary output.
3089
3090
* `jj split` now supports a `--siblings/-s` option that splits the target
3091
revision into siblings with the same parents and children.
3092
3093
* New function `working_copies()` for revsets to show the working copy commits
3094
of all workspaces.
3095
3096
### Fixed bugs
3097
3098
None.
3099
3100
### Contributors
3101
3102
Thanks to the people who made this release happen!
3103
3104
* Aleksey Kuznetsov (@zummenix)
3105
* Anton Älgmyr (@algmyr)
3106
* Austin Seipp (@thoughtpolice)
3107
* Benjamin Tan (@bnjmnt4n)
3108
* Chris Krycho (@chriskrycho)
3109
* Christoph Koehler (@ckoehler)
3110
* Daniel Ploch (@torquestomp)
3111
* Evan Mesterhazy (@emesterhazy)
3112
* Ilya Grigoriev (@ilyagr)
3113
* Khionu Sybiern (@khionu)
3114
* Martin von Zweigbergk (@martinvonz)
3115
* Matthew Davidson (@KingMob)
3116
* mrstanwell (@mrstanwell)
3117
* Noah Mayr (@noahmayr)
3118
* Patric Stout (@TrueBrain)
3119
* Poliorcetics (@poliorcetics)
3120
* Simon Wollwage (@Kintaro)
3121
* Steve Klabnik (@steveklabnik)
3122
* Tom Ward (@tomafro)
3123
* TrashCan (@TrashCan69420)
3124
* Yuya Nishihara (@yuja)
3125
3126
## [0.15.1] - 2024-03-06
3127
3128
No code changes (fixing Rust `Cargo.toml` stuff).
3129
3130
## [0.15.0] - 2024-03-06
3131
3132
### Breaking changes
3133
3134
* The minimum supported Rust version (MSRV) is now 1.76.0.
3135
3136
* The on-disk index format changed. New index files will be created
3137
automatically, but it can fail if the repository is colocated and predates
3138
Git GC issues [#815](https://github.com/jj-vcs/jj/issues/815). If
3139
reindexing failed, you'll need to clean up corrupted operation history by
3140
`jj op abandon ..<bad operation ID>`.
3141
3142
* Dropped support for the "legacy" graph-drawing style. Use "ascii" for a very
3143
similar result.
3144
3145
* The default log output no longer lists all tagged heads. Set `revsets.log =
3146
"@ | ancestors(immutable_heads().., 2) | heads(immutable_heads())"` to restore
3147
the old behavior.
3148
3149
* Dropped support for the deprecated `:` revset operator. Use `::` instead.
3150
3151
* `jj rebase --skip-empty` no longer abandons commits that were already empty
3152
before the rebase.
3153
3154
### New features
3155
3156
* Partial support for commit signing. Currently you can configure jj to "keep"
3157
commit signatures by making new ones for rewritten commits, and to sign new
3158
commits when they are created.
3159
3160
This comes with out-of-the-box support for the following backends:
3161
* GnuPG
3162
* SSH
3163
3164
Signature verification and an explicit sign command will hopefully come soon.
3165
3166
* Templates now support logical operators: `||`, `&&`, `!`
3167
3168
* Templates now support the `self` keyword, which is the current commit in `jj
3169
log`/`obslog` templates.
3170
3171
* `jj show` now accepts `-T`/`--template` option to render its output using
3172
template
3173
3174
* `jj config list` now accepts `-T`/`--template` option.
3175
3176
* `jj git fetch` now accepts `-b` as a shorthand for `--branch`, making it more
3177
consistent with other commands that accept a branch
3178
3179
* In the templating language, Timestamps now have a `.local()` method for
3180
converting to the local timezone.
3181
3182
* `jj next/prev` now infer `--edit` when you're already editing a non-head
3183
commit (a commit with children).
3184
3185
* A new built-in pager named `:builtin` is available on all platforms,
3186
implemented with [minus](https://github.com/arijit79/minus/)
3187
3188
* Set config `ui.log-synthetic-elided-nodes = true` to make `jj log` include
3189
synthetic nodes in the graph where some revisions were elided
3190
([#1252](https://github.com/jj-vcs/jj/issues/1252),
3191
[#2971](https://github.com/jj-vcs/jj/issues/2971)). This may become the
3192
default depending on feedback.
3193
3194
* When creating a new workspace, the sparse patterns are now copied over from
3195
the current workspace.
3196
3197
* `jj git init --colocate` can now import an existing Git repository. This is
3198
equivalent to `jj git init --git-repo=.`.
3199
3200
* `jj git fetch` now automatically prints new remote branches and tags by
3201
default.
3202
3203
* `--verbose/-v` is now `--debug` (no short option since it's not intended to be
3204
used often)
3205
3206
* `jj move --from/--to` can now be abbreviated to `jj move -f/-t`
3207
3208
* `jj commit`/`diffedit`/`move`/`resolve`/`split`/`squash`/`unsquash` now accept
3209
`--tool=<NAME>` option to override the default.
3210
[#2575](https://github.com/jj-vcs/jj/issues/2575)
3211
3212
* Added completions for [Nushell](https://nushell.sh) to `jj util completion`
3213
3214
* `jj branch list` now supports a `--tracked/-t` option which can be used to
3215
show tracked branches only. Omits local Git-tracking branches by default.
3216
3217
* Commands producing diffs now accept a `--context` flag for the number of
3218
lines of context to show.
3219
3220
* `jj` commands with the `-T`/`--template` option now provide a hint containing
3221
defined template names when no argument is given, assisting the user in making
3222
a selection.
3223
3224
### Fixed bugs
3225
3226
* On Windows, symlinks in the repo are now supported when Developer Mode is
3227
enabled.
3228
When symlink support is unavailable, they will be materialized as regular
3229
files in the
3230
working copy (instead of resulting in a crash).
3231
[#2](https://github.com/jj-vcs/jj/issues/2)
3232
3233
* On Windows, the `:builtin` pager is now used by default, rather than being
3234
disabled entirely.
3235
3236
* Auto-rebase now preserves the shape of history even for merge commits where
3237
one parent is an ancestor of another.
3238
[#2600](https://github.com/jj-vcs/jj/issues/2600)
3239
3240
### Contributors
3241
3242
Thanks to the people who made this release happen!
3243
3244
* Aleksey Kuznetsov (@zummenix)
3245
* Anton Bulakh (@necauqua)
3246
* Anton Älgmyr (@algmyr)
3247
* Austin Seipp (@thoughtpolice)
3248
* Benjamin Brittain (@benbrittain)
3249
* Benjamin Tan (@bnjmnt4n)
3250
* Daehyeok Mun (@daehyeok)
3251
* Daniel Ploch (@torquestomp)
3252
* Evan Mesterhazy (@emesterhazy)
3253
* gulbanana (@gulbanana)
3254
* Ilya Grigoriev (@ilyagr)
3255
* Jonathan Tan (@jonathantanmy)
3256
* Julien Vincent (@julienvincent)
3257
* jyn (@jyn514)
3258
* Martin von Zweigbergk (@martinvonz)
3259
* Paulo Coelho (@prscoelho)
3260
* Philip Metzger (@PhilipMetzger)
3261
* Poliorcetics (@poliorcetics)
3262
* Stephen Jennings (@jennings)
3263
* Vladimir (@0xdeafbeef)
3264
* Yuya Nishihara (@yuja)
3265
3266
## [0.14.0] - 2024-02-07
3267
3268
### Deprecations
3269
3270
* `jj checkout` and `jj merge` are both deprecated; use `jj new` instead to
3271
replace both of these commands in all instances.
3272
3273
**Rationale**: `jj checkout` and `jj merge` both implement identical
3274
functionality, which is a subset of `jj new`. `checkout` creates a new working
3275
copy commit on top of a single specified revision, i.e. with one parent.
3276
`merge` creates a new working copy commit on top of *at least* two specified
3277
revisions, i.e. with two or more parents.
3278
3279
The only difference between these commands and `jj new`, which *also* creates
3280
a new working copy commit, is that `new` can create a working copy commit on
3281
top of any arbitrary number of revisions, so it can handle both the previous
3282
cases at once. The only actual difference between these three commands is the
3283
command syntax and their name. These names were chosen to be familiar to users
3284
of other version control systems, but we instead encourage all users to adopt
3285
`jj new` instead; it is more general and easier to remember than both of
3286
these.
3287
3288
`jj checkout` and `jj merge` will no longer be shown as part of `jj help`, but
3289
will still function for now, emitting a warning about their deprecation.
3290
3291
**Deadline**: `jj checkout` and `jj merge` will be deleted and are expected
3292
become a **hard error later in 2024**.
3293
3294
* `jj init --git` and `jj init --git-repo` are now deprecated and will be
3295
removed
3296
in the near future.
3297
3298
Use `jj git init` instead.
3299
3300
### Breaking changes
3301
3302
* (Minor) Diff summaries (e.g. `jj diff -s`) now use `D` for "Deleted" instead
3303
of `R` for "Removed". @joyously pointed out that `R` could also mean
3304
"Renamed".
3305
3306
* `jj util completion` now takes the shell as a positional argument, not a flag.
3307
the previous behavior is deprecated, but supported for now. it will be removed
3308
in the future.
3309
3310
* `jj rebase` now preserves the shape of history even for merge commits where
3311
one parent is an ancestor of another. You can follow the `jj rebase` by
3312
`jj rebase -s <merge commit> -d <single parent>` if you want to linearize the
3313
history.
3314
3315
### New features
3316
3317
* `jj util completion` now supports powershell and elvish.
3318
3319
* Official binaries for macOS running on Apple Silicon (`aarch64-apple-darwin`)
3320
are now available, alongside the existing macOS x86 binaries.
3321
3322
* New `jj op abandon` command is added to clean up the operation history. Git
3323
refs and commit objects can be further compacted by `jj util gc`.
3324
3325
* `jj util gc` now removes unreachable operation, view, and Git objects.
3326
3327
* `jj branch rename` will now warn if the renamed branch has a remote branch,
3328
since
3329
those will have to be manually renamed outside of `jj`.
3330
3331
* `jj git push` gained a `--tracked` option, to push all the tracked branches.
3332
3333
* There's now a virtual root operation, similar to the [virtual root
3334
commit](docs/glossary.md#root-commit). It appears at the end of `jj op log`.
3335
3336
* `jj config list` gained a `--include-overridden` option to allow
3337
printing overridden config values.
3338
3339
* `jj config list` now accepts `--user` or `--repo` option to specify
3340
config origin.
3341
3342
* New `jj config path` command to print the config file path without launching
3343
an editor.
3344
3345
* `jj tag list` command prints imported git tags.
3346
3347
* `jj next` and `jj prev` now prompt in the event of the next/previous commit
3348
being ambiguous, instead of failing outright.
3349
3350
* `jj resolve` now displays the file being resolved.
3351
3352
* `jj workspace root` was aliased to `jj root`, for ease of discoverability
3353
3354
* `jj diff` no longer shows the contents of binary files.
3355
3356
* `jj git` now has an `init` command that initializes a git backed repo.
3357
3358
* New template function `surround(prefix, suffix, content)` is added.
3359
3360
### Fixed bugs
3361
3362
* Fixed snapshots of symlinks in `gitignore`-d directory.
3363
[#2878](https://github.com/jj-vcs/jj/issues/2878)
3364
3365
* Fixed data loss in dirty working copy when checked-out branch is rebased or
3366
abandoned by Git.
3367
[#2876](https://github.com/jj-vcs/jj/issues/2876)
3368
3369
### Contributors
3370
3371
Thanks to the people who made this release happen!
3372
3373
* Austin Seipp (@thoughtpolice)
3374
* Benjamin Brittain (@benbrittain)
3375
* Chris Krycho (@chriskrycho)
3376
* Daehyeok Mun (@daehyeok)
3377
* Daniel Ploch (@torquestomp)
3378
* Essien Ita Essien (@essiene)
3379
* Ikko Eltociear Ashimine (@eltociear)
3380
* Ilya Grigoriev (@ilyagr)
3381
* Jonathan Tan (@jonathantanmy)
3382
* jyn (@jyn514)
3383
* Martin von Zweigbergk (@martinvonz)
3384
* Matt Stark (@matts1)
3385
* Michael Pratt (prattmic)
3386
* Philip Metzger (@PhilipMetzger)
3387
* Stephen Jennings (@jennings)
3388
* Valentin Gatien-Baron (@v-gb)
3389
* vwkd (@vwkd)
3390
* Yuya Nishihara (@yuja)
3391
3392
## [0.13.0] - 2024-01-03
3393
3394
### Breaking changes
3395
3396
* `jj git fetch` no longer imports new remote branches as local branches. Set
3397
`git.auto-local-branch = true` to restore the old behavior.
3398
3399
### New features
3400
3401
* Information about new and resolved conflicts is now printed by every command.
3402
3403
* `jj branch` has gained a new `rename` subcommand that allows changing a branch
3404
name atomically. `jj branch help rename` for details.
3405
3406
### Fixed bugs
3407
3408
* Command aliases can now be loaded from repository config relative to the
3409
current working directory.
3410
[#2414](https://github.com/jj-vcs/jj/issues/2414)
3411
3412
### Contributors
3413
3414
Thanks to the people who made this release happen!
3415
3416
* Austin Seipp (@thoughtpolice)
3417
* Essien Ita Essien (@essiene)
3418
* Gabriel Scherer (@gasche)
3419
* Ilya Grigoriev (@ilyagr)
3420
* Martin von Zweigbergk (@martinvonz)
3421
* Philip Metzger (@PhilipMetzger)
3422
* Waleed Khan (@arxanas)
3423
* Yuya Nishihara (@yuja)
3424
3425
## [0.12.0] - 2023-12-05
3426
3427
### Breaking changes
3428
3429
* The `remote_branches()` revset no longer includes branches exported to the Git
3430
repository (so called Git-tracking branches.)
3431
3432
* `jj branch set` no longer creates a new branch. Use `jj branch create`
3433
instead.
3434
3435
* `jj init --git` in an existing Git repository now errors and exits rather than
3436
creating a second Git store.
3437
3438
### New features
3439
3440
* `jj workspace add` can now take _multiple_ `--revision` arguments, which will
3441
create a new workspace with its working-copy commit on top of all the parents,
3442
as if you had run `jj new r1 r2 r3 ...`.
3443
3444
* You can now set `git.abandon-unreachable-commits = false` to disable the
3445
usual behavior where commits that became unreachable in the Git repo are
3446
abandoned ([#2504](https://github.com/jj-vcs/jj/pull/2504)).
3447
3448
* `jj new` gained a `--no-edit` option to prevent editing the newly created
3449
commit. For example, `jj new a b --no-edit -m Merge` creates a merge commit
3450
without affecting the working copy.
3451
3452
* `jj rebase` now takes the flag `--skip-empty`, which doesn't copy over commits
3453
that would become empty after a rebase.
3454
3455
* There is a new `jj util gc` command for cleaning up the repository storage.
3456
For now, it simply runs `git gc` on the backing Git repo (when using the Git
3457
backend).
3458
3459
### Fixed bugs
3460
3461
* Fixed another file conflict resolution issue where `jj status` would disagree
3462
with the actual file content.
3463
[#2654](https://github.com/jj-vcs/jj/issues/2654)
3464
3465
### Contributors
3466
3467
Thanks to the people who made this release happen!
3468
3469
* Antoine Cezar (@AntoineCezar)
3470
* Anton Bulakh (@necauqua)
3471
* Austin Seipp (@thoughtpolice)
3472
* Benjamin Saunders (@Ralith)
3473
* Carlos Precioso (@cprecioso)
3474
* Chris Krycho (@chriskrycho)
3475
* Ilya Grigoriev (@ilyagr)
3476
* Jason R. Coombs (@jaraco)
3477
* Jesse Somerville (@jessesomerville)
3478
* Łukasz Kurowski (@crackcomm)
3479
* Martin von Zweigbergk (@martinvonz)
3480
* mlcui (@mlcui-corp)
3481
* Philip Metzger (@PhilipMetzger)
3482
* Waleed Khan (@arxanas)
3483
* Yuya Nishihara (@yuja)
3484
3485
## [0.11.0] - 2023-11-01
3486
3487
### Breaking changes
3488
3489
* Conflicts are now stored in a different way. Commits written by a new `jj`
3490
binary will not be read correctly by older `jj` binaries. The new model
3491
solves some performance problems with the old model. For example, `jj log`
3492
should be noticeably faster on large repos. You may need to create a new
3493
clone to see the full speedup.
3494
3495
* The `remote_branches()` revset now includes branches exported to the Git
3496
repository (so called Git-tracking branches.) *This change will be reverted
3497
in 0.12.0.*
3498
3499
* Status messages are now printed to stderr.
3500
3501
* `jj config set` now interprets the value as TOML also if it's a valid TOML
3502
array or table. For example, `jj config set --user 'aliases.n' '["new"]'`
3503
3504
* Remote branches now have tracking or non-tracking flags. The
3505
`git.auto-local-branch` setting is applied only to newly fetched remote
3506
branches. Existing remote branches are migrated as follows:
3507
3508
* If local branch exists, the corresponding remote branches are considered
3509
tracking branches.
3510
* Otherwise, the remote branches are non-tracking branches.
3511
3512
If the deduced tracking flags are wrong, use `jj branch track`/`untrack`
3513
commands to fix them up.
3514
3515
* Non-tracking remote branches aren't listed by default. Use `jj branch list
3516
--all` to show all local and remote branches.
3517
3518
* It's not allowed to push branches if non-tracking remote branches of the same
3519
name exist.
3520
3521
* Pushing deleted/moved branches no longer abandons the local commits referenced
3522
by the remote branches.
3523
3524
* `jj git fetch --branch` now requires `glob:` prefix to expand `*` in branch
3525
name.
3526
3527
### New features
3528
3529
* `jj`'s stable release can now be installed
3530
with [`cargo binstall jj-cli`](https://github.com/cargo-bins/cargo-binstall).
3531
3532
* `jj workspace add` now takes a `--revision` argument.
3533
3534
* `jj workspace forget` can now forget multiple workspaces at once.
3535
3536
* `branches()`/`remote_branches()`/`author()`/`committer()`/`description()`
3537
revsets now support glob matching.
3538
3539
* `jj branch delete`/`forget`/`list`, and `jj git push --branch` now support
3540
[string pattern syntax](docs/revsets.md#string-patterns). The `--glob` option
3541
is deprecated in favor of `glob:` pattern.
3542
3543
* The `branches`/`tags`/`git_refs`/`git_head` template keywords now return a
3544
list of `RefName`s. They were previously pre-formatted strings.
3545
3546
* The new template keywords `local_branches`/`remote_branches` are added to show
3547
only local/remote branches.
3548
3549
* `jj workspace add` now preserves all parents of the old working-copy commit
3550
instead of just the first one.
3551
3552
* `jj rebase -r` gained the ability to rebase a revision `A` onto a descendant
3553
of `A`.
3554
3555
### Fixed bugs
3556
3557
* Updating the working copy to a commit where a file that's currently ignored
3558
in the working copy no longer leads to a crash
3559
([#976](https://github.com/jj-vcs/jj/issues/976)).
3560
3561
* Conflicts in executable files can now be resolved just like conflicts in
3562
non-executable files ([#1279](https://github.com/jj-vcs/jj/issues/1279)).
3563
3564
* `jj new --insert-before` and `--insert-after` now respect immutable revisions
3565
([#2468](https://github.com/jj-vcs/jj/pull/2468)).
3566
3567
### Contributors
3568
3569
Thanks to the people who made this release happen!
3570
3571
* Antoine Cezar (@AntoineCezar)
3572
* Austin Seipp (@thoughtpolice)
3573
* Benjamin Saunders (@Ralith)
3574
* Gabriel Scherer (@gasche)
3575
* Ilya Grigoriev (@ilyagr)
3576
* Infra (@1011X)
3577
* Isabella Basso (@isinyaaa)
3578
* Martin von Zweigbergk (@martinvonz)
3579
* Tal Pressman (@talpr)
3580
* Waleed Khan (@arxanas)
3581
* Yuya Nishihara (@yuja)
3582
3583
## [0.10.0] - 2023-10-04
3584
3585
### Breaking changes
3586
3587
* A default revset-alias function `trunk()` now exists. If you previously
3588
defined
3589
your own `trunk()` alias it will continue to overwrite the built-in one.
3590
Check [revsets.toml](docs/revsets.toml)
3591
and [revsets.md](docs/revsets.md)
3592
to understand how the function can be adapted.
3593
3594
### New features
3595
3596
* The `ancestors()` revset function now takes an optional `depth` argument
3597
to limit the depth of the ancestor set. For example, use `jj log -r
3598
'ancestors(@, 5)` to view the last 5 commits.
3599
3600
* Support for the Watchman filesystem monitor is now bundled by default. Set
3601
`core.fsmonitor = "watchman"` in your repo to enable.
3602
3603
* You can now configure the set of immutable commits via
3604
`revset-aliases.immutable_heads()`. For example, set it to
3605
`"remote_branches() | tags()"` to prevent rewriting those those. Their
3606
ancestors are implicitly also immutable.
3607
3608
* `jj op log` now supports `--no-graph`.
3609
3610
* Templates now support an additional escape: `\0`. This will output a literal
3611
null byte. This may be useful for e.g.
3612
`jj log -T 'description ++ "\0"' --no-graph` to output descriptions only, but
3613
be able to tell where the boundaries are
3614
3615
* jj now bundles a TUI tool to use as the default diff and merge editors. (The
3616
previous default was `meld`.)
3617
3618
* `jj split` supports the `--interactive` flag. (This is already the default if
3619
no paths are provided.)
3620
3621
* `jj commit` accepts an optional list of paths indicating a subset of files to
3622
include in the first commit
3623
3624
* `jj commit` accepts the `--interactive` flag.
3625
3626
### Fixed bugs
3627
3628
### Contributors
3629
3630
Thanks to the people who made this release happen!
3631
3632
* Austin Seipp (@thoughtpolice)
3633
* Emily Kyle Fox (@emilykfox)
3634
* glencbz (@glencbz)
3635
* Hong Shin (@honglooker)
3636
* Ilya Grigoriev (@ilyagr)
3637
* James Sully (@sullyj3)
3638
* Martin von Zweigbergk (@martinvonz)
3639
* Philip Metzger (@PhilipMetzger)
3640
* Ruben Slabbert (@rslabbert)
3641
* Vamsi Avula (@avamsi)
3642
* Waleed Khan (@arxanas)
3643
* Willian Mori (@wmrmrx))
3644
* Yuya Nishihara (@yuja)
3645
* Zachary Dremann (@Dr-Emann)
3646
3647
## [0.9.0] - 2023-09-06
3648
3649
### Breaking changes
3650
3651
* The minimum supported Rust version (MSRV) is now 1.71.0.
3652
3653
* The storage format of branches, tags, and git refs has changed. Newly-stored
3654
repository data will no longer be loadable by older binaries.
3655
3656
* The `:` revset operator is deprecated. Use `::` instead. We plan to delete the
3657
`:` form in jj 0.15+.
3658
3659
* The `--allow-large-revsets` flag for `jj rebase` and `jj new` was replaced by
3660
a `all:` before the revset. For example, use `jj rebase -d 'all:foo-'`
3661
instead of `jj rebase --allow-large-revsets -d 'foo-'`.
3662
3663
* The `--allow-large-revsets` flag for `jj rebase` and `jj new` can no longer be
3664
used for allowing duplicate destinations. Include the potential duplicates
3665
in a single expression instead (e.g. `jj new 'all:x|y'`).
3666
3667
* The `push.branch-prefix` option was renamed to `git.push-branch-prefix`.
3668
3669
* The default editor on Windows is now `Notepad` instead of `pico`.
3670
3671
* `jj` will fail attempts to snapshot new files larger than 1MiB by default.
3672
This behavior
3673
can be customized with the `snapshot.max-new-file-size` config option.
3674
3675
* Author and committer signatures now use empty strings to represent unset
3676
names and email addresses. The `author`/`committer` template keywords and
3677
methods also return empty strings.
3678
Older binaries may not warn user when attempting to `git push` commits
3679
with such signatures.
3680
3681
* In revsets, the working-copy or remote symbols (such as `@`, `workspace_id@`,
3682
and `branch@remote`) can no longer be quoted as a unit. If a workspace or
3683
branch name contains whitespace, quote the name like `"branch name"@remote`.
3684
Also, these symbols will not be resolved as revset aliases or function
3685
parameters. For example, `author(foo@)` is now an error, and the revset alias
3686
`'revset-aliases.foo@' = '@'` will be failed to parse.
3687
3688
* The `root` revset symbol has been converted to function `root()`.
3689
3690
* The `..x` revset is now evaluated to `root()..x`, which means the root commit
3691
is no longer included.
3692
3693
* `jj git push` will now push all branches in the range `remote_branches()..@`
3694
instead of only branches pointing to `@` or `@-`.
3695
3696
* It's no longer allowed to create a Git remote named "git". Use `jj git remote
3697
rename` to rename the existing remote.
3698
[#1690](https://github.com/jj-vcs/jj/issues/1690)
3699
3700
* Revset expression like `origin/main` will no longer resolve to a
3701
remote-tracking branch. Use `main@origin` instead.
3702
3703
### New features
3704
3705
* Default template for `jj log` now does not show irrelevant information
3706
(timestamp, empty, message placeholder etc.) about the root commit.
3707
3708
* Commit templates now support the `root` keyword, which is `true` for the root
3709
commit and `false` for every other commit.
3710
3711
* `jj init --git-repo` now works with bare repositories.
3712
3713
* `jj config edit --user` and `jj config set --user` will now pick a default
3714
config location if no existing file is found, potentially creating parent
3715
directories.
3716
3717
* `jj log` output is now topologically grouped.
3718
[#242](https://github.com/jj-vcs/jj/issues/242)
3719
3720
* `jj git clone` now supports the `--colocate` flag to create the git repo
3721
in the same directory as the jj repo.
3722
3723
* `jj restore` gained a new option `--changes-in` to restore files
3724
from a merge revision's parents. This undoes the changes that `jj diff -r`
3725
would show.
3726
3727
* `jj diff`/`log` now supports `--tool <name>` option to generate diffs by
3728
external program. For configuration, see [the documentation](docs/config.md).
3729
[#1886](https://github.com/jj-vcs/jj/issues/1886)
3730
3731
* A new experimental diff editor `meld-3` is introduced that sets up Meld to
3732
allow you to see both sides of the original diff while editing. This can be
3733
used with `jj split`, `jj move -i`, etc.
3734
3735
* `jj log`/`obslog`/`op log` now supports `--limit N` option to show the first
3736
`N` entries.
3737
3738
* Added the `ui.paginate` option to enable/disable pager usage in commands
3739
3740
* `jj checkout`/`jj describe`/`jj commit`/`jj new`/`jj squash` can take repeated
3741
`-m/--message` arguments. Each passed message will be combined into paragraphs
3742
(separated by a blank line)
3743
3744
* It is now possible to set a default description using the new
3745
`ui.default-description` option, to use when describing changes with an empty
3746
description.
3747
3748
* `jj split` will now leave the description empty on the second part if the
3749
description was empty on the input commit.
3750
3751
* `branches()`/`remote_branches()`/`author()`/`committer()`/`description()`
3752
revsets now support exact matching. For example, `branch(exact:main)`
3753
selects the branch named "main", but not "maint". `description(exact:"")`
3754
selects commits whose description is empty.
3755
3756
* Revsets gained a new function `mine()` that
3757
aliases `author(exact:"your_email")`.
3758
3759
* Added support for `::` and `..` revset operators with both left and right
3760
operands omitted. These expressions are equivalent to `all()` and `~root()`
3761
respectively.
3762
3763
* `jj log` timestamp format now accepts `.utc()` to convert a timestamp to UTC.
3764
3765
* templates now support additional string
3766
methods `.starts_with(x)`, `.ends_with(x)`
3767
`.remove_prefix(x)`, `.remove_suffix(x)`, and `.substr(start, end)`.
3768
3769
* `jj next` and `jj prev` are added, these allow you to traverse the history
3770
in a linear style. For people coming from Sapling and `git-branchles`
3771
see [#2126](https://github.com/jj-vcs/jj/issues/2126) for
3772
further pending improvements.
3773
3774
* `jj diff --stat` has been implemented. It shows a histogram of the changes,
3775
same as `git diff --stat`.
3776
Fixes [#2066](https://github.com/jj-vcs/jj/issues/2066)
3777
3778
* `jj git fetch --all-remotes` has been implemented. It fetches all remotes
3779
instead of just the default remote
3780
3781
### Fixed bugs
3782
3783
* Fix issues related to .gitignore handling of untracked directories
3784
[#2051](https://github.com/jj-vcs/jj/issues/2051).
3785
3786
* `jj config set --user` and `jj config edit --user` can now be used outside of
3787
any repository.
3788
3789
* SSH authentication could hang when ssh-agent couldn't be reached
3790
[#1970](https://github.com/jj-vcs/jj/issues/1970)
3791
3792
* SSH authentication can now use ed25519 and ed25519-sk keys. They still need
3793
to be password-less.
3794
3795
* Git repository managed by the repo tool can now be detected as a "colocated"
3796
repository.
3797
[#2011](https://github.com/jj-vcs/jj/issues/2011)
3798
3799
### Contributors
3800
3801
Thanks to the people who made this release happen!
3802
3803
* Alexander Potashev (@aspotashev)
3804
* Anton Bulakh (@necauqua)
3805
* Austin Seipp (@thoughtpolice)
3806
* Benjamin Brittain (@benbrittain)
3807
* Benjamin Saunders (@Ralith)
3808
* Christophe Poucet (@poucet)
3809
* Emily Kyle Fox (@emilykfox)
3810
* Glen Choo (@chooglen)
3811
* Ilya Grigoriev (@ilyagr)
3812
* Kevin Liao (@kevincliao)
3813
* Linus Arver (@listx)
3814
* Martin Clausen (@maacl)
3815
* Martin von Zweigbergk (@martinvonz)
3816
* Matt Freitas-Stavola (@mbStavola)
3817
* Oscar Bonilla (@ob)
3818
* Philip Metzger (@PhilipMetzger)
3819
* Piotr Kufel (@qfel)
3820
* Preston Van Loon (@prestonvanloon)
3821
* Tal Pressman (@talpr)
3822
* Vamsi Avula (@avamsi)
3823
* Vincent Breitmoser (@Valodim)
3824
* Vladimir (@0xdeafbeef)
3825
* Waleed Khan (@arxanas)
3826
* Yuya Nishihara (@yuja)
3827
* Zachary Dremann (@Dr-Emann)
3828
3829
## [0.8.0] - 2023-07-09
3830
3831
### Breaking changes
3832
3833
* The `jujutsu` and `jujutsu-lib` crates were renamed to `jj-cli` and `jj-lib`,
3834
respectively.
3835
3836
* The `ui.oplog-relative-timestamps` option has been removed. Use the
3837
`format_time_range()` template alias instead. For details, see
3838
[the documentation](docs/config.md).
3839
3840
* Implicit concatenation of template expressions has been disabled. Use
3841
`++` operator, `concat()`, or `separate()` function instead.
3842
Example: `description ++ "\n"`
3843
3844
* `jj git push` will consider pushing the parent commit only when the
3845
current commit has no content and no description, such as right after
3846
a `jj squash`.
3847
3848
* The minimum supported Rust version (MSRV) is now 1.64.0.
3849
3850
* The `heads()` revset function was split up into two functions. `heads()`
3851
without arguments is now called `visible_heads()`. `heads()` with one argument
3852
is unchanged.
3853
3854
* The `ui.default-revset` config was renamed to `revsets.log`.
3855
3856
* The `jj sparse` command was split up into `jj sparse list` and
3857
`jj sparse set`.
3858
3859
* `jj hide` (alias for `jj abandon`) is no longer available. Use `jj abandon`
3860
instead.
3861
3862
* `jj debug completion`, `jj debug mangen` and `jj debug config-schema` have
3863
been moved from `jj debug` to `jj util`.
3864
3865
* `jj` will no longer parse `br` as a git_ref `refs/heads/br` when a branch `br`
3866
does not exist but the git_ref does (this is rare). Use `br@git` instead.
3867
3868
* `jj git fetch` will no longer import unrelated branches from the underlying
3869
Git repo.
3870
3871
### New features
3872
3873
* `jj git push --deleted` will remove all locally deleted branches from the
3874
remote.
3875
3876
* `jj restore` without `--from` works correctly even if `@` is a merge
3877
commit.
3878
3879
* `jj rebase` now accepts multiple `-s` and `-b` arguments. Revsets with
3880
multiple commits are allowed with `--allow-large-revsets`.
3881
3882
* `jj git fetch` now supports a `--branch` argument to fetch some of the
3883
branches only.
3884
3885
* `jj config get` command allows retrieving config values for use in scripting.
3886
3887
* `jj config set` command allows simple config edits like
3888
`jj config set --repo user.email "somebody@example.com"`
3889
3890
* Added `ui.log-word-wrap` option to wrap `jj log`/`obslog`/`op log` content
3891
based on terminal width. [#1043](https://github.com/jj-vcs/jj/issues/1043)
3892
3893
* Nodes in the (text-based) graphical log output now use a `◉` symbol instead
3894
of the letter `o`. The ASCII-based graph styles still use `o`.
3895
3896
* Commands that accept a diff format (`jj diff`, `jj interdiff`, `jj show`,
3897
`jj log`, and `jj obslog`) now accept `--types` to show only the type of file
3898
before and after.
3899
3900
* `jj describe` now supports `--reset-author` for resetting a commit's author
3901
to the configured user. `jj describe` also gained a `--no-edit` option to
3902
avoid opening the editor.
3903
3904
* Added `latest(x[, n])` revset function to select the latest `n` commits.
3905
3906
* Added `conflict()` revset function to select commits with conflicts.
3907
3908
* `jj squash` AKA `jj amend` now accepts a `--message` option to set the
3909
description of the squashed commit on the command-line.
3910
3911
* The progress display on `jj git clone/fetch` now includes the downloaded size.
3912
3913
* The formatter now supports a "default" color that can override another color
3914
defined by a parent style.
3915
3916
* `jj obslog` and `jj log` now show abandoned commits as hidden.
3917
3918
* `jj git fetch` and `jj git push` will now use the single defined remote even
3919
if it is not named "origin".
3920
3921
* `jj git push` now accepts `--branch` and `--change` arguments together.
3922
3923
* `jj git push` now accepts a `-r/--revisions` flag to specify revisions to
3924
push. All branches pointing to any of the specified revisions will be pushed.
3925
The flag can be used together with `--branch` and `--change`.
3926
3927
* `jj` with no subcommand now defaults to `jj log` instead of showing help. This
3928
command can be overridden by setting `ui.default-command`.
3929
3930
* Description tempfiles created via `jj describe` now have the file extension
3931
`.jjdescription` to help external tooling detect a unique filetype.
3932
3933
* The shortest unique change ID prefixes and commit ID prefixes in `jj log` are
3934
now shorter within the default log revset. You can override the default by
3935
setting the `revsets.short-prefixes` config to a different revset.
3936
3937
* The last seen state of branches in the underlying git repo is now presented by
3938
`jj branch list`/`jj log` as a remote called `git` (e.g. `main@git`). They can
3939
also be referenced in revsets. Such branches exist in colocated repos or if
3940
you use `jj git export`.
3941
3942
* The new `jj chmod` command allows setting or removing the executable bit on
3943
paths. Unlike the POSIX `chmod`, it works on Windows, on conflicted files, and
3944
on arbitrary revisions. Bits other than the executable bit are not planned to
3945
be supported.
3946
3947
* `jj sparse set` now accepts an `--edit` flag which brings up the `$EDITOR` to
3948
edit sparse patterns.
3949
3950
* `jj branch list` can now be filtered by revset.
3951
3952
* Initial support for the Watchman filesystem monitor. Set
3953
`core.fsmonitor = "watchman"` in your repo to enable.
3954
3955
### Fixed bugs
3956
3957
* Modify/delete conflicts now include context lines
3958
[#1244](https://github.com/jj-vcs/jj/issues/1244).
3959
3960
* It is now possible to modify either side of a modify/delete conflict (any
3961
change used to be considered a resolution).
3962
3963
* Fixed a bug that could get partially resolved conflicts to be interpreted
3964
incorrectly.
3965
3966
* `jj git fetch`: when re-adding a remote repository that had been previously
3967
removed, in some situations the remote branches were not recreated.
3968
3969
* `jj git remote rename`: the git remote references were not rewritten with
3970
the new name. If a new remote with the old name and containing the same
3971
branches was added, the remote branches may not be recreated in some cases.
3972
3973
* `jj workspace update-stale` now snapshots the working-copy changes before
3974
updating to the new working-copy commit.
3975
3976
* It is no longer allowed to create branches at the root commit.
3977
3978
* `git checkout` (without using `jj`) in colocated repo no longer abandons
3979
the previously checked-out anonymous branch.
3980
[#1042](https://github.com/jj-vcs/jj/issues/1042).
3981
3982
* `jj git fetch` in a colocated repo now abandons branches deleted on the
3983
remote, just like in a non-colocated repo.
3984
[#864](https://github.com/jj-vcs/jj/issues/864)
3985
3986
* `jj git fetch` can now fetch forgotten branches even if they didn't move on
3987
the remote.
3988
[#1714](https://github.com/jj-vcs/jj/pull/1714)
3989
[#1771](https://github.com/jj-vcs/jj/pull/1771)
3990
3991
* It is now possible to `jj branch forget` deleted branches.
3992
[#1537](https://github.com/jj-vcs/jj/issues/1537)
3993
3994
* Fixed race condition when assigning change id to Git commit. If you've
3995
already had unreachable change ids, run `jj debug reindex`.
3996
[#924](https://github.com/jj-vcs/jj/issues/924)
3997
3998
* Fixed false divergence on racy working-copy snapshots.
3999
[#697](https://github.com/jj-vcs/jj/issues/697),
4000
[#1608](https://github.com/jj-vcs/jj/issues/1608)
4001
4002
* In colocated repos, a bug causing conflicts when undoing branch moves (#922)
4003
has been fixed. Some surprising behaviors related to undoing `jj git push` or
4004
`jj git fetch` remain.
4005
4006
### Contributors
4007
4008
Thanks to the people who made this release happen!
4009
4010
* Aaron Bull Schaefer (@elasticdog)
4011
* Anton Bulakh (@necauqua)
4012
* Austin Seipp (@thoughtpolice)
4013
* Benjamin Saunders (@Ralith)
4014
* B Wilson (@xelxebar)
4015
* Christophe Poucet (@poucet)
4016
* David Barnett (@dbarnett)
4017
* Glen Choo (@chooglen)
4018
* Grégoire Geis (@71)
4019
* Ilya Grigoriev (@ilyagr)
4020
* Isabella Basso (@isinyaaa)
4021
* Kevin Liao (@kevincliao)
4022
* Martin von Zweigbergk (@martinvonz)
4023
* mlcui (@mlcui-corp)
4024
* Samuel Tardieu (@samueltardieu)
4025
* Tal Pressman (@talpr)
4026
* Vamsi Avula (@avamsi)
4027
* Waleed Khan (@arxanas)
4028
* Yuya Nishihara (@yuja)
4029
4030
## [0.7.0] - 2023-02-16
4031
4032
### Breaking changes
4033
4034
* The minimum supported Rust version (MSRV) is now 1.61.0.
4035
4036
* The `jj touchup` command was renamed to `jj diffedit`.
4037
4038
* The `-i` option to `jj restore` was removed in favor of new `--from`/`--to`
4039
options to `jj diffedit`.
4040
4041
* To report the situation when a change id corresponds to multiple visible
4042
commits, `jj log` now prints the change id in red and puts `??` after it.
4043
Previously, it printed the word "divergent".
4044
4045
* `jj log` prefixes commit descriptions with "(empty)" when they contain no
4046
change compared to their parents.
4047
4048
* The `author`/`committer` templates now display both name and email. Use
4049
`author.name()`/`committer.name()` to extract the name.
4050
4051
* Storage of the "HEAD@git" reference changed and can now have conflicts.
4052
Operations written by a new `jj` binary will have a "HEAD@git" reference that
4053
is not visible to older binaries.
4054
4055
* The `description` template keyword is now empty if no description set.
4056
Use `if(description, description, "(no description set)\n")` to get back
4057
the previous behavior.
4058
4059
* The `template.log.graph` and `template.commit_summary` config keys were
4060
renamed to `templates.log` and `templates.commit_summary` respectively.
4061
4062
* If a custom `templates.log` template is set, working-copy commit will
4063
no longer be highlighted automatically. Wrap your template with
4064
`label(if(current_working_copy, "working_copy"), ...)` to label the
4065
working-copy entry.
4066
4067
* The `ui.relative-timestamps` option has been removed. Use the
4068
`format_timestamp()` template alias instead. For details on showing relative
4069
timestamps in `jj log` and `jj show`, see [the documentation](docs/config.md).
4070
4071
* `jj op log` now shows relative timestamps by default. To disable, set
4072
`ui.oplog-relative-timestamps` to `false`.
4073
4074
* The global `--no-commit-working-copy` is now called `--ignore-working-copy`.
4075
4076
* The `diff.format` config option is now called `ui.diff.format`. The old name
4077
is still supported for now.
4078
4079
* `merge-tools.<name>.edit-args` now requires `$left`/`$right` parameters.
4080
The default is `edit-args = ["$left", "$right"]`.
4081
4082
* The builtin `jj update` and `jj up` aliases for `jj checkout` have been
4083
deleted.
4084
4085
* Change IDs are now rendered using letters from the end of the alphabet (from
4086
'z' through 'k') instead of the usual hex digits ('0' through '9' and 'a'
4087
through 'f'). This is to clarify the distinction between change IDs and commit
4088
IDs, and to allow more efficient lookup of unique prefixes. This change
4089
doesn't affect the storage format; existing repositories will remain usable.
4090
4091
### New features
4092
4093
* The default log format now uses the committer timestamp instead of the author
4094
timestamp.
4095
4096
* `jj log --summary --patch` now shows both summary and diff outputs.
4097
4098
* `jj git push` now accepts multiple `--branch`/`--change` arguments
4099
4100
* `jj config list` command prints values from config and `config edit` opens
4101
the config in an editor.
4102
4103
* `jj debug config-schema` command prints out JSON schema for the jj TOML config
4104
file format.
4105
4106
* `jj resolve --list` can now describe the complexity of conflicts.
4107
4108
* `jj resolve` now notifies the user of remaining conflicts, if any, on success.
4109
This can be prevented by the new `--quiet` option.
4110
4111
* Per-repository configuration is now read from `.jj/repo/config.toml`.
4112
4113
* Background colors, bold text, and underlining are now supported. You can set
4114
e.g. `colors.error = { bg = "red", bold = true, underline = true }` in your
4115
`~/.jjconfig.toml`.
4116
4117
* The `empty` condition in templates is true when the commit makes no change to
4118
the three compared to its parents.
4119
4120
* `branches([needle])` revset function now takes `needle` as an optional
4121
argument and matches just the branches whose name contains `needle`.
4122
4123
* `remote_branches([branch_needle[, remote_needle]])` now takes `branch_needle`
4124
and `remote_needle` as optional arguments and matches just the branches whose
4125
name contains `branch_needle` and remote contains `remote_needle`.
4126
4127
* `jj git fetch` accepts repeated `--remote` arguments.
4128
4129
* Default remotes can be configured for the `jj git fetch` and `jj git push`
4130
operations ("origin" by default) using the `git.fetch` and `git.push`
4131
configuration entries. `git.fetch` can be a list if multiple remotes must
4132
be fetched from.
4133
4134
* `jj duplicate` can now duplicate multiple changes in one go. This preserves
4135
any parent-child relationships between them. For example, the entire tree of
4136
descendants of `abc` can be duplicated with `jj duplicate abc:`.
4137
4138
* `jj log` now highlights the shortest unique prefix of every commit and change
4139
id and shows the rest in gray. To customize the length and style, use the
4140
`format_short_id()` template alias. For details, see
4141
[the documentation](docs/config.md).
4142
4143
* `jj print` was renamed to `jj cat`. `jj print` remains as an alias.
4144
4145
* In content that goes to the terminal, the ANSI escape byte (0x1b) is replaced
4146
by a "␛" character. That prevents them from interfering with the ANSI escapes
4147
jj itself writes.
4148
4149
* `jj workspace root` prints the root path of the current workspace.
4150
4151
* The `[alias]` config section was renamed to `[aliases]`. The old name is
4152
still accepted for backwards compatibility for some time.
4153
4154
* Commands that draw an ASCII graph (`jj log`, `jj op log`, `jj obslog`) now
4155
have different styles available by setting e.g. `ui.graph.style = "curved"`.
4156
4157
* `jj split` accepts creating empty commits when given a path. `jj split .`
4158
inserts an empty commit between the target commit and its children if any,
4159
and `jj split any-non-existent-path` inserts an empty commit between the
4160
target commit and its parents.
4161
4162
* Command arguments to `ui.diff-editor`/`ui.merge-editor` can now be specified
4163
inline without referring to `[merge-tools]` table.
4164
4165
* `jj rebase` now accepts a new `--allow-large-revsets` argument that allows the
4166
revset in the `-d` argument to expand to several revisions. For example,
4167
`jj rebase -s B -d B- -d C` now works even if `B` is a merge commit.
4168
4169
* `jj new` now also accepts a `--allow-large-revsets` argument that behaves
4170
similarly to `jj rebase --allow-large-revsets`.
4171
4172
* `jj new --insert-before` inserts the new commit between the target commit and
4173
its parents.
4174
4175
* `jj new --insert-after` inserts the new commit between the target commit and
4176
its children.
4177
4178
* `author`/`committer` templates now support `.username()`, which leaves out the
4179
domain information of `.email()`.
4180
4181
* It is now possible to change the author format of `jj log` with the
4182
`format_short_signature()` template alias. For details, see
4183
[the documentation](docs/config.md).
4184
4185
* Added support for template aliases. New symbols and functions can be
4186
configured by `template-aliases.<name> = <expression>`. Be aware that
4187
the template syntax isn't documented yet and is likely to change.
4188
4189
* The `ui.diff-instructions` config setting can be set to `false` to inhibit the
4190
creation of the `JJ-INSTRUCTIONS` file as part of diff editing.
4191
4192
### Fixed bugs
4193
4194
* When sharing the working copy with a Git repo, we used to forget to export
4195
branches to Git when only the working copy had changed. That's now fixed.
4196
4197
* Commit description set by `-m`/`--message` is now terminated with a newline
4198
character, just like descriptions set by editor are.
4199
4200
* The `-R`/`--repository` path must be a valid workspace directory. Its
4201
ancestor directories are no longer searched.
4202
4203
* Fixed a crash when trying to access a commit that's never been imported into
4204
the jj repo from a Git repo. They will now be considered as non-existent if
4205
referenced explicitly instead of crashing.
4206
4207
* Fixed handling of escaped characters in .gitignore (only keep trailing spaces
4208
if escaped properly).
4209
4210
* `jj undo` now works after `jj duplicate`.
4211
4212
* `jj duplicate` followed by `jj rebase` of a tree containing both the original
4213
and duplicate commit no longer crashes. The fix should also resolve any
4214
remaining
4215
instances of https://github.com/jj-vcs/jj/issues/27.
4216
4217
* Fix the output of `jj debug completion --help` by reversing fish and zsh text.
4218
4219
* Fixed edge case in `jj git fetch` when a pruned branch is a prefix of another
4220
branch.
4221
4222
### Contributors
4223
4224
Thanks to the people who made this release happen!
4225
4226
* Aleksandr Mikhailov (@AM5800)
4227
* Augie Fackler (@durin42)
4228
* Benjamin Saunders (@Ralith)
4229
* Daniel Ploch (@torquestomp)
4230
* Danny Hooper (@hooper)
4231
* David Barnett (@dbarnett)
4232
* Glen Choo (@chooglen)
4233
* Herby Gillot (@herbygillot)
4234
* Ilya Grigoriev (@ilyagr)
4235
* Luke Granger-Brown (@lukegb)
4236
* Martin von Zweigbergk (@martinvonz)
4237
* Michael Forster (@MForster)
4238
* Philip Metzger (@PhilipMetzger)
4239
* Ruben Slabbert (@rslabbert)
4240
* Samuel Tardieu (@samueltardieu)
4241
* Tal Pressman (@talpr)
4242
* Vamsi Avula (@avamsi)
4243
* Waleed Khan (@arxanas)
4244
* Yuya Nishihara (@yuja)
4245
4246
## [0.6.1] - 2022-12-05
4247
4248
No changes, only changed to a released version of the `thrift` crate dependency.
4249
4250
## [0.6.0] - 2022-12-05
4251
4252
### Breaking changes
4253
4254
* Dropped candidates set argument from `description(needle)`, `author(needle)`,
4255
`committer(needle)`, `merges()` revsets. Use `x & description(needle)`
4256
instead.
4257
4258
* Adjusted precedence of revset union/intersection/difference operators.
4259
`x | y & z` is now equivalent to `x | (y & z)`.
4260
4261
* Support for open commits has been dropped. The `ui.enable-open-commits` config
4262
that was added in 0.5.0 is no longer respected. The `jj open/close` commands
4263
have been deleted.
4264
4265
* `jj commit` is now a separate command from `jj close` (which no longer
4266
exists). The behavior has changed slightly. It now always asks for a
4267
description, even if there already was a description set. It now also only
4268
works on the working-copy commit (there's no `-r` argument).
4269
4270
* If a workspace's working-copy commit has been updated from another workspace,
4271
most commands in that workspace will now fail. Use the new
4272
`jj workspace update-stale` command to update the workspace to the new
4273
working-copy commit. (The old behavior was to automatically update the
4274
workspace.)
4275
4276
### New features
4277
4278
* Commands with long output are paginated.
4279
[#9](https://github.com/jj-vcs/jj/issues/9)
4280
4281
* The new `jj git remote rename` command allows git remotes to be renamed
4282
in-place.
4283
4284
* The new `jj resolve` command allows resolving simple conflicts with
4285
an external 3-way-merge tool.
4286
4287
* `jj git push` will search `@-` for branches to push if `@` has none.
4288
4289
* The new revset function `file(pattern..)` finds commits modifying the
4290
paths specified by the `pattern..`.
4291
4292
* The new revset function `empty()` finds commits modifying no files.
4293
4294
* Added support for revset aliases. New symbols and functions can be configured
4295
by `revset-aliases.<name> = <expression>`.
4296
4297
* It is now possible to specify configuration options on the command line
4298
with the new `--config-toml` global option.
4299
4300
* `jj git` subcommands will prompt for credentials when required for HTTPS
4301
remotes rather than failing.
4302
[#469](https://github.com/jj-vcs/jj/issues/469)
4303
4304
* Branches that have a different target on some remote than they do locally are
4305
now indicated by an asterisk suffix (e.g. `main*`) in `jj log`.
4306
[#254](https://github.com/jj-vcs/jj/issues/254)
4307
4308
* The commit ID was moved from first on the line in `jj log` output to close to
4309
the end. The goal is to encourage users to use the change ID instead, since
4310
that is generally more convenient, and it reduces the risk of creating
4311
divergent commits.
4312
4313
* The username and hostname that appear in the operation log are now
4314
configurable via config options `operation.username` and `operation.hostname`.
4315
4316
* `jj git` subcommands now support credential helpers.
4317
4318
* `jj log` will warn if it appears that the provided path was meant to be a
4319
revset.
4320
4321
* The new global flag `-v/--verbose` will turn on debug logging to give
4322
some additional insight into what is happening behind the scenes.
4323
Note: This is not comprehensively supported by all operations yet.
4324
4325
* `jj log`, `jj show`, and `jj obslog` now all support showing relative
4326
timestamps by setting `ui.relative-timestamps = true` in the config file.
4327
4328
### Fixed bugs
4329
4330
* A bug in the export of branches to Git caused spurious conflicted branches.
4331
This typically occurred when running in a working copy colocated with Git
4332
(created by running `jj init --git-dir=.`).
4333
[#463](https://github.com/jj-vcs/jj/issues/463)
4334
4335
* When exporting branches to Git, we used to fail if some branches could not be
4336
exported (e.g. because Git doesn't allow a branch called `main` and another
4337
branch called `main/sub`). We now print a warning about these branches
4338
instead.
4339
[#493](https://github.com/jj-vcs/jj/issues/493)
4340
4341
* If you had modified branches in jj and also modified branches in conflicting
4342
ways in Git, `jj git export` used to overwrite the changes you made in Git.
4343
We now print a warning about these branches instead.
4344
4345
* `jj edit root` now fails gracefully.
4346
4347
* `jj git import` used to abandon a commit if Git branches and tags referring
4348
to it were removed. We now keep it if a detached HEAD refers to it.
4349
4350
* `jj git import` no longer crashes when all Git refs are removed.
4351
4352
* Git submodules are now ignored completely. Earlier, files present in the
4353
submodule directory in the working copy would become added (tracked), and
4354
later removed if you checked out another commit. You can now use `git` to
4355
populate the submodule directory and `jj` will leave it alone.
4356
4357
* Git's GC could remove commits that were referenced from jj in some cases. We
4358
are now better at adding Git refs to prevent that.
4359
[#815](https://github.com/jj-vcs/jj/issues/815)
4360
4361
* When the working-copy commit was a merge, `jj status` would list only the
4362
first parent, and the diff summary would be against that parent. The output
4363
now lists all parents and the diff summary is against the auto-merged parents.
4364
4365
### Contributors
4366
4367
Thanks to the people who made this release happen!
4368
4369
* Martin von Zweigbergk (@martinvonz)
4370
* Benjamin Saunders (@Ralith)
4371
* Yuya Nishihara (@yuja)
4372
* Glen Choo (@chooglen)
4373
* Ilya Grigoriev (@ilyagr)
4374
* Ruben Slabbert (@rslabbert)
4375
* Waleed Khan (@arxanas)
4376
* Sean E. Russell (@xxxserxxx)
4377
* Pranay Sashank (@pranaysashank)
4378
* Luke Granger-Brown (@lukegb)
4379
4380
## [0.5.1] - 2022-10-17
4381
4382
No changes (just trying to get automated GitHub release to work).
4383
4384
## [0.5.0] - 2022-10-17
4385
4386
### Breaking changes
4387
4388
* Open commits are now disabled by default. That means that `jj checkout` will
4389
always create a new change on top of the specified commit and will let you
4390
edit that in the working copy. Set `ui.enable-open-commits = true` to restore
4391
the old behavior and let us know that you did so we know how many people
4392
prefer the workflow with open commits.
4393
4394
* `jj [op] undo` and `jj op restore` used to take the operation to undo or
4395
restore to as an argument to `-o/--operation`. It is now a positional
4396
argument instead (i.e. `jj undo -o abc123` is now written `jj undo abc123`).
4397
4398
* An alias that is not configured as a string list (e.g. `my-status = "status"`
4399
instead of `my-status = ["status"]`) is now an error instead of a warning.
4400
4401
* `jj log` now defaults to showing only commits that are not on any remote
4402
branches (plus their closest commit on the remote branch for context). This
4403
set of commits can be overridden by setting `ui.default-revset`. Use
4404
`jj log -r 'all()'` for the old behavior. Read more about revsets
4405
[here](https://github.com/jj-vcs/jj/blob/main/docs/revsets.md).
4406
[#250](https://github.com/jj-vcs/jj/issues/250)
4407
4408
* `jj new` now always checks out the new commit (used to be only if the parent
4409
was `@`).
4410
4411
* `jj merge` now checks out the new commit. The command now behaves exactly
4412
like `jj new`, except that it requires at least two arguments.
4413
4414
* When the working-copy commit is abandoned by `jj abandon` and the parent
4415
commit is open, a new working-copy commit will be created on top (the open
4416
parent commit used to get checked out).
4417
4418
* `jj branch` now uses subcommands like `jj branch create` and
4419
`jj branch forget` instead of options like `jj branch --forget`.
4420
[#330](https://github.com/jj-vcs/jj/issues/330)
4421
4422
* The [`$NO_COLOR` environment variable](https://no-color.org/) no longer
4423
overrides the `ui.color` configuration if explicitly set.
4424
4425
* `jj edit` has been renamed to `jj touchup`, and `jj edit` is now a new command
4426
with different behavior. The new `jj edit` lets you edit a commit in the
4427
working copy, even if the specified commit is closed.
4428
4429
* `jj git push` no longer aborts if you attempt to push an open commit (but it
4430
now aborts if a commit does not have a description).
4431
4432
* `jj git push` now pushes only branches pointing to the `@` by default. Use
4433
`--all` to push all branches.
4434
4435
* The `checkouts` template keyword is now called `working_copies`, and
4436
`current_checkout` is called `current_working_copy`.
4437
4438
### New features
4439
4440
* The new `jj interdiff` command compares the changes in commits, ignoring
4441
changes from intervening commits.
4442
4443
* `jj rebase` now accepts a `--branch/-b <revision>` argument, which can be used
4444
instead of `-r` or `-s` to specify which commits to rebase. It will rebase the
4445
whole branch, relative to the destination. The default mode has changed from
4446
`-r @` to `-b @`.
4447
4448
* The new `jj print` command prints the contents of a file in a revision.
4449
4450
* The new `jj git remotes list` command lists the configured remotes and their
4451
URLs.
4452
[#243](https://github.com/jj-vcs/jj/issues/243)
4453
4454
* `jj move` and `jj squash` now lets you limit the set of changes to move by
4455
specifying paths on the command line (in addition to the `--interactive`
4456
mode). For example, use `jj move --to @-- foo` to move the changes to file
4457
(or directory) `foo` in the working copy to the grandparent commit.
4458
4459
* When `jj move/squash/unsquash` abandons the source commit because it became
4460
empty and both the source and the destination commits have non-empty
4461
descriptions, it now asks for a combined description. If either description
4462
was empty, it uses the other without asking.
4463
4464
* `jj split` now lets you specify on the CLI which paths to include in the first
4465
commit. The interactive diff-editing is not started when you do that.
4466
4467
* Sparse checkouts are now supported. In fact, all working copies are now
4468
"sparse", only to different degrees. Use the `jj sparse` command to manage
4469
the paths included in the sparse checkout.
4470
4471
* Configuration is now also read from `~/.jjconfig.toml`.
4472
4473
* The `$JJ_CONFIG` environment variable can now point to a directory. If it
4474
does, all files in the directory will be read, in alphabetical order.
4475
4476
* The `$VISUAL` environment is now respected and overrides `$EDITOR`. The new
4477
`ui.editor` config has higher priority than both of them. There is also a new
4478
`$JJ_EDITOR` environment variable, which has even higher priority than the
4479
config.
4480
4481
* You can now use `-` and `+` in revset symbols. You used to have to quote
4482
branch names like `my-feature` in nested quotes (outer layer for your shell)
4483
like `jj co '"my-feature"'`. The quoting is no longer needed.
4484
4485
* The new revset function `connected(x)` is the same as `x:x`.
4486
4487
* The new revset function `roots(x)` finds commits in the set that are not
4488
descendants of other commits in the set.
4489
4490
* ssh-agent is now detected even if `$SSH_AGENT_PID` is not set (as long as
4491
`$SSH_AUTH_SOCK` is set). This should help at least macOS users where
4492
ssh-agent is launched by default and only `$SSH_AUTH_SOCK` is set.
4493
4494
* When importing from a git, any commits that are no longer referenced on the
4495
git side will now be abandoned on the jj side as well. That means that
4496
`jj git fetch` will now abandon unreferenced commits and rebase any local
4497
changes you had on top.
4498
4499
* `jj git push` gained a `--change <revision>` argument. When that's used, it
4500
will create a branch named after the revision's change ID, so you don't have
4501
to create a branch yourself. By default, the branch name will start with
4502
`push-`, but this can be overridden by the `push.branch-prefix` config
4503
setting.
4504
4505
* `jj git push` now aborts if you attempt to push a commit without a
4506
description or with the placeholder "(no name/email configured)" values for
4507
author/committer.
4508
4509
* Diff editor command arguments can now be specified by config file.
4510
Example:
4511
4512
[merge-tools.kdiff3]
4513
program = "kdiff3"
4514
edit-args = ["--merge", "--cs", "CreateBakFiles=0"]
4515
4516
* `jj branch` can accept any number of branches to update, rather than just one.
4517
4518
* Aliases can now call other aliases.
4519
4520
* `jj log` now accepts a `--reversed` option, which will show older commits
4521
first.
4522
4523
* `jj log` now accepts file paths.
4524
4525
* `jj obslog` now accepts `-p`/`--patch` option, which will show the diff
4526
compared to the previous version of the change.
4527
4528
* The "(no name/email configured)" placeholder value for name/email will now be
4529
replaced if once you modify a commit after having configured your name/email.
4530
4531
* Color setting can now be overridden by `--color=always|never|auto` option.
4532
4533
* `jj checkout` now lets you specify a description with `--message/-m`.
4534
4535
* `jj new` can now be used for creating merge commits. If you pass more than
4536
one argument to it, the new commit will have all of them as parents.
4537
4538
### Fixed bugs
4539
4540
* When rebasing a conflict where one side modified a file and the other side
4541
deleted it, we no longer automatically resolve it in favor of the modified
4542
content (this was a regression from commit c0ae4b16e8c4).
4543
4544
* Errors are now printed to stderr (they used to be printed to stdout).
4545
4546
* Updating the working copy to a commit where a file's executable bit changed
4547
but the contents was the same used to lead to a crash. That has now been
4548
fixed.
4549
4550
* If one side of a merge modified a directory and the other side deleted it, it
4551
used to be considered a conflict. The same was true if both sides added a
4552
directory with different files in. They are now merged as if the missing
4553
directory had been empty.
4554
4555
* When using `jj move` to move part of a commit into an ancestor, any branches
4556
pointing to the source commit used to be left on a hidden intermediate commit.
4557
They are now correctly updated.
4558
4559
* `jj untrack` now requires at least one path (allowing no arguments was a UX
4560
bug).
4561
4562
* `jj rebase` now requires at least one destination (allowing no arguments was a
4563
UX bug).
4564
4565
* `jj restore --to <rev>` now restores from the working copy (it used to restore
4566
from the working copy's parent).
4567
4568
* You now get a proper error message instead of a crash when `$EDITOR` doesn't
4569
exist or exits with an error.
4570
4571
* Global arguments, such as `--at-op=<operation>`, can now be passed before
4572
an alias.
4573
4574
* Fixed relative path to the current directory in output to be `.` instead of
4575
empty string.
4576
4577
* When adding a new workspace, the parent of the current workspace's current
4578
checkout will be checked out. That was always the intent, but the root commit
4579
was accidentally checked out instead.
4580
4581
* When checking out a commit, the previous commit is no longer abandoned if it
4582
has a non-empty description.
4583
4584
* All commands now consistently snapshot the working copy (it was missing from
4585
e.g. `jj undo` and `jj merge` before).
4586
4587
## [0.4.0] - 2022-04-02
4588
4589
### Breaking changes
4590
4591
* Dropped support for config in `~/.jjconfig`. Your configuration is now read
4592
from `<config dir>/jj/config.toml`, where `<config dir>` is
4593
`${XDG_CONFIG_HOME}` or `~/.config/` on Linux,
4594
`~/Library/Application Support/` on macOS, and `~\AppData\Roaming\` on
4595
Windows.
4596
4597
### New features
4598
4599
* You can now set an environment variable called `$JJ_CONFIG` to a path to a
4600
config file. That will then be read instead of your regular config file. This
4601
is mostly intended for testing and scripts.
4602
4603
* The [standard `$NO_COLOR` environment variable](https://no-color.org/) is now
4604
respected.
4605
4606
* `jj new` now lets you specify a description with `--message/-m`.
4607
4608
* When you check out a commit, the old commit no longer automatically gets
4609
abandoned if it's empty and has descendants, it only gets abandoned if it's
4610
empty and does not have descendants.
4611
4612
* When undoing an earlier operation, any new commits on top of commits from the
4613
undone operation will be rebased away. For example, let's say you rebase
4614
commit A so it becomes a new commit A', and then you create commit B on top of
4615
A'. If you now undo the rebase operation, commit B will be rebased to be on
4616
top of A instead. The same logic is used if the repo was modified by
4617
concurrent operations (so if one operation added B on top of A, and one
4618
operation rebased A as A', then B would be automatically rebased on top of
4619
A'). See #111 for more examples.
4620
[#111](https://github.com/jj-vcs/jj/issues/111)
4621
4622
* `jj log` now accepts `-p`/`--patch` option.
4623
4624
### Fixed bugs
4625
4626
* Fixed crash on `jj init --git-repo=.` (it almost always crashed).
4627
4628
* When sharing the working copy with a Git repo, the automatic importing and
4629
exporting (sometimes?) didn't happen on Windows.
4630
4631
## [0.3.3] - 2022-03-16
4632
4633
No changes, only trying to get the automated build to work.
4634
4635
## [0.3.2] - 2022-03-16
4636
4637
No changes, only trying to get the automated build to work.
4638
4639
## [0.3.1] - 2022-03-13
4640
4641
### Fixed bugs
4642
4643
- Fixed crash when `core.excludesFile` pointed to nonexistent file, and made
4644
leading `~/` in that config expand to `$HOME/`
4645
[#131](https://github.com/jj-vcs/jj/issues/131)
4646
4647
## [0.3.0] - 2022-03-12
4648
4649
Last release before this changelog started.
4650
4651
[unreleased]: https://github.com/jj-vcs/jj/compare/v0.37.0...HEAD
4652
[0.37.0]: https://github.com/jj-vcs/jj/compare/v0.36.0...v0.37.0
4653
[0.36.0]: https://github.com/jj-vcs/jj/compare/v0.35.0...v0.36.0
4654
[0.35.0]: https://github.com/jj-vcs/jj/compare/v0.34.0...v0.35.0
4655
[0.34.0]: https://github.com/jj-vcs/jj/compare/v0.33.0...v0.34.0
4656
[0.33.0]: https://github.com/jj-vcs/jj/compare/v0.32.0...v0.33.0
4657
[0.32.0]: https://github.com/jj-vcs/jj/compare/v0.31.0...v0.32.0
4658
[0.31.0]: https://github.com/jj-vcs/jj/compare/v0.30.0...v0.31.0
4659
[0.30.0]: https://github.com/jj-vcs/jj/compare/v0.29.0...v0.30.0
4660
[0.29.0]: https://github.com/jj-vcs/jj/compare/v0.28.2...v0.29.0
4661
[0.28.2]: https://github.com/jj-vcs/jj/compare/v0.28.1...v0.28.2
4662
[0.28.1]: https://github.com/jj-vcs/jj/compare/v0.28.0...v0.28.1
4663
[0.28.0]: https://github.com/jj-vcs/jj/compare/v0.27.0...v0.28.0
4664
[0.27.0]: https://github.com/jj-vcs/jj/compare/v0.26.0...v0.27.0
4665
[0.26.0]: https://github.com/jj-vcs/jj/compare/v0.25.0...v0.26.0
4666
[0.25.0]: https://github.com/jj-vcs/jj/compare/v0.24.0...v0.25.0
4667
[0.24.0]: https://github.com/jj-vcs/jj/compare/v0.23.0...v0.24.0
4668
[0.23.0]: https://github.com/jj-vcs/jj/compare/v0.22.0...v0.23.0
4669
[0.22.0]: https://github.com/jj-vcs/jj/compare/v0.21.0...v0.22.0
4670
[0.21.0]: https://github.com/jj-vcs/jj/compare/v0.20.0...v0.21.0
4671
[0.20.0]: https://github.com/jj-vcs/jj/compare/v0.19.0...v0.20.0
4672
[0.19.0]: https://github.com/jj-vcs/jj/compare/v0.18.0...v0.19.0
4673
[0.18.0]: https://github.com/jj-vcs/jj/compare/v0.17.1...v0.18.0
4674
[0.17.1]: https://github.com/jj-vcs/jj/compare/v0.17.0...v0.17.1
4675
[0.17.0]: https://github.com/jj-vcs/jj/compare/v0.16.0...v0.17.0
4676
[0.16.0]: https://github.com/jj-vcs/jj/compare/v0.15.1...v0.16.0
4677
[0.15.1]: https://github.com/jj-vcs/jj/compare/v0.15.0...v0.15.1
4678
[0.15.0]: https://github.com/jj-vcs/jj/compare/v0.14.0...v0.15.0
4679
[0.14.0]: https://github.com/jj-vcs/jj/compare/v0.13.0...v0.14.0
4680
[0.13.0]: https://github.com/jj-vcs/jj/compare/v0.12.0...v0.13.0
4681
[0.12.0]: https://github.com/jj-vcs/jj/compare/v0.11.0...v0.12.0
4682
[0.11.0]: https://github.com/jj-vcs/jj/compare/v0.10.0...v0.11.0
4683
[0.10.0]: https://github.com/jj-vcs/jj/compare/v0.9.0...v0.10.0
4684
[0.9.0]: https://github.com/jj-vcs/jj/compare/v0.8.0...v0.9.0
4685
[0.8.0]: https://github.com/jj-vcs/jj/compare/v0.7.0...v0.8.0
4686
[0.7.0]: https://github.com/jj-vcs/jj/compare/v0.6.1...v0.7.0
4687
[0.6.1]: https://github.com/jj-vcs/jj/compare/v0.6.0...v0.6.1
4688
[0.6.0]: https://github.com/jj-vcs/jj/compare/v0.5.1...v0.6.0
4689
[0.5.1]: https://github.com/jj-vcs/jj/compare/v0.5.0...v0.5.1
4690
[0.5.0]: https://github.com/jj-vcs/jj/compare/v0.4.0...v0.5.0
4691
[0.4.0]: https://github.com/jj-vcs/jj/compare/v0.3.3...v0.4.0
4692
[0.3.3]: https://github.com/jj-vcs/jj/compare/v0.3.2...v0.3.3
4693
[0.3.2]: https://github.com/jj-vcs/jj/compare/v0.3.1...v0.3.2
4694
[0.3.1]: https://github.com/jj-vcs/jj/compare/v0.3.0...v0.3.1
4695
[0.3.0]: https://github.com/jj-vcs/jj/releases/tag/v0.3.0
4696