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-08-08 15:54:54
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/chezmoi (Old)
 and      /work/SRC/openSUSE:Factory/.chezmoi.new.22712 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "chezmoi"

Tue Aug  8 15:54:54 2023 rev:31 rq:1102765 version:2.37.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/chezmoi/chezmoi.changes  2023-08-01 
15:38:46.745912905 +0200
+++ /work/SRC/openSUSE:Factory/.chezmoi.new.22712/chezmoi.changes       
2023-08-08 15:55:04.253044524 +0200
@@ -1,0 +2,12 @@
+Mon Aug  7 17:15:09 UTC 2023 - Filippo Bonazzi <filippo.bona...@suse.com>
+
+- Update to version 2.37.0:
+  * feat: Read personal mackup config files
+  * feat: Add support for Doppler
+  * feat: Extend re-add command to accept an optional list of targets
+  * fix: Avoid concurrent map access when evaluating multiple templates
+  * feat: Add isExecutable template function
+  * chore: Fix isExecutable tests on Windows
+  * chore: Update dependencies
+
+-------------------------------------------------------------------

Old:
----
  chezmoi-2.36.1.obscpio

New:
----
  chezmoi-2.37.0.obscpio

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

Other differences:
------------------
++++++ chezmoi.spec ++++++
--- /var/tmp/diff_new_pack.PfMxWL/_old  2023-08-08 15:55:05.409051759 +0200
+++ /var/tmp/diff_new_pack.PfMxWL/_new  2023-08-08 15:55:05.425051859 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           chezmoi
-Version:        2.36.1
+Version:        2.37.0
 Release:        0
 Summary:        A multi-host manager for dotfiles
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.PfMxWL/_old  2023-08-08 15:55:05.473052159 +0200
+++ /var/tmp/diff_new_pack.PfMxWL/_new  2023-08-08 15:55:05.473052159 +0200
@@ -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.36.1</param>
+    <param name="revision">v2.37.0</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
   </service>

++++++ chezmoi-2.36.1.obscpio -> chezmoi-2.37.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/.github/workflows/main.yml 
new/chezmoi-2.37.0/.github/workflows/main.yml
--- old/chezmoi-2.36.1/.github/workflows/main.yml       2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/.github/workflows/main.yml       2023-08-06 
18:42:18.000000000 +0200
@@ -11,7 +11,7 @@
 env:
   ACTIONLINT_VERSION: 1.6.25
   AGE_VERSION: 1.1.1
-  GO_VERSION: 1.20.6
+  GO_VERSION: 1.20.7
   GOFUMPT_VERSION: 0.4.0
   GOLANGCI_LINT_VERSION: 1.53.3
   GOLINES_VERSION: 0.11.0
@@ -51,10 +51,10 @@
     - uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9
       with:
         fetch-depth: 1
-    - uses: github/codeql-action/init@f6e388ebf0efc915c6c5b165b019ee61a6746a38
+    - uses: github/codeql-action/init@0ba4244466797eb048eb91a6cd43d5c03ca8bd05
       with:
         languages: go
-    - uses: 
github/codeql-action/analyze@f6e388ebf0efc915c6c5b165b019ee61a6746a38
+    - uses: 
github/codeql-action/analyze@0ba4244466797eb048eb91a6cd43d5c03ca8bd05
   misspell:
     runs-on: ubuntu-22.04
     steps:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/commands/re-add.md 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/commands/re-add.md
--- old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/commands/re-add.md      
2023-07-30 13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/commands/re-add.md      
2023-08-06 18:42:18.000000000 +0200
@@ -1,7 +1,11 @@
-# `re-add`
+# `re-add` [*target*...]
 
-Re-add all modified files in the target state. chezmoi will not overwrite
-templates, and all entries that are not files are ignored.
+Re-add modified files in the target state, preserving any `encrypted_`
+attributes. chezmoi will not overwrite templates, and all entries that are not
+files are ignored.
+
+If no *target*s are specified then all modified files are re-added. If one or
+more *target*s are given then only those targets are re-added.
 
 !!! hint
 
@@ -11,4 +15,5 @@
 
     ```console
     $ chezmoi re-add
+    $ chezmoi re-add ~/.bashrc
     ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
--- 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
    2023-07-30 13:56:41.000000000 +0200
+++ 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
    2023-08-06 18:42:18.000000000 +0200
@@ -147,6 +147,19 @@
       type: bool
       default: '`true`'
       description: Show script contents
+  doppler:
+    args:
+      type: '[]string'
+      description: Extra args to Doppler CLI command
+    command:
+      default: '`doppler`'
+      description: Doppler CLI command
+    config:
+      type: string
+      description: Default config (aka environment) if none is specified
+    project:
+      type: string
+      description: Default project name if none is specified
   edit:
     apply:
       type: bool
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/templates/doppler/doppler.md
 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/templates/doppler/doppler.md
--- 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/templates/doppler/doppler.md
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/templates/doppler/doppler.md
    2023-08-06 18:42:18.000000000 +0200
@@ -0,0 +1,15 @@
+# `doppler` *key* [*project* [*config*]]
+
+`doppler` returns the secret for the specified project and configuration
+from [Doppler](https://www.doppler.com) using `doppler secrets download --json 
--no-file`.
+
+If either of *project* or *config* are empty or
+omitted, then chezmoi will use the value from the
+`doppler.project` and
+`doppler.config` config variables if they are set and not empty.
+
+!!! example
+
+    ```
+    {{ doppler "SECRET_NAME" "project_name" "configuration_name" }}
+    ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/templates/doppler/dopplerProjectJson.md
 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/templates/doppler/dopplerProjectJson.md
--- 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/templates/doppler/dopplerProjectJson.md
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/templates/doppler/dopplerProjectJson.md
 2023-08-06 18:42:18.000000000 +0200
@@ -0,0 +1,16 @@
+# `dopplerProjectJson` [*project* [*config*]]
+
+`dopplerProjectJson` returns the secret for the specified project and 
configuration
+from [Doppler](https://www.doppler.com) using `doppler secrets download --json 
--no-file`
+as `json` structured data.
+
+If either of *project* or *config* are empty or
+omitted, then chezmoi will use the value from the
+`doppler.project` and
+`doppler.config` config variables if they are set and not empty.
+
+!!! example
+
+    ```
+    {{ (dopplerProjectJson "project_name" "configuration_name").SECRET_NAME }}
+    ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/templates/doppler/index.md 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/templates/doppler/index.md
--- 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/templates/doppler/index.md  
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/templates/doppler/index.md  
    2023-08-06 18:42:18.000000000 +0200
@@ -0,0 +1,9 @@
+# Doppler
+
+chezmoi includes support for [Doppler](https://www.doppler.com) using the 
`doppler`
+CLI to expose data through the `doppler` and `dopplerProjectJson`
+template functions.
+
+!!! warning
+
+    Doppler is in beta and chezmoi's interface to it may change.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/templates/functions/isExecutable.md
 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/templates/functions/isExecutable.md
--- 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/reference/templates/functions/isExecutable.md
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/reference/templates/functions/isExecutable.md
     2023-08-06 18:42:18.000000000 +0200
@@ -0,0 +1,11 @@
+# `isExecutable` *file*
+
+`isExecutable` returns true if a file is executable.
+
+!!! example
+
+    ```
+    {{ if isExecutable "/bin/echo" }}
+    # echo is executable
+    {{ end }}
+    ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/user-guide/password-managers/custom.md
 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/user-guide/password-managers/custom.md
--- 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/user-guide/password-managers/custom.md
    2023-07-30 13:56:41.000000000 +0200
+++ 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/user-guide/password-managers/custom.md
    2023-08-06 18:42:18.000000000 +0200
@@ -7,14 +7,15 @@
 output respectively. All of the above secret managers can be supported in this
 way:
 
-| Secret Manager    | `secret.command` | Template skeleton                     
             |
-| ----------------- | ---------------- | 
-------------------------------------------------- |
-| 1Password         | `op`             | `{{ secretJSON "get" "item" "$ID" }}` 
             |
-| Bitwarden         | `bw`             | `{{ secretJSON "get" "$ID" }}`        
             |
-| HashiCorp Vault   | `vault`          | `{{ secretJSON "kv" "get" 
"-format=json" "$ID" }}` |
-| HCP Vault Secrets | `vlt`            | `{{ secret "secrets" "get" 
"--plaintext" "$ID }}`  |
-| LastPass          | `lpass`          | `{{ secretJSON "show" "--json" "$ID" 
}}`           |
-| KeePassXC         | `keepassxc-cli`  | Not possible (interactive command 
only)            |
-| Keeper            | `keeper`         | `{{ secretJSON "get" "--format=json" 
"$ID" }}`     |
-| pass              | `pass`           | `{{ secret "show" "$ID" }}`           
             |
-| passhole          | `ph`             | `{{ secret "$ID" "password" }}`       
             |
+| Secret Manager    | `secret.command` | Template skeleton                     
                           |
+| ----------------- | ---------------- | 
---------------------------------------------------------------- |
+| 1Password         | `op`             | `{{ secretJSON "get" "item" "$ID" }}` 
                           |
+| Bitwarden         | `bw`             | `{{ secretJSON "get" "$ID" }}`        
                           |
+| Doppler           | `doppler`        | `{{ secretJSON "secrets" "download" 
"--json" "--no-file" }}`     |
+| HashiCorp Vault   | `vault`          | `{{ secretJSON "kv" "get" 
"-format=json" "$ID" }}`               |
+| HCP Vault Secrets | `vlt`            | `{{ secret "secrets" "get" 
"--plaintext" "$ID }}`                |
+| LastPass          | `lpass`          | `{{ secretJSON "show" "--json" "$ID" 
}}`                         |
+| KeePassXC         | `keepassxc-cli`  | Not possible (interactive command 
only)                          |
+| Keeper            | `keeper`         | `{{ secretJSON "get" "--format=json" 
"$ID" }}`                   |
+| pass              | `pass`           | `{{ secret "show" "$ID" }}`           
                           |
+| passhole          | `ph`             | `{{ secret "$ID" "password" }}`       
                           |
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/user-guide/password-managers/doppler.md
 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/user-guide/password-managers/doppler.md
--- 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/user-guide/password-managers/doppler.md
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/user-guide/password-managers/doppler.md
   2023-08-06 18:42:18.000000000 +0200
@@ -0,0 +1,58 @@
+# Doppler
+
+chezmoi includes support for [Doppler](https://www.doppler.com) using the 
`doppler`
+CLI to expose data through the `doppler` and `dopplerProjectJson`
+template functions.
+
+!!! warning
+
+    Doppler is in beta and chezmoi's interface to it may change.
+    Note: Doppler only supports secrets in the `UPPER_SNAKE_CASE` format.
+
+Log in using:
+
+```console
+$ doppler login
+```
+
+It is now possible to interact with the `doppler` CLI in two different, but 
similar, ways.
+Both make use of the command `doppler secrets download --json --no-file` 
behind the scenes
+but present a different experience.
+
+The `doppler` function is used in the following way:
+```
+{{ doppler "SECRET_NAME" "project name" "config" }}
+```
+
+All secrets from the specified project/config combination are cached for 
subsequent access and
+will not requery the `doppler` CLI for another secret in the same 
project/config.
+This caching mechanism enhances performance and reduces unnecessary CLI calls.
+
+The `dopplerProjectJson` presents the secrets as `json` structured data and is 
used in the following
+way:
+```
+{{ (dopplerProjectJson "project" "config").PASSWORD }}
+```
+
+Additionally one can set the default values for the project and
+config (aka environment) in your config file, for example:
+
+```toml title="~/.config/chezmoi/chezmoi.toml"
+[doppler]
+    project = "my-project"
+    config = "dev"
+```
+With these default values, you can omit them in the call to both `doppler` and 
`dopplerProjectJson`,
+for example:
+```
+{{ doppler "SECRET_NAME" }}
+{{ dopplerProjectJson.SECRET_NAME }}
+```
+
+It is important to note that neither of the above parse any individual secret 
as `json`.
+This can be achieved by using the `fromJson` function, for example:
+```
+{{ (doppler "SECRET_NAME" | fromJson).created_by.email_address }}
+{{ (dopplerProjectJson.SECRET_NAME | fromJson).created_by.email_address }}
+```
+Obviously the secret would have to be saved in `json` format for this to work 
as expected.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/assets/chezmoi.io/docs/what-does-chezmoi-do.md 
new/chezmoi-2.37.0/assets/chezmoi.io/docs/what-does-chezmoi-do.md
--- old/chezmoi-2.36.1/assets/chezmoi.io/docs/what-does-chezmoi-do.md   
2023-07-30 13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/assets/chezmoi.io/docs/what-does-chezmoi-do.md   
2023-08-06 18:42:18.000000000 +0200
@@ -46,8 +46,8 @@
 Manager](https://aws.amazon.com/secrets-manager/),
 [Azure Key Vault](https://learn.microsoft.com/en-us/azure/key-vault/general/),
 [Bitwarden](https://bitwarden.com/), [Dashlane](https://www.dashlane.com/),
-[gopass](https://www.gopass.pw/), [HCP Vault
-Secrets](https://developer.hashicorp.com/hcp/docs/vault-secrets),
+[Doppler](https://www.doppler.com), [gopass](https://www.gopass.pw/),
+[HCP Vault Secrets](https://developer.hashicorp.com/hcp/docs/vault-secrets),
 [KeePassXC](https://keepassxc.org/), [Keeper](https://www.keepersecurity.com/),
 [LastPass](https://lastpass.com/), [pass](https://www.passwordstore.org/),
 [passhole](https://github.com/Evidlo/passhole),
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/assets/chezmoi.io/mkdocs.yml 
new/chezmoi-2.37.0/assets/chezmoi.io/mkdocs.yml
--- old/chezmoi-2.36.1/assets/chezmoi.io/mkdocs.yml     2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/assets/chezmoi.io/mkdocs.yml     2023-08-06 
18:42:18.000000000 +0200
@@ -195,6 +195,7 @@
       - include: reference/templates/functions/include.md
       - includeTemplate: reference/templates/functions/includeTemplate.md
       - ioreg: reference/templates/functions/ioreg.md
+      - isExecutable: reference/templates/functions/isExecutable.md
       - joinPath: reference/templates/functions/joinPath.md
       - jq: reference/templates/functions/jq.md
       - lookPath: reference/templates/functions/lookPath.md
@@ -251,6 +252,10 @@
       - reference/templates/dashlane-functions/index.md
       - dashlaneNote: reference/templates/dashlane-functions/dashlaneNote.md
       - dashlanePassword: 
reference/templates/dashlane-functions/dashlanePassword.md
+    - Doppler functions:
+      - reference/templates/doppler-functions/index.md
+      - doppler: reference/templates/doppler-functions/doppler.md
+      - dopplerProjectJson: 
reference/templates/doppler-functions/dopplerProjectJson.md
     - ejson functions:
       - reference/templates/ejson-functions/index.md
       - ejsonDecrypt: reference/templates/ejson-functions/ejsonDecrypt.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/go.mod new/chezmoi-2.37.0/go.mod
--- old/chezmoi-2.36.1/go.mod   2023-07-30 13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/go.mod   2023-08-06 18:42:18.000000000 +0200
@@ -9,9 +9,9 @@
        github.com/Masterminds/sprig/v3 v3.2.3
        github.com/Shopify/ejson v1.4.1
        github.com/alecthomas/assert/v2 v2.3.0
-       github.com/aws/aws-sdk-go-v2 v1.19.1
-       github.com/aws/aws-sdk-go-v2/config v1.18.30
-       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.12
+       github.com/aws/aws-sdk-go-v2 v1.20.0
+       github.com/aws/aws-sdk-go-v2/config v1.18.32
+       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.20.1
        github.com/bmatcuk/doublestar/v4 v4.6.0
        github.com/bradenhilton/mozillainstallhash v1.0.1
        github.com/charmbracelet/bubbles v0.16.1
@@ -31,7 +31,7 @@
        github.com/muesli/termenv v0.15.2
        github.com/pelletier/go-toml/v2 v2.0.9
        github.com/rogpeppe/go-internal v1.11.0
-       github.com/rs/zerolog v1.29.1
+       github.com/rs/zerolog v1.30.0
        github.com/sergi/go-diff v1.1.0
        github.com/spf13/cobra v1.7.0
        github.com/spf13/pflag v1.0.5
@@ -44,12 +44,12 @@
        github.com/zalando/go-keyring v0.2.3
        go.etcd.io/bbolt v1.3.7
        go.uber.org/multierr v1.11.0
-       golang.org/x/crypto v0.11.0
-       golang.org/x/exp v0.0.0-20230725093048-515e97ebf090
-       golang.org/x/oauth2 v0.10.0
+       golang.org/x/crypto v0.12.0
+       golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b
+       golang.org/x/oauth2 v0.11.0
        golang.org/x/sync v0.3.0
-       golang.org/x/sys v0.10.0
-       golang.org/x/term v0.10.0
+       golang.org/x/sys v0.11.0
+       golang.org/x/term v0.11.0
        gopkg.in/ini.v1 v1.67.0
        gopkg.in/yaml.v3 v3.0.1
        howett.net/plist v1.0.0
@@ -61,7 +61,7 @@
        github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0 // indirect
        github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect
        github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 
// indirect
-       github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // 
indirect
+       github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0 // 
indirect
        github.com/Masterminds/goutils v1.1.1 // indirect
        github.com/Masterminds/semver/v3 v3.2.1 // indirect
        github.com/Microsoft/go-winio v0.6.1 // indirect
@@ -71,16 +71,16 @@
        github.com/alecthomas/repr v0.2.0 // indirect
        github.com/alessio/shellescape v1.4.2 // indirect
        github.com/atotto/clipboard v0.1.4 // indirect
-       github.com/aws/aws-sdk-go-v2/credentials v1.13.29 // indirect
-       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37 // indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/sso v1.12.14 // indirect
-       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14 // indirect
-       github.com/aws/aws-sdk-go-v2/service/sts v1.20.1 // indirect
-       github.com/aws/smithy-go v1.13.5 // indirect
+       github.com/aws/aws-sdk-go-v2/credentials v1.13.31 // indirect
+       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 // indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 // 
indirect
+       github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 // indirect
+       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 // indirect
+       github.com/aws/smithy-go v1.14.0 // indirect
        github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
        github.com/aymerick/douceur v0.2.0 // indirect
        github.com/bradenhilton/cityhash v1.0.0 // indirect
@@ -95,7 +95,7 @@
        github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
        github.com/go-git/go-billy/v5 v5.4.1 // indirect
        github.com/godbus/dbus/v5 v5.1.0 // indirect
-       github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
+       github.com/golang-jwt/jwt/v5 v5.0.0 // indirect
        github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // 
indirect
        github.com/golang/protobuf v1.5.3 // indirect
        github.com/google/btree v1.1.2 // indirect
@@ -133,9 +133,9 @@
        github.com/yuin/goldmark v1.5.5 // indirect
        github.com/yuin/goldmark-emoji v1.0.2 // indirect
        golang.org/x/mod v0.12.0 // indirect
-       golang.org/x/net v0.12.0 // indirect
-       golang.org/x/text v0.11.0 // indirect
-       golang.org/x/tools v0.11.0 // indirect
+       golang.org/x/net v0.14.0 // indirect
+       golang.org/x/text v0.12.0 // indirect
+       golang.org/x/tools v0.11.1 // indirect
        google.golang.org/appengine v1.6.7 // indirect
        google.golang.org/protobuf v1.31.0 // indirect
        gopkg.in/warnings.v0 v0.1.2 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/go.sum new/chezmoi-2.37.0/go.sum
--- old/chezmoi-2.36.1/go.sum   2023-07-30 13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/go.sum   2023-08-06 18:42:18.000000000 +0200
@@ -18,8 +18,8 @@
 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets 
v1.0.0/go.mod h1:w2K61Z8eppIuGbQRx1SKYld2Lrr5vrGvnUwWAhF4nso=
 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0 
h1:T028gtTPiYt/RMUfs8nVsAL7FDQrfLlrm/NnRG/zcC4=
 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v0.8.0/go.mod 
h1:cw4zVQgBby0Z5f2v0itn6se2dDP17nTjbZFXW5uPyHA=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 
h1:OBhqkivkhkMqLPymWEppkm7vgPQY2XsHoEkaMQ0AdZY=
-github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod 
h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0 
h1:HCc0+LpPfpCKs6LGGLAhwBARt9632unrVcI6i8s/8os=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.1.0/go.mod 
h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
 github.com/Masterminds/goutils v1.1.1 
h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
 github.com/Masterminds/goutils v1.1.1/go.mod 
h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
 github.com/Masterminds/semver/v3 v3.2.0/go.mod 
h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
@@ -50,32 +50,32 @@
 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.19.1 
h1:STs0lbbpXu3byTPcnRLghs2DH0yk9qKDo27TyyJSKsM=
-github.com/aws/aws-sdk-go-v2 v1.19.1/go.mod 
h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw=
-github.com/aws/aws-sdk-go-v2/config v1.18.30 
h1:TTAXQIn31qYFUQjkW6siVrRTX1ux+sADZDOe3jsZcMg=
-github.com/aws/aws-sdk-go-v2/config v1.18.30/go.mod 
h1:+YogjT7e/t9JVu/sOnZZgxTge1G+bPNk8zOaI0QIQvE=
-github.com/aws/aws-sdk-go-v2/credentials v1.13.29 
h1:KNgCpThGuZyCjq9EuuqoLDenKKMwO/x1Xx01ckDa7VI=
-github.com/aws/aws-sdk-go-v2/credentials v1.13.29/go.mod 
h1:VMq1LcmSEa9qxBlOCYTjVuGJWEEzhGmgL552jQsmhss=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6 
h1:kortK122LvTU34CGX/F9oJpelXKkEA2j/MW48II+8+8=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.6/go.mod 
h1:k7IPHyHNIASI0m0RwOmCjWOTtgG+J0raqwuHH8WhWJE=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36 
h1:kbk81RlPoC6e4co7cQx2FAvH9TgbzxIqCqiosAFiB+w=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.36/go.mod 
h1:T8Jsn/uNL/AFOXrVYQ1YQaN1r9gN34JU1855/Lyjv+o=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30 
h1:lMl8S5SB8jNCB+Sty2Em4lnu3IJytceHQd7qbmfqKL0=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.30/go.mod 
h1:v3GSCnFxbHzt9dlWBqvA1K1f9lmWuf4ztupZBCAIVs4=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37 
h1:BXiqvN7WuV/pMhz8CivhO8cG8icJcjnjHumif4ukQ0c=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.3.37/go.mod 
h1:d4GZ62cjnz/hjKFdAu11gAwK73bdhqaFv2O4J1gaqIs=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30 
h1:UcVZxLVNY4yayCmiG94Ge3l2qbc5WEB/oa4RmjoQEi0=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.30/go.mod 
h1:wPffyJiWWtHwvpFyn23WjAjVjMnlQOQrl02+vutBh3Y=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.12 
h1:2C2a9VVs2Ob1I09GsmsKVvmlw5aebPj4yGfJX8EWMrk=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.19.12/go.mod 
h1:cglZ7TL22WrrkFCyDqD0X8GrByvmkOXXfkcRjj0ZkVA=
-github.com/aws/aws-sdk-go-v2/service/sso v1.12.14 
h1:gUjz7trfz9qBm0AlkKTvJHBXELi1wvw+2LA9GfD2AsM=
-github.com/aws/aws-sdk-go-v2/service/sso v1.12.14/go.mod 
h1:9kfRdJgLCbnyeqZ/DpaSwcgj9ZDYLfRpe8Sze+NrYfQ=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14 
h1:8bEtxV5UT9ucdWGXfZ7CM3caQhSHGjWnTHt0OeF7m7s=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.14/go.mod 
h1:nd9BG2UnexN2sDx/mk2Jd6pf3d2E61AiA8m8Fdvdx8Y=
-github.com/aws/aws-sdk-go-v2/service/sts v1.20.1 
h1:U7h9CPoyMfVoN5jUglB0LglCMP10AK4vMBsbsCKM8Yw=
-github.com/aws/aws-sdk-go-v2/service/sts v1.20.1/go.mod 
h1:BUHusg4cOA1TFGegj7x8/eoWrbdHzJfoMrXcbMQAG0k=
-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/aws/aws-sdk-go-v2 v1.20.0 
h1:INUDpYLt4oiPOJl0XwZDK2OVAVf0Rzo+MGVTv9f+gy8=
+github.com/aws/aws-sdk-go-v2 v1.20.0/go.mod 
h1:uWOr0m0jDsiWw8nnXiqZ+YG6LdvAlGYDLLf2NmHZoy4=
+github.com/aws/aws-sdk-go-v2/config v1.18.32 
h1:tqEOvkbTxwEV7hToRcJ1xZRjcATqwDVsWbAscgRKyNI=
+github.com/aws/aws-sdk-go-v2/config v1.18.32/go.mod 
h1:U3ZF0fQRRA4gnbn9GGvOWLoT2EzzZfAWeKwnVrm1rDc=
+github.com/aws/aws-sdk-go-v2/credentials v1.13.31 
h1:vJyON3lG7R8VOErpJJBclBADiWTwzcwdkQpTKx8D2sk=
+github.com/aws/aws-sdk-go-v2/credentials v1.13.31/go.mod 
h1:T4sESjBtY2lNxLgkIASmeP57b5j7hTQqCbqG0tWnxC4=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7 
h1:X3H6+SU21x+76LRglk21dFRgMTJMa5QcpW+SqUf5BBg=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.13.7/go.mod 
h1:3we0V09SwcJBzNlnyovrR2wWJhWmVdqAsmVs4uronv8=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37 
h1:zr/gxAZkMcvP71ZhQOcvdm8ReLjFgIXnIn0fw5AM7mo=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.37/go.mod 
h1:Pdn4j43v49Kk6+82spO3Tu5gSeQXRsxo56ePPQAvFiA=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31 
h1:0HCMIkAkVY9KMgueD8tf4bRTUanzEYvhw7KkPXIMpO0=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.31/go.mod 
h1:fTJDMe8LOFYtqiFFFeHA+SVMAwqLhoq0kcInYoLa9Js=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38 
h1:+i1DOFrW3YZ3apE45tCal9+aDKK6kNEbW6Ib7e1nFxE=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.3.38/go.mod 
h1:1/jLp0OgOaWIetycOmycW+vYTYgTZFPttJQRgsI1PoU=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31 
h1:auGDJ0aLZahF5SPvkJ6WcUuX7iQ7kyl2MamV7Tm8QBk=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.31/go.mod 
h1:3+lloe3sZuBQw1aBc5MyndvodzQlyqCZ7x1QPDHaWP4=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.20.1 
h1:AD8gRAXAXDU9+XTm0Q3D+NBsMCX4TlpN/qnNYbbQLO4=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.20.1/go.mod 
h1:aFRHxQ3V4bs/uVQYpg8Wm6szKWuB2KnraKcIGp5JS/I=
+github.com/aws/aws-sdk-go-v2/service/sso v1.13.1 
h1:DSNpSbfEgFXRV+IfEcKE5kTbqxm+MeF5WgyeRlsLnHY=
+github.com/aws/aws-sdk-go-v2/service/sso v1.13.1/go.mod 
h1:TC9BubuFMVScIU+TLKamO6VZiYTkYoEHqlSQwAe2omw=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1 
h1:hd0SKLMdOL/Sl6Z0np1PX9LeH2gqNtBe0MhTedA8MGI=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.15.1/go.mod 
h1:XO/VcyoQ8nKyKfFW/3DMsRQXsfh/052tHTWmg3xBXRg=
+github.com/aws/aws-sdk-go-v2/service/sts v1.21.1 
h1:pAOJj+80tC8sPVgSDHzMYD6KLWsaLQ1kZw31PTeORbs=
+github.com/aws/aws-sdk-go-v2/service/sts v1.21.1/go.mod 
h1:G8SbvL0rFk4WOJroU8tKBczhsbhj2p/YY7qeJezJ3CI=
+github.com/aws/smithy-go v1.14.0 
h1:+X90sB94fizKjDmwb4vyl2cTTPXTE5E2G/1mjByb0io=
+github.com/aws/smithy-go v1.14.0/go.mod 
h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
 github.com/aymanbagabas/go-osc52 v1.0.3 
h1:DTwqENW7X9arYimJrPeGZcV0ln14sGMt3pHZspWD+Mg=
 github.com/aymanbagabas/go-osc52 v1.0.3/go.mod 
h1:zT8H+Rk4VSabYN90pWyugflM3ZhpTZNC7cASDfUCdT4=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1 
h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
@@ -150,6 +150,8 @@
 github.com/godbus/dbus/v5 v5.1.0/go.mod 
h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
 github.com/golang-jwt/jwt/v4 v4.5.0 
h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
 github.com/golang-jwt/jwt/v4 v4.5.0/go.mod 
h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v5 v5.0.0 
h1:1n1XNM9hk7O9mnQoNBGolZvzebBQ7p93ULHRc28XJUE=
+github.com/golang-jwt/jwt/v5 v5.0.0/go.mod 
h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da 
h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod 
h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
@@ -288,10 +290,10 @@
 github.com/rivo/uniseg v0.4.4/go.mod 
h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
 github.com/rogpeppe/go-internal v1.11.0 
h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M=
 github.com/rogpeppe/go-internal v1.11.0/go.mod 
h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA=
-github.com/rs/xid v1.4.0 h1:qd7wPTDkN6KQx2VmMBLrpHkiyQwgFXRnkOLacUiaSNY=
-github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
-github.com/rs/zerolog v1.29.1 h1:cO+d60CHkknCbvzEWxP0S9K6KqyTjrCNUy1LdQLCGPc=
-github.com/rs/zerolog v1.29.1/go.mod 
h1:Le6ESbR7hc+DP6Lt1THiV8CQSdkkNrd3R0XbEgp3ZBU=
+github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
+github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
+github.com/rs/zerolog v1.30.0 h1:SymVODrcRsaRaSInD9yQtKbtWqwsfoPcRff/oRXLj4c=
+github.com/rs/zerolog v1.30.0/go.mod 
h1:/tk+P47gFdPXq4QYjvCmT5/Gsug2nagsFWBWhAiSi1w=
 github.com/russross/blackfriday/v2 v2.1.0 
h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 github.com/russross/blackfriday/v2 v2.1.0/go.mod 
h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 github.com/sahilm/fuzzy v0.1.0 h1:FzWGaw2Opqyu+794ZQ9SYifWv2EIXpwP4q8dY1kDAwI=
@@ -372,10 +374,10 @@
 golang.org/x/crypto v0.3.0/go.mod 
h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod 
h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4=
 golang.org/x/crypto v0.7.0/go.mod 
h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
-golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA=
-golang.org/x/crypto v0.11.0/go.mod 
h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio=
-golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 
h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY=
-golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod 
h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
+golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk=
+golang.org/x/crypto v0.12.0/go.mod 
h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
+golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b 
h1:r+vk0EmXNmekl0S0BascoeeoHk/L7wmaW2QF90K+kYI=
+golang.org/x/exp v0.0.0-20230801115018-d63ba01acd4b/go.mod 
h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod 
h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
 golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
@@ -389,10 +391,10 @@
 golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY=
 golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
-golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50=
-golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA=
-golang.org/x/oauth2 v0.10.0 h1:zHCpF2Khkwy4mMB4bv0U37YtJdTGW8jI0glAApi0Kh8=
-golang.org/x/oauth2 v0.10.0/go.mod 
h1:kTpgurOux7LqtuxjuyZa4Gj2gdezIt/jQtGnNFfypQI=
+golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
+golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
+golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU=
+golang.org/x/oauth2 v0.11.0/go.mod 
h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk=
 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/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -418,15 +420,15 @@
 golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
-golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
+golang.org/x/sys v0.11.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.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
-golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c=
-golang.org/x/term v0.10.0/go.mod 
h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o=
+golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0=
+golang.org/x/term v0.11.0/go.mod 
h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
 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=
@@ -435,14 +437,14 @@
 golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4=
-golang.org/x/text v0.11.0/go.mod 
h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
+golang.org/x/text v0.12.0/go.mod 
h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 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.6.0/go.mod 
h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
-golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8=
-golang.org/x/tools v0.11.0/go.mod 
h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
+golang.org/x/tools v0.11.1 h1:ojD5zOW8+7dOGzdnNgersm8aPfcDjhMp12UfG93NIMc=
+golang.org/x/tools v0.11.1/go.mod 
h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8=
 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.36.1/internal/chezmoi/chezmoi_unix.go 
new/chezmoi-2.37.0/internal/chezmoi/chezmoi_unix.go
--- old/chezmoi-2.36.1/internal/chezmoi/chezmoi_unix.go 2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/chezmoi/chezmoi_unix.go 2023-08-06 
18:42:18.000000000 +0200
@@ -15,8 +15,8 @@
        unix.Umask(int(Umask))
 }
 
-// isExecutable returns if fileInfo is executable.
-func isExecutable(fileInfo fs.FileInfo) bool {
+// IsExecutable returns if fileInfo is executable.
+func IsExecutable(fileInfo fs.FileInfo) bool {
        return fileInfo.Mode().Perm()&0o111 != 0
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/chezmoi/chezmoi_windows.go 
new/chezmoi-2.37.0/internal/chezmoi/chezmoi_windows.go
--- old/chezmoi-2.36.1/internal/chezmoi/chezmoi_windows.go      2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/chezmoi/chezmoi_windows.go      2023-08-06 
18:42:18.000000000 +0200
@@ -2,13 +2,31 @@
 
 import (
        "io/fs"
+       "os"
+       "path/filepath"
+       "strings"
+
+       "golang.org/x/exp/slices"
 )
 
 const nativeLineEnding = "\r\n"
 
-// isExecutable returns false on Windows.
-func isExecutable(fileInfo fs.FileInfo) bool {
-       return false
+var pathExts = strings.Split(os.Getenv("PATHEXT"), 
string(filepath.ListSeparator))
+
+// IsExecutable checks if the file is a regular file and has an extension 
listed
+// in the PATHEXT environment variable as per
+// 
https://www.nextofwindows.com/what-is-pathext-environment-variable-in-windows.
+func IsExecutable(fileInfo fs.FileInfo) bool {
+       if !fileInfo.Mode().IsRegular() {
+               return false
+       }
+       ext := filepath.Ext(fileInfo.Name())
+       if ext == "" {
+               return false
+       }
+       return slices.ContainsFunc(pathExts, func(pathExt string) bool {
+               return strings.EqualFold(pathExt, ext)
+       })
 }
 
 // isPrivate returns false on Windows.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/chezmoi/sourcestate.go 
new/chezmoi-2.37.0/internal/chezmoi/sourcestate.go
--- old/chezmoi-2.36.1/internal/chezmoi/sourcestate.go  2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/chezmoi/sourcestate.go  2023-08-06 
18:42:18.000000000 +0200
@@ -27,6 +27,7 @@
        "time"
 
        "github.com/coreos/go-semver/semver"
+       "github.com/mitchellh/copystructure"
        "github.com/rs/zerolog"
        "github.com/rs/zerolog/log"
        vfs "github.com/twpayne/go-vfs/v4"
@@ -764,11 +765,10 @@
                }
        }
 
-       // Temporarily set .chezmoi.sourceFile to the name of the template.
+       // Set .chezmoi.sourceFile to the name of the template.
        templateData := s.TemplateData()
        if chezmoiTemplateData, ok := templateData["chezmoi"].(map[string]any); 
ok {
                chezmoiTemplateData["sourceFile"] = options.Name
-               defer delete(chezmoiTemplateData, "sourceFile")
        }
 
        return tmpl.Execute(templateData)
@@ -1278,7 +1278,7 @@
        return targetRelPaths
 }
 
-// TemplateData returns s's template data.
+// TemplateData returns a copy of s's template data.
 func (s *SourceState) TemplateData() map[string]any {
        if s.templateData == nil {
                s.templateData = make(map[string]any)
@@ -1289,7 +1289,11 @@
                RecursiveMerge(s.templateData, s.userTemplateData)
                RecursiveMerge(s.templateData, s.priorityTemplateData)
        }
-       return s.templateData
+       templateData, err := copystructure.Copy(s.templateData)
+       if err != nil {
+               panic(err)
+       }
+       return templateData.(map[string]any) //nolint:forcetypeassert
 }
 
 // addExternal adds external source entries to s.
@@ -1857,10 +1861,6 @@
                                if chezmoiTemplateData, ok := 
templateData["chezmoi"].(map[string]any); ok {
                                        chezmoiTemplateData["stdin"] = 
string(currentContents)
                                        chezmoiTemplateData["sourceFile"] = 
sourceFile
-                                       defer func() {
-                                               delete(chezmoiTemplateData, 
"stdin")
-                                               delete(chezmoiTemplateData, 
"sourceFile")
-                                       }()
                                }
 
                                contents, err = tmpl.Execute(templateData)
@@ -2092,7 +2092,7 @@
        fileAttr := FileAttr{
                TargetName: fileInfo.Name(),
                Encrypted:  options.Encrypt,
-               Executable: isExecutable(fileInfo),
+               Executable: IsExecutable(fileInfo),
                Private:    isPrivate(fileInfo),
                ReadOnly:   isReadOnly(fileInfo),
                Template:   options.Template,
@@ -2316,7 +2316,7 @@
                                TargetName: fileInfo.Name(),
                                Type:       SourceFileTypeFile,
                                Empty:      fileInfo.Size() == 0,
-                               Executable: isExecutable(fileInfo),
+                               Executable: IsExecutable(fileInfo),
                                Private:    isPrivate(fileInfo),
                                ReadOnly:   isReadOnly(fileInfo),
                        }
@@ -2448,7 +2448,7 @@
                                TargetName: fileInfo.Name(),
                                Type:       SourceFileTypeFile,
                                Empty:      fileInfo.Size() == 0,
-                               Executable: isExecutable(fileInfo) || 
external.Executable,
+                               Executable: IsExecutable(fileInfo) || 
external.Executable,
                                Private:    isPrivate(fileInfo),
                                ReadOnly:   isReadOnly(fileInfo),
                        }
@@ -2530,7 +2530,7 @@
                                TargetName: fileInfo.Name(),
                                Type:       SourceFileTypeFile,
                                Empty:      true,
-                               Executable: isExecutable(fileInfo),
+                               Executable: IsExecutable(fileInfo),
                                Private:    isPrivate(fileInfo),
                                ReadOnly:   isReadOnly(fileInfo),
                        }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/cmd/config.go 
new/chezmoi-2.37.0/internal/cmd/config.go
--- old/chezmoi-2.36.1/internal/cmd/config.go   2023-07-30 13:56:41.000000000 
+0200
+++ new/chezmoi-2.37.0/internal/cmd/config.go   2023-08-06 18:42:18.000000000 
+0200
@@ -128,6 +128,7 @@
        AzureKeyVault     azureKeyVaultConfig     `json:"azureKeyVault"     
mapstructure:"azureKeyVault"     yaml:"azureKeyVault"`
        Bitwarden         bitwardenConfig         `json:"bitwarden"         
mapstructure:"bitwarden"         yaml:"bitwarden"`
        Dashlane          dashlaneConfig          `json:"dashlane"          
mapstructure:"dashlane"          yaml:"dashlane"`
+       Doppler           dopplerConfig           `json:"doppler"           
mapstructure:"doppler"           yaml:"doppler"`
        Ejson             ejsonConfig             `json:"ejson"             
mapstructure:"ejson"             yaml:"ejson"`
        Gopass            gopassConfig            `json:"gopass"            
mapstructure:"gopass"            yaml:"gopass"`
        HCPVaultSecrets   hcpVaultSecretConfig    `json:"hcpVaultSecrets"   
mapstructure:"hcpVaultSecrets"   yaml:"hcpVaultSecrets"`
@@ -396,6 +397,8 @@
                "dashlanePassword":         c.dashlanePasswordTemplateFunc,
                "decrypt":                  c.decryptTemplateFunc,
                "deleteValueAtPath":        c.deleteValueAtPathTemplateFunc,
+               "doppler":                  c.dopplerTemplateFunc,
+               "dopplerProjectJson":       c.dopplerProjectJSONTemplateFunc,
                "ejsonDecrypt":             c.ejsonDecryptTemplateFunc,
                "ejsonDecryptWithKey":      c.ejsonDecryptWithKeyTemplateFunc,
                "encrypt":                  c.encryptTemplateFunc,
@@ -417,6 +420,7 @@
                "include":                  c.includeTemplateFunc,
                "includeTemplate":          c.includeTemplateTemplateFunc,
                "ioreg":                    c.ioregTemplateFunc,
+               "isExecutable":             c.isExecutableTemplateFunc,
                "joinPath":                 c.joinPathTemplateFunc,
                "jq":                       c.jqTemplateFunc,
                "keepassxc":                c.keepassxcTemplateFunc,
@@ -2588,6 +2592,9 @@
                Dashlane: dashlaneConfig{
                        Command: "dcli",
                },
+               Doppler: dopplerConfig{
+                       Command: "doppler",
+               },
                Ejson: ejsonConfig{
                        KeyDir: firstNonEmptyString(os.Getenv("EJSON_KEYDIR"), 
"/opt/ejson/keys"),
                },
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/cmd/doctorcmd.go 
new/chezmoi-2.37.0/internal/cmd/doctorcmd.go
--- old/chezmoi-2.36.1/internal/cmd/doctorcmd.go        2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/cmd/doctorcmd.go        2023-08-06 
18:42:18.000000000 +0200
@@ -314,6 +314,14 @@
                        versionRx:   regexp.MustCompile(`^(\d+\.\d+\.\d+)`),
                },
                &binaryCheck{
+                       name:        "doppler-command",
+                       binaryname:  c.Doppler.Command,
+                       ifNotSet:    checkResultWarning,
+                       ifNotExist:  checkResultInfo,
+                       versionArgs: []string{"--version"},
+                       versionRx:   regexp.MustCompile(`^v(\d+\.\d+\.\d+)`),
+               },
+               &binaryCheck{
                        name:        "gopass-command",
                        binaryname:  c.Gopass.Command,
                        ifNotSet:    checkResultWarning,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/cmd/dopplertemplatefuncs.go 
new/chezmoi-2.37.0/internal/cmd/dopplertemplatefuncs.go
--- old/chezmoi-2.36.1/internal/cmd/dopplertemplatefuncs.go     1970-01-01 
01:00:00.000000000 +0100
+++ new/chezmoi-2.37.0/internal/cmd/dopplertemplatefuncs.go     2023-08-06 
18:42:18.000000000 +0200
@@ -0,0 +1,111 @@
+package cmd
+
+import (
+       "encoding/json"
+       "fmt"
+       "os"
+       "os/exec"
+       "strings"
+
+       "golang.org/x/exp/slices"
+
+       "github.com/twpayne/chezmoi/v2/internal/chezmoilog"
+)
+
+type dopplerConfig struct {
+       Command     string   `json:"command" mapstructure:"command" 
yaml:"command"`
+       Args        []string `json:"args"    mapstructure:"args"    yaml:"args"`
+       Project     string   `json:"project" mapstructure:"project" 
yaml:"project"`
+       Config      string   `json:"config"  mapstructure:"config"  
yaml:"config"`
+       outputCache map[string][]byte
+}
+
+func (c *Config) dopplerTemplateFunc(key string, additionalArgs ...string) any 
{
+       if len(additionalArgs) > 2 {
+               // Add one to the number of received arguments as the key
+               // is the first argument.
+               panic(fmt.Errorf("expected 1 to 3 arguments, got %d", 
len(additionalArgs)+1))
+       }
+
+       args := c.appendDopplerAdditionalArgs(
+               []string{"secrets", "download", "--json", "--no-file"},
+               additionalArgs,
+       )
+
+       data, err := c.dopplerOutput(args)
+       if err != nil {
+               panic(err)
+       }
+       var value map[string]any
+       if err := json.Unmarshal(data, &value); err != nil {
+               panic(err)
+       }
+
+       secret, ok := value[key]
+       if !ok {
+               panic(fmt.Errorf("could not find requested secret: %s", key))
+       }
+
+       return secret
+}
+
+func (c *Config) dopplerProjectJSONTemplateFunc(additionalArgs ...string) any {
+       if len(additionalArgs) > 2 {
+               panic(fmt.Errorf("expected 0 to 2 arguments, got %d", 
len(additionalArgs)))
+       }
+       args := c.appendDopplerAdditionalArgs(
+               []string{"secrets", "download", "--json", "--no-file"},
+               additionalArgs,
+       )
+
+       data, err := c.dopplerOutput(args)
+       if err != nil {
+               panic(err)
+       }
+       var value any
+       if err := json.Unmarshal(data, &value); err != nil {
+               panic(err)
+       }
+       return value
+}
+
+func (c *Config) appendDopplerAdditionalArgs(
+       args, additionalArgs []string,
+) []string {
+       if len(additionalArgs) > 0 && additionalArgs[0] != "" {
+               args = append(args, "--project", additionalArgs[0])
+       } else if c.Doppler.Project != "" {
+               args = append(args, "--project", c.Doppler.Project)
+       }
+       if len(additionalArgs) > 1 && additionalArgs[1] != "" {
+               args = append(args, "--config", additionalArgs[1])
+       } else if c.Doppler.Config != "" {
+               args = append(args, "--config", c.Doppler.Config)
+       }
+
+       return args
+}
+
+func (c *Config) dopplerOutput(args []string) ([]byte, error) {
+       args = append(slices.Clone(c.Doppler.Args), args...)
+       key := strings.Join(args, "\x00")
+       if data, ok := c.Doppler.outputCache[key]; ok {
+               return data, nil
+       }
+       cmd := exec.Command(c.Doppler.Command, args...) //nolint:gosec
+       // Always run the doppler command in the destination path because 
doppler uses
+       // relative paths to find its .doppler.json config file.
+       cmd.Dir = c.DestDirAbsPath.String()
+       cmd.Stdin = os.Stdin
+       cmd.Stderr = os.Stderr
+       output, err := chezmoilog.LogCmdOutput(cmd)
+       if err != nil {
+               return nil, newCmdOutputError(cmd, output, err)
+       }
+
+       if c.Doppler.outputCache == nil {
+               c.Doppler.outputCache = make(map[string][]byte)
+       }
+       c.Doppler.outputCache[key] = output
+       return output, nil
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/cmd/mackupcmd_darwin.go 
new/chezmoi-2.37.0/internal/cmd/mackupcmd_darwin.go
--- old/chezmoi-2.36.1/internal/cmd/mackupcmd_darwin.go 2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/cmd/mackupcmd_darwin.go 2023-08-06 
18:42:18.000000000 +0200
@@ -5,7 +5,9 @@
 import (
        "bufio"
        "bytes"
+       "errors"
        "fmt"
+       "os"
        "os/exec"
        "regexp"
        "strings"
@@ -70,11 +72,14 @@
                return err
        }
 
+       mackupDirAbsPath := c.homeDirAbsPath.JoinString(".mackup")
        var addArgs []string
        for _, arg := range args {
-               data, err := c.baseSystem.ReadFile(
-                       mackupApplicationsDir.Join(chezmoi.NewRelPath(arg + 
".cfg")),
-               )
+               configRelPath := chezmoi.NewRelPath(arg + ".cfg")
+               data, err := 
c.baseSystem.ReadFile(mackupDirAbsPath.Join(configRelPath))
+               if errors.Is(err, os.ErrNotExist) {
+                       data, err = 
c.baseSystem.ReadFile(mackupApplicationsDir.Join(configRelPath))
+               }
                if err != nil {
                        return err
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/cmd/main_test.go 
new/chezmoi-2.37.0/internal/cmd/main_test.go
--- old/chezmoi-2.36.1/internal/cmd/main_test.go        2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/cmd/main_test.go        2023-08-06 
18:42:18.000000000 +0200
@@ -653,6 +653,9 @@
 
        env.Setenv("HOME", homeDir)
        env.Setenv("PATH", prependDirToPath(binDir, env.Getenv("PATH")))
+       if runtime.GOOS == "windows" {
+               env.Setenv("PATHEXT", 
".COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.CPL")
+       }
        env.Setenv("CHEZMOICONFIGDIR", path.Join(absSlashHomeDir, ".config", 
"chezmoi"))
        env.Setenv("CHEZMOISOURCEDIR", path.Join(absSlashHomeDir, ".local", 
"share", "chezmoi"))
        env.Setenv("CHEZMOI_GITHUB_TOKEN", os.Getenv("CHEZMOI_GITHUB_TOKEN"))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/cmd/readdcmd.go 
new/chezmoi-2.37.0/internal/cmd/readdcmd.go
--- old/chezmoi-2.36.1/internal/cmd/readdcmd.go 2023-07-30 13:56:41.000000000 
+0200
+++ new/chezmoi-2.37.0/internal/cmd/readdcmd.go 2023-08-06 18:42:18.000000000 
+0200
@@ -4,6 +4,7 @@
        "bytes"
        "fmt"
        "io/fs"
+       "path/filepath"
        "sort"
 
        "github.com/spf13/cobra"
@@ -22,7 +23,7 @@
                Long:              mustLongHelp("re-add"),
                Example:           example("re-add"),
                ValidArgsFunction: c.targetValidArgs,
-               Args:              cobra.NoArgs,
+               Args:              cobra.ArbitraryArgs,
                RunE:              c.makeRunEWithSourceState(c.runReAddCmd),
                Annotations: newAnnotations(
                        modifiesSourceDirectory,
@@ -47,13 +48,29 @@
 ) error {
        var targetRelPaths chezmoi.RelPaths
        sourceStateEntries := make(map[chezmoi.RelPath]chezmoi.SourceStateEntry)
-       _ = sourceState.ForEach(
-               func(targetRelPath chezmoi.RelPath, sourceStateEntry 
chezmoi.SourceStateEntry) error {
+       if len(args) == 0 {
+               _ = sourceState.ForEach(
+                       func(targetRelPath chezmoi.RelPath, sourceStateEntry 
chezmoi.SourceStateEntry) error {
+                               targetRelPaths = append(targetRelPaths, 
targetRelPath)
+                               sourceStateEntries[targetRelPath] = 
sourceStateEntry
+                               return nil
+                       },
+               )
+       } else {
+               for _, arg := range args {
+                       arg = filepath.Clean(arg)
+                       destAbsPath, err := chezmoi.NewAbsPathFromExtPath(arg, 
c.homeDirAbsPath)
+                       if err != nil {
+                               return err
+                       }
+                       targetRelPath, err := c.targetRelPath(destAbsPath)
+                       if err != nil {
+                               return err
+                       }
                        targetRelPaths = append(targetRelPaths, targetRelPath)
-                       sourceStateEntries[targetRelPath] = sourceStateEntry
-                       return nil
-               },
-       )
+                       sourceStateEntries[targetRelPath] = 
sourceState.Get(targetRelPath)
+               }
+       }
        sort.Sort(targetRelPaths)
 
 TARGET_REL_PATH:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.36.1/internal/cmd/templatefuncs.go 
new/chezmoi-2.37.0/internal/cmd/templatefuncs.go
--- old/chezmoi-2.36.1/internal/cmd/templatefuncs.go    2023-07-30 
13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/cmd/templatefuncs.go    2023-08-06 
18:42:18.000000000 +0200
@@ -315,6 +315,17 @@
        }
 }
 
+func (c *Config) isExecutableTemplateFunc(file string) bool {
+       switch fileInfo, err := c.fileSystem.Stat(file); {
+       case err == nil:
+               return chezmoi.IsExecutable(fileInfo)
+       case errors.Is(err, fs.ErrNotExist):
+               return false
+       default:
+               panic(err)
+       }
+}
+
 func (c *Config) lstatTemplateFunc(name string) any {
        switch fileInfo, err := c.fileSystem.Lstat(name); {
        case err == nil:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/internal/cmd/testdata/scripts/doctor_unix.txtar 
new/chezmoi-2.37.0/internal/cmd/testdata/scripts/doctor_unix.txtar
--- old/chezmoi-2.36.1/internal/cmd/testdata/scripts/doctor_unix.txtar  
2023-07-30 13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/cmd/testdata/scripts/doctor_unix.txtar  
2023-08-06 18:42:18.000000000 +0200
@@ -3,6 +3,7 @@
 chmod 755 bin/age
 chmod 755 bin/bw
 chmod 755 bin/dcli
+chmod 755 bin/doppler
 chmod 755 bin/git
 chmod 755 bin/gopass
 chmod 755 bin/gpg
@@ -48,6 +49,7 @@
 stdout '^ok\s+1password-command\s+'
 stdout '^ok\s+bitwarden-command\s+'
 stdout '^ok\s+dashlane-command\s+'
+stdout '^ok\s+doppler-command\s+'
 stdout '^ok\s+gopass-command\s+'
 stdout '^ok\s+keepassxc-command\s+'
 stdout '^info\s+keepassxc-db\s+'
@@ -93,6 +95,10 @@
 #!/bin/sh
 
 echo 1.0.0
+-- bin/doppler --
+#!/bin/sh
+
+echo "v3.65.1"
 -- bin/git --
 #!/bin/sh
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/internal/cmd/testdata/scripts/doppler.txtar 
new/chezmoi-2.37.0/internal/cmd/testdata/scripts/doppler.txtar
--- old/chezmoi-2.36.1/internal/cmd/testdata/scripts/doppler.txtar      
1970-01-01 01:00:00.000000000 +0100
+++ new/chezmoi-2.37.0/internal/cmd/testdata/scripts/doppler.txtar      
2023-08-06 18:42:18.000000000 +0200
@@ -0,0 +1,151 @@
+[!windows] chmod 755 bin/doppler
+[windows] unix2dos bin/doppler.cmd
+
+# test doppler template function (global configuration)
+exec chezmoi execute-template '{{ doppler "PASSWORD_123"}}'
+stdout ^staplebatteryhorsecorrect$
+
+# test doppler template function with project and config arguments (supplied 
configuration)
+exec chezmoi execute-template '{{ doppler "PASSWORD" "project" "config" }}'
+stdout ^correcthorsebatterystaple$
+
+# test doppler template function with empty project and config arguments 
(global configuration)
+exec chezmoi execute-template '{{ doppler "PASSWORD" "" "" }}'
+stdout ^correcthorsebatterystaple$
+
+# test dopplerProjectJson template function with project and config arguments 
(supplied configuration)
+exec chezmoi execute-template '{{ (dopplerProjectJson "project" 
"config").PASSWORD_123 }}'
+stdout ^staplebatteryhorsecorrect$
+
+# test dopplerProjectJson template function with JSON secret piped to fromJson 
function, project and config arguments
+exec chezmoi execute-template '{{ ((dopplerProjectJson "project" 
"config").JSON_SECRET | fromJson).created_by.email }}'
+stdout ^user@example\.com$
+
+# test dopplerProjectJson template function with project and empty config 
arguments (global configuration)
+exec chezmoi execute-template '{{ (dopplerProjectJson "project" "").PASSWORD 
}}'
+stdout ^correcthorsebatterystaple$
+
+# test dopplerProjectJson template function with empty project and empty 
config arguments (global configuration)
+exec chezmoi execute-template '{{ (dopplerProjectJson "" "").PASSWORD }}'
+stdout ^correcthorsebatterystaple$
+
+# test dopplerProjectJson template function without project and config 
arguments (global configuration)
+exec chezmoi execute-template '{{ dopplerProjectJson.PASSWORD }}'
+stdout ^correcthorsebatterystaple$
+
+chhome home3/user
+
+# test doppler template function with default project and config arguments 
(chezmoi configuration)
+exec chezmoi execute-template '{{ doppler "PASSWORD" }}'
+stdout ^default-project-password$
+
+# test doppler template function with project and default config arguments 
(chezmoi configuration)
+exec chezmoi execute-template '{{ doppler "PASSWORD" "other-project" }}'
+stdout ^other-project-password$
+
+# test doppler template function with project and default config arguments 
(supplied configuration)
+exec chezmoi execute-template '{{ doppler "PASSWORD" "project" "config" }}'
+stdout ^correcthorsebatterystaple$
+
+# test dopplerProjectJson template function with project and default config 
arguments (chezmoi configuration)
+exec chezmoi execute-template '{{ (dopplerProjectJson 
"default-project").DOPPLER_CONFIG }}'
+stdout ^default-config$
+
+# test dopplerProjectJson template function with default project and config 
arguments (chezmoi configuration)
+exec chezmoi execute-template '{{ (dopplerProjectJson).DOPPLER_PROJECT }}'
+stdout ^default-project$
+
+-- bin/doppler --
+#!/bin/sh
+
+case "$*" in
+"secrets download --json --no-file --project project --config config"|"secrets 
download --json --no-file --project project"|"secrets download --json 
--no-file")
+    cat <<EOF
+{
+  "DOPPLER_CONFIG": "config",
+  "DOPPLER_ENVIRONMENT": "config",
+  "DOPPLER_PROJECT": "project",
+  "PASSWORD": "correcthorsebatterystaple",
+  "PASSWORD_123": "staplebatteryhorsecorrect",
+  "JSON_SECRET": "{\n  \"created_at\": \"2023-06-09T13:14:28.140Z\",\n  
\"created_by\": {\n    \"email\": \"u...@example.com\",\n    \"name\": 
\"example\",\n    \"type\": \"TYPE_USER\"\n  },\n  \"latest_version\": \"2\",\n 
 \"name\": \"password\"\n}"
+}
+EOF
+    ;;
+"secrets download --json --no-file --project default-project --config 
default-config")
+    cat <<EOF
+{
+  "DOPPLER_CONFIG": "default-config",
+  "DOPPLER_ENVIRONMENT": "default-config",
+  "DOPPLER_PROJECT": "default-project",
+  "PASSWORD": "default-project-password"
+}
+EOF
+    ;;
+"secrets download --json --no-file --project other-project --config 
default-config")
+    cat <<EOF
+{
+  "DOPPLER_CONFIG": "default-config",
+  "DOPPLER_ENVIRONMENT": "default-config",
+  "DOPPLER_PROJECT": "other-project",
+  "PASSWORD": "other-project-password"
+}
+EOF
+    ;;
+*)
+    echo "$*: unknown command"
+    exit 1
+    ;;
+esac
+-- bin/doppler.cmd --
+@echo off
+IF "%*" == "secrets download --json --no-file --project project --config 
config" (
+    goto download-project
+) ELSE IF "%*" == "secrets download --json --no-file --project project" (
+    goto download-project
+) ELSE IF "%*" == "secrets download --json --no-file" (
+    goto download-project
+) ELSE IF "%*" == "secrets download --json --no-file --project default-project 
--config default-config" (
+    goto download-default-project
+) ELSE IF "%*" == "secrets download --json --no-file --project other-project 
--config default-config" (
+    goto download-other-project
+) ELSE (
+    echo unknown command: $*
+    exit /b 1
+)
+
+exit /b 0
+
+:download-project
+echo.{
+echo.  "DOPPLER_CONFIG": "config",
+echo.  "DOPPLER_ENVIRONMENT": "config",
+echo.  "DOPPLER_PROJECT": "project",
+echo.  "PASSWORD": "correcthorsebatterystaple",
+echo.  "PASSWORD_123": "staplebatteryhorsecorrect",
+echo.  "JSON_SECRET": "{\n  \"created_at\": \"2023-06-09T13:14:28.140Z\",\n  
\"created_by\": {\n    \"email\": \"u...@example.com\",\n    \"name\": 
\"example\",\n    \"type\": \"TYPE_USER\"\n  },\n  \"latest_version\": \"2\",\n 
 \"name\": \"password\"\n}"
+echo.}
+exit /b 0
+
+:download-default-project
+echo.{
+echo.  "DOPPLER_CONFIG": "default-config",
+echo.  "DOPPLER_ENVIRONMENT": "default-config",
+echo.  "DOPPLER_PROJECT": "default-project",
+echo.  "PASSWORD": "default-project-password"
+echo.}
+exit /b 0
+
+:download-other-project
+echo.{
+echo.  "DOPPLER_CONFIG": "default-config",
+echo.  "DOPPLER_ENVIRONMENT": "default-config",
+echo.  "DOPPLER_PROJECT": "other-project",
+echo.  "PASSWORD": "other-project-password"
+echo.}
+exit /b 0
+
+-- home/user/.keep --
+-- home3/user/.config/chezmoi/chezmoi.toml --
+[doppler]
+    project = "default-project"
+    config = "default-config"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/internal/cmd/testdata/scripts/mackup_darwin.txt 
new/chezmoi-2.37.0/internal/cmd/testdata/scripts/mackup_darwin.txt
--- old/chezmoi-2.36.1/internal/cmd/testdata/scripts/mackup_darwin.txt  
2023-07-30 13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/cmd/testdata/scripts/mackup_darwin.txt  
1970-01-01 01:00:00.000000000 +0100
@@ -1,63 +0,0 @@
-[!darwin] skip 'Darwin only'
-
-chmod 755 bin/brew
-chmod 755 bin/mackup
-
-# test that chezmoi mackup add adds normal dotfiles
-exec chezmoi mackup add curl
-cmp $CHEZMOISOURCEDIR/dot_curlrc golden/dot_curlrc
-
-# test that chezmoi mackup add adds XDG configuration files
-exec chezmoi mackup add vscode
-cmp $CHEZMOISOURCEDIR/dot_config/Code/User/settings.json golden/settings.json
-
--- bin/brew --
-#!/bin/sh
-
-case "$*" in
-"--prefix")
-    echo "opt/homebrew"
-    ;;
-*)
-    echo "Error: Unknown command $*"
-    ;;
-esac
--- bin/mackup --
-#!/bin/sh
-
-case "$*" in
-"--version")
-    echo "Mackup 0.8.32"
-    ;;
-*)
-    echo "Usage:"
-    ;;
-esac
--- golden/dot_curlrc --
-# contents of .curlrc
--- golden/settings.json --
-# contents of .config/Code/User/settings.json
--- home/user/.config/Code/User/settings.json --
-# contents of .config/Code/User/settings.json
--- home/user/.curlrc --
-# contents of .curlrc
--- 
opt/homebrew/Cellar/mackup/0.8.32/libexec/lib/python3.9/site-packages/mackup/applications/curl.cfg
 --
-[application]
-name = Curl
-
-[configuration_files]
-.netrc
-.curlrc
--- 
opt/homebrew/Cellar/mackup/0.8.32/libexec/lib/python3.9/site-packages/mackup/applications/vscode.cfg
 --
-[application]
-name = Visual Studio Code
-
-[configuration_files]
-Library/Application Support/Code/User/snippets
-Library/Application Support/Code/User/keybindings.json
-Library/Application Support/Code/User/settings.json
-
-[xdg_configuration_files]
-Code/User/snippets
-Code/User/keybindings.json
-Code/User/settings.json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/internal/cmd/testdata/scripts/mackup_darwin.txtar 
new/chezmoi-2.37.0/internal/cmd/testdata/scripts/mackup_darwin.txtar
--- old/chezmoi-2.36.1/internal/cmd/testdata/scripts/mackup_darwin.txtar        
1970-01-01 01:00:00.000000000 +0100
+++ new/chezmoi-2.37.0/internal/cmd/testdata/scripts/mackup_darwin.txtar        
2023-08-06 18:42:18.000000000 +0200
@@ -0,0 +1,63 @@
+[!darwin] skip 'Darwin only'
+
+chmod 755 bin/brew
+chmod 755 bin/mackup
+
+# test that chezmoi mackup add adds normal dotfiles
+exec chezmoi mackup add curl
+cmp $CHEZMOISOURCEDIR/dot_curlrc golden/dot_curlrc
+
+# test that chezmoi mackup add adds XDG configuration files
+exec chezmoi mackup add vscode
+cmp $CHEZMOISOURCEDIR/dot_config/Code/User/settings.json golden/settings.json
+
+-- bin/brew --
+#!/bin/sh
+
+case "$*" in
+"--prefix")
+    echo "opt/homebrew"
+    ;;
+*)
+    echo "Error: Unknown command $*"
+    ;;
+esac
+-- bin/mackup --
+#!/bin/sh
+
+case "$*" in
+"--version")
+    echo "Mackup 0.8.32"
+    ;;
+*)
+    echo "Usage:"
+    ;;
+esac
+-- golden/dot_curlrc --
+# contents of .curlrc
+-- golden/settings.json --
+# contents of .config/Code/User/settings.json
+-- home/user/.config/Code/User/settings.json --
+# contents of .config/Code/User/settings.json
+-- home/user/.curlrc --
+# contents of .curlrc
+-- home/user/.mackup/curl.cfg --
+[application]
+name = Curl
+
+[configuration_files]
+.netrc
+.curlrc
+-- 
opt/homebrew/Cellar/mackup/0.8.32/libexec/lib/python3.9/site-packages/mackup/applications/vscode.cfg
 --
+[application]
+name = Visual Studio Code
+
+[configuration_files]
+Library/Application Support/Code/User/snippets
+Library/Application Support/Code/User/keybindings.json
+Library/Application Support/Code/User/settings.json
+
+[xdg_configuration_files]
+Code/User/snippets
+Code/User/keybindings.json
+Code/User/settings.json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/internal/cmd/testdata/scripts/re-add.txtar 
new/chezmoi-2.37.0/internal/cmd/testdata/scripts/re-add.txtar
--- old/chezmoi-2.36.1/internal/cmd/testdata/scripts/re-add.txtar       
2023-07-30 13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/cmd/testdata/scripts/re-add.txtar       
2023-08-06 18:42:18.000000000 +0200
@@ -12,3 +12,12 @@
 grep '# edited' $CHEZMOISOURCEDIR/dot_dir/exact_subdir/file
 exec chezmoi diff
 ! stdout .
+
+# test that chezmoi re-add adds only specified targets
+edit $HOME/.file
+edit $HOME/.dir/file
+edit $HOME/.dir/subdir/file
+exec chezmoi re-add ~/.dir/file
+grep -count=1 '# edited' $CHEZMOISOURCEDIR/dot_file
+grep -count=2 '# edited' $CHEZMOISOURCEDIR/dot_dir/file
+grep -count=1 '# edited' $CHEZMOISOURCEDIR/dot_dir/exact_subdir/file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.36.1/internal/cmd/testdata/scripts/templatefuncs.txtar 
new/chezmoi-2.37.0/internal/cmd/testdata/scripts/templatefuncs.txtar
--- old/chezmoi-2.36.1/internal/cmd/testdata/scripts/templatefuncs.txtar        
2023-07-30 13:56:41.000000000 +0200
+++ new/chezmoi-2.37.0/internal/cmd/testdata/scripts/templatefuncs.txtar        
2023-08-06 18:42:18.000000000 +0200
@@ -1,6 +1,7 @@
 [!windows] chmod 755 bin/chezmoi-output-test
 [!windows] chmod 755 bin/generate-color-formats
 [!windows] chmod 755 bin/ioreg
+[!windows] chmod 755 bin/executable
 [windows] unix2dos bin/chezmoi-output-test.cmd
 
 symlink $HOME/symlink -> dir
@@ -68,6 +69,15 @@
 exec chezmoi execute-template '{{ dict "key" "value" | jq ".key" | first }}'
 stdout ^value$
 
+# test isExecutable template function positive test case
+[!windows] exec chezmoi execute-template '{{ isExecutable "bin/executable" }}'
+[windows] exec chezmoi execute-template '{{ isExecutable "bin/executable.cmd" 
}}'
+stdout ^true$
+
+# test isExecutable template function negative test case
+exec chezmoi execute-template '{{ isExecutable "bin/not-executable" }}'
+stdout ^false$
+
 # test lookPath template function to find in PATH
 exec chezmoi execute-template '{{ lookPath "go" }}'
 stdout go$exe
@@ -152,6 +162,9 @@
 set out=%out:\=%
 echo %out%
 endlocal
+-- bin/executable --
+#!/bin/sh
+-- bin/executable.cmd --
 -- bin/generate-color-formats --
 #!/bin/sh
 
@@ -194,6 +207,7 @@
 echo '        <string>Darwin Kernel Version 21.1.0: Wed Oct 13 17:33:24 PDT 
2021; root:xnu-8019.41.5~1/RELEASE_ARM64_T8101</string>'
 echo '</dict>'
 echo '</plist>'
+-- bin/not-executable --
 -- golden/comment --
 # line1
 # line2

++++++ chezmoi.obsinfo ++++++
--- /var/tmp/diff_new_pack.PfMxWL/_old  2023-08-08 15:55:05.925054988 +0200
+++ /var/tmp/diff_new_pack.PfMxWL/_new  2023-08-08 15:55:05.929055013 +0200
@@ -1,5 +1,5 @@
 name: chezmoi
-version: 2.36.1
-mtime: 1690718201
-commit: 0b0fa89f612f5f885ccfc8c3890f515cc668c5c6
+version: 2.37.0
+mtime: 1691340138
+commit: 552d2556aa4b53ecd2677f9ef811376c42fc6c8e
 

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

Reply via email to