Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package chezmoi for openSUSE:Factory checked 
in at 2023-02-17 16:45:52
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/chezmoi (Old)
 and      /work/SRC/openSUSE:Factory/.chezmoi.new.22824 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "chezmoi"

Fri Feb 17 16:45:52 2023 rev:15 rq:1066400 version:2.31.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/chezmoi/chezmoi.changes  2023-02-13 
16:43:24.780256882 +0100
+++ /work/SRC/openSUSE:Factory/.chezmoi.new.22824/chezmoi.changes       
2023-02-17 16:46:17.703298532 +0100
@@ -1,0 +2,12 @@
+Fri Feb 17 14:26:22 UTC 2023 - Filippo Bonazzi <filippo.bona...@suse.com>
+
+- Update to version 2.31.0:
+  * feat: Print a warning when chezmoi add is called with an ignored entry
+  * feat: Cache GitHub API results by default to stay under rate limit
+  * feat: Display progress bars by default when stdout is a TTY
+  * feat(bitwarden): Grab attachment by object name
+  * fix: Eliminate [DEFAULT] section for fromIni map
+  * feat: Add --with-stdin flag to execute-template command
+  * chore: Update dependencies
+
+-------------------------------------------------------------------

Old:
----
  chezmoi-2.30.1.obscpio

New:
----
  chezmoi-2.31.0.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ chezmoi.spec ++++++
--- /var/tmp/diff_new_pack.MjmhR9/_old  2023-02-17 16:46:18.591303533 +0100
+++ /var/tmp/diff_new_pack.MjmhR9/_new  2023-02-17 16:46:18.603303600 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           chezmoi
-Version:        2.30.1
+Version:        2.31.0
 Release:        0
 Summary:        A multi-host manager for dotfiles
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.MjmhR9/_old  2023-02-17 16:46:18.655303894 +0100
+++ /var/tmp/diff_new_pack.MjmhR9/_new  2023-02-17 16:46:18.663303938 +0100
@@ -2,7 +2,7 @@
   <service name="obs_scm" mode="manual">
     <param name="scm">git</param>
     <param name="url">https://github.com/twpayne/chezmoi.git</param>
-    <param name="revision">v2.30.1</param>
+    <param name="revision">v2.31.0</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
   </service>

++++++ chezmoi-2.30.1.obscpio -> chezmoi-2.31.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/.github/workflows/main.yml 
new/chezmoi-2.31.0/.github/workflows/main.yml
--- old/chezmoi-2.30.1/.github/workflows/main.yml       2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/.github/workflows/main.yml       2023-02-17 
12:19:43.000000000 +0100
@@ -10,9 +10,9 @@
     - v*
 env:
   AGE_VERSION: 1.1.1
-  GO_VERSION: '1.20'
+  GO_VERSION: '1.20.1'
   GOFUMPT_VERSION: 0.4.0
-  GOLANGCI_LINT_VERSION: 1.51.0
+  GOLANGCI_LINT_VERSION: 1.51.1
   GOVERSIONINFO_VERSION: 1.4.0
 jobs:
   changes:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/.github/workflows/winget.yml 
new/chezmoi-2.31.0/.github/workflows/winget.yml
--- old/chezmoi-2.30.1/.github/workflows/winget.yml     1970-01-01 
01:00:00.000000000 +0100
+++ new/chezmoi-2.31.0/.github/workflows/winget.yml     2023-02-17 
12:19:43.000000000 +0100
@@ -0,0 +1,14 @@
+name: Publish to Winget
+on:
+  release:
+    types: [released]
+
+jobs:
+  publish:
+    runs-on: windows-latest # Action can only run on Windows
+    steps:
+      - uses: vedantmgoyal2009/winget-releaser@v2
+        with:
+          identifier: twpayne.chezmoi
+          installers-regex: '_windows_\w+\.zip$'
+          token: ${{ secrets.WINGET_TOKEN }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/.golangci.yml 
new/chezmoi-2.31.0/.golangci.yml
--- old/chezmoi-2.30.1/.golangci.yml    2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/.golangci.yml    2023-02-17 12:19:43.000000000 +0100
@@ -87,7 +87,6 @@
   - paralleltest
   - rowserrcheck # https://github.com/golangci/golangci-lint/issues/2649
   - sqlclosecheck # https://github.com/golangci/golangci-lint/issues/2649
-  - structcheck # https://github.com/golangci/golangci-lint/issues/2649
   - testpackage
   - tparallel
   - varnamelen
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/links/links.yaml 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/links/links.yaml
--- old/chezmoi-2.30.1/assets/chezmoi.io/docs/links/links.yaml  2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/assets/chezmoi.io/docs/links/links.yaml  2023-02-17 
12:19:43.000000000 +0100
@@ -379,6 +379,10 @@
   title: dotfile manager の chezmoi に移行してみる
   lang: JP
   url: https://blog.yamano.dev/posts/2023/01/chezmoi-setup/
+- date: '2023-01-22'
+  version: 2.29.3
+  title: Managing dotfiles
+  url: https://dnitza.com/post/managing-dotfiles
 - date: '2023-01-30'
   version: 2.29.3
   formats:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/command-line-flags/global.md
 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/command-line-flags/global.md
--- 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/command-line-flags/global.md
    2023-02-11 19:06:40.000000000 +0100
+++ 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/command-line-flags/global.md
    2023-02-17 12:19:43.000000000 +0100
@@ -60,9 +60,10 @@
 its persistent state in `chezmoistate.boltdb` in the same directory as its
 configuration file.
 
-## `--progress`
+## `--progress` *value*
 
-Show progress when downloading externals.
+Show progress when downloading externals. *value* can be `on`, `off`, or 
`auto`.
+The default is `auto` which shows progress bars when stdout is a terminal.
 
 ## `-R`, `--refresh-externals` [*value*]
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/commands/add.md 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/commands/add.md
--- old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/commands/add.md 
2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/commands/add.md 
2023-02-17 12:19:43.000000000 +0100
@@ -37,6 +37,10 @@
 
 Interactively prompt before adding each file.
 
+## `-q`, `--quiet`
+
+Suppress warnings about adding ignored entries.
+
 ## `-r`, `--recursive`
 
 Recursively add all files, directories, and symlinks.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/commands/execute-template.md
 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/commands/execute-template.md
--- 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/commands/execute-template.md
    2023-02-11 19:06:40.000000000 +0100
+++ 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/commands/execute-template.md
    2023-02-17 12:19:43.000000000 +0100
@@ -42,6 +42,11 @@
 
 Simulate the `stdinIsATTY` function by returning *bool*.
 
+## `--with-stdin`
+
+If run with arguments, then set `.chezmoi.stdin` to the contents of the 
standard
+input.
+
 !!! example
 
     ```console
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/commands/init.md 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/commands/init.md
--- old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/commands/init.md        
2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/commands/init.md        
2023-02-17 12:19:43.000000000 +0100
@@ -15,10 +15,10 @@
 | `sr.ht/~user`      | `https://u...@git.sr.ht/~user/dotfiles`     | 
`g...@git.sr.ht:~user/dotfiles.git` |
 | `sr.ht/~user/repo` | `https://u...@git.sr.ht/~user/repo`         | 
`g...@git.sr.ht:~user/repo.git`     |
 
-To disable git repo URL guessing pass the `--guess-repo-url=false` option.
+To disable git repo URL guessing, pass the `--guess-repo-url=false` option.
 
-First, if the source directory is not already contain a repository, then if
-*repo* is given it is checked out into the source directory, otherwise a new
+First, if the source directory does not already contain a repository, then if
+*repo* is given, it is checked out into the source directory; otherwise a new
 repository is initialized in the source directory.
 
 Second, if a file called `.chezmoi.$FORMAT.tmpl` exists, where `$FORMAT` is one
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
--- 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
    2023-02-11 19:06:40.000000000 +0100
+++ 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
    2023-02-17 12:19:43.000000000 +0100
@@ -154,6 +154,11 @@
     command:
       default: '`git`'
       description: git CLI command
+  gitHub:
+    refreshPeriod:
+      type: duration
+      default: '`1m`'
+      description: Minimum duration between identical GitHub API requests
   gopass:
     command:
       default: '`gopass`'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/templates/bitwarden-functions/bitwardenAttachmentByRef.md
 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/templates/bitwarden-functions/bitwardenAttachmentByRef.md
--- 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/templates/bitwarden-functions/bitwardenAttachmentByRef.md
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/templates/bitwarden-functions/bitwardenAttachmentByRef.md
       2023-02-17 12:19:43.000000000 +0100
@@ -0,0 +1,23 @@
+# `bitwardenAttachmentByRef` *filename* *args*
+
+`bitwardenAttachmentByRef` returns a document from
+[Bitwarden](https://bitwarden.com/) using the [Bitwarden
+CLI](https://bitwarden.com/help/article/cli/) (`bw`).  This method requires two
+calls to `bw` to complete.  *args* are passed to `bw get` in order to retrieve
+the item's *itemid*.  Then, *filename* and *itemid* are passed to
+`bw get attachment $FILENAME --itemid $ITEMID` and the output from
+`bw` is returned. The output from `bw` is cached so calling
+`bitwardenAttachmentByRef` multiple times with the same *filename* and 
*itemid* will
+only invoke `bw` once.
+
+!!! example
+
+    ```
+    {{- bitwardenAttachmentByRef "$FILENAME" "$ARGS" -}}
+    ```
+
+!!! example
+
+    ```
+    {{- bitwardenAttachmentByRef "id_rsa" "item" "example.com" -}}
+    ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/templates/github-functions/index.md
 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/templates/github-functions/index.md
--- 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/reference/templates/github-functions/index.md
     2023-02-11 19:06:40.000000000 +0100
+++ 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/reference/templates/github-functions/index.md
     2023-02-17 12:19:43.000000000 +0100
@@ -2,17 +2,20 @@
 
 The `gitHub*` template functions return data from the GitHub API.
 
-By default, an anonymous GitHub API request will be made, which is subject to
+By default, chezmoi makes anonymous GitHub API requests, which are subject to
 [GitHub's rate
 
limits](https://docs.github.com/en/rest/overview/resources-in-the-rest-api#rate-limiting)
-(currently 60 requests per hour per source IP address). If any of the
-environment variables `$CHEZMOI_GITHUB_ACCESS_TOKEN`, `$GITHUB_ACCESS_TOKEN`, 
or
-`$GITHUB_TOKEN` are found, then the first one found will be used to 
authenticate
-the GitHub API request, with a higher rate limit (currently 5,000 requests per
-hour per user).
+(currently 60 requests per hour per source IP address). chezmoi caches results
+from identical GitHub API requests for the period defined in
+`gitHub.refreshPeriod` (default one minute).
 
-In practice, GitHub API rate limits are high enough that you should rarely need
-to set a token, unless you are sharing a source IP address with many other
-GitHub users. If needed, the GitHub documentation describes how to [create a
-personal access
+If any of the environment variables `$CHEZMOI_GITHUB_ACCESS_TOKEN`,
+`$GITHUB_ACCESS_TOKEN`, or `$GITHUB_TOKEN` are found, then the first one found
+will be used to authenticate the GitHub API requests which have a higher rate
+limit (currently 5,000 requests per hour per user).
+
+In practice, GitHub API rate limits are high enough chezmoi's caching of 
results
+mean that you should rarely need to set a token, unless you are sharing a 
source
+IP address with many other GitHub users. If needed, the GitHub documentation
+describes how to [create a personal access
 
token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/user-guide/include-files-from-elsewhere.md
 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/user-guide/include-files-from-elsewhere.md
--- 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/user-guide/include-files-from-elsewhere.md
        2023-02-11 19:06:40.000000000 +0100
+++ 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/user-guide/include-files-from-elsewhere.md
        2023-02-17 12:19:43.000000000 +0100
@@ -111,50 +111,6 @@
     refreshPeriod = "168h"
 ```
 
-## Include a subdirectory from a git repository
-
-You can configure chezmoi to keep a git repository up to date in a subdirectory
-by using the external type `git-repo`, for example:
-
-```toml title="~/.local/share/chezmoi/.chezmoiexternal.toml"
-[".vim/pack/alker0/chezmoi.vim"]
-    type = "git-repo"
-    url = "https://github.com/alker0/chezmoi.vim.git";
-    refreshPeriod = "168h"
-```
-
-If the directory does not exist then chezmoi will run `git clone` to clone it.
-If the directory does exist then chezmoi will run `git pull` to pull the latest
-changes, but not more often than every `refreshPeriod`. In the above example
-the `refreshPeriod` is `168h` which is one week. The default `refreshPeriod` is
-zero, which disables refreshes. You can force a refresh (i.e. force a `git
-pull`) by passing the `--refresh-externals`/`-R` flag to `chezmoi apply`.
-
-You can customize the arguments to `git clone` and `git pull` by setting the
-`$DIR.clone.args` and `$DIR.pull.args` variables in `.chezmoiexternal.$FORMAT`,
-for example:
-
-```toml title="~/.local/share/chezmoi/.chezmoiexternal.toml"
-[".vim/pack/alker0/chezmoi.vim"]
-    type = "git-repo"
-    url = "https://github.com/alker0/chezmoi.vim.git";
-    refreshPeriod = "168h"
-    [".vim/pack/alker0/chezmoi.vim".pull]
-        args = ["--ff-only"]
-```
-
-!!! note
-
-    chezmoi's support for `git-repo` externals is limited to running `git
-    clone` and/or `git pull` in a directory. The contents of `git-repo`
-    externals are not manifested in commands like `chezmoi archive` or `chezmoi
-    dump`.
-
-!!! note
-
-    chezmoi's support for `git-repo` externals currently requires `git` to be
-    in your `$PATH`.
-
 ## Extract a single file from an archive
 
 You can extract a single file from an archive using the `$ENTRY.filter.command`
@@ -221,3 +177,75 @@
 Here `filter.command` and `filter.args` together tell chezmoi to filter the
 downloaded data through `zstd -d`. The `format = "tar"` line tells chezmoi that
 output of the filter is an uncompressed tar archive.
+
+## Include a subdirectory from a git repository
+
+You can configure chezmoi to keep a git repository up to date in a subdirectory
+by using the external type `git-repo`, for example:
+
+```toml title="~/.local/share/chezmoi/.chezmoiexternal.toml"
+[".vim/pack/alker0/chezmoi.vim"]
+    type = "git-repo"
+    url = "https://github.com/alker0/chezmoi.vim.git";
+    refreshPeriod = "168h"
+```
+
+If the directory does not exist then chezmoi will run `git clone` to clone it.
+If the directory does exist then chezmoi will run `git pull` to pull the latest
+changes, but not more often than every `refreshPeriod`. In the above example
+the `refreshPeriod` is `168h` which is one week. The default `refreshPeriod` is
+zero, which disables refreshes. You can force a refresh (i.e. force a `git
+pull`) by passing the `--refresh-externals`/`-R` flag to `chezmoi apply`.
+
+!!! warning
+
+    chezmoi's support for `git-repo` externals is limited to running `git
+    clone` and/or `git pull` in a directory. You must have a `git` binary
+    in your `$PATH`.
+
+    Using a `git-repo` external delegates management of the
+    directory to git. chezmoi cannot manage any other files in that directory.
+
+    The contents of `git-repo` externals will not be manifested in commands
+    like `chezmoi archive` or `chezmoi dump`.
+
+!!! hint
+
+    If you need to manage extra files in a `git-repo` external, use an
+    `archive` external instead with the URL pointing to an archive of the git
+    repo's `master` or `main` branch.
+
+You can customize the arguments to `git clone` and `git pull` by setting the
+`$DIR.clone.args` and `$DIR.pull.args` variables in `.chezmoiexternal.$FORMAT`,
+for example:
+
+```toml title="~/.local/share/chezmoi/.chezmoiexternal.toml"
+[".vim/pack/alker0/chezmoi.vim"]
+    type = "git-repo"
+    url = "https://github.com/alker0/chezmoi.vim.git";
+    refreshPeriod = "168h"
+    [".vim/pack/alker0/chezmoi.vim".pull]
+        args = ["--ff-only"]
+```
+
+## Use git submodules in your source directory
+
+!!! important
+
+    If you use git submodules, then you should set the `external_` attribute on
+    the subdirectory containing the submodule.
+
+You can include git repos from elsewhere as git submodules in your source
+directory. `chezmoi init` and `chezmoi update` are aware of git submodules and
+will run git with the `--recurse-submodules` flag by default.
+
+chezmoi assumes that all files and directories in its source state are in
+chezmoi's format, i.e. their filenames include attributes like `private_` and
+`run_`.  Most git submodules are not in chezmoi's format and so files like
+`run_test.sh` will be be interpreted by chezmoi as a `run_` script. To avoid
+this problem, set the `external_` attribute on all subdirectories that contain
+submodules.
+
+You can stop chezmoi from handling git submodules by passing the
+`--recurse-submodules=false` flag or setting the `update.recurseSubmodules`
+configuration variable to `false`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/user-guide/password-managers/bitwarden.md
 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/user-guide/password-managers/bitwarden.md
--- 
old/chezmoi-2.30.1/assets/chezmoi.io/docs/user-guide/password-managers/bitwarden.md
 2023-02-11 19:06:40.000000000 +0100
+++ 
new/chezmoi-2.31.0/assets/chezmoi.io/docs/user-guide/password-managers/bitwarden.md
 2023-02-17 12:19:43.000000000 +0100
@@ -18,6 +18,14 @@
 
 Set the `BW_SESSION` environment variable, as instructed.
 
+!!! tip "Bitwarden Session One-liner"
+
+    Set `BW_SESSION` automatically with:
+
+    ```console
+    $ export BW_SESSION=$(bw {login,unlock} --raw)
+    ```
+
 The structured data from `bw get` is available as the `bitwarden` template
 function in your config files, for example:
 
@@ -33,3 +41,15 @@
 ```
 {{ (bitwardenFields "item" "example.com").token.value }}
 ```
+
+Attachments can be accessed with the `bitwardenAttachment` and
+`bitwardenAttachmentByRef` template function. For example, if you have an
+attachment named `id_rsa`, you can retrieve its value with:
+
+```
+{{ bitwardenAttachment "id_rsa" "bf22e4b4-ae4a-4d1c-8c98-ac620004b628" }}
+```
+or
+```
+{{ bitwardenAttachmentByRef "id_rsa" "item" "example.com" }}
+```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/assets/chezmoi.io/mkdocs.yml 
new/chezmoi-2.31.0/assets/chezmoi.io/mkdocs.yml
--- old/chezmoi-2.30.1/assets/chezmoi.io/mkdocs.yml     2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/assets/chezmoi.io/mkdocs.yml     2023-02-17 
12:19:43.000000000 +0100
@@ -233,6 +233,7 @@
       - reference/templates/bitwarden-functions/index.md
       - bitwarden: reference/templates/bitwarden-functions/bitwarden.md
       - bitwardenAttachment: 
reference/templates/bitwarden-functions/bitwardenAttachment.md
+      - bitwardenAttachmentByRef: 
reference/templates/bitwarden-functions/bitwardenAttachmentByRef.md
       - bitwardenFields: 
reference/templates/bitwarden-functions/bitwardenFields.md
     - gopass functions:
       - reference/templates/gopass-functions/index.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/go.mod new/chezmoi-2.31.0/go.mod
--- old/chezmoi-2.30.1/go.mod   2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/go.mod   2023-02-17 12:19:43.000000000 +0100
@@ -5,13 +5,13 @@
 require (
        filippo.io/age v1.1.1
        github.com/Masterminds/sprig/v3 v3.2.3
-       github.com/aws/aws-sdk-go-v2 v1.17.3
-       github.com/aws/aws-sdk-go-v2/config v1.18.10
-       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.18.2
+       github.com/aws/aws-sdk-go-v2 v1.17.4
+       github.com/aws/aws-sdk-go-v2/config v1.18.13
+       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.18.4
        github.com/bmatcuk/doublestar/v4 v4.6.0
        github.com/bradenhilton/mozillainstallhash v1.0.0
        github.com/charmbracelet/bubbles v0.15.0
-       github.com/charmbracelet/bubbletea v0.23.1
+       github.com/charmbracelet/bubbletea v0.23.2
        github.com/charmbracelet/glamour v0.6.0
        github.com/coreos/go-semver v0.3.1
        github.com/fsnotify/fsnotify v1.6.0
@@ -22,7 +22,7 @@
        github.com/klauspost/compress v1.15.15
        github.com/mitchellh/mapstructure v1.5.0
        github.com/muesli/combinator v0.3.0
-       github.com/muesli/termenv v0.13.0
+       github.com/muesli/termenv v0.14.0
        github.com/pelletier/go-toml/v2 v2.0.6
        github.com/rogpeppe/go-internal v1.9.0
        github.com/rs/zerolog v1.29.0
@@ -36,14 +36,14 @@
        github.com/ulikunitz/xz v0.5.11
        github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1
        github.com/zalando/go-keyring v0.2.2
-       go.etcd.io/bbolt v1.3.7-0.20220226045046-fd5535f71f48
+       go.etcd.io/bbolt v1.3.7
        go.uber.org/multierr v1.9.0
-       golang.org/x/crypto v0.5.0
-       golang.org/x/exp v0.0.0-20230129154200-a960b3787bd2
-       golang.org/x/oauth2 v0.4.0
+       golang.org/x/crypto v0.6.0
+       golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb
+       golang.org/x/oauth2 v0.5.0
        golang.org/x/sync v0.1.0
-       golang.org/x/sys v0.4.0
-       golang.org/x/term v0.4.0
+       golang.org/x/sys v0.5.0
+       golang.org/x/term v0.5.0
        gopkg.in/ini.v1 v1.67.0
        gopkg.in/yaml.v3 v3.0.1
        howett.net/plist v1.0.0
@@ -54,34 +54,34 @@
        github.com/Masterminds/goutils v1.1.1 // indirect
        github.com/Masterminds/semver/v3 v3.2.0 // indirect
        github.com/Microsoft/go-winio v0.6.0 // indirect
-       github.com/ProtonMail/go-crypto v0.0.0-20230127202215-f7f10de891d5 // 
indirect
+       github.com/ProtonMail/go-crypto v0.0.0-20230214155104-81033d7f4442 // 
indirect
        github.com/acomagu/bufpipe v1.0.3 // indirect
        github.com/alecthomas/chroma v0.10.0 // indirect
        github.com/alessio/shellescape v1.4.1 // indirect
        github.com/atotto/clipboard v0.1.4 // indirect
-       github.com/aws/aws-sdk-go-v2/credentials v1.13.10 // indirect
-       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28 // indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.21 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/sso v1.12.0 // indirect
-       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.0 // indirect
-       github.com/aws/aws-sdk-go-v2/service/sts v1.18.2 // indirect
+       github.com/aws/aws-sdk-go-v2/credentials v1.13.13 // indirect
+       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29 // indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22 // 
indirect
+       github.com/aws/aws-sdk-go-v2/service/sso v1.12.2 // indirect
+       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.2 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sts v1.18.3 // indirect
        github.com/aws/smithy-go v1.13.5 // indirect
        github.com/aymanbagabas/go-osc52 v1.2.1 // indirect
        github.com/aymerick/douceur v0.2.0 // indirect
        github.com/bradenhilton/cityhash v1.0.0 // indirect
        github.com/charmbracelet/harmonica v0.2.0 // indirect
        github.com/charmbracelet/lipgloss v0.6.0 // indirect
-       github.com/cloudflare/circl v1.3.1 // indirect
+       github.com/cloudflare/circl v1.3.2 // indirect
        github.com/containerd/console v1.0.3 // indirect
        github.com/danieljoos/wincred v1.1.2 // indirect
        github.com/davecgh/go-spew v1.1.1 // indirect
        github.com/dlclark/regexp2 v1.8.0 // indirect
        github.com/emirpasic/gods v1.18.1 // indirect
        github.com/go-git/gcfg v1.5.0 // indirect
-       github.com/go-git/go-billy/v5 v5.4.0 // indirect
+       github.com/go-git/go-billy/v5 v5.4.1 // indirect
        github.com/godbus/dbus/v5 v5.1.0 // indirect
        github.com/golang/protobuf v1.5.2 // indirect
        github.com/google/btree v1.1.2 // indirect
@@ -115,13 +115,13 @@
        github.com/skeema/knownhosts v1.1.0 // indirect
        github.com/spf13/cast v1.5.0 // indirect
        github.com/xanzy/ssh-agent v0.3.3 // indirect
-       github.com/yuin/goldmark v1.5.3 // indirect
+       github.com/yuin/goldmark v1.5.4 // indirect
        github.com/yuin/goldmark-emoji v1.0.1 // indirect
        go.uber.org/atomic v1.10.0 // indirect
-       golang.org/x/mod v0.7.0 // indirect
-       golang.org/x/net v0.5.0 // indirect
-       golang.org/x/text v0.6.0 // indirect
-       golang.org/x/tools v0.5.0 // indirect
+       golang.org/x/mod v0.8.0 // indirect
+       golang.org/x/net v0.7.0 // indirect
+       golang.org/x/text v0.7.0 // indirect
+       golang.org/x/tools v0.6.0 // indirect
        google.golang.org/appengine v1.6.7 // indirect
        google.golang.org/protobuf v1.28.1 // indirect
        gopkg.in/warnings.v0 v0.1.2 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/go.sum new/chezmoi-2.31.0/go.sum
--- old/chezmoi-2.30.1/go.sum   2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/go.sum   2023-02-17 12:19:43.000000000 +0100
@@ -12,8 +12,8 @@
 github.com/Microsoft/go-winio v0.6.0 
h1:slsWYD/zyx7lCXoZVlvQrj0hPTM1HI4+v1sIda2yDvg=
 github.com/Microsoft/go-winio v0.6.0/go.mod 
h1:cTAf44im0RAYeL23bpB+fzCyDH2MJiz2BO69KH/soAE=
 github.com/ProtonMail/go-crypto v0.0.0-20221026131551-cf6655e29de4/go.mod 
h1:UBYPn8k0D56RtnR8RFQMjmh4KrZzWJ5o7Z9SYjossQ8=
-github.com/ProtonMail/go-crypto v0.0.0-20230127202215-f7f10de891d5 
h1:Fu4D/i1HBoWql9xVIfW50Kohujz+T3xXPV60JVb3Fao=
-github.com/ProtonMail/go-crypto v0.0.0-20230127202215-f7f10de891d5/go.mod 
h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
+github.com/ProtonMail/go-crypto v0.0.0-20230214155104-81033d7f4442 
h1:OUJ54Fkd+AQXYmr9eOUxZfWNzpK3/e/KD40qa2rKHS4=
+github.com/ProtonMail/go-crypto v0.0.0-20230214155104-81033d7f4442/go.mod 
h1:I0gYDMZ6Z5GRU7l58bNFSkPTFN6Yl12dsUlAZ8xy98g=
 github.com/acomagu/bufpipe v1.0.3 
h1:fxAGrHZTgQ9w5QqVItgzwj235/uYZYgbXitB+dLupOk=
 github.com/acomagu/bufpipe v1.0.3/go.mod 
h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
 github.com/alecthomas/chroma v0.10.0 
h1:7XDcGkCQopCNKjZHfYrNLraA+M7e0fMiJ/Mfikbfjek=
@@ -26,30 +26,30 @@
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod 
h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
 github.com/atotto/clipboard v0.1.4 
h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4=
 github.com/atotto/clipboard v0.1.4/go.mod 
h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
-github.com/aws/aws-sdk-go-v2 v1.17.3 
h1:shN7NlnVzvDUgPQ+1rLMSxY8OWRNDRYtiqe0p/PgrhY=
-github.com/aws/aws-sdk-go-v2 v1.17.3/go.mod 
h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw=
-github.com/aws/aws-sdk-go-v2/config v1.18.10 
h1:Znce11DWswdh+5kOsIp+QaNfY9igp1QUN+fZHCKmeCI=
-github.com/aws/aws-sdk-go-v2/config v1.18.10/go.mod 
h1:VATKco+pl+Qe1WW+RzvZTlPPe/09Gg9+vM0ZXsqb16k=
-github.com/aws/aws-sdk-go-v2/credentials v1.13.10 
h1:T4Y39IhelTLg1f3xiKJssThnFxsndS8B6OnmcXtKK+8=
-github.com/aws/aws-sdk-go-v2/credentials v1.13.10/go.mod 
h1:tqAm4JmQaShel+Qi38hmd1QglSnnxaYt50k/9yGQzzc=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21 
h1:j9wi1kQ8b+e0FBVHxCqCGo4kxDU175hoDHcWAi0sauU=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.21/go.mod 
h1:ugwW57Z5Z48bpvUyZuaPy4Kv+vEfJWnIrky7RmkBvJg=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27 
h1:I3cakv2Uy1vNmmhRQmFptYDxOvBnwCdNwyw63N0RaRU=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.27/go.mod 
h1:a1/UpzeyBBerajpnP5nGZa9mGzsBn5cOKxm6NWQsvoI=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21 
h1:5NbbMrIzmUn/TXFqAle6mgrH5m9cOvMLRGL7pnG8tRE=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.21/go.mod 
h1:+Gxn8jYn5k9ebfHEqlhrMirFjSW0v0C9fI+KN5vk2kE=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28 
h1:KeTxcGdNnQudb46oOl4d90f2I33DF/c6q3RnZAmvQdQ=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.3.28/go.mod 
h1:yRZVr/iT0AqyHeep00SZ4YfBAKojXz08w3XMBscdi0c=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.21 
h1:5C6XgTViSb0bunmU57b3CT+MhxULqHH2721FVA+/kDM=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.21/go.mod 
h1:lRToEJsn+DRA9lW4O9L9+/3hjTkUzlzyzHqn8MTds5k=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.18.2 
h1:QDVKb2VpuwzIslzshumxksayV5GkpqT+rkVvdPVrA9E=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.18.2/go.mod 
h1:jAeo/PdIJZuDSwsvxJS94G4d6h8tStj7WXVuKwLHWU8=
-github.com/aws/aws-sdk-go-v2/service/sso v1.12.0 
h1:/2gzjhQowRLarkkBOGPXSRnb8sQ2RVsjdG1C/UliK/c=
-github.com/aws/aws-sdk-go-v2/service/sso v1.12.0/go.mod 
h1:wo/B7uUm/7zw/dWhBJ4FXuw1sySU5lyIhVg1Bu2yL9A=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.0 
h1:Jfly6mRxk2ZOSlbCvZfKNS7TukSx1mIzhSsqZ/IGSZI=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.0/go.mod 
h1:TZSH7xLO7+phDtViY/KUp9WGCJMQkLJ/VpgkTFd5gh8=
-github.com/aws/aws-sdk-go-v2/service/sts v1.18.2 
h1:J/4wIaGInCEYCGhTSruxCxeoA5cy91a+JT7cHFKFSHQ=
-github.com/aws/aws-sdk-go-v2/service/sts v1.18.2/go.mod 
h1:+lGbb3+1ugwKrNTWcf2RT05Xmp543B06zDFTwiTLp7I=
+github.com/aws/aws-sdk-go-v2 v1.17.4 
h1:wyC6p9Yfq6V2y98wfDsj6OnNQa4w2BLGCLIxzNhwOGY=
+github.com/aws/aws-sdk-go-v2 v1.17.4/go.mod 
h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw=
+github.com/aws/aws-sdk-go-v2/config v1.18.13 
h1:v0xlYqbO6/EVlM8tUn2QEOA7btQxcgidEq2JRDBPTho=
+github.com/aws/aws-sdk-go-v2/config v1.18.13/go.mod 
h1:r39wGSZB7wPDW1i54JyQXUpc5KsWjh5z/3S5D9eCqDg=
+github.com/aws/aws-sdk-go-v2/credentials v1.13.13 
h1:zw1KAc1kl00NYd3ofVmFrb09qnYlSQMeh+fmlQRAihI=
+github.com/aws/aws-sdk-go-v2/credentials v1.13.13/go.mod 
h1:DW9nbIIF9MrIja0cBQrUpeWYQMSlNmP8fevLUyF9W38=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22 
h1:3aMfcTmoXtTZnaT86QlVaYh+BRMbvrrmZwIQ5jWqCZQ=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.22/go.mod 
h1:YGSIJyQ6D6FjKMQh16hVFSIUD54L4F7zTGePqYMYYJU=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28 
h1:r+XwaCLpIvCKjBIYy/HVZujQS9tsz5ohHG3ZIe0wKoE=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.28/go.mod 
h1:3lwChorpIM/BhImY/hy+Z6jekmN92cXGPI1QJasVPYY=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22 
h1:7AwGYXDdqRQYsluvKFmWoqpcOQJ4bH634SkYf3FNj/A=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.22/go.mod 
h1:EqK7gVrIGAHyZItrD1D8B0ilgwMD1GiWAmbU4u/JHNk=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29 
h1:J4xhFd6zHhdF9jPP0FQJ6WknzBboGMBNjKOv4iTuw4A=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.3.29/go.mod 
h1:TwuqRBGzxjQJIwH16/fOZodwXt2Zxa9/cwJC5ke4j7s=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22 
h1:LjFQf8hFuMO22HkV5VWGLBvmCLBCLPivUAmpdpnp4Vs=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.22/go.mod 
h1:xt0Au8yPIwYXf/GYPy/vl4K3CgwhfQMYbrH7DlUUIws=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.18.4 
h1:0P9VF9miVGT40WSZSuMzHwkwTVIltpDrTrvswMLjbx0=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.18.4/go.mod 
h1:hqPcyOuLU6yWIbLy3qMnQnmidgKuIEwqIlW6+chYnog=
+github.com/aws/aws-sdk-go-v2/service/sso v1.12.2 
h1:EN102fWY7hI5u/2FPheTrwwMHkSXfl49RYkeEnJsrCU=
+github.com/aws/aws-sdk-go-v2/service/sso v1.12.2/go.mod 
h1:IgV8l3sj22nQDd5qcAGY0WenwCzCphqdbFOpfktZPrI=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.2 
h1:f1lmlce7r13CX1BPyPqt9oh/H+uqOWc9367lDoGGwNQ=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.2/go.mod 
h1:O1YSOg3aekZibh2SngvCRRG+cRHKKlYgxf/JBF/Kr/k=
+github.com/aws/aws-sdk-go-v2/service/sts v1.18.3 
h1:s49mSnsBZEXjfGBkRfmK+nPqzT7Lt3+t2SmAKNyHblw=
+github.com/aws/aws-sdk-go-v2/service/sts v1.18.3/go.mod 
h1:b+psTJn33Q4qGoDaM7ZiOVVG8uVjGI6HaZ8WBHdgDgU=
 github.com/aws/smithy-go v1.13.5 
h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8=
 github.com/aws/smithy-go v1.13.5/go.mod 
h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
 github.com/aymanbagabas/go-osc52 v1.0.3/go.mod 
h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4=
@@ -67,8 +67,9 @@
 github.com/bwesterb/go-ristretto v1.2.2 
h1:S2C0mmSjCLS3H9+zfXoIoKzl+cOncvBvt6pE+zTm5Ms=
 github.com/charmbracelet/bubbles v0.15.0 
h1:c5vZ3woHV5W2b8YZI1q7v4ZNQaPetfHuoHzx+56Z6TI=
 github.com/charmbracelet/bubbles v0.15.0/go.mod 
h1:Y7gSFbBzlMpUDR/XM9MhZI374Q+1p1kluf1uLl8iK74=
-github.com/charmbracelet/bubbletea v0.23.1 
h1:CYdteX1wCiCzKNUlwm25ZHBIc1GXlYFyUIte8WPvhck=
 github.com/charmbracelet/bubbletea v0.23.1/go.mod 
h1:JAfGK/3/pPKHTnAS8JIE2u9f61BjWTQY57RbT25aMXU=
+github.com/charmbracelet/bubbletea v0.23.2 
h1:vuUJ9HJ7b/COy4I30e8xDVQ+VRDUEFykIjryPfgsdps=
+github.com/charmbracelet/bubbletea v0.23.2/go.mod 
h1:FaP3WUivcTM0xOKNmhciz60M6I+weYLF76mr1JyI7sM=
 github.com/charmbracelet/glamour v0.6.0 
h1:wi8fse3Y7nfcabbbDuwolqTqMQPMnVPeZhDM273bISc=
 github.com/charmbracelet/glamour v0.6.0/go.mod 
h1:taqWV4swIMMbWALc0m7AfE9JkPSU8om2538k9ITBxOc=
 github.com/charmbracelet/harmonica v0.2.0 
h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ=
@@ -76,8 +77,8 @@
 github.com/charmbracelet/lipgloss v0.6.0 
h1:1StyZB9vBSOyuZxQUcUwGr17JmojPNm87inij9N3wJY=
 github.com/charmbracelet/lipgloss v0.6.0/go.mod 
h1:tHh2wr34xcHjC2HCXIlGSG1jaDF0S0atAUvBMP6Ppuk=
 github.com/cloudflare/circl v1.1.0/go.mod 
h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I=
-github.com/cloudflare/circl v1.3.1 
h1:4OVCZRL62ijwEwxnF6I7hLwxvIYi3VaZt8TflkqtrtA=
-github.com/cloudflare/circl v1.3.1/go.mod 
h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw=
+github.com/cloudflare/circl v1.3.2 
h1:VWp8dY3yH69fdM7lM6A1+NhhVoDu9vqK0jOgmkQHFWk=
+github.com/cloudflare/circl v1.3.2/go.mod 
h1:+CauBF6R70Jqcyl8N2hC8pAXYbWkGIezuSbuGLtRhnw=
 github.com/containerd/console v1.0.3 
h1:lIr7SlA5PxZyMV30bDW0MGbiOPXwc63yRuCP0ARubLw=
 github.com/containerd/console v1.0.3/go.mod 
h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U=
 github.com/coreos/go-semver v0.3.1 
h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
@@ -106,8 +107,9 @@
 github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4=
 github.com/go-git/gcfg v1.5.0/go.mod 
h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E=
 github.com/go-git/go-billy/v5 v5.3.1/go.mod 
h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0=
-github.com/go-git/go-billy/v5 v5.4.0 
h1:Vaw7LaSTRJOUric7pe4vnzBSgyuf2KrLsu2Y4ZpQBDE=
 github.com/go-git/go-billy/v5 v5.4.0/go.mod 
h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg=
+github.com/go-git/go-billy/v5 v5.4.1 
h1:Uwp5tDRkPr+l/TnbHOQzp+tmJfLceOlbVucgpTz8ix4=
+github.com/go-git/go-billy/v5 v5.4.1/go.mod 
h1:vjbugF6Fz7JIflbVpl1hJsGjSHNltrSw45YK/ukIvQg=
 github.com/go-git/go-git-fixtures/v4 v4.3.1 
h1:y5z6dd3qi8Hl+stezc8p3JxDkoTRqMAlKnXHuzrfjTQ=
 github.com/go-git/go-git-fixtures/v4 v4.3.1/go.mod 
h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo=
 github.com/go-git/go-git/v5 v5.5.2 
h1:v8lgZa5k9ylUw+OR/roJHTxR4QItsNFI5nKtAXFuynw=
@@ -213,8 +215,9 @@
 github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
 github.com/muesli/reflow v0.3.0/go.mod 
h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
 github.com/muesli/termenv v0.11.1-0.20220204035834-5ac8409525e0/go.mod 
h1:Bd5NYQ7pd+SrtBSrSNoBBmXlcY8+Xj4BMJgh8qcZrvs=
-github.com/muesli/termenv v0.13.0 
h1:wK20DRpJdDX8b7Ek2QfhvqhRQFZ237RGRO0RQ/Iqdy0=
 github.com/muesli/termenv v0.13.0/go.mod 
h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc=
+github.com/muesli/termenv v0.14.0 
h1:8x9NFfOe8lmIWK4pgy3IfVEy47f+ppe3tUqdPZG2Uy0=
+github.com/muesli/termenv v0.14.0/go.mod 
h1:kG/pF1E7fh949Xhe156crRUrHNyK221IuGO7Ez60Uc8=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e 
h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod 
h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
 github.com/olekukonko/tablewriter v0.0.5 
h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
@@ -290,14 +293,15 @@
 github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.4.13/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/goldmark v1.5.2/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/yuin/goldmark v1.5.3 h1:3HUJmBFbQW9fhQOzMgseU134xfi6hU+mjWywx5Ty+/M=
-github.com/yuin/goldmark v1.5.3/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/yuin/goldmark v1.5.4 h1:2uY/xC0roWy8IBEGLgB1ywIoEJFGmRrX21YQcvGZzjU=
+github.com/yuin/goldmark v1.5.4/go.mod 
h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
 github.com/yuin/goldmark-emoji v1.0.1 
h1:ctuWEyzGBwiucEqxzwe0SOYDXPAucOrE9NQC18Wa1os=
 github.com/yuin/goldmark-emoji v1.0.1/go.mod 
h1:2w1E6FEWLcDQkoTE+7HU6QF1F6SLlNGjRIBbIZQFqkQ=
 github.com/zalando/go-keyring v0.2.2 
h1:f0xmpYiSrHtSNAVgwip93Cg8tuF45HJM6rHq/A5RI/4=
 github.com/zalando/go-keyring v0.2.2/go.mod 
h1:sI3evg9Wvpw3+n4SqplGSJUMwtDeROfD4nsFz4z9PG0=
-go.etcd.io/bbolt v1.3.7-0.20220226045046-fd5535f71f48 
h1:edJBWeGHJkzwvJ8ReW0h50BRw6ikNVtrzhqtbseIAL8=
-go.etcd.io/bbolt v1.3.7-0.20220226045046-fd5535f71f48/go.mod 
h1:sh/Yp01MYDakY7RVfzKZn+T1WOMTTFJrWjl7+M73RXA=
+go.etcd.io/bbolt v1.3.7 h1:j+zJOnnEjF/kyHlDDgGnVL/AIqIJPq8UoB2GSNfkUfQ=
+go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
+go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg=
 go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ=
 go.uber.org/atomic v1.10.0/go.mod 
h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
 go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
@@ -308,13 +312,13 @@
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod 
h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.0.0-20220826181053-bd7e27e6170d/go.mod 
h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/crypto v0.3.0/go.mod 
h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
-golang.org/x/crypto v0.5.0 h1:U/0M97KRkSFvyD/3FSmdP5W5swImpNgle/EHFhOsQPE=
-golang.org/x/crypto v0.5.0/go.mod 
h1:NK/OQwhpMQP3MwtdjgLlYHnH9ebylxKWv3e0fK+mkQU=
-golang.org/x/exp v0.0.0-20230129154200-a960b3787bd2 
h1:5sPMf9HJXrvBWIamTw+rTST0bZ3Mho2n1p58M0+W99c=
-golang.org/x/exp v0.0.0-20230129154200-a960b3787bd2/go.mod 
h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
+golang.org/x/crypto v0.6.0 h1:qfktjS5LUO+fFKeJXZ+ikTRijMmljikvG68fpMMruSc=
+golang.org/x/crypto v0.6.0/go.mod 
h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
+golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb 
h1:PaBZQdo+iSDyHT053FjUCgZQ/9uqVwPOcl7KSWhKn6w=
+golang.org/x/exp v0.0.0-20230213192124-5e25df0256eb/go.mod 
h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/mod v0.7.0 h1:LapD9S96VoQRhi/GrNTqeBJFrUjs5UHCAtTlgwA5oZA=
-golang.org/x/mod v0.7.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod 
h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod 
h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod 
h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
@@ -323,10 +327,10 @@
 golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod 
h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod 
h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
-golang.org/x/net v0.5.0 h1:GyT4nK/YDHSqa1c4753ouYCDajOYKTja9Xb/OHtgvSw=
-golang.org/x/net v0.5.0/go.mod h1:DivGGAXEgPSlEBzxGzZI+ZLohi+xUj054jfeKui00ws=
-golang.org/x/oauth2 v0.4.0 h1:NF0gk8LVPg1Ml7SSbGyySuoxdsXitj7TvgvuRxIMc/M=
-golang.org/x/oauth2 v0.4.0/go.mod 
h1:RznEsdpjGAINPTOF0UH/t+xJ75L18YO3Ho6Pyn+uRec=
+golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g=
+golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/oauth2 v0.5.0 h1:HuArIo48skDwlrvM3sEdHXElYslAMsf3KwRkkW4MC4s=
+golang.org/x/oauth2 v0.5.0/go.mod 
h1:9/XBHVqLaWO3/BRHs5jbpYCnOZVjj5V0ndyaAM7KB4I=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
@@ -354,27 +358,27 @@
 golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.4.0 h1:Zr2JFtRQNX3BCZ8YtxRE9hNJYC8J6I1MVbMg6owUp18=
-golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0 h1:MUK/U/4lj1t1oPg0HfuXDN/Z1wv31ZJ/YcPiGccS4DU=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod 
h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
-golang.org/x/term v0.4.0 h1:O7UWfv5+A2qiuulQk30kVinPoMtoIPeVaKLEgLpVkvg=
-golang.org/x/term v0.4.0/go.mod h1:9P2UbLfCdcvo3p/nzKvsmas4TnlujnuoV9hGgYzW1lQ=
+golang.org/x/term v0.5.0 h1:n2a8QNdAb0sZNpU9R1ALUXBbY+w51fCQDN+7EdxNBsY=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
-golang.org/x/text v0.6.0 h1:3XmdazWV+ubf7QgHSTWeykHOci5oeekaGJBLkrkaw4k=
-golang.org/x/text v0.6.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.7.0 h1:4BRB4x83lYWy72KwLD/qYDuTu7q9PjSagHvijDw7cLo=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod 
h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod 
h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.1.12/go.mod 
h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/tools v0.5.0 h1:+bSpV5HIeWkuvgaMfI3UmKRThoTA5ODJTUd8T17NO+4=
-golang.org/x/tools v0.5.0/go.mod 
h1:N+Kgy78s5I24c24dU8OfWNEotWjutIs8SnJvn5IDq+k=
+golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM=
+golang.org/x/tools v0.6.0/go.mod 
h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 
h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod 
h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/chezmoi/persistentstate.go 
new/chezmoi-2.31.0/pkg/chezmoi/persistentstate.go
--- old/chezmoi-2.30.1/pkg/chezmoi/persistentstate.go   2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/chezmoi/persistentstate.go   2023-02-17 
12:19:43.000000000 +0100
@@ -7,13 +7,13 @@
        // EntryStateBucket is the bucket for recording the entry states.
        EntryStateBucket = []byte("entryState")
 
-       // gitRepoExternalState is the bucket for recording the state of 
commands
+       // GitRepoExternalStateBucket is the bucket for recording the state of 
commands
        // that modify directories.
-       gitRepoExternalState = []byte("gitRepoExternalState")
+       GitRepoExternalStateBucket = []byte("gitRepoExternalState")
 
-       // scriptStateBucket is the bucket for recording the state of run once
+       // ScriptStateBucket is the bucket for recording the state of run once
        // scripts.
-       scriptStateBucket = []byte("scriptState")
+       ScriptStateBucket = []byte("scriptState")
 
        stateFormat = formatJSON{}
 )
@@ -47,38 +47,20 @@
 }
 
 // PersistentStateData returns the structured data in s.
-func PersistentStateData(s PersistentState) (any, error) {
-       configStateData, err := PersistentStateBucketData(s, ConfigStateBucket)
-       if err != nil {
-               return nil, err
-       }
-       entryStateData, err := PersistentStateBucketData(s, EntryStateBucket)
-       if err != nil {
-               return nil, err
-       }
-       gitRepoExternalData, err := PersistentStateBucketData(s, 
gitRepoExternalState)
-       if err != nil {
-               return nil, err
-       }
-       scriptStateData, err := PersistentStateBucketData(s, scriptStateBucket)
-       if err != nil {
-               return nil, err
+func PersistentStateData(s PersistentState, buckets map[string][]byte) 
(map[string]any, error) {
+       result := make(map[string]any)
+       for bucketName, bucketKey := range buckets {
+               stateData, err := PersistentStateBucketData(s, bucketKey)
+               if err != nil {
+                       return nil, err
+               }
+               result[bucketName] = stateData
        }
-       return struct {
-               ConfigState         any `json:"configState" yaml:"configState"`
-               EntryState          any `json:"entryState" yaml:"entryState"`
-               GitRepoExternalData any `json:"gitRepoExternalState" 
yaml:"gitRepoExternalState"`
-               ScriptState         any `json:"scriptState" yaml:"scriptState"`
-       }{
-               ConfigState:         configStateData,
-               EntryState:          entryStateData,
-               GitRepoExternalData: gitRepoExternalData,
-               ScriptState:         scriptStateData,
-       }, nil
+       return result, nil
 }
 
-// persistentStateGet gets the value associated with key in bucket in s, if it 
exists.
-func persistentStateGet(s PersistentState, bucket, key []byte, value any) 
(bool, error) {
+// PersistentStateGet gets the value associated with key in bucket in s, if it 
exists.
+func PersistentStateGet(s PersistentState, bucket, key []byte, value any) 
(bool, error) {
        data, err := s.Get(bucket, key)
        if err != nil {
                return false, err
@@ -92,8 +74,8 @@
        return true, nil
 }
 
-// persistentStateSet sets the value associated with key in bucket in s.
-func persistentStateSet(s PersistentState, bucket, key []byte, value any) 
error {
+// PersistentStateSet sets the value associated with key in bucket in s.
+func PersistentStateSet(s PersistentState, bucket, key []byte, value any) 
error {
        data, err := stateFormat.Marshal(value)
        if err != nil {
                return err
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/chezmoi/sourcestate.go 
new/chezmoi-2.31.0/pkg/chezmoi/sourcestate.go
--- old/chezmoi-2.30.1/pkg/chezmoi/sourcestate.go       2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/chezmoi/sourcestate.go       2023-02-17 
12:19:43.000000000 +0100
@@ -290,6 +290,7 @@
        EncryptedSuffix  string           // Suffix for encrypted files.
        Exact            bool             // Add the exact_ attribute to added 
directories.
        Filter           *EntryTypeFilter // Entry type filter.
+       OnIgnoreFunc     func(RelPath)    // Function to call when a target is 
ignored.
        PreAddFunc       PreAddFunc       // Function to be called before a 
source entry is added.
        RemoveDir        RelPath          // Directory to remove before adding.
        ReplaceFunc      ReplaceFunc      // Function to be called before a 
source entry is replaced.
@@ -325,6 +326,9 @@
                targetRelPath := destAbsPath.MustTrimDirPrefix(s.destDirAbsPath)
 
                if s.Ignore(targetRelPath) {
+                       if options.OnIgnoreFunc != nil {
+                               options.OnIgnoreFunc(targetRelPath)
+                       }
                        continue
                }
 
@@ -493,7 +497,7 @@
                        }
                }
                if !sourceUpdate.destAbsPath.Empty() {
-                       if err := persistentStateSet(
+                       if err := PersistentStateSet(
                                persistentState, EntryStateBucket, 
sourceUpdate.destAbsPath.Bytes(), sourceUpdate.entryState,
                        ); err != nil {
                                return err
@@ -613,7 +617,7 @@
        if options.PreApplyFunc != nil {
                var lastWrittenEntryState *EntryState
                var entryState EntryState
-               ok, err := persistentStateGet(persistentState, 
EntryStateBucket, targetAbsPath.Bytes(), &entryState)
+               ok, err := PersistentStateGet(persistentState, 
EntryStateBucket, targetAbsPath.Bytes(), &entryState)
                if err != nil {
                        return err
                }
@@ -633,7 +637,7 @@
                // respect to the last written state, we record the effect of 
the last
                // apply as the last written state.
                if targetEntryState.Equivalent(actualEntryState) && 
!lastWrittenEntryState.Equivalent(actualEntryState) {
-                       err := persistentStateSet(persistentState, 
EntryStateBucket, targetAbsPath.Bytes(), targetEntryState)
+                       err := PersistentStateSet(persistentState, 
EntryStateBucket, targetAbsPath.Bytes(), targetEntryState)
                        if err != nil {
                                return err
                        }
@@ -652,7 +656,7 @@
                return nil
        }
 
-       return persistentStateSet(persistentState, EntryStateBucket, 
targetAbsPath.Bytes(), targetEntryState)
+       return PersistentStateSet(persistentState, EntryStateBucket, 
targetAbsPath.Bytes(), targetEntryState)
 }
 
 // Contains returns the source state entry for targetRelPath.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/chezmoi/targetstateentry.go 
new/chezmoi-2.31.0/pkg/chezmoi/targetstateentry.go
--- old/chezmoi-2.30.1/pkg/chezmoi/targetstateentry.go  2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/chezmoi/targetstateentry.go  2023-02-17 
12:19:43.000000000 +0100
@@ -90,8 +90,8 @@
        }
 
        modifyDirWithCmdStateKey := []byte(actualStateEntry.Path().String())
-       if err := persistentStateSet(
-               persistentState, gitRepoExternalState, 
modifyDirWithCmdStateKey, &modifyDirWithCmdState{
+       if err := PersistentStateSet(
+               persistentState, GitRepoExternalStateBucket, 
modifyDirWithCmdStateKey, &modifyDirWithCmdState{
                        Name:  actualStateEntry.Path(),
                        RunAt: runAt,
                }); err != nil {
@@ -120,7 +120,7 @@
                return false, nil
        }
        modifyDirWithCmdKey := []byte(targetAbsPath.String())
-       switch modifyDirWithCmdStateBytes, err := 
persistentState.Get(gitRepoExternalState, modifyDirWithCmdKey); {
+       switch modifyDirWithCmdStateBytes, err := 
persistentState.Get(GitRepoExternalStateBucket, modifyDirWithCmdKey); {
        case err != nil:
                return false, err
        case modifyDirWithCmdStateBytes == nil:
@@ -328,7 +328,7 @@
        }
 
        scriptStateKey := []byte(hex.EncodeToString(contentsSHA256))
-       if err := persistentStateSet(persistentState, scriptStateBucket, 
scriptStateKey, &scriptState{
+       if err := PersistentStateSet(persistentState, ScriptStateBucket, 
scriptStateKey, &scriptState{
                Name:  t.name,
                RunAt: runAt,
        }); err != nil {
@@ -336,7 +336,7 @@
        }
 
        entryStateKey := actualStateEntry.Path().Bytes()
-       if err := persistentStateSet(persistentState, EntryStateBucket, 
entryStateKey, &EntryState{
+       if err := PersistentStateSet(persistentState, EntryStateBucket, 
entryStateKey, &EntryState{
                Type:           EntryStateTypeScript,
                ContentsSHA256: HexBytes(contentsSHA256),
        }); err != nil {
@@ -381,7 +381,7 @@
                        return false, err
                }
                scriptStateKey := []byte(hex.EncodeToString(contentsSHA256))
-               switch scriptState, err := 
persistentState.Get(scriptStateBucket, scriptStateKey); {
+               switch scriptState, err := 
persistentState.Get(ScriptStateBucket, scriptStateKey); {
                case err != nil:
                        return false, err
                case scriptState != nil:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/addcmd.go 
new/chezmoi-2.31.0/pkg/cmd/addcmd.go
--- old/chezmoi-2.30.1/pkg/cmd/addcmd.go        2023-02-11 19:06:40.000000000 
+0100
+++ new/chezmoi-2.31.0/pkg/cmd/addcmd.go        2023-02-17 12:19:43.000000000 
+0100
@@ -17,6 +17,7 @@
        filter           *chezmoi.EntryTypeFilter
        follow           bool
        prompt           bool
+       quiet            bool
        recursive        bool
        template         bool
 }
@@ -47,6 +48,7 @@
        flags.BoolVarP(&c.Add.follow, "follow", "f", c.Add.follow, "Add symlink 
targets instead of symlinks")
        flags.VarP(c.Add.filter.Include, "include", "i", "Include entry types")
        flags.BoolVarP(&c.Add.prompt, "prompt", "p", c.Add.prompt, "Prompt 
before adding each entry")
+       flags.BoolVarP(&c.Add.quiet, "quiet", "q", c.Add.quiet, "Suppress 
warnings")
        flags.BoolVarP(&c.Add.recursive, "recursive", "r", c.Add.recursive, 
"Recurse into subdirectories")
        flags.BoolVarP(&c.Add.template, "template", "T", c.Add.template, "Add 
files as templates")
        flags.BoolVar(&c.Add.TemplateSymlinks, "template-symlinks", 
c.Add.TemplateSymlinks, "Add symlinks with target in source or home dirs as 
templates") //nolint:lll
@@ -56,6 +58,12 @@
        return addCmd
 }
 
+func (c *Config) defaultOnIgnoreFunc(targetRelPath chezmoi.RelPath) {
+       if !c.Add.quiet {
+               c.errorf("warning: ignoring %s", targetRelPath)
+       }
+}
+
 func (c *Config) defaultPreAddFunc(targetRelPath chezmoi.RelPath) error {
        if !c.Add.prompt {
                return nil
@@ -147,6 +155,7 @@
                EncryptedSuffix:  c.encryption.EncryptedSuffix(),
                Exact:            c.Add.exact,
                Filter:           c.Add.filter,
+               OnIgnoreFunc:     c.defaultOnIgnoreFunc,
                PreAddFunc:       c.defaultPreAddFunc,
                ReplaceFunc:      c.defaultReplaceFunc,
                Template:         c.Add.template,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/bitwardentemplatefuncs.go 
new/chezmoi-2.31.0/pkg/cmd/bitwardentemplatefuncs.go
--- old/chezmoi-2.30.1/pkg/cmd/bitwardentemplatefuncs.go        2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/bitwardentemplatefuncs.go        2023-02-17 
12:19:43.000000000 +0100
@@ -22,6 +22,22 @@
        return string(output)
 }
 
+func (c *Config) bitwardenAttachmentByRefTemplateFunc(name string, args 
...string) string {
+       output, err := c.bitwardenOutput(args)
+       if err != nil {
+               panic(err)
+       }
+       var data map[string]interface{}
+       if err := json.Unmarshal(output, &data); err != nil {
+               panic(newParseCmdOutputError(c.Bitwarden.Command, args, output, 
err))
+       }
+       itemid, ok := data["id"].(string)
+       if !ok {
+               panic("bitwarden object has invalid id")
+       }
+       return c.bitwardenAttachmentTemplateFunc(name, itemid)
+}
+
 func (c *Config) bitwardenFieldsTemplateFunc(args ...string) map[string]any {
        output, err := c.bitwardenOutput(args)
        if err != nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/config.go 
new/chezmoi-2.31.0/pkg/cmd/config.go
--- old/chezmoi-2.30.1/pkg/cmd/config.go        2023-02-11 19:06:40.000000000 
+0100
+++ new/chezmoi-2.31.0/pkg/cmd/config.go        2023-02-17 12:19:43.000000000 
+0100
@@ -86,11 +86,12 @@
        Data               map[string]any                  `json:"data" 
mapstructure:"data" yaml:"data"`
        Format             writeDataFormat                 `json:"format" 
mapstructure:"format" yaml:"format"`
        DestDirAbsPath     chezmoi.AbsPath                 `json:"destDir" 
mapstructure:"destDir" yaml:"destDir"`
+       GitHub             gitHubConfig                    `json:"gitHub" 
mapstructure:"gitHub" yaml:"gitHub"`
        Interpreters       map[string]*chezmoi.Interpreter `json:"interpreters" 
mapstructure:"interpreters" yaml:"interpreters"` //nolint:lll
        Mode               chezmoi.Mode                    `json:"mode" 
mapstructure:"mode" yaml:"mode"`
        Pager              string                          `json:"pager" 
mapstructure:"pager" yaml:"pager"`
        PINEntry           pinEntryConfig                  `json:"pinentry" 
mapstructure:"pinentry" yaml:"pinentry"`
-       Progress           bool                            `json:"progress" 
mapstructure:"progress" yaml:"progress"`
+       Progress           autoBool                        `json:"progress" 
mapstructure:"progress" yaml:"progress"`
        Safe               bool                            `json:"safe" 
mapstructure:"safe" yaml:"safe"`
        ScriptEnv          map[string]string               `json:"scriptEnv" 
mapstructure:"scriptEnv" yaml:"scriptEnv"`
        ScriptTempDir      chezmoi.AbsPath                 
`json:"scriptTempDir" mapstructure:"scriptTempDir" yaml:"scriptTempDir"` 
//nolint:lll
@@ -357,6 +358,7 @@
                "awsSecretsManagerRaw":     c.awsSecretsManagerRawTemplateFunc,
                "bitwarden":                c.bitwardenTemplateFunc,
                "bitwardenAttachment":      c.bitwardenAttachmentTemplateFunc,
+               "bitwardenAttachmentByRef": 
c.bitwardenAttachmentByRefTemplateFunc,
                "bitwardenFields":          c.bitwardenFieldsTemplateFunc,
                "comment":                  c.commentTemplateFunc,
                "decrypt":                  c.decryptTemplateFunc,
@@ -1372,7 +1374,7 @@
        persistentFlags.VarP(&c.DestDirAbsPath, "destination", "D", "Set 
destination directory")
        persistentFlags.Var(&c.Mode, "mode", "Mode")
        persistentFlags.Var(&c.persistentStateAbsPath, "persistent-state", "Set 
persistent state file")
-       persistentFlags.BoolVar(&c.Progress, "progress", c.Progress, "Display 
progress bars")
+       persistentFlags.Var(&c.Progress, "progress", "Display progress bars")
        persistentFlags.BoolVar(&c.Safe, "safe", c.Safe, "Safely replace files 
and symlinks")
        persistentFlags.VarP(&c.SourceDirAbsPath, "source", "S", "Set source 
directory")
        persistentFlags.Var(&c.UseBuiltinAge, "use-builtin-age", "Use builtin 
age")
@@ -1944,6 +1946,14 @@
        return defaultConfigFileAbsPath.Dir().Join(persistentStateFileRelPath), 
nil
 }
 
+// progressAutoFunc detects whether progress bars should be displayed.
+func (c *Config) progressAutoFunc() bool {
+       if stdout, ok := c.stdout.(*os.File); ok {
+               return term.IsTerminal(int(stdout.Fd()))
+       }
+       return false
+}
+
 func (c *Config) newTemplateData() *templateData {
        // Determine the user's username and group, if possible.
        //
@@ -2378,6 +2388,9 @@
                },
                Interpreters: defaultInterpreters,
                Pager:        os.Getenv("PAGER"),
+               Progress: autoBool{
+                       auto: true,
+               },
                PINEntry: pinEntryConfig{
                        Options: pinEntryDefaultOptions,
                },
@@ -2451,6 +2464,9 @@
                Git: gitCmdConfig{
                        Command: "git",
                },
+               GitHub: gitHubConfig{
+                       RefreshPeriod: 1 * time.Minute,
+               },
                Merge: mergeCmdConfig{
                        Command: "vimdiff",
                },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/executetemplatecmd.go 
new/chezmoi-2.31.0/pkg/cmd/executetemplatecmd.go
--- old/chezmoi-2.30.1/pkg/cmd/executetemplatecmd.go    2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/executetemplatecmd.go    2023-02-17 
12:19:43.000000000 +0100
@@ -18,6 +18,7 @@
        promptString    map[string]string
        stdinIsATTY     bool
        templateOptions chezmoi.TemplateOptions
+       withStdin       bool
 }
 
 func (c *Config) newExecuteTemplateCmd() *cobra.Command {
@@ -27,6 +28,9 @@
                Long:    mustLongHelp("execute-template"),
                Example: example("execute-template"),
                RunE:    c.runExecuteTemplateCmd,
+               Annotations: newAnnotations(
+                       persistentStateModeReadWrite,
+               ),
        }
 
        flags := executeTemplateCmd.Flags()
@@ -37,6 +41,7 @@
        flags.BoolVar(&c.executeTemplate.stdinIsATTY, "stdinisatty", 
c.executeTemplate.stdinIsATTY, "Simulate stdinIsATTY")
        flags.StringVar(&c.executeTemplate.templateOptions.LeftDelimiter, 
"left-delimiter", c.executeTemplate.templateOptions.LeftDelimiter, "Set left 
template delimiter")     //nolint:lll
        flags.StringVar(&c.executeTemplate.templateOptions.RightDelimiter, 
"right-delimiter", c.executeTemplate.templateOptions.RightDelimiter, "Set right 
template delimiter") //nolint:lll
+       flags.BoolVar(&c.executeTemplate.withStdin, "with-stdin", 
c.executeTemplate.withStdin, "Set .chezmoi.stdin to the contents of the 
standard input")                      //nolint:lll
 
        return executeTemplateCmd
 }
@@ -48,6 +53,17 @@
        if c.executeTemplate.init {
                options = append(options, chezmoi.WithReadTemplateData(false))
        }
+       if c.executeTemplate.withStdin && len(args) > 0 {
+               stdin, err := io.ReadAll(c.stdin)
+               if err != nil {
+                       return err
+               }
+               options = append(options, 
chezmoi.WithPriorityTemplateData(map[string]any{
+                       "chezmoi": map[string]any{
+                               "stdin": string(stdin),
+                       },
+               }))
+       }
        sourceState, err := c.newSourceState(cmd.Context(), options...)
        if err != nil {
                return err
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/githubtemplatefuncs.go 
new/chezmoi-2.31.0/pkg/cmd/githubtemplatefuncs.go
--- old/chezmoi-2.30.1/pkg/cmd/githubtemplatefuncs.go   2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/githubtemplatefuncs.go   2023-02-17 
12:19:43.000000000 +0100
@@ -4,12 +4,38 @@
        "context"
        "fmt"
        "strings"
+       "time"
 
        "github.com/google/go-github/v50/github"
 
        "github.com/twpayne/chezmoi/v2/pkg/chezmoi"
 )
 
+type gitHubConfig struct {
+       RefreshPeriod time.Duration `json:"refreshPeriod" 
mapstructure:"refreshPeriod" yaml:"refreshPeriod"`
+}
+
+type gitHubKeysState struct {
+       RequestedAt time.Time     `json:"requestedAt" yaml:"requestedAt"`
+       Keys        []*github.Key `json:"keys" yaml:"keys"`
+}
+
+type gitHubLatestReleaseState struct {
+       RequestedAt time.Time                 `json:"requestedAt" 
yaml:"requestedAt"`
+       Release     *github.RepositoryRelease `json:"release" yaml:"release"`
+}
+
+type gitHubLatestTagState struct {
+       RequestedAt time.Time             `json:"requestedAt" 
yaml:"requestedAt"`
+       Tag         *github.RepositoryTag `json:"tag" yaml:"tag"`
+}
+
+var (
+       gitHubKeysStateBucket          = []byte("gitHubLatestKeysState")
+       gitHubLatestReleaseStateBucket = []byte("gitHubLatestReleaseState")
+       gitHubLatestTagStateBucket     = []byte("gitHubLatestTagState")
+)
+
 type gitHubData struct {
        client             *github.Client
        clientErr          error
@@ -23,6 +49,18 @@
                return keys
        }
 
+       now := time.Now()
+       gitHubKeysKey := []byte(user)
+       if c.GitHub.RefreshPeriod != 0 {
+               var gitHubKeysValue gitHubKeysState
+               switch ok, err := chezmoi.PersistentStateGet(c.persistentState, 
gitHubKeysStateBucket, gitHubKeysKey, &gitHubKeysValue); { //nolint:lll
+               case err != nil:
+                       panic(err)
+               case ok && 
!now.After(gitHubKeysValue.RequestedAt.Add(c.GitHub.RefreshPeriod)):
+                       return gitHubKeysValue.Keys
+               }
+       }
+
        ctx, cancel := context.WithCancel(context.Background())
        defer cancel()
 
@@ -47,10 +85,18 @@
                opts.Page = resp.NextPage
        }
 
+       if err := chezmoi.PersistentStateSet(c.persistentState, 
gitHubKeysStateBucket, gitHubKeysKey, &gitHubKeysState{
+               RequestedAt: now,
+               Keys:        allKeys,
+       }); err != nil {
+               panic(err)
+       }
+
        if c.gitHub.keysCache == nil {
                c.gitHub.keysCache = make(map[string][]*github.Key)
        }
        c.gitHub.keysCache[user] = allKeys
+
        return allKeys
 }
 
@@ -64,6 +110,18 @@
                return release
        }
 
+       now := time.Now()
+       gitHubLatestReleaseKey := []byte(owner + "/" + repo)
+       if c.GitHub.RefreshPeriod != 0 {
+               var gitHubLatestReleaseStateValue gitHubLatestReleaseState
+               switch ok, err := chezmoi.PersistentStateGet(c.persistentState, 
gitHubLatestReleaseStateBucket, gitHubLatestReleaseKey, 
&gitHubLatestReleaseStateValue); { //nolint:lll
+               case err != nil:
+                       panic(err)
+               case ok && 
!now.After(gitHubLatestReleaseStateValue.RequestedAt.Add(c.GitHub.RefreshPeriod)):
+                       return gitHubLatestReleaseStateValue.Release
+               }
+       }
+
        ctx, cancel := context.WithCancel(context.Background())
        defer cancel()
 
@@ -77,6 +135,13 @@
                panic(err)
        }
 
+       if err := chezmoi.PersistentStateSet(c.persistentState, 
gitHubLatestReleaseStateBucket, gitHubLatestReleaseKey, 
&gitHubLatestReleaseState{ //nolint:lll
+               RequestedAt: now,
+               Release:     release,
+       }); err != nil {
+               panic(err)
+       }
+
        if c.gitHub.latestReleaseCache == nil {
                c.gitHub.latestReleaseCache = 
make(map[string]map[string]*github.RepositoryRelease)
        }
@@ -98,6 +163,18 @@
                return tag
        }
 
+       now := time.Now()
+       gitHubLatestTagKey := []byte(owner + "/" + repo)
+       if c.GitHub.RefreshPeriod != 0 {
+               var gitHubLatestTagValue gitHubLatestTagState
+               switch ok, err := chezmoi.PersistentStateGet(c.persistentState, 
gitHubLatestTagStateBucket, gitHubLatestTagKey, &gitHubLatestTagValue); { 
//nolint:lll
+               case err != nil:
+                       panic(err)
+               case ok && 
!now.After(gitHubLatestTagValue.RequestedAt.Add(c.GitHub.RefreshPeriod)):
+                       return gitHubLatestTagValue.Tag
+               }
+       }
+
        ctx, cancel := context.WithCancel(context.Background())
        defer cancel()
 
@@ -112,9 +189,16 @@
        if err != nil {
                panic(err)
        }
-       var firstTag *github.RepositoryTag
+       var tag *github.RepositoryTag
        if len(tags) > 0 {
-               firstTag = tags[0]
+               tag = tags[0]
+       }
+
+       if err := chezmoi.PersistentStateSet(c.persistentState, 
gitHubLatestTagStateBucket, gitHubLatestTagKey, &gitHubLatestTagState{ 
//nolint:lll
+               RequestedAt: now,
+               Tag:         tag,
+       }); err != nil {
+               panic(err)
        }
 
        if c.gitHub.latestTagCache == nil {
@@ -123,9 +207,9 @@
        if c.gitHub.latestTagCache[owner] == nil {
                c.gitHub.latestTagCache[owner] = 
make(map[string]*github.RepositoryTag)
        }
-       c.gitHub.latestTagCache[owner][repo] = firstTag
+       c.gitHub.latestTagCache[owner][repo] = tag
 
-       return firstTag
+       return tag
 }
 
 func (c *Config) getGitHubClient(ctx context.Context) (*github.Client, error) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/readhttpresponse.go 
new/chezmoi-2.31.0/pkg/cmd/readhttpresponse.go
--- old/chezmoi-2.30.1/pkg/cmd/readhttpresponse.go      2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/readhttpresponse.go      2023-02-17 
12:19:43.000000000 +0100
@@ -114,7 +114,7 @@
 
 func (c *Config) readHTTPResponse(resp *http.Response) ([]byte, error) {
        switch {
-       case c.noTTY || !c.Progress:
+       case c.noTTY || !c.Progress.Value(c.progressAutoFunc):
                return io.ReadAll(resp.Body)
 
        case resp.ContentLength >= 0:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/statecmd.go 
new/chezmoi-2.31.0/pkg/cmd/statecmd.go
--- old/chezmoi-2.30.1/pkg/cmd/statecmd.go      2023-02-11 19:06:40.000000000 
+0100
+++ new/chezmoi-2.31.0/pkg/cmd/statecmd.go      2023-02-17 12:19:43.000000000 
+0100
@@ -186,7 +186,15 @@
 }
 
 func (c *Config) runStateDumpCmd(cmd *cobra.Command, args []string) error {
-       data, err := chezmoi.PersistentStateData(c.persistentState)
+       data, err := chezmoi.PersistentStateData(c.persistentState, 
map[string][]byte{
+               "configState":              chezmoi.ConfigStateBucket,
+               "entryState":               chezmoi.EntryStateBucket,
+               "gitHubKeysState":          gitHubKeysStateBucket,
+               "gitHubLatestReleaseState": gitHubLatestReleaseStateBucket,
+               "gitHubLatestTagState":     gitHubLatestTagStateBucket,
+               "gitRepoExternalState":     chezmoi.GitRepoExternalStateBucket,
+               "scriptState":              chezmoi.ScriptStateBucket,
+       })
        if err != nil {
                return err
        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/templatefuncs.go 
new/chezmoi-2.31.0/pkg/cmd/templatefuncs.go
--- old/chezmoi-2.30.1/pkg/cmd/templatefuncs.go 2023-02-11 19:06:40.000000000 
+0100
+++ new/chezmoi-2.31.0/pkg/cmd/templatefuncs.go 2023-02-17 12:19:43.000000000 
+0100
@@ -473,7 +473,13 @@
 func iniFileToMap(file *ini.File) map[string]any {
        m := make(map[string]any)
        for _, section := range file.Sections() {
-               m[section.Name()] = iniSectionToMap(section)
+               if section.Name() == ini.DefaultSection {
+                       for _, k := range section.Keys() {
+                               m[k.Name()] = k.Value()
+                       }
+               } else {
+                       m[section.Name()] = iniSectionToMap(section)
+               }
        }
        return m
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/templatefuncs_test.go 
new/chezmoi-2.31.0/pkg/cmd/templatefuncs_test.go
--- old/chezmoi-2.30.1/pkg/cmd/templatefuncs_test.go    2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/templatefuncs_test.go    2023-02-17 
12:19:43.000000000 +0100
@@ -7,7 +7,6 @@
 
        "github.com/stretchr/testify/assert"
        "github.com/stretchr/testify/require"
-       "gopkg.in/ini.v1"
 
        "github.com/twpayne/chezmoi/v2/pkg/chezmoitest"
 )
@@ -370,18 +369,28 @@
                                `key = value`,
                        ),
                        expected: map[string]any{
-                               ini.DefaultSection: map[string]any{
-                                       "key": "value",
+                               "key": "value",
+                       },
+               },
+               {
+                       text: chezmoitest.JoinLines(
+                               `[section]`,
+                               `sectionKey = sectionValue`,
+                       ),
+                       expected: map[string]any{
+                               "section": map[string]any{
+                                       "sectionKey": "sectionValue",
                                },
                        },
                },
                {
                        text: chezmoitest.JoinLines(
+                               `key = value`,
                                `[section]`,
                                `sectionKey = sectionValue`,
                        ),
                        expected: map[string]any{
-                               ini.DefaultSection: map[string]any{},
+                               "key": "value",
                                "section": map[string]any{
                                        "sectionKey": "sectionValue",
                                },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/add.txtar 
new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/add.txtar
--- old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/add.txtar       2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/add.txtar       2023-02-17 
12:19:43.000000000 +0100
@@ -59,6 +59,7 @@
 # test that chezmoi add respects .chezmoiignore
 exec chezmoi add $HOME${/}.dir
 exists $CHEZMOISOURCEDIR/dot_dir/file
+stderr 'warning: ignoring'
 ! exists $CHEZMOISOURCEDIR/dot_dir/ignore
 
 chhome home4/user
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/bitwarden.txtar 
new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/bitwarden.txtar
--- old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/bitwarden.txtar 2023-02-11 
19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/bitwarden.txtar 2023-02-17 
12:19:43.000000000 +0100
@@ -14,6 +14,10 @@
 exec chezmoi execute-template '{{ (bitwardenAttachment "filename" "item-id") 
}}'
 cmp stdout golden/bitwarden-attachment
 
+# test bitwardenAttachmentByRef template function
+exec chezmoi execute-template '{{ (bitwardenAttachmentByRef "filename" "item" 
"example.com") }}'
+cmp stdout golden/bitwarden-attachment
+
 -- bin/bw --
 #!/bin/sh
 
@@ -57,6 +61,11 @@
 hidden-file-value
 EOF
     ;;
+"get attachment filename --itemid bf22e4b4-ae4a-4d1c-8c98-ac620004b628 --raw")
+    cat <<EOF
+hidden-file-value
+EOF
+    ;;
 *)
     echo "Invalid command: $*"
     echo "See --help for a list of available commands."
@@ -97,6 +106,8 @@
     echo.}
 ) ELSE IF "%*" == "get attachment filename --itemid item-id --raw" (
     echo.hidden-file-value
+) ELSE IF "%*" == "get attachment filename --itemid 
bf22e4b4-ae4a-4d1c-8c98-ac620004b628 --raw" (
+    echo.hidden-file-value
 ) ELSE (
     echo Invalid command: $*
     echo "See --help for a list of available commands."
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/configstate.txtar 
new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/configstate.txtar
--- old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/configstate.txtar       
2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/configstate.txtar       
2023-02-17 12:19:43.000000000 +0100
@@ -67,6 +67,9 @@
     configState:
         configTemplateContentsSHA256: 
af43121a524340707b84e390f510c949731177e6f2a25b3b6b11b2fc656cf8f2
 entryState: {}
+gitHubKeysState: {}
+gitHubLatestReleaseState: {}
+gitHubLatestTagState: {}
 gitRepoExternalState: {}
 scriptState: {}
 -- home/user/.local/share/chezmoi/.chezmoi.toml.tmpl --
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/executetemplate.txtar 
new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/executetemplate.txtar
--- old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/executetemplate.txtar   
2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/executetemplate.txtar   
2023-02-17 12:19:43.000000000 +0100
@@ -7,6 +7,11 @@
 exec chezmoi execute-template
 stdout stdin-template
 
+# test reading from stdin with an argument
+stdin golden/stdin
+exec chezmoi execute-template --with-stdin '{{ .chezmoi.stdin | upper }}'
+stdout '# CONTENTS OF STDIN'
+
 # test partial templates work
 exec chezmoi execute-template '{{ template "partial" }}'
 stdout 'hello world'
@@ -77,6 +82,8 @@
 exec chezmoi execute-template --init '{{ promptString "value" "default" }}'
 stdout default
 
+-- golden/stdin --
+# contents of stdin
 -- golden/stdin.tmpl --
 {{ "stdin-template" }}
 -- home/user/.config/chezmoi/chezmoi.toml --
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/state_unix.txtar 
new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/state_unix.txtar
--- old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/state_unix.txtar        
2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/state_unix.txtar        
2023-02-17 12:19:43.000000000 +0100
@@ -40,6 +40,9 @@
 -- golden/dump.yaml --
 configState: {}
 entryState: {}
+gitHubKeysState: {}
+gitHubLatestReleaseState: {}
+gitHubLatestTagState: {}
 gitRepoExternalState: {}
 scriptState: {}
 -- home/user/.local/share/chezmoi/run_once_script.sh --
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/state_windows.txtar 
new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/state_windows.txtar
--- old/chezmoi-2.30.1/pkg/cmd/testdata/scripts/state_windows.txtar     
2023-02-11 19:06:40.000000000 +0100
+++ new/chezmoi-2.31.0/pkg/cmd/testdata/scripts/state_windows.txtar     
2023-02-17 12:19:43.000000000 +0100
@@ -21,6 +21,9 @@
 -- golden/dump.yaml --
 configState: {}
 entryState: {}
+gitHubKeysState: {}
+gitHubLatestReleaseState: {}
+gitHubLatestTagState: {}
 gitRepoExternalState: {}
 scriptState: {}
 -- home/user/.local/share/chezmoi/run_once_script.cmd --

++++++ chezmoi.obsinfo ++++++
--- /var/tmp/diff_new_pack.MjmhR9/_old  2023-02-17 16:46:19.215307047 +0100
+++ /var/tmp/diff_new_pack.MjmhR9/_new  2023-02-17 16:46:19.223307092 +0100
@@ -1,5 +1,5 @@
 name: chezmoi
-version: 2.30.1
-mtime: 1676138800
-commit: ff0c704a9068c81b3ad301236d730fefcd9ce98c
+version: 2.31.0
+mtime: 1676632783
+commit: 4d2bc846212e27fae1e5bbd45d70e00908da603b
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/chezmoi/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.chezmoi.new.22824/vendor.tar.gz differ: char 5, 
line 1

Reply via email to