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