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