garden-tools 2.6.0

Garden grows and cultivates collections of Git trees Garden lets you define and run commands over collections of configuration-defined multi-worktree Git environments.
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
# Changelog

## v2.6.0

*Released 2026-03-14*

**Features**:

- `garden <custom-cmd>` now has a `-x | --echo` option that enables the shell's
native echo mode.

**Packaging**:

- [Prebuilt binaries for Apple Darwin aarch64]https://github.com/garden-rs/garden/releases
are now available.

- Garden can now be installed directly via
[Homebrew on macOS]https://github.com/Homebrew/homebrew-core/pull/271700.
The `garden-rs/homebrew-garden` tap repository has been archived and is no
longer maintained.


## v2.5.1

*Released 2026-01-27*

**Fixes**:

- Updated the command-line parser to account for a change in behavior in
[clap v4.5.55]https://github.com/clap-rs/clap/issues/5040.


## v2.5.0

*Released 2025-12-31*

**Features**:

- `garden git` was added for running Git sub-commands.

**Development**:

- The minimum supported Rust version is now 1.88.0.

- `eframe`, `egui` and `egui_autocomplete` were updated to the latest version.


## v2.4.0

*Released 2025-12-22*

**Development**:

- The minimum supported Rust version is now 1.86.0.

- `cargo-clap`, `rayon`, `which` and `yaml-rust2` were updated to the latest versions.

- Pinned dependencies `idna` and `mime_guess2` have been removed from `Cargo.toml`.

- The test suite no longer depends on the deprecated `CommandCargoExt` extension
from the `assert_cmd` crate.


## v2.3.0

*Released 2025-09-01*

**Features**:

- Garden variables can now be defined as being *required* variables. A required variable
must evaluate to a non-empty string. If a required variable evaluates to an empty value
then an error is reported and execution is aborted.
([#21]https://gitlab.com/garden-rs/garden/-/issues/21)

- `garden ls -cc` now displays command recipes.

**Development**:

- `garden-gui` switched over to `egui_autocomplete` now that our
[autocomplete multiple words feature]https://github.com/JakeHandsome/egui_autocomplete/pull/38
was merged and released.


## v2.2.0

*Released 2025-05-11*

**Features**:

- `garden ls` now has a `-R | --no-remotes` option to disable the display of remotes.

- `garden gui` now avoids displaying duplicate trees.

- `garden --help` now uses ANSI colors.

**Development**:

- The `xdg` dependency was upgraded to v3.0.

- The `idna_adapter` and `mime_guess2` crates were pinned to maintain the
current MSRV of 1.81.0 for `garden-gui`.


## v2.1.0

*Released 2025-02-23*

**Features**:

- Commands defined in Garden and Tree scopes are now runnable from the `garden gui`
command palette.

- `garden grow` is now runnable from the `garden gui` commands and query results.

- `garden ls` is now runnable from the `garden gui` commands and query results.

- Missing trees are now displayed in red in the `garden gui` query results.

- Tree names and paths can now be copied to the system clipboard from the
`garden gui` query results.

- Autocompletion was added to the `garden gui` query field.

- Escape and Ctrl-Q hotkeys can now close the `garden gui` command details window.

- The Ctrl-Q hotkey will now close the main `garden gui` window.

- `garden ls` now has `-G | --no-groups` and `-N | --no-gardens` options
for omitting groups and gardens from its output.

**Development**:

- The `v2.0.0` release removed `Cargo.lock` and added an entry for it to `.gitignore`.
The `.gitignore` entry has now been removed to make it easier for packagers to track
their changes.

- The `yaml-rust2` dependency was upgraded to v0.10.

- The `egui` dependency was upgraded to v0.31.

**Documentation**:

- Windows support was improved in `v1.10.1` to the point where we can now consider
Windows as being officially supported. This development has now been documented
in the installation section of the Garden User Guide.

**Packaging**:

- The Nightly Build artifacts from Gitlab CI have been updated to include `garden-gui`.


## v2.0.0

*Released 2025-01-26*

**Features**:

- A new `garden-gui` graphical user interface for Garden is now available.
Garden GUI is provided as a separate `cargo install garden-gui` crate.

**Development**:

- The `dirs` dependency was upgraded to v6.0.

- The `thiserror` dependency was upgraded to v2.0.

- The `which` dependency was upgraded to v7.0.


## v1.10.1

*Released 2025-01-14*

**Features**:

- `garden completion` now includes a comment in its output indicating which version of
`garden` was used to generate the completion script.

- Windows support was improved by avoiding UNC paths.
([#20]https://gitlab.com/garden-rs/garden/-/issues/20)


## v1.10.0

*Released 2024-12-14*

**Features**:

- `garden grow` can now filter the remotes that will be updated by specifying a glob
pattern to the new `--remote` option.

- `garden ls` now has a `-s | --sort` option that allows you to sort
trees by name or modification time.

**Development**:

- Use of the [unmaintained]https://rustsec.org/advisories/RUSTSEC-2024-0388
`derivative` crate has been eliminated.


## v1.9.1

*Released 2024-11-06*

**Features**:

- `GARDEN_CMD_VERBOSE` and `GARDEN_CMD_QUIET` are now updated when using
`garden <command> -v ...` and `garden cmd <command> -v ...`.
Previously, these variables were only set when `-v` was used against the `garden`
command directly, before any sub-commands, e.g. `garden -v ...`.

**Fixes**:

- `garden exec`'s parallel mode was made more robust.


## v1.9.0

*Released 2024-10-11*

**Features**:

- `garden exec` can now run commands in parallel using the `-j# | --jobs=#` option.
([#43]https://github.com/garden-rs/garden/issues/43)

**Packaging**:

- Garden's Nix flake was improved and using Garden with Nix home-manager was documented.
([#46]https://github.com/garden-rs/garden/pull/46)
([#17]https://github.com/garden-rs/garden/issues/17)

**Development**:

- Internal APIs for running commands were refactored.

- The `yaml-rust2` dependency was upgraded to v0.9.


## v1.8.0

*Released 2024-09-26*

**Features**:

- `garden cmd` and custom commands now have a `-j# | --jobs=#` option for
[running commands in parallel]https://garden-rs.gitlab.io/commands.html#parallel-execution.
Use `-j0 | --jobs=0` to use all available cores.
([#43]https://github.com/garden-rs/garden/issues/43)
([#45]https://github.com/garden-rs/garden/pull/45)

- `garden ls` now has a `--reverse | -r` option to display trees in reverse order.
([#44]https://github.com/garden-rs/garden/pull/44)

**Development**:

- The `which`, `yansi` and `strum` dependencies were upgraded. `yansi` was a new major version
and required a fair amount of changes. `strum` involved minor changes.
([#42]https://github.com/garden-rs/garden/pull/42)


## v1.7.0

*Released 2024-06-29*

**Features**:

- `garden ls` now has a `--commands | -c` option to display just commands.
The related `--no-commands | -C` option is used to omit commands from being displayed.
([#39]https://github.com/garden-rs/garden/issues/39)
([#41]https://github.com/garden-rs/garden/pull/41)

- `garden cmd` and `garden <custom-command>` now support a `--dry-run | -N` option
to perform trial runs without actually running any commands.
([#39]https://github.com/garden-rs/garden/issues/39)
([#41]https://github.com/garden-rs/garden/pull/41)

- `garden exec` made `-N` the short option for its `--dry-run` option and the original
`-n` short option was made an undocumented alias for compatibility.
([#41]https://github.com/garden-rs/garden/pull/41)

- The `garden eval`, `garden exec`, `garden cmd` and custom sub-commands
now accept the same `--define | -D name=value` override options as the root
`garden` command.

- `garden grow` reports more details about the commands it runs and no
longer prints redundant `git config` commands.

**Fixes**:

- `garden ls` now prints the list of commands in the same order as they appear in `garden.yaml`.
([#39]https://github.com/garden-rs/garden/issues/39)
([#41]https://github.com/garden-rs/garden/pull/41)

**Packaging**:

- The nix flake was updated to re-enable llvm coverage.
([#38]https://github.com/garden-rs/garden/pull/38)

- `nix run` can now be used to run `garden` and `nix shell` can now be used to
open a nix shell with garden installed.
([#40]https://github.com/garden-rs/garden/pull/40)

**Development**:

- More structs, functions and methods were made private.

- Several types were renamed from "HashMap" to "Map".


## v1.6.0

*Released 2024-06-02*

**Features**:

- `zsh` is now invoked using `zsh +o nomatch` for better portability across
shells. This prevents zsh from erroring when wildcard patterns find
no matches. Wildcards can be used, for example, to implement a
custom `clean` command that feeds `rm -f` using wildcard patterns,
but these commands would generate errors without disabling `nomatch`.
The zsh `nomatch` option is a less useful option for non-interactive use
so we disable it unconditionally.

- The `--verbose | -v` option can now be passed to custom and built-in commands.
The `verbose` option was previously a global option that had to
be specified before sub-commands. The following invocations are all
equivalent now:
  - `garden -vv build`
  - `garden -v build -v`
  - `garden build -vv`

  ([#36]https://github.com/garden-rs/garden/pull/36)

**Packaging**:

- The nix flake was updated to use Fenix for the latest stable rustc 1.78.0.
([#37]https://github.com/garden-rs/garden/pull/37)

**Development**:

- An `.envrc` file was added to enable the nix flake for direnv users.
([#37]https://github.com/garden-rs/garden/pull/37)


## v1.5.0

*Released 2024-04-14*

**Features**:

- Running `garden init` inside a Git repository will now record the
current directory as a tree with its path set to  `${GARDEN_CONFIG_DIR}`.
([#34]https://github.com/garden-rs/garden/pull/34)

- Custom commands skip missing trees by default. A new `-f | --force`
option can be used to make `garden` run commands on missing trees.
([#33]https://github.com/garden-rs/garden/issues/33)

- `garden plant` now avoids updating the configuration when a tree is
re-planted and its configuration contains expressions that evaluate
to the same value as currently exist in git.
([#31]https://github.com/garden-rs/garden/issues/31)
([#32]https://github.com/garden-rs/garden/pull/32)

**Packaging**:

- [Prebuilt binaries]https://github.com/garden-rs/garden/releases
are now available!

**Development**:

- The original github repository under `davvid`'s namespace was transferred to the
[garden-rs]https://github.com/garden-rs/garden organization on github.

- The `yaml-rust2` dependency was upgraded to `0.8.0` to avoid the `encoding` crate
([RUSTSEC-2021-0153]https://rustsec.org/advisories/RUSTSEC-2021-0153).


## v1.4.1

*Released 2024-03-22*

**Features**:

- The empty directory detection in `garden grow` was improved.

**Development**:

- The internal APIs were updated to use `AsRef<Path>` wherever possible.


## v1.4.0

*Released 2024-03-21*

**Features**:

- Custom commands can now specify an interpreter to use on a per-command basis.
If a command uses a shebang `#!` line then the command's text will be passed as the
next argument to the specified command. For example, using `#!python3 -c` as the
first line in a custom command will cause `python3 -c <command>` to be executed.

- Trees can now use branches defined in separate remotes when configuring the
default branch to checkout. `garden grow` will now fetch the remote associated with the
configured branch switching branches in order to make this possible.

- Trees can now use any upstream branch from any configured remote in the `branches` section.
Previously, branches associated with non-default remotes could not be created unless
they were fetched beforehand. `garden grow` will now fetch the associated remote
before creating the local branch.

- `garden grow` now detects empty directories (e.g. the directories that are created
when using uninitialized Git submodules) and will properly clone into the empty directories
instead of treating them like an already-grown tree.
([#30]https://github.com/garden-rs/garden/pull/30)

**Development**:

- `garden` can now be built on Windows. Symlink trees and the XDG base directory support
is UNIX-only and disabled on Windows.
([#17]https://gitlab.com/garden-rs/garden/-/issues/17)

- [yaml-rust2]https://crates.io/crates/yaml-rust2 is now used instead of
the [yaml-rust-davvid]https://crates.io/crates/yaml-rust-davvid fork that was
being maintained by [@davvid]https://github.com/davvid for use by garden.
([#29]https://github.com/garden-rs/garden/pull/29)


## v1.3.0

*Released 2024-02-19*

**Features**:

- `garden eval` and garden expressions in general will now resolve variables defined
within `environment` blocks. Environment blocks were previously not considered when
resolving variables. Environment blocks are now resolved and checked for variables
when `${variable}` expressions do not find the variable in scopes with higher
precedence. The precedence order, from strongest to weakest, is the `variables`
block in a garden's scope, the `variables` block in a tree's scope, the
`variables` block in global configuration scope, the `environments` block in
a garden's scope, the `environments` block in a tree's scope, the
`environments` block in global configuration scope and, lastly, OS environment
variables. The first entry found is used when expanding variable expressions.
([#23]https://github.com/garden-rs/garden/pull/23)

- Evaluation cycles (i.e. circular variable dependencies) are now prevented when
evaluating garden variables. The evaluation engine will now return empty strings
when a variable with a cyclical expression is evaluated.
([#24]https://github.com/garden-rs/garden/pull/24)

- When `zsh` is used as the `garden.shell`, which happens automatically when `zsh`
is installed, `garden` will now use `zsh -o shwordsplit` in order to enable
word-splitting of `$variable` expressions by default. This makes `zsh` behave
just like other shells by default, which improves the portability of commands.
Configure `garden.shell-wordsplit` to `false` or use the
`garden <cmd> -z | --no-wordsplit` option to opt-out of this behavior.
([#25]https://github.com/garden-rs/garden/pull/25)

- `garden.shell` can now be configured to use arbitrary commands for executing
command strings. Garden uses the configured `garden.shell` as-is and does
not augment its options (e.g. `-e`  or `-o shwordsplit`) when a custom command
is used. Custom commands are identified as commands that expand to 2 or more
command-line arguments. Thus, `python3` is not considered a custom command
and `garden` will run `python3 -c <string>` to run commands. On the other
hand, specifying `ruby -e` *is* considered a custom command because it
expands to `["ruby", "-e"]` under the hood. If you need to use a custom
command  that takes no additional command-line arguments then you can
use `env` as an extra argument to have it be considered as a custom shell.
For example, `env custom-shell` will cause `garden` to run
`env custom-shell <string>`, which is equivalent to `custom-shell <string>`.
Using just `custom-shell` would have resulted in `garden` running
`custom-shell -c <string>` instead, which may not be desired.
([#26]https://github.com/garden-rs/garden/pull/26)

- The `garden shell` command can now be configured to use an interactive command shell
that is distinct from the command specified in the `garden.shell` configuration by
configuring the `garden.interactive-shell` value.
([#26]https://github.com/garden-rs/garden/pull/26)

- `garden shell` can now be run without any arguments. The tree query now defaults to
`.` so that the tree in the current directory is used when nothing is specified.
([#26]https://github.com/garden-rs/garden/pull/26)

- Custom commands now have access to a `${GARDEN_CMD_VERBOSE}` and `${GARDEN_CMD_QUIET}`
variables which can be used to forward the `--verbose` and `--quiet` arguments
down into child `garden` invocations. `${GARDEN_CMD_VERBOSE}` uses the short `-v`
flag in the value to support the case where the verbose option is specified
multiples times to increase the verbosity level (e.g. `-vv`).
([#27]https://github.com/garden-rs/garden/pull/27)


## v1.2.1

*Released 2024-02-05*

**Development**:

- The `yaml-rust-davvid` dependency was upgraded to `v0.6.0`.

- Documentation and code maintenance.


## v1.2.0

*Released 2024-01-27*

**Features**:

- If a garden file has no trees defined at all then an implicit tree called
`.` will now be synthesized into existence. The presence of this implicit tree
allows garden files that define just the current directory as a tree to omit
the entire `trees` section altogether. This consequently makes it easier
to use garden as a simple command runner because the `commands` section
is the only section required in order to run `garden` commands.

- When `garden.root` is not configured `garden` will behave as if
`garden.root` is configured to `${GARDEN_CONFIG_DIR}`. This allows garden files to
omit `garden.root` from their configuration in typical scenarios.

- Configuring `garden.root` to an empty string (`""`) will behave as if `garden.root`
is configured to the current directory from which `garden` was run.

- When a `garden.yaml` file does not exist in the current directory then garden
will walk up the file system searching for `garden.yaml` or the name specified using
`garden -c <name>`. Garden will behave as if it were launched from the directory
containing the garden file when a configuration file is found.

- The `GARDEN_CEILING_DIRS` and `GIT_CEILING_DIRS` environment variables can be
used to limit the `garden.yaml` discovery by preventing `garden` from traversing
into and beyond the specified directories when discovering garden files.

- `garden exec`, `garden cmd` `garden grow`, `garden ls` and custom garden commands
can now filter the trees they operate over by passing a glob pattern using
`-t | --trees` option. These commands will only operate on the trees whose names
match the pattern. This allows you to specify a garden as the tree query and use
the full set of environment variables from all trees in the query while
executing commands over a subset of the trees in that garden.

- `garden init` will now add the current directory to the `trees` block
when the current directory contains a Git repository. Use `garden init --empty`
to disable this behavior.

**Development**:

- The `shlex` dependency was upgraded to `1.3.0`, which includes fixes for
[RUSTSEC-2024-0006]https://rustsec.org/advisories/RUSTSEC-2024-0006.html a.k.a.
[GHSA-r7qv-8r2h-pg27]https://github.com/comex/rust-shlex/security/advisories/GHSA-r7qv-8r2h-pg27.

## v1.1.0

*Released 2024-01-15*

**Features**:

- `garden ls` now displays information about trees, groups, gardens and commands.

- `garden ls -c` (i.e. `--no-commands`) hides command details from the output.

- `garden plant -s` (i.e. `--sort`) sorts all of the configured `trees` entries
after planting the specified trees.

- `garden exec -n` (i.e. `--dry-run`) performs a trial run without executing
any commands.

- `garden.shell-errexit` can now be configured to `false` in `garden.yaml` to
opt-out of using the `-e` exit-on-error shell option when running custom commands.

- `garden.shell` can now be configured to `bun`, `fish`, `node`, `perl` and `python3`
in addition to the traditional `bash`, `zsh`, `dash`, `ksh` and `sh` shells.
This allows you to use these interpreters to run custom commands.

**Development**:

- Garden is now using
[shellexpand v3]https://gitlab.com/ijackson/rust-shellexpand#version-300-2022-12-01.

## v1.0.0

*Released 2023-12-23*

**Features**:

- Commands can now specify pre-commands and post-commands that are run before/after
the specified command.
([#3]https://github.com/garden-rs/garden/issues/3)
([documentation]https://garden-rs.gitlab.io/commands.html#pre-and-post-commands)

- The default `origin` remote name can now be configured using `tree.<tree>.default-remote`.
([#16]https://gitlab.com/garden-rs/garden/-/issues/16)

- Commands now display the tree's current branch alongside the tree name.
([#18]https://github.com/garden-rs/garden/issues/18)

- `garden -vv exec` and `garden -vv shell` now display the command being run.

**Packaging**:

- `garden` can now be installed as a `nix flake` package.
A `flake.nix` file is now provided.
([#16]https://github.com/garden-rs/garden/issues/16)

## v0.9.1

*Released 2023-11-19*

**Fixes**:

- `garden -D name=value` now overrides variables in all scopes.
Variables defined in tree scope were not subject to overrides and
will now get properly overridden by the `--define` / `-D`
command-line options.

## v0.9.0

*Released 2023-11-02*

**Features**:

- `garden grow` now sets `git config remote.$name.tagopt --no-tags`
when adding additional remotes. This prevents accidentally fetching tags
when interacting with remotes.

## v0.8.1

*Released 2023-07-18*

**Fixes**:

- `garden grow` was fixed to detect existing branches when growing
`git worktree`-created child worktrees.

**Development**:

- `strum` is now used to implement `FromStr` for `enum ColorMode`.

- [is-terminal]https://crates.io/crates/is-terminal is now used instead of
the unmaintained `atty` crate.

## v0.8.0

*Released 2023-07-16*

**Features**:

- `garden` now supports a `grafts` feature that allows you to
[stitch configuration entities from separate garden files]https://garden-rs.gitlab.io/configuration.html#grafts
into a graft-specific namespace. Trees and variables from grafted configurations can be
referenced using `graft::` namespace qualifiers.

- `garden grow` can now configure [upstream branches]https://garden-rs.gitlab.io/commands.html#upstream-branches.

- `garden grow` can now configure [gitconfig settings with multiple values]https://garden-rs.gitlab.io/commands.html#upstream-branches#git-configuration-values
using [`git config --add <name> <value>`]https://git-scm.com/docs/git-config#Documentation/git-config.txt---add.

## v0.7.0

*Released 2023-02-12*

**Features**:

- Trees, Groups, Gardens and Commands defined in the top-level `garden.yaml` can now
override entries defined via `garden.includes`. Configuration entities now follow
"last one wins" semantics -- if the same entity is defined in multiple includes files
then only the final definition will be used.
([#14]https://github.com/garden-rs/garden/issues/14)
([#15]https://github.com/garden-rs/garden/pull/15)

- [Trees now sparsely override existing entries]https://garden-rs.gitlab.io/configuration.html#l#the-last-one-wins-rule.
This behavior allows a tree definition to replace just the `url` field, or to replace
individual tree commands while retaining the rest. Use `replace: true` in a Tree
definition in order to completely replace the existing entry instead of sparsely
overriding it.

- Improved shell completions for `garden`, `garden init` and `garden plant`.

**Packaging**:

- [0323pin]https://github.com/0323 packaged `garden` for pkgsrc/NetBSD and
[merged the package into the main branch!]http://mail-index.netbsd.org/pkgsrc-changes/2023/01/22/msg267560.html
([#13]https://github.com/garden-rs/garden/issues/13)

## v0.6.0

*Released 2023-01-20*

**Features**:

- Both names and values in `gitconfig` can now use `${var}` expressions.
Previously only values were evaluated. Names are evaluated now as well.

**Fixes**:

- The `zsh` workaround for `garden completion zsh` is no longer needed.
The [documentation for generating zsh completions]https://garden-rs.gitlab.io/commands.html#zsh
has been updated.
([#10]https://github.com/garden-rs/garden/issues/10)

## v0.5.1

*Released 2023-01-15*

**Fixes**:

- Exec expressions were previously run with the current directory set to the
directory from which garden was run. Exec expressions are now run in the
tree's current directory.

## v0.5.0

*Released 2023-01-12*

**Features**:

- [Garden configuration files can now include other configuration files
](https://garden-rs.gitlab.io/configuration.html#includes) by specifying
the additional files to include in the `garden.includes` field.
The `includes` feature makes it possible to create modular and reusable garden files.
The `trees`, `variables`, `commands`, `groups` and `gardens` defined in the included
files are added to the current configuration.
([#7]https://github.com/garden-rs/garden/pull/7)

- [Garden commands can now use shell variables]https://garden-rs.gitlab.io/commands.html#shell-syntax
using the standard (brace-less) shell `$variable` syntax. The braced `${garden}`
variable syntax remains reserved for resolving Garden Variables.
Double-`$` braces (ex: `$${...}`) can be used to escape a `$${variable}` from
evaluation so that a literal `${variable}` value is used in the garden command.
([#11]https://github.com/garden-rs/garden/issues/11)
([#12]https://github.com/garden-rs/garden/pull/12)

- A new `garden completion` subcommand was added for providing shell command-line
completion using the [clap_complete]https://crates.io/crates/clap_complete crate.
([#9]https://github.com/garden-rs/garden/pull/9)

- `garden -V | --version` was added alongside the `clap` rewrite for displaying
the `garden` command version.

**Development**:

- The `Makefile` has been replaced by a `garden.yaml` Garden file.
We can now use `garden {build, test, check, fmt, clippy, ...}` instead of `make ...`.
See [garden.yaml @ 5ef8d0ab16 for more details]https://gitlab.com/garden-rs/garden/-/raw/5ef8d0ab16a64660fef2bfc551e69cc782dfd4a3/garden.yaml.
Packagers can use `cargo install` to install `garden` and invoke `mdbook` directly
to install the user manual. We also provide
`garden -D DESTDIR=/tmp/stage -D prefix=/usr/local install-doc` if distros
want to install the user manual using our recipe.
([#8]https://github.com/garden-rs/garden/pull/8)

- Garden's command-line parsing has been rewritten to leverage the
[clap]https://crates.io/crates/clap crate and ecosystem.

## v0.4.1

*Released 2022-12-26*

**Features**:

- The `garden cmd --no-errexit` option was extended to work with commands that are
configured using a YAML list of strings. Commands that are specified using lists
are now indistinguishable from commands specified using multi-line strings.

## v0.4.0

*Released 2022-12-23*

**Breaking Changes**:

- `garden cmd` now runs custom commands using `<shell> -e -c '<command>'` by default.
The use of `-e` is a change in behavior and causes multi-line / multi-statement
commands to halt execution when the first non-zero exit code is encountered.
Use `set +e` at the top of of a multi-line command to opt-out of this behavior
on a per-command basis, or specify the `-n | --no-errexit` option.

- `garden` will now fallback to `bash` (and `sh`) as the default `garden.shell` value
when `zsh` (and `bash`) are not installed. As before, the `garden.shell`
configuration variable can be used to override the default shell.

**Features**:

- `garden prune` was added for removing orphaned Git repositories.
([#4]https://github.com/garden-rs/garden/issues/4)

- `garden cmd` can now run commands in breadth-first order when the
`-b/--breadth-first` option is used. Depth-first tree traversal is the default.
The `garden cmd --breadth-first` traversal runs all commands on a tree before
continuing on to the next tree. The default `garden cmd` depth-first traversal
runs a command across all trees before continuing on to the next command.
([#3]https://github.com/garden-rs/garden/issues/3)

## v0.3.0

*Released 2022-08-20*

**Features**:

- `garden plant` can now detect `git worktree` repositories.
([#1]https://github.com/garden-rs/garden/issues/1)

## v0.2.0

*Released 2022-07-29*

**Breaking Changes**:

- `garden add` was renamed to `garden plant`.

**Features**:

- `garden grow` can now grow trees using "git worktree" (#1).
- `garden grow` learned to clone specific branches.
- `garden grow` and `garden plant` can now handle bare repositories.


## v0.1.0

*Released 2022-06-13*

**Features**:

This is the initial garden release.

- `garden grow` grows worktrees.
- `garden init` initializes configuration.
- `garden plant` (formerly `garden add`) adds existing trees.
- `garden cmd` and `garden <custom-command>` can run custom commands.
- Templates, variables, and environment variables are all supported.