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