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-07-18 22:07:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/chezmoi (Old)
 and      /work/SRC/openSUSE:Factory/.chezmoi.new.3193 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "chezmoi"

Tue Jul 18 22:07:43 2023 rev:29 rq:1099108 version:2.35.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/chezmoi/chezmoi.changes  2023-07-05 
15:31:18.666833653 +0200
+++ /work/SRC/openSUSE:Factory/.chezmoi.new.3193/chezmoi.changes        
2023-07-18 22:07:53.642911743 +0200
@@ -1,0 +2,9 @@
+Mon Jul 17 14:20:09 UTC 2023 - Filippo Bonazzi <filippo.bona...@suse.com>
+
+- Update to version 2.35.0:
+  * feat: Add archive-file externals
+  * fix: Never consider localhost.localdomain in /etc/hosts as the FQDN
+  * feat: Add support for HCP Vault Secrets
+  * chore: Miscellaneous fixes
+
+-------------------------------------------------------------------

Old:
----
  chezmoi-2.34.3.obscpio

New:
----
  chezmoi-2.35.0.obscpio

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

Other differences:
------------------
++++++ chezmoi.spec ++++++
--- /var/tmp/diff_new_pack.d1SIHW/_old  2023-07-18 22:07:54.706917691 +0200
+++ /var/tmp/diff_new_pack.d1SIHW/_new  2023-07-18 22:07:54.714917736 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           chezmoi
-Version:        2.34.3
+Version:        2.35.0
 Release:        0
 Summary:        A multi-host manager for dotfiles
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.d1SIHW/_old  2023-07-18 22:07:54.762918004 +0200
+++ /var/tmp/diff_new_pack.d1SIHW/_new  2023-07-18 22:07:54.766918027 +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.34.3</param>
+    <param name="revision">v2.35.0</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
   </service>

++++++ chezmoi-2.34.3.obscpio -> chezmoi-2.35.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/.github/workflows/govulncheck.yml 
new/chezmoi-2.35.0/.github/workflows/govulncheck.yml
--- old/chezmoi-2.34.3/.github/workflows/govulncheck.yml        2023-07-03 
09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/.github/workflows/govulncheck.yml        2023-07-14 
18:22:53.000000000 +0200
@@ -1,5 +1,13 @@
 name: govulncheck
 on:
+  pull_request:
+    branches:
+    - master
+  push:
+    branches:
+    - master
+    tags:
+    - v*
   schedule:
   - cron: 22 2 * * *
 jobs:
@@ -11,12 +19,6 @@
       id: go-version
       run: |
         echo go-version="$(awk '/GO_VERSION:/ { print $2 }' 
.github/workflows/main.yml | tr -d \')" >> "${GITHUB_OUTPUT}"
-    - uses: actions/setup-go@fac708d6674e30b6ba41289acaab6d4b75aa0753
+    - uses: golang/govulncheck-action@dd3ead030e4f2cf713062f7a3395191802364e13
       with:
-        go-version: ${{ steps.go-version.outputs.go-version }}
-    - name: install
-      run: |
-        go install golang.org/x/vuln/cmd/govulncheck@latest
-    - name: run
-      run: |
-        govulncheck ./...
+        go-version-input: ${{ steps.go-version.outputs.go-version }}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/.github/workflows/main.yml 
new/chezmoi-2.35.0/.github/workflows/main.yml
--- old/chezmoi-2.34.3/.github/workflows/main.yml       2023-07-03 
09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/.github/workflows/main.yml       2023-07-14 
18:22:53.000000000 +0200
@@ -11,7 +11,7 @@
 env:
   ACTIONLINT_VERSION: 1.6.25
   AGE_VERSION: 1.1.1
-  GO_VERSION: 1.20.5
+  GO_VERSION: 1.20.6
   GOFUMPT_VERSION: 0.4.0
   GOLANGCI_LINT_VERSION: 1.53.3
   GOLINES_VERSION: 0.11.0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/.github/workflows/winget.yml 
new/chezmoi-2.35.0/.github/workflows/winget.yml
--- old/chezmoi-2.34.3/.github/workflows/winget.yml     2023-07-03 
09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/.github/workflows/winget.yml     1970-01-01 
01:00:00.000000000 +0100
@@ -1,14 +0,0 @@
-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.34.3/.goreleaser.yaml 
new/chezmoi-2.35.0/.goreleaser.yaml
--- old/chezmoi-2.34.3/.goreleaser.yaml 2023-07-03 09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/.goreleaser.yaml 2023-07-14 18:22:53.000000000 +0200
@@ -244,3 +244,38 @@
   prefix_template: '{{ .ProjectName }}-{{ .Version }}/'
   files:
   - COMMIT
+
+winget:
+- name: chezmoi
+  publisher: twpayne
+  publisher_url: https://github.com/twpayne
+  short_description: Manage your dotfiles across multiple diverse machines, 
securely.
+  license: MIT
+  commit_author:
+    name: Tom Payne
+    email: twpa...@gmail.com
+  homepage: https://chezmoi.io
+  license_url: https://github.com/twpayne/chezmoi/blob/master/LICENSE
+  copyright: Copyright (c) 2018-2023 Tom Payne
+  release_notes: '{{ .Changelog }}'
+  release_notes_url: 'https://github.com/twpayne/chezmoi/releases/tag/{{ .Tag 
}}'
+  tags:
+  - cli
+  - configuration
+  - dotbot
+  - dotfile
+  - dotfiles
+  - stow
+  - yadm
+  author: Tom Payne
+  publisher_support_url: https://github.com/twpayne/chezmoi/issues
+  repository:
+    owner: twpayne
+    name: winget-pkgs
+    token: ${{ secrets.WINGET_TOKEN }}
+    pull_request:
+      enabled: true
+      base:
+        owner: microsoft
+        name: winget-pkgs
+        branch: master
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
    2023-07-03 09:12:43.000000000 +0200
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/configuration-file/variables.md.yaml
    2023-07-14 18:22:53.000000000 +0200
@@ -215,6 +215,22 @@
     symmetric:
       type: bool
       description: Use symmetric GPG encryption
+  hcpVaultSecrets:
+    applicationName:
+      type: string
+      description: Default application name if none is specified
+    args:
+      type: '[]string'
+      description: Extra args to HCP Vault Secrets CLI command
+    command:
+      default: '`vlt`'
+      description: HCP Vault Secrets CLI command
+    organizationId:
+      type: string
+      description: Default organization ID if none is specified
+    projectId:
+      type: string
+      description: Default project ID if none is specified
   hooks:
     '*command*`.post.args`':
       type: '[]string'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/special-files-and-directories/chezmoiexternal-format.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/special-files-and-directories/chezmoiexternal-format.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/special-files-and-directories/chezmoiexternal-format.md
 2023-07-03 09:12:43.000000000 +0200
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/special-files-and-directories/chezmoiexternal-format.md
 2023-07-14 18:22:53.000000000 +0200
@@ -13,32 +13,33 @@
 
 Entries are indexed by target name relative to the directory of the
 `.chezmoiexternal.$FORMAT` file, and must have a `type` and a `url` field.
-`type` can be either `file`, `archive`, or `git-repo`. If the entry's parent
-directories do not already exist in the source state then chezmoi will create
-them as regular directories.
+`type` can be either `file`, `archive`, `archive-file`, or `git-repo`. If the
+entry's parent directories do not already exist in the source state then 
chezmoi
+will create them as regular directories.
 
 Entries may have the following fields:
 
-| Variable          | Type     | Default value | Description                   
                                |
-| ----------------- | -------- | ------------- | 
------------------------------------------------------------- |
-| `type`            | string   | *none*        | External type (`file`, 
`archive`, or `git-repo`)              |
-| `encrypted`       | bool     | `false`       | Whether the external is 
encrypted                             |
-| `exact`           | bool     | `false`       | Add `exact_` attribute to 
directories in archive              |
-| `exclude`         | []string | *none*        | Patterns to exclude from 
archive                              |
-| `executable`      | bool     | `false`       | Add `executable_` attribute 
to file                           |
-| `format`          | string   | *autodetect*  | Format of archive             
                                |
-| `include`         | []string | *none*        | Patterns to include from 
archive                              |
-| `refreshPeriod`   | duration | `0`           | Refresh period                
                                |
-| `stripComponents` | int      | `0`           | Number of leading directory 
components to strip from archives |
-| `url`             | string   | *none*        | URL                           
                                |
-| `checksum.sha256` | string   | *none*        | Expected SHA256 checksum of 
data                              |
-| `checksum.sha384` | string   | *none*        | Expected SHA384 checksum of 
data                              |
-| `checksum.sha512` | string   | *none*        | Expected SHA512 checksum of 
data                              |
-| `checksum.size`   | int      | *none*        | Expected size of data         
                                |
-| `clone.args`      | []string | *none*        | Extra args to `git clone`     
                                |
-| `filter.command`  | string   | *none*        | Command to filter contents    
                                |
-| `filter.args`     | []string | *none*        | Extra args to command to 
filter contents                      |
-| `pull.args`       | []string | *none*        | Extra args to `git pull`      
                                |
+| Variable          | Type     | Default value | Description                   
                                   |
+| ----------------- | -------- | ------------- | 
---------------------------------------------------------------- |
+| `type`            | string   | *none*        | External type (`file`, 
`archive`, `archive-file`, or `git-repo`) |
+| `encrypted`       | bool     | `false`       | Whether the external is 
encrypted                                |
+| `exact`           | bool     | `false`       | Add `exact_` attribute to 
directories in archive                 |
+| `exclude`         | []string | *none*        | Patterns to exclude from 
archive                                 |
+| `executable`      | bool     | `false`       | Add `executable_` attribute 
to file                              |
+| `format`          | string   | *autodetect*  | Format of archive             
                                   |
+| `path`            | string   | *none*        | Path to file in archive       
                                   |
+| `include`         | []string | *none*        | Patterns to include from 
archive                                 |
+| `refreshPeriod`   | duration | `0`           | Refresh period                
                                   |
+| `stripComponents` | int      | `0`           | Number of leading directory 
components to strip from archives    |
+| `url`             | string   | *none*        | URL                           
                                   |
+| `checksum.sha256` | string   | *none*        | Expected SHA256 checksum of 
data                                 |
+| `checksum.sha384` | string   | *none*        | Expected SHA384 checksum of 
data                                 |
+| `checksum.sha512` | string   | *none*        | Expected SHA512 checksum of 
data                                 |
+| `checksum.size`   | int      | *none*        | Expected size of data         
                                   |
+| `clone.args`      | []string | *none*        | Extra args to `git clone`     
                                   |
+| `filter.command`  | string   | *none*        | Command to filter contents    
                                   |
+| `filter.args`     | []string | *none*        | Extra args to command to 
filter contents                         |
+| `pull.args`       | []string | *none*        | Extra args to `git pull`      
                                   |
 
 If any of the optional `checksum.sha256`, `checksum.sha384`, or
 `checksum.sha512` fields are set, chezmoi will verify that the downloaded data
@@ -84,6 +85,12 @@
 Excluded archive members do not generate source state entries, and, if they are
 directories, all of their children are also excluded.
 
+If `type` is `archive-file` then the target is a file or symlink with the
+contents of the entry `path` in the archive at `url`. The optional integer 
field
+`stripComponents` will remove leading path components from the members of the
+archive before comparing them with `path`. The behavior of `format` is the same
+as for `archive`.
+
 If `type` is `git-repo` then chezmoi will run `git clone $URL $TARGET_NAME`
 with the optional `clone.args` if the target does not exist. If the target
 exists, then chezmoi will run `git pull` with the optional `pull.args` to
@@ -120,6 +127,10 @@
         url = "https://github.com/romkatv/powerlevel10k/archive/v1.15.0.tar.gz";
         exact = true
         stripComponents = 1
+    [".local/bin/age"]
+        type = "archive-file"
+        url = 
"https://github.com/FiloSottile/age/releases/download/v1.1.1/age-v1.1.1-{{ 
.chezmoi.os }}-{{ .chezmoi.arch }}.tar.gz"
+        path = "age/age"
     ["www/adminer/plugins"]
         type = "archive"
         url = "https://api.github.com/repos/vrana/adminer/tarball";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/1password-functions/onepassword.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/1password-functions/onepassword.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/1password-functions/onepassword.md
    2023-07-03 09:12:43.000000000 +0200
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/1password-functions/onepassword.md
    2023-07-14 18:22:53.000000000 +0200
@@ -15,6 +15,10 @@
 If there is no valid session in the environment, by default you will be
 interactively prompted to sign in.
 
+The 1password CLI command can be set with the `onePassword.command` config
+variable, and extra arguments can be specified with the `onePassword.args`
+config variable.
+
 !!! example
 
     ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret.md
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/hcpVaultSecret.md
 2023-07-14 18:22:53.000000000 +0200
@@ -0,0 +1,16 @@
+# `hcpVaultSecret` *key* [*application-name* [*project-id* 
[*organization-id*]]]
+
+`hcpVaultSecret` returns the plaintext secret from [HCP Vault
+Secrets](https://developer.hashicorp.com/hcp/docs/vault-secrets) using `vlt
+secrets get --plaintext`.
+
+If any of *application-name*, *project-id*, or *organization-id* are empty or
+omitted, then chezmoi will use the value from the
+`hcpVaultSecret.applicationName`, `hcpVaultSecret.projectId`, and
+`hcpVaultSecret.organizationId` config variables if they are set and not empty.
+
+!!! example
+
+    ```
+    {{ hcpVaultSecret "username" }}
+    ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson.md
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson.md
     2023-07-14 18:22:53.000000000 +0200
@@ -0,0 +1,16 @@
+# `hcpVaultSecretJson` *key* [*application-name* [*project-id* 
[*organization-id*]]]
+
+`hcpVaultSecretJson` returns structured data from [HCP Vault
+Secrets](https://developer.hashicorp.com/hcp/docs/vault-secrets) using `vlt
+secrets get --format=json`.
+
+If any of *application-name*, *project-id*, or *organization-id* are empty or 
omitted, then
+chezmoi will use the value from the `hcpVaultSecret.applicationName`,
+`hcpVaultSecret.projectId`, and `hcpVaultSecret.organizationId` config 
variables
+if they are set and not empty.
+
+!!! example
+
+    ```
+    {{ (hcpVaultSecretJson "secret_name" "application_name").created_by.email 
}}
+    ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/index.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/index.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/index.md
  1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/hcp-vault-secrets-functions/index.md
  2023-07-14 18:22:53.000000000 +0200
@@ -0,0 +1,10 @@
+# HCP Vault Secrets
+
+chezmoi includes support for [HCP Vault
+Secrets](https://developer.hashicorp.com/hcp/docs/vault-secrets) using the 
`vlt`
+CLI to expose data through the `hcpVaultSecret` and `hcpVaultSecretJson`
+template functions.
+
+!!! warning
+
+    HCP Vault Secrets is in beta and chezmoi's interface to it may change.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/passhole-functions/index.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/passhole-functions/index.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/passhole-functions/index.md
   2023-07-03 09:12:43.000000000 +0200
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/passhole-functions/index.md
   2023-07-14 18:22:53.000000000 +0200
@@ -1,4 +1,4 @@
 # Passhole
 
-chezmoi includes support for [Keepass](https://keepass.info/) using the
+chezmoi includes support for [KeePass](https://keepass.info/) using the
 [Passhole CLI](https://github.com/Evidlo/passhole) (`ph`).
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/passhole-functions/passhole.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/passhole-functions/passhole.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/reference/templates/passhole-functions/passhole.md
        2023-07-03 09:12:43.000000000 +0200
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/reference/templates/passhole-functions/passhole.md
        2023-07-14 18:22:53.000000000 +0200
@@ -1,6 +1,6 @@
 # passhole *path* *field*
 
-`passhole` returns the *field* of *path* from a 
[Keepass](https://keypass.info/)
+`passhole` returns the *field* of *path* from a 
[KeePass](https://keepass.info/)
 database using [passhole](https://github.com/Evidlo/passhole)'s `ph` command.
 
 !!! example
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/user-guide/include-files-from-elsewhere.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/user-guide/include-files-from-elsewhere.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/user-guide/include-files-from-elsewhere.md
        2023-07-03 09:12:43.000000000 +0200
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/user-guide/include-files-from-elsewhere.md
        2023-07-14 18:22:53.000000000 +0200
@@ -113,24 +113,20 @@
 
 ## Extract a single file from an archive
 
-You can extract a single file from an archive using the `$ENTRY.filter.command`
-and `$ENTRY.filter.args` variables in `.chezmoiexternal.$FORMAT`, for example:
+You can extract a single file from an archive using the `archive-file` type in
+`.chezmoiexternal.$FORMAT`, for example:
 
 ```toml title="~/.local/share/chezmoi/.chezmoiexternal.toml"
-{{ $ageVersion := "1.0.0" -}}
+{{ $ageVersion := "1.1.1" -}}
 [".local/bin/age"]
-    type = "file"
+    type = "archive-file"
     url = "https://github.com/FiloSottile/age/releases/download/v{{ 
$ageVersion }}/age-v{{ $ageVersion }}-{{ .chezmoi.os }}-{{ .chezmoi.arch 
}}.tar.gz"
-    executable = true
-    refreshPeriod = "168h"
-    [".local/bin/age".filter]
-        command = "tar"
-        args = ["--extract", "--file", "/dev/stdin", "--gzip", "--to-stdout", 
"age/age"]
+    path = "age/age"
 ```
 
 This will extract the single archive member `age/age` from the given URL (which
 is computed for the current OS and architecture) to the target
-`./local/bin/age` and set its executable bit.
+`./local/bin/age`.
 
 ## Import archives
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/user-guide/password-managers/custom.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/user-guide/password-managers/custom.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/user-guide/password-managers/custom.md
    2023-07-03 09:12:43.000000000 +0200
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/user-guide/password-managers/custom.md
    2023-07-14 18:22:53.000000000 +0200
@@ -7,13 +7,14 @@
 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" }}` |
-| 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" }}`        
             |
+| 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.34.3/assets/chezmoi.io/docs/user-guide/password-managers/hcp-vault-secrets.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/user-guide/password-managers/hcp-vault-secrets.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/user-guide/password-managers/hcp-vault-secrets.md
 1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/user-guide/password-managers/hcp-vault-secrets.md
 2023-07-14 18:22:53.000000000 +0200
@@ -0,0 +1,47 @@
+# HCP Vault Secrets
+
+chezmoi includes support for [HCP Vault
+Secrets](https://developer.hashicorp.com/hcp/docs/vault-secrets) using the 
`vlt`
+CLI to expose data through the `hcpVaultSecret` and `hcpVaultSecretJson`
+template functions.
+
+!!! warning
+
+    HCP Vault Secrets is in beta and chezmoi's interface to it may change.
+
+Log in using:
+
+```console
+$ vlt login
+```
+
+The output of the `vlt secrets get --plaintext $SECRET_NAME` is available as 
the
+`hcpVaultSecret` function, for example:
+
+```
+{{ hcpVaultSecret "secret_name" "application_name" "project_id" 
"organization_id" }}
+```
+
+You can set the default values for the application name, project ID, and
+organization ID in your config file, for example:
+
+```toml title="~/.config/chezmoi/chezmoi.toml"
+[hcpVaultSecrets]
+    organizationId = "bf479eab-a292-4b46-92df-e22f5c47eadc"
+    projectId = "5907a2fa-d26a-462a-8705-74dfe967e87d"
+    applicationName = "my-application"
+```
+
+With these default values, you can omit them in the call to `hcpVaultSecret`, 
for example:
+
+```
+{{ hcpVaultSecret "secret_name" }}
+{{ hcpVaultSecret "other_secret_name" "other_application_name" }}
+```
+
+Structured data from `vlt secrets get --format=json $SECRET_NAME` is available
+as the `hcpVaultSecretJson` template function, for example:
+
+```
+{{ (hcpVaultSecretJson "secret_name").created_by.email }}
+```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/user-guide/password-managers/keepassxc.md
 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/user-guide/password-managers/keepassxc.md
--- 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/user-guide/password-managers/keepassxc.md
 2023-07-03 09:12:43.000000000 +0200
+++ 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/user-guide/password-managers/keepassxc.md
 2023-07-14 18:22:53.000000000 +0200
@@ -28,7 +28,7 @@
 
 !!! info
 
-    The KeepassXC CLI does not currently support any persistent login, which
+    The KeePassXC CLI does not currently support any persistent login, which
     means that you will have to enter your password every time you run chezmoi.
 
     Support for non-password authentication methods (e.g. YubiKey) is currently
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/assets/chezmoi.io/docs/what-does-chezmoi-do.md 
new/chezmoi-2.35.0/assets/chezmoi.io/docs/what-does-chezmoi-do.md
--- old/chezmoi-2.34.3/assets/chezmoi.io/docs/what-does-chezmoi-do.md   
2023-07-03 09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/assets/chezmoi.io/docs/what-does-chezmoi-do.md   
2023-07-14 18:22:53.000000000 +0200
@@ -45,9 +45,10 @@
 [1Password](https://1password.com/), [AWS Secrets
 Manager](https://aws.amazon.com/secrets-manager/),
 [Bitwarden](https://bitwarden.com/), [Dashlane](https://www.dashlane.com/),
-[gopass](https://www.gopass.pw/), [KeePassXC](https://keepassxc.org/),
-[Keeper](https://www.keepersecurity.com/), [LastPass](https://lastpass.com/),
-[pass](https://www.passwordstore.org/),
+[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),
 [Vault](https://www.vaultproject.io/), Keychain,
 [Keyring](https://wiki.gnome.org/Projects/GnomeKeyring), or any command-line
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/assets/chezmoi.io/mkdocs.yml 
new/chezmoi-2.35.0/assets/chezmoi.io/mkdocs.yml
--- old/chezmoi-2.34.3/assets/chezmoi.io/mkdocs.yml     2023-07-03 
09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/assets/chezmoi.io/mkdocs.yml     2023-07-14 
18:22:53.000000000 +0200
@@ -65,6 +65,7 @@
     - Dashlane: user-guide/password-managers/dashlane.md
     - ejson: user-guide/password-managers/ejson.md
     - gopass: user-guide/password-managers/gopass.md
+    - Hashicorp Vault Secrets: 
user-guide/password-managers/hcp-vault-secrets.md
     - KeePassXC: user-guide/password-managers/keepassxc.md
     - Keychain and Windows Credentials Manager: 
user-guide/password-managers/keychain-and-windows-credentials-manager.md
     - Keeper: user-guide/password-managers/keeper.md
@@ -254,6 +255,10 @@
       - reference/templates/gopass-functions/index.md
       - gopass: reference/templates/gopass-functions/gopass.md
       - gopassRaw: reference/templates/gopass-functions/gopassRaw.md
+    - HCP Vault Secrets functions:
+      - reference/templates/hcp-vault-secrets-functions/index.md
+      - hcpVaultSecret: 
reference/templates/hcp-vault-secrets-functions/hcpVaultSecret.md
+      - hcpVaultSecretJson: 
reference/templates/hcp-vault-secrets-functions/hcpVaultSecretJson.md
     - KeePassXC functions:
       - reference/templates/keepassxc-functions/index.md
       - keepassxc: reference/templates/keepassxc-functions/keepassxc.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/assets/images/144px.svg 
new/chezmoi-2.35.0/assets/images/144px.svg
--- old/chezmoi-2.34.3/assets/images/144px.svg  2023-07-03 09:12:43.000000000 
+0200
+++ new/chezmoi-2.35.0/assets/images/144px.svg  1970-01-01 01:00:00.000000000 
+0100
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
-<!-- Creator: CorelDRAW X7 -->
-<svg xmlns="http://www.w3.org/2000/svg"; xml:space="preserve" width="12.1918mm" 
height="9.9906mm" version="1.1" style="shape-rendering:geometricPrecision; 
text-rendering:geometricPrecision; image-rendering:optimizeQuality; 
fill-rule:evenodd; clip-rule:evenodd"
-viewBox="0 0 1219 999"
- xmlns:xlink="http://www.w3.org/1999/xlink";>
- <defs>
-  <style type="text/css">
-   <![CDATA[
-    .fil1 {fill:url(#id0)}
-    .fil0 {fill:url(#id1)}
-   ]]>
-  </style>
-  <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="678.83" 
y1="533.54" x2="532.87" y2="437.45">
-   <stop offset="0" style="stop-opacity:1; stop-color:#4D4B4A"/>
-   <stop offset="1" style="stop-opacity:1; stop-color:#84807D"/>
-  </linearGradient>
-  <linearGradient id="id1" gradientUnits="userSpaceOnUse" xlink:href="#id0" 
x1="1029.01" y1="775.63" x2="190.17" y2="223.43">
-  </linearGradient>
- </defs>
- <g id="Layer_x0020_1">
-  <metadata id="CorelCorpID_0Corel-Layer"/>
-  <g id="_1036550208">
-   <path class="fil0" d="M634 25l244 206 245 205 91 77 -119 0 -153 0 0 
258c98,23 192,60 279,108 -191,-54 -401,-75 -618,-54 -218,21 -420,82 -597,172 
81,-68 171,-125 270,-167 -2,1 -4,2 -6,2l0 -319 -153 0 -119 0 91 -77 245 -205 
244 -206 28 -23 28 23zm308 746c-3,-1 -6,-2 -9,-2 3,0 6,1 9,2zm-10 -3c-3,0 -6,-1 
-9,-2 3,1 6,2 9,2zm-10 -2c-3,0 -6,-1 -9,-2 3,1 6,2 9,2zm-10 -2c-3,0 -6,-1 -8,-1 
2,0 5,1 8,1zm-11 -2c-2,0 -5,-1 -7,-1 2,0 5,1 7,1zm-9 -2c-3,0 -5,-1 -8,-1 3,0 
5,1 8,1zm-11 -2c-2,0 -4,0 -7,-1 3,1 5,1 7,1zm-10 -1c-2,-1 -4,-1 -6,-1 2,0 4,0 
6,1zm-10 -2c-2,0 -4,-1 -6,-1l0 -140 0 -101 0 -87 121 0 -154 -129 -216 -182 -217 
182 -153 129 121 0 0 87 0 101 0 185 0 0c76,-26 155,-43 238,-51 90,-9 179,-6 
266,7zm-549 60c-1,1 -3,1 -4,2 1,-1 3,-1 4,-2zm-9 4c-1,0 -3,1 -5,1 2,0 4,-1 
5,-1zm-9 3c-2,1 -4,2 -6,3 2,-1 4,-2 6,-3zm-9 4c-2,1 -4,2 -6,2 2,0 4,-1 6,-2z"/>
-   <path class="fil1" d="M532 445c0,-40 33,-73 74,-73 40,0 73,33 73,73 0,28 
-14,52 -36,64l7 13 45 77 -89 0 -89 0 45 -77 7 -13c-22,-12 -37,-36 -37,-64z"/>
-  </g>
- </g>
-</svg>
Binary files old/chezmoi-2.34.3/assets/images/256px.png and 
new/chezmoi-2.35.0/assets/images/256px.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/assets/images/256px.svg 
new/chezmoi-2.35.0/assets/images/256px.svg
--- old/chezmoi-2.34.3/assets/images/256px.svg  2023-07-03 09:12:43.000000000 
+0200
+++ new/chezmoi-2.35.0/assets/images/256px.svg  1970-01-01 01:00:00.000000000 
+0100
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
-<!-- Creator: CorelDRAW X7 -->
-<svg xmlns="http://www.w3.org/2000/svg"; xml:space="preserve" width="21.6746mm" 
height="17.6952mm" version="1.1" style="shape-rendering:geometricPrecision; 
text-rendering:geometricPrecision; image-rendering:optimizeQuality; 
fill-rule:evenodd; clip-rule:evenodd"
-viewBox="0 0 2167 1770"
- xmlns:xlink="http://www.w3.org/1999/xlink";>
- <defs>
-  <style type="text/css">
-   <![CDATA[
-    .fil0 {fill:url(#id0)}
-    .fil1 {fill:url(#id1)}
-   ]]>
-  </style>
-  <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="1827.19" 
y1="1374.16" x2="340.28" y2="395.35">
-   <stop offset="0" style="stop-opacity:1; stop-color:#4D4B4A"/>
-   <stop offset="1" style="stop-opacity:1; stop-color:#84807D"/>
-  </linearGradient>
-  <linearGradient id="id1" gradientUnits="userSpaceOnUse" xlink:href="#id0" 
x1="1206.46" y1="945.05" x2="947.73" y2="774.73">
-  </linearGradient>
- </defs>
- <g id="Layer_x0020_1">
-  <metadata id="CorelCorpID_0Corel-Layer"/>
-  <g id="_601534368">
-   <path class="fil0" d="M1127 44l433 364 433 365 161 136 -211 0 -271 0 0 
457c174,40 341,106 496,192 -339,-97 -711,-134 -1097,-96 -385,37 -743,145 
-1057,305 143,-121 304,-221 478,-297 -4,2 -7,3 -10,5l0 -566 -271 0 -211 0 161 
-136 433 -365 434 -364 49 -42 50 42zm545 1321c-5,-1 -10,-2 -16,-3 6,1 11,2 
16,3zm-17 -4c-6,-1 -11,-2 -16,-3 5,1 10,2 16,3zm-18 -3c-5,-2 -10,-3 -15,-4 5,1 
10,2 15,4zm-18 -4c-5,-1 -9,-2 -14,-3 5,1 9,2 14,3zm-18 -4c-4,-1 -9,-2 -14,-2 
5,0 10,1 14,2zm-18 -3c-4,-1 -8,-2 -13,-3 5,1 9,2 13,3zm-17 -3c-5,-1 -9,-2 
-13,-3 4,1 8,2 13,3zm-19 -4c-4,0 -7,-1 -11,-1 4,0 7,1 11,1zm-18 -2c-4,-1 -7,-2 
-11,-2l0 -248 0 -179 0 -154 214 0 -271 -229 -384 -323 -384 323 -271 229 214 0 0 
154 0 179 0 327 0 0c134,-45 275,-76 422,-91 160,-15 318,-10 471,14zm-972 
106c-3,1 -6,2 -8,3 2,-1 5,-2 8,-3zm-17 6c-2,1 -5,2 -8,4 3,-2 6,-3 8,-4zm-15 
7c-4,1 -7,2 -11,4 4,-2 7,-3 11,-4zm-17 6c-3,2 -7,3 -10,5 3,-2 7,-3 10,-5z"/>
-   <path class="fil1" d="M947 789c0,-72 58,-130 130,-130 72,0 131,58 131,130 
0,48 -27,90 -66,113l14 23 78 136 -157 0 -157 0 79 -136 13 -23c-39,-23 -65,-65 
-65,-113z"/>
-  </g>
- </g>
-</svg>
Binary files old/chezmoi-2.34.3/assets/images/512px.png and 
new/chezmoi-2.35.0/assets/images/512px.png differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/assets/images/512px.svg 
new/chezmoi-2.35.0/assets/images/512px.svg
--- old/chezmoi-2.34.3/assets/images/512px.svg  2023-07-03 09:12:43.000000000 
+0200
+++ new/chezmoi-2.35.0/assets/images/512px.svg  1970-01-01 01:00:00.000000000 
+0100
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
-<!-- Creator: CorelDRAW X7 -->
-<svg xmlns="http://www.w3.org/2000/svg"; xml:space="preserve" width="43.3492mm" 
height="35.306mm" version="1.1" style="shape-rendering:geometricPrecision; 
text-rendering:geometricPrecision; image-rendering:optimizeQuality; 
fill-rule:evenodd; clip-rule:evenodd"
-viewBox="0 0 4335 3531"
- xmlns:xlink="http://www.w3.org/1999/xlink";>
- <defs>
-  <style type="text/css">
-   <![CDATA[
-    .fil1 {fill:url(#id0)}
-    .fil0 {fill:url(#id1)}
-   ]]>
-  </style>
-  <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="2412.92" 
y1="1885.88" x2="1895.45" y2="1545.24">
-   <stop offset="0" style="stop-opacity:1; stop-color:#4D4B4A"/>
-   <stop offset="1" style="stop-opacity:1; stop-color:#84807D"/>
-  </linearGradient>
-  <linearGradient id="id1" gradientUnits="userSpaceOnUse" xlink:href="#id0" 
x1="3654.36" y1="2744.1" x2="680.56" y2="786.49">
-  </linearGradient>
- </defs>
- <g id="Layer_x0020_1">
-  <metadata id="CorelCorpID_0Corel-Layer"/>
-  <g id="_1095342688">
-   <path class="fil0" d="M2253 83l866 729 867 730 323 272 -422 0 -542 0 0 
913c348,82 681,212 990,384 -677,-194 -1421,-267 -2192,-192 -772,75 -1488,291 
-2115,612 287,-243 608,-444 955,-594 -6,3 -13,5 -19,8l0 -1131 -543 0 -422 0 324 
-272 866 -730 866 -729 99 -83 99 83zm1092 2644c-11,-3 -22,-5 -32,-8 10,3 21,5 
32,8zm-36 -8c-10,-3 -21,-5 -32,-7 11,2 22,4 32,7zm-34 -8c-11,-2 -21,-4 -32,-7 
11,3 21,5 32,7zm-36 -8c-10,-2 -20,-3 -30,-5 10,2 20,3 30,5zm-37 -7c-9,-2 -18,-3 
-27,-5 9,2 18,3 27,5zm-35 -7c-9,-1 -18,-3 -27,-4 9,1 18,3 27,4zm-36 -6c-8,-1 
-17,-3 -25,-4 8,1 17,3 25,4zm-37 -6c-7,-1 -15,-3 -22,-4 7,1 15,3 22,4zm-36 
-6c-8,-1 -15,-2 -22,-3l0 -496 0 -358 0 -309 429 0 -543 -457 -768 -646 -767 646 
-544 457 429 0 0 309 0 358 0 654 -1 0c269,-91 551,-153 845,-181 320,-31 636,-21 
942,26zm-1945 213c-5,2 -10,4 -16,6 6,-2 11,-4 16,-6zm-32 12c-6,2 -11,5 -17,7 
6,-2 11,-5 17,-7zm-32 13c-7,3 -14,6 -20,9 6,-3 13,-6 20,-9zm-32 13c-7,3 -14,6 
-21,10 7,-4 14,-7 21,-10z"/>
-   <path class="fil1" d="M1893 1574c0,-144 117,-261 261,-261 144,0 261,117 
261,261 0,96 -52,181 -130,226l26 46 158 272 -315 0 -314 0 157 -272 27 
-46c-78,-45 -131,-130 -131,-226z"/>
-  </g>
- </g>
-</svg>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/assets/images/96px.svg 
new/chezmoi-2.35.0/assets/images/96px.svg
--- old/chezmoi-2.34.3/assets/images/96px.svg   2023-07-03 09:12:43.000000000 
+0200
+++ new/chezmoi-2.35.0/assets/images/96px.svg   1970-01-01 01:00:00.000000000 
+0100
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
-<!-- Creator: CorelDRAW X7 -->
-<svg xmlns="http://www.w3.org/2000/svg"; xml:space="preserve" width="8.1278mm" 
height="6.6038mm" version="1.1" style="shape-rendering:geometricPrecision; 
text-rendering:geometricPrecision; image-rendering:optimizeQuality; 
fill-rule:evenodd; clip-rule:evenodd"
-viewBox="0 0 813 660"
- xmlns:xlink="http://www.w3.org/1999/xlink";>
- <defs>
-  <style type="text/css">
-   <![CDATA[
-    .fil0 {fill:url(#id0)}
-    .fil1 {fill:url(#id1)}
-   ]]>
-  </style>
-  <linearGradient id="id0" gradientUnits="userSpaceOnUse" x1="684.52" 
y1="513.27" x2="128.27" y2="147.1">
-   <stop offset="0" style="stop-opacity:1; stop-color:#4D4B4A"/>
-   <stop offset="1" style="stop-opacity:1; stop-color:#84807D"/>
-  </linearGradient>
-  <linearGradient id="id1" gradientUnits="userSpaceOnUse" xlink:href="#id0" 
x1="452.31" y1="352.74" x2="355.51" y2="289.03">
-  </linearGradient>
- </defs>
- <g id="Layer_x0020_1">
-  <metadata id="CorelCorpID_0Corel-Layer"/>
-  <g id="_1099353056">
-   <path class="fil0" d="M422 16l162 136 163 136 60 51 -79 0 -101 0 0 
171c65,15 127,40 185,72 -127,-36 -266,-50 -410,-36 -145,14 -278,54 -396,114 
54,-45 114,-83 179,-111 -1,1 -3,1 -4,2l0 -212 -101 0 -79 0 60 -51 162 -136 162 
-136 19 -16 18 16zm205 494c-2,0 -4,-1 -6,-1 2,0 4,1 6,1zm-7 -1c-2,-1 -4,-1 
-6,-2 2,1 4,1 6,2zm-7 -2c-1,0 -3,-1 -5,-1 2,0 4,1 5,1zm-6 -1c-2,-1 -4,-1 -6,-1 
2,0 4,0 6,1zm-7 -2c-2,0 -3,0 -5,-1 2,1 3,1 5,1zm-7 -1c-1,0 -3,-1 -5,-1 2,0 4,1 
5,1zm-6 -1c-2,0 -3,-1 -5,-1 2,0 3,1 5,1zm-7 -1c-2,-1 -3,-1 -4,-1 1,0 2,0 
4,1zm-7 -1c-1,-1 -3,-1 -4,-1l0 -93 0 -67 0 -57 80 0 -102 -86 -143 -121 -144 121 
-101 86 80 0 0 57 0 67 0 123 0 0c50,-17 103,-29 158,-34 60,-6 119,-4 
176,5zm-364 39c-1,1 -2,1 -3,2 1,-1 2,-1 3,-2zm-6 3c-1,0 -2,1 -3,1 1,0 2,-1 
3,-1zm-6 2c-1,1 -2,1 -4,2 2,-1 3,-1 4,-2zm-6 3c-1,0 -2,1 -4,1 2,0 3,-1 4,-1z"/>
-   <path class="fil1" d="M355 294c0,-27 22,-48 49,-48 27,0 49,21 49,48 0,18 
-10,34 -25,43l5 8 30 51 -59 0 -59 0 30 -51 5 -8c-15,-9 -25,-25 -25,-43z"/>
-  </g>
- </g>
-</svg>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/go.mod new/chezmoi-2.35.0/go.mod
--- old/chezmoi-2.34.3/go.mod   2023-07-03 09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/go.mod   2023-07-14 18:22:53.000000000 +0200
@@ -5,7 +5,7 @@
 require (
        filippo.io/age v1.1.1
        github.com/Masterminds/sprig/v3 v3.2.3
-       github.com/Shopify/ejson v1.4.0
+       github.com/Shopify/ejson v1.4.1
        github.com/alecthomas/assert/v2 v2.3.0
        github.com/aws/aws-sdk-go-v2 v1.18.1
        github.com/aws/aws-sdk-go-v2/config v1.18.27
@@ -22,7 +22,7 @@
        github.com/google/renameio/v2 v2.0.0
        github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79
        github.com/itchyny/gojq v0.12.13
-       github.com/klauspost/compress v1.16.6
+       github.com/klauspost/compress v1.16.7
        github.com/mitchellh/mapstructure v1.5.0
        github.com/muesli/combinator v0.3.0
        github.com/muesli/termenv v0.15.2
@@ -41,12 +41,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.10.0
-       golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df
-       golang.org/x/oauth2 v0.9.0
+       golang.org/x/crypto v0.11.0
+       golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb
+       golang.org/x/oauth2 v0.10.0
        golang.org/x/sync v0.3.0
-       golang.org/x/sys v0.9.0
-       golang.org/x/term v0.9.0
+       golang.org/x/sys v0.10.0
+       golang.org/x/term v0.10.0
        gopkg.in/ini.v1 v1.67.0
        gopkg.in/yaml.v3 v3.0.1
        howett.net/plist v1.0.0
@@ -57,7 +57,7 @@
        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
-       github.com/ProtonMail/go-crypto v0.0.0-20230626094100-7e9e0395ebec // 
indirect
+       github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb // 
indirect
        github.com/acomagu/bufpipe v1.0.4 // indirect
        github.com/alecthomas/chroma v0.10.0 // indirect
        github.com/alecthomas/repr v0.2.0 // indirect
@@ -117,15 +117,15 @@
        github.com/pkg/errors v0.9.1 // indirect
        github.com/rivo/uniseg v0.4.4 // indirect
        github.com/shopspring/decimal v1.3.1 // indirect
-       github.com/skeema/knownhosts v1.1.1 // indirect
+       github.com/skeema/knownhosts v1.2.0 // indirect
        github.com/spf13/cast v1.5.1 // indirect
        github.com/xanzy/ssh-agent v0.3.3 // indirect
        github.com/yuin/goldmark v1.5.4 // indirect
-       github.com/yuin/goldmark-emoji v1.0.1 // indirect
-       golang.org/x/mod v0.11.0 // indirect
-       golang.org/x/net v0.11.0 // indirect
-       golang.org/x/text v0.10.0 // indirect
-       golang.org/x/tools v0.10.0 // 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
        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.34.3/go.sum new/chezmoi-2.35.0/go.sum
--- old/chezmoi-2.34.3/go.sum   2023-07-03 09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/go.sum   2023-07-14 18:22:53.000000000 +0200
@@ -1,5 +1,11 @@
+cloud.google.com/go/compute v1.20.1 
h1:6aKEtlUiwEpJzM001l0yFkpXmUVXaN8W+fbkb2AZNbg=
+cloud.google.com/go/compute v1.20.1/go.mod 
h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM=
+cloud.google.com/go/compute/metadata v0.2.3 
h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
+cloud.google.com/go/compute/metadata v0.2.3/go.mod 
h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
 filippo.io/age v1.1.1 h1:pIpO7l151hCnQ4BdyBujnGP2YlUo0uj6sAVNHGBvXHg=
 filippo.io/age v1.1.1/go.mod h1:l03SrzDUrBkdBx8+IILdnn2KZysqQdbEBUQ4p3sqEQE=
+filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek=
+filippo.io/edwards25519 v1.0.0/go.mod 
h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns=
 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=
@@ -10,10 +16,10 @@
 github.com/Microsoft/go-winio v0.5.2/go.mod 
h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
 github.com/Microsoft/go-winio v0.6.1 
h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
 github.com/Microsoft/go-winio v0.6.1/go.mod 
h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
-github.com/ProtonMail/go-crypto v0.0.0-20230626094100-7e9e0395ebec 
h1:vV3RryLxt42+ZIVOFbYJCH1jsZNTNmj2NYru5zfx+4E=
-github.com/ProtonMail/go-crypto v0.0.0-20230626094100-7e9e0395ebec/go.mod 
h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
-github.com/Shopify/ejson v1.4.0 h1:RvvWSOjDdInbMNtR97eJ5GEd6njjDNSbvbFHoQjJAXo=
-github.com/Shopify/ejson v1.4.0/go.mod 
h1:VZMUtDzvBW/PAXRUF5fzp1ffb1ucT8MztrZXXLYZurw=
+github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb 
h1:RU+Ff2vE68zFQSoBqlb/LChFztEWWJ9EZ8LU4gA3ubU=
+github.com/ProtonMail/go-crypto v0.0.0-20230710112148-e01326fd72eb/go.mod 
h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0=
+github.com/Shopify/ejson v1.4.1 h1:zGGojGJNTdIWza/kOT8gd2HKCg3ZkSi3CZ1ZX70NHsw=
+github.com/Shopify/ejson v1.4.1/go.mod 
h1:VZMUtDzvBW/PAXRUF5fzp1ffb1ucT8MztrZXXLYZurw=
 github.com/acomagu/bufpipe v1.0.4 
h1:e3H4WUzM3npvo5uv95QuJM3cQspFNtFBzvJ2oNjKIDQ=
 github.com/acomagu/bufpipe v1.0.4/go.mod 
h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ2sYmHc4=
 github.com/alecthomas/assert/v2 v2.3.0 
h1:mAsH2wmvjsuvyBvAmCtm7zFsBlb8mIHx5ySLVdDZXL0=
@@ -25,7 +31,9 @@
 github.com/alessio/shellescape v1.4.1 
h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0=
 github.com/alessio/shellescape v1.4.1/go.mod 
h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30=
 github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be 
h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
+github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod 
h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
 github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 
h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
+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.18.1 
h1:+tefE750oAb7ZQGzla6bLkOwfcQCEtC5y2RqoqCeqKo=
@@ -54,6 +62,7 @@
 github.com/aws/aws-sdk-go-v2/service/sts v1.19.2/go.mod 
h1:dp0yLPsLBOi++WTxzCjA/oZqi6NPIhoR+uF7GeMU9eg=
 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 
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=
 github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod 
h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
@@ -65,6 +74,7 @@
 github.com/bradenhilton/cityhash v1.0.0/go.mod 
h1:Wmb8yW1egA9ulrsRX4mxfYx5zq4nBWOCZ+j63oK6uz8=
 github.com/bradenhilton/mozillainstallhash v1.0.1 
h1:JVAVsItiWlLoudJX4L+tIuml+hoxjlzCwkhlENi9yS4=
 github.com/bradenhilton/mozillainstallhash v1.0.1/go.mod 
h1:J6cA36kUZrgaTkDl2bHRqI+4i2UKO1ImDB1P1x1PyOA=
+github.com/bwesterb/go-ristretto v1.2.3 
h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw=
 github.com/bwesterb/go-ristretto v1.2.3/go.mod 
h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0=
 github.com/charmbracelet/bubbles v0.16.1 
h1:6uzpAAaT9ZqKssntbvZMlksWHruQLNxg49H5WdeuYSY=
 github.com/charmbracelet/bubbles v0.16.1/go.mod 
h1:2QCp9LFlEsBQMvIYERr7Ww2H2bA7xen1idUDIzm/+Xc=
@@ -82,9 +92,13 @@
 github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod 
h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk=
 github.com/coreos/go-semver v0.3.1 
h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
 github.com/coreos/go-semver v0.3.1/go.mod 
h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
+github.com/coreos/go-systemd/v22 v22.5.0 
h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
 github.com/coreos/go-systemd/v22 v22.5.0/go.mod 
h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/cpuguy83/go-md2man/v2 v2.0.2 
h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
 github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod 
h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
 github.com/creack/pty v1.1.9/go.mod 
h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY=
+github.com/creack/pty v1.1.18/go.mod 
h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 github.com/danieljoos/wincred v1.2.0 
h1:ozqKHaLK0W/ii4KVbbvluM91W2H3Sh0BncbUNPS7jLE=
 github.com/danieljoos/wincred v1.2.0/go.mod 
h1:FzQLLMKBFdvu+osBrnFODiv32YGwCfx0SkRa/eYHgec=
 github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -93,20 +107,26 @@
 github.com/dlclark/regexp2 v1.4.0/go.mod 
h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
 github.com/dlclark/regexp2 v1.10.0 
h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=
 github.com/dlclark/regexp2 v1.10.0/go.mod 
h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
+github.com/dustin/go-humanize v1.0.1 
h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
+github.com/dustin/go-humanize v1.0.1/go.mod 
h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
 github.com/dustin/gojson v0.0.0-20160307161227-2e71ec9dd5ad 
h1:Qk76DOWdOp+GlyDKBAG3Klr9cn7N+LcYc82AZ2S7+cA=
 github.com/dustin/gojson v0.0.0-20160307161227-2e71ec9dd5ad/go.mod 
h1:mPKfmRa823oBIgl2r20LeMSpTAteW5j7FLkc0vjmzyQ=
 github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819 
h1:RIB4cRk+lBqKK3Oy0r2gRX4ui7tuhiZq2SuTtTCi0/0=
+github.com/elazarl/goproxy v0.0.0-20221015165544-a0805db90819/go.mod 
h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM=
 github.com/emirpasic/gods v1.18.1 
h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
 github.com/emirpasic/gods v1.18.1/go.mod 
h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
 github.com/frankban/quicktest v1.14.5 
h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA=
+github.com/frankban/quicktest v1.14.5/go.mod 
h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
 github.com/fsnotify/fsnotify v1.6.0 
h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
 github.com/fsnotify/fsnotify v1.6.0/go.mod 
h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
 github.com/gliderlabs/ssh v0.3.5 
h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY=
+github.com/gliderlabs/ssh v0.3.5/go.mod 
h1:8XB4KraRrX39qHhT6yxPsHedjA08I/uBVwj4xC+/+z4=
 github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 
h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI=
 github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod 
h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic=
 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.2-0.20230305113008-0c11038e723f 
h1:Pz0DHeFij3XFhoBRGUDPzSJ+w2UcK5/0JvF8DRI58r8=
+github.com/go-git/go-git-fixtures/v4 
v4.3.2-0.20230305113008-0c11038e723f/go.mod 
h1:8LHG1a3SRW71ettAD/jW13h8c6AqjVSeL11RAdgaqpo=
 github.com/go-git/go-git/v5 v5.7.0 
h1:t9AudWVLmqzlo+4bqdf7GY+46SUuRsx59SboFxkq2aE=
 github.com/go-git/go-git/v5 v5.7.0/go.mod 
h1:coJHKEOk5kUClpsNlXrUvPrDxY3w3gjHvhcZd8Fodw8=
 github.com/godbus/dbus/v5 v5.0.4/go.mod 
h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
@@ -115,6 +135,7 @@
 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=
+github.com/golang/mock v1.6.0/go.mod 
h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
 github.com/golang/protobuf v1.3.1/go.mod 
h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.5.0/go.mod 
h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 github.com/golang/protobuf v1.5.3 
h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
@@ -125,6 +146,7 @@
 github.com/google/go-cmp v0.5.5/go.mod 
h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.8/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod 
h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 github.com/google/go-github/v53 v53.2.0 
h1:wvz3FyF53v4BK+AsnvCmeNhf8AkTaeh2SoYu/XUvTtI=
 github.com/google/go-github/v53 v53.2.0/go.mod 
h1:XhFRObz+m/l+UCm9b7KSIC3lT3NWSXGt7mOsAWEloao=
 github.com/google/go-querystring v1.1.0 
h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
@@ -135,6 +157,7 @@
 github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 github.com/google/uuid v1.3.0/go.mod 
h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 
h1:l5lAOZEym3oK3SQ2HBHWsJUfbNBiTXJDeW2QDxw9AQ0=
+github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod 
h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
 github.com/gorilla/css v1.0.0/go.mod 
h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
 github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 
h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA=
@@ -156,20 +179,29 @@
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 
h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A=
 github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod 
h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo=
 github.com/jessevdk/go-flags v1.4.0/go.mod 
h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
+github.com/jessevdk/go-flags v1.5.0 
h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc=
+github.com/jessevdk/go-flags v1.5.0/go.mod 
h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4=
+github.com/jmespath/go-jmespath v0.4.0 
h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
 github.com/jmespath/go-jmespath v0.4.0/go.mod 
h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmespath/go-jmespath/internal/testify v1.5.1 
h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod 
h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/jtolds/gls v4.20.0+incompatible 
h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod 
h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
 github.com/kevinburke/ssh_config v1.2.0 
h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4=
 github.com/kevinburke/ssh_config v1.2.0/go.mod 
h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM=
-github.com/klauspost/compress v1.16.6 
h1:91SKEy4K37vkp255cJ8QesJhjyRO0hn9i9G0GoUwLsk=
-github.com/klauspost/compress v1.16.6/go.mod 
h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/klauspost/compress v1.16.7 
h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I=
+github.com/klauspost/compress v1.16.7/go.mod 
h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
 github.com/kr/pretty v0.1.0/go.mod 
h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pretty v0.2.1/go.mod 
h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod 
h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod 
h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod 
h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/kylelemons/godebug v1.1.0 
h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
+github.com/kylelemons/godebug v1.1.0/go.mod 
h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
 github.com/lucasb-eyer/go-colorful v1.2.0 
h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY=
 github.com/lucasb-eyer/go-colorful v1.2.0/go.mod 
h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0=
 github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A=
@@ -198,6 +230,8 @@
 github.com/mitchellh/reflectwalk v1.0.0/go.mod 
h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
 github.com/mitchellh/reflectwalk v1.0.2 
h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
 github.com/mitchellh/reflectwalk v1.0.2/go.mod 
h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mmcloughlin/avo v0.5.0 
h1:nAco9/aI9Lg2kiuROBY6BhCI/z0t5jEvJfjWbL8qXLU=
+github.com/mmcloughlin/avo v0.5.0/go.mod 
h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM=
 github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 
h1:ZK8zHtRHOkbHy6Mmr5D264iyp3TiX5OmNcI5cIARiQI=
 github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6/go.mod 
h1:CJlz5H+gyd6CUWT45Oy4q24RdLyn7Md9Vj2/ldJBSIo=
 github.com/muesli/cancelreader v0.2.2 
h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA=
@@ -209,6 +243,7 @@
 github.com/muesli/termenv v0.13.0/go.mod 
h1:sP1+uffeLaEYpyOTb8pLCUctGcGLnoFjSn4YJK5e2bc=
 github.com/muesli/termenv v0.15.2 
h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
 github.com/muesli/termenv v0.15.2/go.mod 
h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
+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=
 github.com/olekukonko/tablewriter v0.0.5/go.mod 
h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
@@ -218,6 +253,8 @@
 github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod 
h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
 github.com/pjbgf/sha1cd v0.3.0/go.mod 
h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e 
h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A=
+github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod 
h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod 
h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 
h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
@@ -228,20 +265,30 @@
 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/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=
+github.com/sahilm/fuzzy v0.1.0/go.mod 
h1:VFvziUEIMCrT6A6tw2RFIXPXXmzXbOsSHF0DOI8ZK9Y=
 github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
 github.com/sergi/go-diff v1.1.0/go.mod 
h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM=
 github.com/shopspring/decimal v1.2.0/go.mod 
h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 github.com/shopspring/decimal v1.3.1 
h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
 github.com/shopspring/decimal v1.3.1/go.mod 
h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/shurcooL/sanitized_anchor_name v1.0.0 
h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod 
h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
 github.com/sirupsen/logrus v1.7.0/go.mod 
h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
-github.com/skeema/knownhosts v1.1.1 
h1:MTk78x9FPgDFVFkDLTrsnnfCJl7g1C/nnKvePgrIngE=
-github.com/skeema/knownhosts v1.1.1/go.mod 
h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo=
+github.com/sirupsen/logrus v1.9.0 
h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
+github.com/sirupsen/logrus v1.9.0/go.mod 
h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/skeema/knownhosts v1.2.0 
h1:h9r9cf0+u7wSE+M183ZtMGgOJKiL96brpaz5ekfJCpM=
+github.com/skeema/knownhosts v1.2.0/go.mod 
h1:g4fPeYpque7P0xefxtGzV81ihjC8sX2IqpAoNkjxbMo=
 github.com/smartystreets/assertions v1.0.1 
h1:voD4ITNjPL5jjBfgR/r8fPIIBrliWrWHeiJApdr3r4w=
+github.com/smartystreets/assertions v1.0.1/go.mod 
h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
 github.com/smartystreets/goconvey v1.6.4 
h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
+github.com/smartystreets/goconvey v1.6.4/go.mod 
h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
 github.com/spf13/cast v1.3.1/go.mod 
h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA=
 github.com/spf13/cast v1.5.1/go.mod 
h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48=
@@ -271,21 +318,29 @@
 github.com/twpayne/go-xdg/v6 v6.1.1/go.mod 
h1:+0KSJ4Dx+xaZeDXWZITF84BcNc1UiHDm0DP8txprfD8=
 github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8=
 github.com/ulikunitz/xz v0.5.11/go.mod 
h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
+github.com/urfave/cli v1.22.4 h1:u7tSpNPPswAFymm8IehJhy4uJMlUuU/GmqSkvJ1InXA=
+github.com/urfave/cli v1.22.4/go.mod 
h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
 github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1 
h1:+dBg5k7nuTE38VVdoroRsT0Z88fmvdYrI2EjzJst35I=
 github.com/withfig/autocomplete-tools/integrations/cobra v1.2.1/go.mod 
h1:nmuySobZb4kFgFy6BptpXp/BBw+xFSyvVPP6auoJB4k=
 github.com/xanzy/ssh-agent v0.3.3 
h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM=
 github.com/xanzy/ssh-agent v0.3.3/go.mod 
h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw=
 github.com/yuin/goldmark v1.2.1/go.mod 
h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.7/go.mod 
h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
 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.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/yuin/goldmark-emoji v1.0.2 
h1:c/RgTShNgHTtc6xdz2KKI74jJr6rWi7FPgnP9GAsO5s=
+github.com/yuin/goldmark-emoji v1.0.2/go.mod 
h1:RhP/RWpexdp+KHs7ghKnifRoIs/Bq4nDS7tRbCkOwKY=
 github.com/zalando/go-keyring v0.2.3 
h1:v9CUu9phlABObO4LPWycf+zwMG7nlbb3t/B5wa97yms=
 github.com/zalando/go-keyring v0.2.3/go.mod 
h1:HL4k+OXQfJUWaMnqyuSOc0drfGPX2b51Du6K+MRgZMk=
 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.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M=
+go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
+go.uber.org/atomic v1.7.0/go.mod 
h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
 go.uber.org/multierr v1.11.0/go.mod 
h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod 
h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -294,14 +349,14 @@
 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.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM=
-golang.org/x/crypto v0.10.0/go.mod 
h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I=
-golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df 
h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME=
-golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod 
h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
+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-20230711153332-06a737ee72cb 
h1:xIApU0ow1zwMa2uL1VDNeQlNVFTWMQxZUZCMDy0Q4Us=
+golang.org/x/exp v0.0.0-20230711153332-06a737ee72cb/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.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU=
-golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
+golang.org/x/mod v0.12.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=
@@ -311,10 +366,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.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU=
-golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ=
-golang.org/x/oauth2 v0.9.0 h1:BPpt2kU7oMRq3kCHAA1tbSEshXRw1LpG2ztgDwrzuAs=
-golang.org/x/oauth2 v0.9.0/go.mod 
h1:qYgFZaFiu6Wg24azG8bdV52QJXJGbZzIIsRCdVKzbLw=
+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/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=
@@ -339,15 +394,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.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s=
-golang.org/x/sys v0.9.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/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.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28=
-golang.org/x/term v0.9.0/go.mod h1:M6DEAAIenWoTxdKrOltXcmDY3rSplQUkrvaDU5FcQyo=
+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/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=
@@ -356,15 +411,16 @@
 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.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58=
-golang.org/x/text v0.10.0/go.mod 
h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+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/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.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg=
-golang.org/x/tools v0.10.0/go.mod 
h1:UJwyiVBsOA2uwvK/e5OY3GTpDUJriEd+/YlqAwLPmyM=
+golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8=
+golang.org/x/tools v0.11.0/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=
 google.golang.org/appengine v1.6.7 
h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c=
 google.golang.org/appengine v1.6.7/go.mod 
h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
@@ -380,10 +436,12 @@
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME=
 gopkg.in/warnings.v0 v0.1.2/go.mod 
h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI=
+gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0 
h1:POO/ycCATvegFmVuPpQzZFJ+pGZeX22Ufu6fibxDVjU=
 gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod 
h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
 gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod 
h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
@@ -391,5 +449,7 @@
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM=
 howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
+mvdan.cc/editorconfig v0.2.0 h1:XL+7ys6ls/RKrkUNFQvEwIvNHh+JKx8Mj1pUV5wQxQE=
+mvdan.cc/editorconfig v0.2.0/go.mod 
h1:lvnnD3BNdBYkhq+B4uBuFFKatfp02eB6HixDvEz91C0=
 mvdan.cc/sh/v3 v3.7.0 h1:lSTjdP/1xsddtaKfGg7Myu7DnlHItd3/M2tomOcNNBg=
 mvdan.cc/sh/v3 v3.7.0/go.mod h1:K2gwkaesF/D7av7Kxl0HbF5kGOd2ArupNTX3X44+8l8=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/pkg/chezmoi/chezmoi.go 
new/chezmoi-2.35.0/pkg/chezmoi/chezmoi.go
--- old/chezmoi-2.34.3/pkg/chezmoi/chezmoi.go   2023-07-03 09:12:43.000000000 
+0200
+++ new/chezmoi-2.35.0/pkg/chezmoi/chezmoi.go   2023-07-14 18:22:53.000000000 
+0200
@@ -297,10 +297,26 @@
                text = strings.TrimSpace(text)
                text, _, _ = strings.Cut(text, "#")
                fields := whitespaceRx.Split(text, -1)
-               if len(fields) > 1 && net.ParseIP(fields[0]).IsLoopback() &&
-                       strings.Contains(fields[1], ".") {
-                       return fields[1], nil
+               if len(fields) < 2 {
+                       continue
                }
+               if !net.ParseIP(fields[0]).IsLoopback() {
+                       continue
+               }
+               hostname, domainname, found := strings.Cut(fields[1], ".")
+               if !found {
+                       continue
+               }
+               if hostname == "localhost" {
+                       continue
+               }
+               if domainname == "localdomain" {
+                       continue
+               }
+               if runtime.GOOS == "darwin" && domainname == "local" {
+                       continue
+               }
+               return fields[1], nil
        }
        return "", s.Err()
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/pkg/chezmoi/chezmoi_test.go 
new/chezmoi-2.35.0/pkg/chezmoi/chezmoi_test.go
--- old/chezmoi-2.34.3/pkg/chezmoi/chezmoi_test.go      2023-07-03 
09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/pkg/chezmoi/chezmoi_test.go      2023-07-14 
18:22:53.000000000 +0200
@@ -66,6 +66,17 @@
                        expected: "host.example.com",
                },
                {
+                       name: 
"etc_hosts_loopback_ipv4_localhost_dot_localdomain",
+                       root: map[string]any{
+                               "/etc/hosts": chezmoitest.JoinLines(
+                                       `127.0.0.1 localhost.localdomain`,
+                                       `127.0.0.2 host.example.com host`,
+                               ),
+                       },
+                       f:        etcHostsFQDNHostname,
+                       expected: "host.example.com",
+               },
+               {
                        name: "etc_hosts_loopback_ipv6",
                        root: map[string]any{
                                "/etc/hosts": chezmoitest.JoinLines(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/pkg/chezmoi/sourcestate.go 
new/chezmoi-2.35.0/pkg/chezmoi/sourcestate.go
--- old/chezmoi-2.34.3/pkg/chezmoi/sourcestate.go       2023-07-03 
09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/pkg/chezmoi/sourcestate.go       2023-07-14 
18:22:53.000000000 +0200
@@ -42,9 +42,10 @@
 
 // ExternalTypes.
 const (
-       ExternalTypeArchive ExternalType = "archive"
-       ExternalTypeFile    ExternalType = "file"
-       ExternalTypeGitRepo ExternalType = "git-repo"
+       ExternalTypeArchive     ExternalType = "archive"
+       ExternalTypeArchiveFile ExternalType = "archive-file"
+       ExternalTypeFile        ExternalType = "file"
+       ExternalTypeGitRepo     ExternalType = "git-repo"
 )
 
 var (
@@ -79,9 +80,10 @@
                Command string   `json:"command" toml:"command" yaml:"command"`
                Args    []string `json:"args" toml:"args" yaml:"args"`
        } `json:"filter"          toml:"filter"          yaml:"filter"`
-       Format  ArchiveFormat `json:"format"          toml:"format"          
yaml:"format"`
-       Include []string      `json:"include"         toml:"include"         
yaml:"include"`
-       Pull    struct {
+       Format      ArchiveFormat `json:"format"          toml:"format"         
 yaml:"format"`
+       Include     []string      `json:"include"         toml:"include"        
 yaml:"include"`
+       ArchivePath string        `json:"path"            toml:"path"           
 yaml:"path"`
+       Pull        struct {
                Args []string `json:"args" toml:"args" yaml:"args"`
        } `json:"pull"            toml:"pull"            yaml:"pull"`
        RefreshPeriod   Duration `json:"refreshPeriod"   toml:"refreshPeriod"   
yaml:"refreshPeriod"`
@@ -748,7 +750,7 @@
 // ExecuteTemplateData returns the result of executing template data.
 func (s *SourceState) ExecuteTemplateData(options ExecuteTemplateDataOptions) 
([]byte, error) {
        templateOptions := options.TemplateOptions
-       templateOptions.Options = append([]string(nil), s.templateOptions...)
+       templateOptions.Options = slices.Clone(s.templateOptions)
 
        tmpl, err := ParseTemplate(options.Name, options.Data, s.templateFuncs, 
templateOptions)
        if err != nil {
@@ -2149,6 +2151,14 @@
        switch external.Type {
        case ExternalTypeArchive:
                return s.readExternalArchive(ctx, externalRelPath, 
parentSourceRelPath, external, options)
+       case ExternalTypeArchiveFile:
+               return s.readExternalArchiveFile(
+                       ctx,
+                       externalRelPath,
+                       parentSourceRelPath,
+                       external,
+                       options,
+               )
        case ExternalTypeFile:
                return s.readExternalFile(ctx, externalRelPath, 
parentSourceRelPath, external, options)
        case ExternalTypeGitRepo:
@@ -2167,19 +2177,11 @@
        external *External,
        options *ReadOptions,
 ) (map[RelPath][]SourceStateEntry, error) {
-       data, err := s.getExternalData(ctx, externalRelPath, external, options)
+       data, format, err := s.readExternalArchiveData(ctx, externalRelPath, 
external, options)
        if err != nil {
                return nil, err
        }
 
-       url, err := url.Parse(external.URL)
-       if err != nil {
-               return nil, fmt.Errorf("%s: %s: %w", externalRelPath, 
external.URL, err)
-       }
-       urlPath := url.Path
-       if external.Encrypted {
-               urlPath = strings.TrimSuffix(urlPath, 
s.encryption.EncryptedSuffix())
-       }
        dirAttr := DirAttr{
                TargetName: externalRelPath.Base(),
                Exact:      external.Exact,
@@ -2199,11 +2201,6 @@
                externalRelPath: {sourceStateDir},
        }
 
-       format := external.Format
-       if format == ArchiveFormatUnknown {
-               format = GuessArchiveFormat(urlPath, data)
-       }
-
        patternSet := newPatternSet()
        for _, includePattern := range external.Include {
                if err := patternSet.add(includePattern, patternSetInclude); 
err != nil {
@@ -2331,6 +2328,143 @@
        return sourceStateEntries, nil
 }
 
+// readExternalArchiveData reads an external archive's data and returns its 
data
+// and format.
+func (s *SourceState) readExternalArchiveData(
+       ctx context.Context,
+       externalRelPath RelPath,
+       external *External,
+       options *ReadOptions,
+) ([]byte, ArchiveFormat, error) {
+       data, err := s.getExternalData(ctx, externalRelPath, external, options)
+       if err != nil {
+               return nil, ArchiveFormatUnknown, err
+       }
+
+       url, err := url.Parse(external.URL)
+       if err != nil {
+               return nil, ArchiveFormatUnknown, fmt.Errorf(
+                       "%s: %s: %w",
+                       externalRelPath,
+                       external.URL,
+                       err,
+               )
+       }
+       urlPath := url.Path
+       if external.Encrypted {
+               urlPath = strings.TrimSuffix(urlPath, 
s.encryption.EncryptedSuffix())
+       }
+
+       format := external.Format
+       if format == ArchiveFormatUnknown {
+               format = GuessArchiveFormat(urlPath, data)
+       }
+
+       return data, format, nil
+}
+
+// readExternalArchiveFile reads a file from an external archive and returns 
its
+// SourceStateEntries.
+func (s *SourceState) readExternalArchiveFile(
+       ctx context.Context,
+       externalRelPath RelPath,
+       parentSourceRelPath SourceRelPath,
+       external *External,
+       options *ReadOptions,
+) (map[RelPath][]SourceStateEntry, error) {
+       if external.ArchivePath == "" {
+               return nil, fmt.Errorf("%s: missing path", externalRelPath)
+       }
+
+       data, format, err := s.readExternalArchiveData(ctx, externalRelPath, 
external, options)
+       if err != nil {
+               return nil, err
+       }
+
+       var sourceStateEntry SourceStateEntry
+       if err := WalkArchive(data, format, func(name string, fileInfo 
fs.FileInfo, r io.Reader, linkname string) error {
+               if external.StripComponents > 0 {
+                       components := strings.Split(name, "/")
+                       if len(components) <= external.StripComponents {
+                               return nil
+                       }
+                       name = 
path.Join(components[external.StripComponents:]...)
+               }
+               switch {
+               case name == "":
+                       return nil
+               case name != external.ArchivePath:
+                       // If this entry is a directory and it cannot contain 
the file we
+                       // are looking for then skip this directory.
+                       if fileInfo.IsDir() && 
!strings.HasPrefix(external.ArchivePath, name) {
+                               return fs.SkipDir
+                       }
+                       return nil
+               case fileInfo.Mode()&fs.ModeType == 0:
+                       contents, err := io.ReadAll(r)
+                       if err != nil {
+                               return fmt.Errorf("%s: %w", name, err)
+                       }
+                       lazyContents := newLazyContents(contents)
+                       fileAttr := FileAttr{
+                               TargetName: fileInfo.Name(),
+                               Type:       SourceFileTypeFile,
+                               Empty:      fileInfo.Size() == 0,
+                               Executable: isExecutable(fileInfo),
+                               Private:    isPrivate(fileInfo),
+                               ReadOnly:   isReadOnly(fileInfo),
+                       }
+                       sourceRelPath := 
parentSourceRelPath.Join(NewSourceRelPath(fileAttr.SourceName(s.encryption.EncryptedSuffix())))
+                       targetStateEntry := &TargetStateFile{
+                               lazyContents: lazyContents,
+                               empty:        fileAttr.Empty,
+                               perm:         fileAttr.perm() &^ s.umask,
+                               sourceAttr: SourceAttr{
+                                       External: true,
+                               },
+                       }
+                       sourceStateEntry = &SourceStateFile{
+                               lazyContents:     lazyContents,
+                               Attr:             fileAttr,
+                               origin:           external,
+                               sourceRelPath:    sourceRelPath,
+                               targetStateEntry: targetStateEntry,
+                       }
+                       return Break
+               case fileInfo.Mode()&fs.ModeType == fs.ModeSymlink:
+                       fileAttr := FileAttr{
+                               TargetName: fileInfo.Name(),
+                               Type:       SourceFileTypeSymlink,
+                       }
+                       sourceRelPath := 
parentSourceRelPath.Join(NewSourceRelPath(fileAttr.SourceName(s.encryption.EncryptedSuffix())))
+                       targetStateEntry := &TargetStateSymlink{
+                               lazyLinkname: newLazyLinkname(linkname),
+                               sourceAttr: SourceAttr{
+                                       External: true,
+                               },
+                       }
+                       sourceStateEntry = &SourceStateFile{
+                               Attr:             fileAttr,
+                               origin:           external,
+                               sourceRelPath:    sourceRelPath,
+                               targetStateEntry: targetStateEntry,
+                       }
+                       return Break
+               default:
+                       return fmt.Errorf("%s: unsupported mode %o", name, 
fileInfo.Mode()&fs.ModeType)
+               }
+       }); err != nil {
+               return nil, err
+       }
+       if sourceStateEntry == nil {
+               return nil, fmt.Errorf("%s: path not found in %s", 
external.ArchivePath, external.URL)
+       }
+
+       return map[RelPath][]SourceStateEntry{
+               externalRelPath: {sourceStateEntry},
+       }, nil
+}
+
 // ReadExternalDir returns all source state entries in an external_ dir.
 func (s *SourceState) readExternalDir(
        rootSourceAbsPath AbsPath, rootSourceRelPath SourceRelPath, 
rootTargetRelPath RelPath,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/pkg/cmd/config.go 
new/chezmoi-2.35.0/pkg/cmd/config.go
--- old/chezmoi-2.34.3/pkg/cmd/config.go        2023-07-03 09:12:43.000000000 
+0200
+++ new/chezmoi-2.35.0/pkg/cmd/config.go        2023-07-14 18:22:53.000000000 
+0200
@@ -124,6 +124,7 @@
        Dashlane          dashlaneConfig          `json:"dashlane"          
mapstructure:"dashlane"          yaml:"dashlane"`
        Ejson             ejsonConfig             `json:"ejson"             
mapstructure:"ejson"             yaml:"ejson"`
        Gopass            gopassConfig            `json:"gopass"            
mapstructure:"gopass"            yaml:"gopass"`
+       HCPVaultSecrets   hcpVaultSecretConfig    `json:"hcpVaultSecrets"   
mapstructure:"hcpVaultSecrets"   yaml:"hcpVaultSecrets"`
        Keepassxc         keepassxcConfig         `json:"keepassxc"         
mapstructure:"keepassxc"         yaml:"keepassxc"`
        Keeper            keeperConfig            `json:"keeper"            
mapstructure:"keeper"            yaml:"keeper"`
        Lastpass          lastpassConfig          `json:"lastpass"          
mapstructure:"lastpass"          yaml:"lastpass"`
@@ -402,6 +403,8 @@
                "glob":                     c.globTemplateFunc,
                "gopass":                   c.gopassTemplateFunc,
                "gopassRaw":                c.gopassRawTemplateFunc,
+               "hcpVaultSecret":           c.hcpVaultSecretTemplateFunc,
+               "hcpVaultSecretJson":       c.hcpVaultSecretJSONTemplateFunc,
                "hexDecode":                c.hexDecodeTemplateFunc,
                "hexEncode":                c.hexEncodeTemplateFunc,
                "include":                  c.includeTemplateFunc,
@@ -2577,6 +2580,9 @@
                Gopass: gopassConfig{
                        Command: "gopass",
                },
+               HCPVaultSecrets: hcpVaultSecretConfig{
+                       Command: "vlt",
+               },
                Keepassxc: keepassxcConfig{
                        Command: "keepassxc-cli",
                        Prompt:  true,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.34.3/pkg/cmd/doctorcmd.go 
new/chezmoi-2.35.0/pkg/cmd/doctorcmd.go
--- old/chezmoi-2.34.3/pkg/cmd/doctorcmd.go     2023-07-03 09:12:43.000000000 
+0200
+++ new/chezmoi-2.35.0/pkg/cmd/doctorcmd.go     2023-07-14 18:22:53.000000000 
+0200
@@ -388,6 +388,15 @@
                        versionRx:   
regexp.MustCompile(`^Vault\s+v(\d+\.\d+\.\d+)`),
                },
                &binaryCheck{
+                       name:        "vlt-command",
+                       binaryname:  c.HCPVaultSecrets.Command,
+                       ifNotSet:    checkResultWarning,
+                       ifNotExist:  checkResultInfo,
+                       versionArgs: []string{"version"},
+                       versionRx:   regexp.MustCompile(`^(\d+\.\d+\.\d+)`),
+                       minVersion:  &vltMinVersion,
+               },
+               &binaryCheck{
                        name:       "secret-command",
                        binaryname: c.Secret.Command,
                        ifNotSet:   checkResultInfo,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/pkg/cmd/hcpvaultsecretsttemplatefuncs.go 
new/chezmoi-2.35.0/pkg/cmd/hcpvaultsecretsttemplatefuncs.go
--- old/chezmoi-2.34.3/pkg/cmd/hcpvaultsecretsttemplatefuncs.go 1970-01-01 
01:00:00.000000000 +0100
+++ new/chezmoi-2.35.0/pkg/cmd/hcpvaultsecretsttemplatefuncs.go 2023-07-14 
18:22:53.000000000 +0200
@@ -0,0 +1,111 @@
+package cmd
+
+import (
+       "encoding/json"
+       "fmt"
+       "os"
+       "os/exec"
+       "strings"
+
+       "github.com/coreos/go-semver/semver"
+       "golang.org/x/exp/slices"
+
+       "github.com/twpayne/chezmoi/v2/pkg/chezmoilog"
+)
+
+type hcpVaultSecretConfig struct {
+       Command         string   `json:"command"         mapstructure:"command" 
        yaml:"command"`
+       Args            []string `json:"args"            mapstructure:"args"    
        yaml:"args"`
+       ApplicationName string   `json:"applicationName" 
mapstructure:"applicationName" yaml:"applicationName"`
+       OrganizationID  string   `json:"organizationId"  
mapstructure:"organizationId"  yaml:"organizationId"`
+       ProjectID       string   `json:"projectId"       
mapstructure:"projectId"       yaml:"projectId"`
+       outputCache     map[string][]byte
+}
+
+var vltMinVersion = semver.Version{Major: 0, Minor: 2, Patch: 1}
+
+func (c *Config) hcpVaultSecretTemplateFunc(key string, additionalArgs 
...string) string {
+       args, err := c.appendHCPVaultSecretsAdditionalArgs(
+               []string{"secrets", "get", "--plaintext"},
+               additionalArgs,
+       )
+       if err != nil {
+               panic(err)
+       }
+       output, err := c.vltOutput(append(args, key))
+       if err != nil {
+               panic(err)
+       }
+       return string(output)
+}
+
+func (c *Config) hcpVaultSecretJSONTemplateFunc(key string, additionalArgs 
...string) any {
+       args, err := c.appendHCPVaultSecretsAdditionalArgs(
+               []string{"secrets", "get", "--format", "json"},
+               additionalArgs,
+       )
+       if err != nil {
+               panic(err)
+       }
+       data, err := c.vltOutput(append(args, key))
+       if err != nil {
+               panic(err)
+       }
+       var value any
+       if err := json.Unmarshal(data, &value); err != nil {
+               panic(err)
+       }
+       return value
+}
+
+func (c *Config) appendHCPVaultSecretsAdditionalArgs(
+       args, additionalArgs []string,
+) ([]string, error) {
+       if len(additionalArgs) > 0 && additionalArgs[0] != "" {
+               args = append(args, "--app-name", additionalArgs[0])
+       } else if c.HCPVaultSecrets.ApplicationName != "" {
+               args = append(args, "--app-name", 
c.HCPVaultSecrets.ApplicationName)
+       }
+       if len(additionalArgs) > 1 && additionalArgs[1] != "" {
+               args = append(args, "--project", additionalArgs[1])
+       } else if c.HCPVaultSecrets.ProjectID != "" {
+               args = append(args, "--project", c.HCPVaultSecrets.ProjectID)
+       }
+       if len(additionalArgs) > 2 && additionalArgs[2] != "" {
+               args = append(args, "--organization", additionalArgs[2])
+       } else if c.HCPVaultSecrets.OrganizationID != "" {
+               args = append(args, "--organization", 
c.HCPVaultSecrets.OrganizationID)
+       }
+       if len(additionalArgs) > 3 {
+               // Add one to the number of received arguments as the 
hcpVaultSecret
+               // and hcpVaultSecretJson template functions report this error 
and take
+               // the key as the first argument.
+               return nil, fmt.Errorf("expected 1 to 4 arguments, got %d", 
len(additionalArgs)+1)
+       }
+       return args, nil
+}
+
+func (c *Config) vltOutput(args []string) ([]byte, error) {
+       args = append(slices.Clone(c.HCPVaultSecrets.Args), args...)
+       key := strings.Join(args, "\x00")
+       if data, ok := c.HCPVaultSecrets.outputCache[key]; ok {
+               return data, nil
+       }
+
+       cmd := exec.Command(c.HCPVaultSecrets.Command, args...) //nolint:gosec
+       // Always run the vlt command in the destination path because vlt uses
+       // relative paths to find its .vlt.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.HCPVaultSecrets.outputCache == nil {
+               c.HCPVaultSecrets.outputCache = make(map[string][]byte)
+       }
+       c.HCPVaultSecrets.outputCache[key] = output
+       return output, nil
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/pkg/cmd/testdata/scripts/doctor_unix.txtar 
new/chezmoi-2.35.0/pkg/cmd/testdata/scripts/doctor_unix.txtar
--- old/chezmoi-2.34.3/pkg/cmd/testdata/scripts/doctor_unix.txtar       
2023-07-03 09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/pkg/cmd/testdata/scripts/doctor_unix.txtar       
2023-07-14 18:22:53.000000000 +0200
@@ -18,6 +18,7 @@
 chmod 755 bin/shell
 chmod 755 bin/vault
 chmod 755 bin/vimdiff
+chmod 755 bin/vlt
 
 mkhomedir
 mksourcedir
@@ -54,8 +55,9 @@
 stdout '^ok\s+passhole-command\s+'
 stdout '^ok\s+lastpass-command\s+'
 stdout '^ok\s+pass-command\s+'
-stdout '^ok\s+vault-command\s+'
 stdout '^ok\s+rbw-command\s+'
+stdout '^ok\s+vault-command\s+'
+stdout '^ok\s+vlt-command\s+'
 stdout '^ok\s+secret-command\s+'
 
 chhome home2/user
@@ -171,6 +173,10 @@
 echo "Vault v1.5.5 ('f5d1ddb3750e7c28e25036e1ef26a4c02379fc01+CHANGES')"
 -- bin/vimdiff --
 #!/bin/sh
+-- bin/vlt --
+#!/bin/sh
+
+echo "0.2.1, git sha (8d9af42c8b98c9527741a239b23a3e384812f514), go1.20.4 
arm64"
 -- home/user/.config/chezmoi/chezmoi.toml --
 [keepassxc]
     command = "keepassxc"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/pkg/cmd/testdata/scripts/external.txtar 
new/chezmoi-2.35.0/pkg/cmd/testdata/scripts/external.txtar
--- old/chezmoi-2.34.3/pkg/cmd/testdata/scripts/external.txtar  2023-07-03 
09:12:43.000000000 +0200
+++ new/chezmoi-2.35.0/pkg/cmd/testdata/scripts/external.txtar  2023-07-14 
18:22:53.000000000 +0200
@@ -97,6 +97,12 @@
 stderr 'MD5 mismatch'
 stderr 'SHA256 mismatch'
 
+chhome home12/user
+
+# test that chezmoi reads archive-file externals
+exec chezmoi apply
+cmp $HOME/.file golden/dir/file
+
 -- archive/dir/file --
 # contents of dir/file
 -- golden/.file --
@@ -130,6 +136,12 @@
     url = "{{ env "HTTPD_URL" }}/.corrupt-file"
     checksum.md5 = "49fe9018f97349cdd0a0ac7b7f668b05"
     checksum.sha256 = 
"634a4dd193c7b3b926d2e08026aa81a416fd41cec52854863b974af422495663"
+-- home12/user/.local/share/chezmoi/.chezmoiexternal.toml --
+[".file"]
+    type = "archive-file"
+    url = "{{ env "HTTPD_URL" }}/archive.tar.gz"
+    path = "dir/file"
+    stripComponents = 1
 -- home2/user/.local/share/chezmoi/.chezmoiexternal.toml --
 [".file"]
     type = "file"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.34.3/pkg/cmd/testdata/scripts/hcpvaultsecrets.txtar 
new/chezmoi-2.35.0/pkg/cmd/testdata/scripts/hcpvaultsecrets.txtar
--- old/chezmoi-2.34.3/pkg/cmd/testdata/scripts/hcpvaultsecrets.txtar   
1970-01-01 01:00:00.000000000 +0100
+++ new/chezmoi-2.35.0/pkg/cmd/testdata/scripts/hcpvaultsecrets.txtar   
2023-07-14 18:22:53.000000000 +0200
@@ -0,0 +1,70 @@
+[windows] skip 'UNIX only'
+[!windows] chmod 755 bin/vlt
+
+# test hcpVaultSecret template function
+exec chezmoi execute-template '{{ hcpVaultSecret "password" }}'
+stdout ^correcthorsebatterystaple$
+
+# test hcpVaultSecret template function with app name, project, and 
organization arguments
+exec chezmoi execute-template '{{ hcpVaultSecret "password" "application-name" 
"project-id" "organization-id" }}'
+stdout ^correcthorsebatterystaple$
+
+# test hcpVaultSecret template function with empty app name, project, and 
organization arguments
+exec chezmoi execute-template '{{ hcpVaultSecret "password" "" "" "" }}'
+stdout ^correcthorsebatterystaple$
+
+# test hcpVaultSecretJson template function
+exec chezmoi execute-template '{{ (hcpVaultSecretJson 
"password").created_by.email }}'
+stdout ^user@example\.com$
+
+chhome home2/user
+
+# test hcpVaultSecret template function with default app name, project, and 
organization arguments
+exec chezmoi execute-template '{{ hcpVaultSecret "password" }}'
+stdout ^default-password$
+
+# test hcpVaultSecretJson template function with default project and 
organization arguments
+exec chezmoi execute-template '{{ hcpVaultSecret "password" "other-app-name" 
}}'
+stdout ^other-password$
+
+-- bin/vlt --
+#!/bin/sh
+
+case "$*" in
+"secrets get --format json password")
+    cat <<EOF
+{
+  "created_at": "2023-06-09T13:14:28.140Z",
+  "created_by": {
+    "email": "u...@example.com",
+    "name": "example",
+    "type": "TYPE_USER"
+  },
+  "latest_version": "2",
+  "name": "password"
+}
+EOF
+    ;;
+"secrets get --plaintext password")
+    echo correcthorsebatterystaple
+    ;;
+"secrets get --plaintext --app-name application-name --project project-id 
--organization organization-id password")
+    echo correcthorsebatterystaple
+    ;;
+"secrets get --plaintext --app-name default-app-name --project 
5907a2fa-d26a-462a-8705-74dfe967e87d --organization 
bf479eab-a292-4b46-92df-e22f5c47eadc password")
+    echo default-password
+    ;;
+"secrets get --plaintext --app-name other-app-name --project 
5907a2fa-d26a-462a-8705-74dfe967e87d --organization 
bf479eab-a292-4b46-92df-e22f5c47eadc password")
+    echo other-password
+    ;;
+*)
+    echo "$*: unknown command"
+    exit 1
+    ;;
+esac
+-- home/user/.keep --
+-- home2/user/.config/chezmoi/chezmoi.toml --
+[hcpVaultSecrets]
+    applicationName = "default-app-name"
+    projectId = "5907a2fa-d26a-462a-8705-74dfe967e87d"
+    organizationId = "bf479eab-a292-4b46-92df-e22f5c47eadc"

++++++ chezmoi.obsinfo ++++++
--- /var/tmp/diff_new_pack.d1SIHW/_old  2023-07-18 22:07:55.246920710 +0200
+++ /var/tmp/diff_new_pack.d1SIHW/_new  2023-07-18 22:07:55.250920732 +0200
@@ -1,5 +1,5 @@
 name: chezmoi
-version: 2.34.3
-mtime: 1688368363
-commit: 439ccf8f4f092a3b1f909e430775db933dc7c740
+version: 2.35.0
+mtime: 1689351773
+commit: a642b704f0bfcff6697b30a6b3ec7a213a9ca0e8
 

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

Reply via email to