Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package chezmoi for openSUSE:Factory checked 
in at 2024-08-09 16:15:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/chezmoi (Old)
 and      /work/SRC/openSUSE:Factory/.chezmoi.new.7232 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "chezmoi"

Fri Aug  9 16:15:03 2024 rev:58 rq:1192637 version:2.52.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/chezmoi/chezmoi.changes  2024-07-17 
15:15:49.651553881 +0200
+++ /work/SRC/openSUSE:Factory/.chezmoi.new.7232/chezmoi.changes        
2024-08-09 16:15:35.461253205 +0200
@@ -1,0 +2,9 @@
+Thu Aug  8 08:36:43 UTC 2024 - Filippo Bonazzi <filippo.bona...@suse.com>
+
+- Update to version 2.52.0:
+  - Features
+    * feat: Add gitHubRelease and gitHubReleaseAssetURL template functions
+  - Fixes
+    * fix: Don't modify ciphertext in edit command if plaintext did not change
+
+-------------------------------------------------------------------

Old:
----
  chezmoi-2.51.0.obscpio

New:
----
  chezmoi-2.52.0.obscpio

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

Other differences:
------------------
++++++ chezmoi.spec ++++++
--- /var/tmp/diff_new_pack.dUDvqM/_old  2024-08-09 16:15:36.369291106 +0200
+++ /var/tmp/diff_new_pack.dUDvqM/_new  2024-08-09 16:15:36.369291106 +0200
@@ -17,7 +17,7 @@
 
 
 Name:           chezmoi
-Version:        2.51.0
+Version:        2.52.0
 Release:        0
 Summary:        A multi-host manager for dotfiles
 License:        MIT

++++++ _service ++++++
--- /var/tmp/diff_new_pack.dUDvqM/_old  2024-08-09 16:15:36.405292609 +0200
+++ /var/tmp/diff_new_pack.dUDvqM/_new  2024-08-09 16:15:36.409292775 +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.51.0</param>
+    <param name="revision">v2.52.0</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)</param>
   </service>

++++++ chezmoi-2.51.0.obscpio -> chezmoi-2.52.0.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/.github/workflows/main.yml 
new/chezmoi-2.52.0/.github/workflows/main.yml
--- old/chezmoi-2.51.0/.github/workflows/main.yml       2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/.github/workflows/main.yml       2024-08-07 
22:11:15.000000000 +0200
@@ -16,7 +16,7 @@
   CHOCOLATEY_VERSION: 2.2.2 # https://github.com/chocolatey/choco/releases
   EDITORCONFIG_CHECKER_VERSION: 3.0.3 # 
https://github.com/editorconfig-checker/editorconfig-checker/releases
   FIND_TYPOS_VERSION: 0.0.3 # https://github.com/twpayne/find-typos/tags
-  GO_VERSION: 1.22.5 # https://go.dev/doc/devel/release
+  GO_VERSION: 1.22.6 # https://go.dev/doc/devel/release
   GOFUMPT_VERSION: 0.6.0 # https://github.com/mvdan/gofumpt/releases
   GOLANGCI_LINT_VERSION: 1.59.1 # 
https://github.com/golangci/golangci-lint/releases
   GOLINES_VERSION: 0.12.2 # https://github.com/segmentio/golines/releases
@@ -60,10 +60,10 @@
     - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332
       with:
         fetch-depth: 1
-    - uses: github/codeql-action/init@b611370bb5703a7efb587f9d136a52ea24c5c38c
+    - uses: github/codeql-action/init@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a
       with:
         languages: go
-    - uses: 
github/codeql-action/analyze@b611370bb5703a7efb587f9d136a52ea24c5c38c
+    - uses: 
github/codeql-action/analyze@afb54ba388a7dca6ecae48f608c4ff05ff4cc77a
   misspell:
     runs-on: ubuntu-22.04
     permissions:
@@ -202,31 +202,31 @@
         args: release --skip=sign --snapshot --timeout=1h
     - name: upload-artifact-chezmoi-darwin-amd64
       if: github.event_name == 'push' || needs.changes.outputs.code == 'true'
-      uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b
+      uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029
       with:
         name: chezmoi-darwin-amd64
         path: dist/chezmoi-nocgo_darwin_amd64_v1/chezmoi
     - name: upload-artifact-chezmoi-darwin-arm64
       if: github.event_name == 'push' || needs.changes.outputs.code == 'true'
-      uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b
+      uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029
       with:
         name: chezmoi-darwin-arm64
         path: dist/chezmoi-nocgo_darwin_arm64/chezmoi
     - name: upload-artifact-chezmoi-linux-amd64
       if: github.event_name == 'push' || needs.changes.outputs.code == 'true'
-      uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b
+      uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029
       with:
         name: chezmoi-linux-amd64
         path: dist/chezmoi-cgo-glibc_linux_amd64_v1/chezmoi
     - name: upload-artifact-chezmoi-linux-musl-amd64
       if: github.event_name == 'push' || needs.changes.outputs.code == 'true'
-      uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b
+      uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029
       with:
         name: chezmoi-linux-amd64-musl
         path: dist/chezmoi-cgo-musl_linux_amd64_v1/chezmoi
     - name: upload-artifact-chezmoi-windows-amd64.exe
       if: github.event_name == 'push' || needs.changes.outputs.code == 'true'
-      uses: actions/upload-artifact@0b2256b8c012f0828dc542b3febcab082c67f72b
+      uses: actions/upload-artifact@89ef406dd8d7e03cfd12d9e0a4a378f454709029
       with:
         name: chezmoi-windows-amd64
         path: dist/chezmoi-nocgo_windows_amd64_v1/chezmoi.exe
@@ -382,7 +382,7 @@
     - uses: actions/setup-go@0a12ed9d6a96ab950c8f026ed9f722fe0da7ef32
       with:
         go-version: stable
-    - uses: 
golangci/golangci-lint-action@a4f60bb28d35aeee14e6880718e0c85ff1882e64
+    - uses: 
golangci/golangci-lint-action@aaa42aa0628b4ae2578232a66b541047968fac86
       with:
         version: v${{ env.GOLANGCI_LINT_VERSION }}
         args: --timeout=5m
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/assets/chezmoi.io/docs/reference/release-history.md.tmpl 
new/chezmoi-2.52.0/assets/chezmoi.io/docs/reference/release-history.md.tmpl
--- old/chezmoi-2.51.0/assets/chezmoi.io/docs/reference/release-history.md.tmpl 
2024-07-15 21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/assets/chezmoi.io/docs/reference/release-history.md.tmpl 
2024-08-07 22:11:15.000000000 +0200
@@ -20,7 +20,7 @@
    | replaceAllRegex "\\(#(\\d+)[)]" 
"(https://github.com/twpayne/chezmoi/pull/$1)"
    | replaceAllRegex "(https://github\\.com/twpayne/chezmoi/pull/(\\d+))" 
"[#$2]($1)"
    | replaceAllRegex "(?m)^([0-9a-f]{7,})" "* $1"
-   | replaceAllRegex "(?m)^\\* ([0-9a-f]{7,})" "* 
[`$1`](https://github.com/twpayne/chezmoi/commit/$1)"
+   | replaceAllRegex "(?m)^\\* (([0-9a-f]{7})[0-9a-f]*)" "* 
[`$2`](https://github.com/twpayne/chezmoi/commit/$1)"
    | replaceAllRegex "\\r\\n" "\\n"
    | trim
    | default "Internal changes only"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/assets/chezmoi.io/docs/reference/templates/github-functions/gitHubRelease.md
 
new/chezmoi-2.52.0/assets/chezmoi.io/docs/reference/templates/github-functions/gitHubRelease.md
--- 
old/chezmoi-2.51.0/assets/chezmoi.io/docs/reference/templates/github-functions/gitHubRelease.md
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.52.0/assets/chezmoi.io/docs/reference/templates/github-functions/gitHubRelease.md
     2024-08-07 22:11:15.000000000 +0200
@@ -0,0 +1,17 @@
+# `gitHubRelease` *owner-repo* *version*
+
+`gitHubRelease` calls the GitHub API to retrieve the latest releases about
+the given *owner-repo*, It iterates through all the versions of the release,
+fetching the first entry equal to *version*.
+
+It then returns structured data as defined by the [GitHub Go API
+bindings](https://pkg.go.dev/github.com/google/go-github/v63/github#RepositoryRelease).
+
+Calls to `gitHubRelease` are cached so calling `gitHubRelease` with
+the same *owner-repo* *version* will only result in one call to the GitHub API.
+
+!!! example
+
+    ```
+    {{ (gitHubRelease "docker/compose" "v2.29.1").TagName }}
+    ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/assets/chezmoi.io/docs/reference/templates/github-functions/gitHubReleaseAssetURL.md
 
new/chezmoi-2.52.0/assets/chezmoi.io/docs/reference/templates/github-functions/gitHubReleaseAssetURL.md
--- 
old/chezmoi-2.51.0/assets/chezmoi.io/docs/reference/templates/github-functions/gitHubReleaseAssetURL.md
     1970-01-01 01:00:00.000000000 +0100
+++ 
new/chezmoi-2.52.0/assets/chezmoi.io/docs/reference/templates/github-functions/gitHubReleaseAssetURL.md
     2024-08-07 22:11:15.000000000 +0200
@@ -0,0 +1,21 @@
+# `gitHubReleaseAssetURL` *owner-repo* *version* *pattern*
+
+`gitHubReleaseAssetURL` calls the GitHub API to retrieve the latest
+releases about the given *owner-repo*, returning structured data as defined by
+the [GitHub Go API
+bindings](https://pkg.go.dev/github.com/google/go-github/v63/github#RepositoryRelease).
+It iterates through all the versions of the release, returning the first entry 
equal to *version*.
+It then iterates through all the release's assets, returning the first one that
+matches *pattern*. *pattern* is a shell pattern as [described in
+`path.Match`](https://pkg.go.dev/path#Match).
+
+Calls to `gitHubReleaseAssetURL` are cached so calling
+`gitHubReleaseAssetURL` with the same *owner-repo* will only result in one
+call to the GitHub API.
+
+!!! example
+
+    ```
+    {{ gitHubReleaseAssetURL "FiloSottile/age" "age v1.2.0" (printf 
"age-*-%s-%s.tar.gz" .chezmoi.os .chezmoi.arch) }}
+    {{ gitHubReleaseAssetURL "twpayne/chezmoi" "v2.50.0" (printf 
"chezmoi-%s-%s" .chezmoi.os .chezmoi.arch) }}
+    ```
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/assets/chezmoi.io/docs/user-guide/machines/containers-and-vms.md
 
new/chezmoi-2.52.0/assets/chezmoi.io/docs/user-guide/machines/containers-and-vms.md
--- 
old/chezmoi-2.51.0/assets/chezmoi.io/docs/user-guide/machines/containers-and-vms.md
 2024-07-15 21:36:30.000000000 +0200
+++ 
new/chezmoi-2.52.0/assets/chezmoi.io/docs/user-guide/machines/containers-and-vms.md
 2024-08-07 22:11:15.000000000 +0200
@@ -40,6 +40,12 @@
 {{- end }}
 ```
 
+!!! warning
+
+    Setting the `sourceDir` configuration variable to `.chezmoi.sourceDir` is
+    required because Codespaces clones your dotfiles repo to a different one to
+    chezmoi's default.
+
 This sets the `codespaces` template variable, so you don't have to repeat `(env
 "CODESPACES")` in your templates. It also sets the `sourceDir` configuration to
 the `--source` argument passed in `chezmoi init`.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/assets/chezmoi.io/mkdocs.yml 
new/chezmoi-2.52.0/assets/chezmoi.io/mkdocs.yml
--- old/chezmoi-2.51.0/assets/chezmoi.io/mkdocs.yml     2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/assets/chezmoi.io/mkdocs.yml     2024-08-07 
22:11:15.000000000 +0200
@@ -225,7 +225,9 @@
       - reference/templates/github-functions/index.md
       - gitHubKeys: reference/templates/github-functions/gitHubKeys.md
       - gitHubLatestRelease: 
reference/templates/github-functions/gitHubLatestRelease.md
+      - gitHubRelease: reference/templates/github-functions/gitHubRelease.md
       - gitHubLatestReleaseAssetURL: 
reference/templates/github-functions/gitHubLatestReleaseAssetURL.md
+      - gitHubReleaseAssetURL: 
reference/templates/github-functions/gitHubReleaseAssetURL.md
       - gitHubLatestTag: 
reference/templates/github-functions/gitHubLatestTag.md
       - gitHubReleases: reference/templates/github-functions/gitHubReleases.md
       - gitHubTags: reference/templates/github-functions/gitHubTags.md
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/assets/chezmoi.io/requirements.txt 
new/chezmoi-2.52.0/assets/chezmoi.io/requirements.txt
--- old/chezmoi-2.51.0/assets/chezmoi.io/requirements.txt       2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/assets/chezmoi.io/requirements.txt       2024-08-07 
22:11:15.000000000 +0200
@@ -1,3 +1,3 @@
 mkdocs==1.6.0
-mkdocs-material==9.5.27
+mkdocs-material==9.5.30
 mkdocs-mermaid2-plugin==1.1.1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/assets/requirements.dev.txt 
new/chezmoi-2.52.0/assets/requirements.dev.txt
--- old/chezmoi-2.51.0/assets/requirements.dev.txt      2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/assets/requirements.dev.txt      2024-08-07 
22:11:15.000000000 +0200
@@ -1 +1 @@
-ruff==0.5.0
+ruff==0.5.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/go.mod new/chezmoi-2.52.0/go.mod
--- old/chezmoi-2.51.0/go.mod   2024-07-15 21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/go.mod   2024-08-07 22:11:15.000000000 +0200
@@ -6,7 +6,7 @@
 
 require (
        filippo.io/age v1.2.0
-       github.com/1password/onepassword-sdk-go v0.1.0-beta.10
+       github.com/1password/onepassword-sdk-go v0.1.0-beta.12
        github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0
        github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.1.0
        github.com/Masterminds/sprig/v3 v3.2.3
@@ -14,13 +14,13 @@
        github.com/Shopify/ejson v1.5.2
        github.com/alecthomas/assert/v2 v2.10.0
        github.com/aws/aws-sdk-go-v2 v1.30.3
-       github.com/aws/aws-sdk-go-v2/config v1.27.26
-       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.3
+       github.com/aws/aws-sdk-go-v2/config v1.27.27
+       github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.4
        github.com/bmatcuk/doublestar/v4 v4.6.1
        github.com/bradenhilton/mozillainstallhash v1.0.1
        github.com/charmbracelet/bubbles v0.18.0
        github.com/charmbracelet/bubbletea v0.26.6
-       github.com/charmbracelet/glamour v0.7.0
+       github.com/charmbracelet/glamour v0.8.0
        github.com/coreos/go-semver v0.3.1
        github.com/fsnotify/fsnotify v1.7.0
        github.com/go-git/go-git/v5 v5.12.0
@@ -32,7 +32,7 @@
        github.com/mitchellh/copystructure v1.2.0
        github.com/mitchellh/mapstructure v1.5.0
        github.com/muesli/combinator v0.3.0
-       github.com/muesli/termenv v0.15.2
+       github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a
        github.com/pelletier/go-toml/v2 v2.2.2
        github.com/rogpeppe/go-internal v1.12.0
        github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3
@@ -48,10 +48,10 @@
        github.com/zricethezav/gitleaks/v8 v8.18.4
        go.etcd.io/bbolt v1.3.10
        golang.org/x/crypto v0.25.0
-       golang.org/x/crypto/x509roots/fallback 
v0.0.0-20240709155400-d66d9c31b4ae
-       golang.org/x/oauth2 v0.21.0
-       golang.org/x/sync v0.7.0
-       golang.org/x/sys v0.22.0
+       golang.org/x/crypto/x509roots/fallback 
v0.0.0-20240726163919-3375612bf41a
+       golang.org/x/oauth2 v0.22.0
+       golang.org/x/sync v0.8.0
+       golang.org/x/sys v0.23.0
        golang.org/x/term v0.22.0
        gopkg.in/ini.v1 v1.67.0
        gopkg.in/yaml.v3 v3.0.1
@@ -61,8 +61,8 @@
 
 require (
        dario.cat/mergo v1.0.0 // indirect
-       github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0 // indirect
-       github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.1 // indirect
+       github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 // indirect
+       github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
        github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.1 
// indirect
        github.com/AzureAD/microsoft-authentication-library-for-go v1.2.2 // 
indirect
        github.com/BobuSumisu/aho-corasick v1.0.3 // indirect
@@ -74,14 +74,14 @@
        github.com/alecthomas/repr v0.4.0 // indirect
        github.com/alessio/shellescape v1.4.2 // indirect
        github.com/atotto/clipboard v0.1.4 // indirect
-       github.com/aws/aws-sdk-go-v2/credentials v1.17.26 // indirect
+       github.com/aws/aws-sdk-go-v2/credentials v1.17.27 // indirect
        github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 // indirect
        github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 // indirect
        github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.15 // indirect
        github.com/aws/aws-sdk-go-v2/internal/ini v1.8.0 // indirect
        github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3 
// indirect
        github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/sso v1.22.3 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 // indirect
        github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 // indirect
        github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 // indirect
        github.com/aws/smithy-go v1.20.3 // indirect
@@ -91,18 +91,18 @@
        github.com/charmbracelet/harmonica v0.2.0 // indirect
        github.com/charmbracelet/lipgloss v0.12.1 // indirect
        github.com/charmbracelet/x/ansi v0.1.4 // indirect
-       github.com/charmbracelet/x/input v0.1.2 // indirect
+       github.com/charmbracelet/x/input v0.1.3 // indirect
        github.com/charmbracelet/x/term v0.1.1 // indirect
        github.com/charmbracelet/x/windows v0.1.2 // indirect
        github.com/cloudflare/circl v1.3.9 // indirect
        github.com/creack/pty/v2 v2.0.0-20231209135443-03db72c7b76c // indirect
-       github.com/cyphar/filepath-securejoin v0.3.0 // indirect
+       github.com/cyphar/filepath-securejoin v0.3.1 // indirect
        github.com/danieljoos/wincred v1.2.2 // indirect
-       github.com/dlclark/regexp2 v1.11.2 // indirect
+       github.com/dlclark/regexp2 v1.11.4 // indirect
        github.com/dustin/gojson v0.0.0-20160307161227-2e71ec9dd5ad // indirect
        github.com/emirpasic/gods v1.18.1 // indirect
        github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f // 
indirect
-       github.com/extism/go-sdk v1.3.0 // indirect
+       github.com/extism/go-sdk v1.3.1 // indirect
        github.com/fatih/semgroup v1.2.0 // indirect
        github.com/gitleaks/go-gitdiff v0.9.0 // indirect
        github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
@@ -130,13 +130,12 @@
        github.com/mattn/go-colorable v0.1.13 // indirect
        github.com/mattn/go-isatty v0.0.20 // indirect
        github.com/mattn/go-localereader v0.0.1 // indirect
-       github.com/mattn/go-runewidth v0.0.15 // indirect
+       github.com/mattn/go-runewidth v0.0.16 // indirect
        github.com/microcosm-cc/bluemonday v1.0.27 // indirect
        github.com/mitchellh/reflectwalk v1.0.2 // indirect
        github.com/muesli/ansi v0.0.0-20230316100256-276c6243b2f6 // indirect
        github.com/muesli/cancelreader v0.2.2 // indirect
        github.com/muesli/reflow v0.3.0 // indirect
-       github.com/olekukonko/tablewriter v0.0.5 // indirect
        github.com/peterbourgon/diskv v2.0.1+incompatible // indirect
        github.com/pjbgf/sha1cd v0.3.0 // indirect
        github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
@@ -145,7 +144,7 @@
        github.com/sagikazarmark/locafero v0.6.0 // indirect
        github.com/sagikazarmark/slog-shim v0.1.0 // indirect
        github.com/shopspring/decimal v1.4.0 // indirect
-       github.com/skeema/knownhosts v1.2.2 // indirect
+       github.com/skeema/knownhosts v1.3.0 // indirect
        github.com/sourcegraph/conc v0.3.0 // indirect
        github.com/spf13/afero v1.11.0 // indirect
        github.com/spf13/cast v1.6.0 // indirect
@@ -157,7 +156,7 @@
        github.com/yuin/goldmark v1.7.4 // indirect
        github.com/yuin/goldmark-emoji v1.0.3 // indirect
        go.uber.org/multierr v1.11.0 // indirect
-       golang.org/x/exp v0.0.0-20240707233637-46b078467d37 // indirect
+       golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 // indirect
        golang.org/x/net v0.27.0 // indirect
        golang.org/x/text v0.16.0 // indirect
        golang.org/x/tools v0.23.0 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/go.sum new/chezmoi-2.52.0/go.sum
--- old/chezmoi-2.51.0/go.sum   2024-07-15 21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/go.sum   2024-08-07 22:11:15.000000000 +0200
@@ -20,14 +20,14 @@
 filippo.io/age v1.2.0/go.mod h1:JL9ew2lTN+Pyft4RiNGguFfOpewKwSHm5ayKD/A4004=
 filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
 filippo.io/edwards25519 v1.1.0/go.mod 
h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
-github.com/1password/onepassword-sdk-go v0.1.0-beta.10 
h1:vYm15kP/HMWdJaScgWFUu0zxl5QeRgUAwg322VabV54=
-github.com/1password/onepassword-sdk-go v0.1.0-beta.10/go.mod 
h1:FnJzZHo0kfR7U4M3f9xRbKIAn+sR9pn1Ssu3zGDcMpM=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0 
h1:1nGuui+4POelzDwI7RG56yfQJHCnKvwfMoU7VsEp+Zg=
-github.com/Azure/azure-sdk-for-go/sdk/azcore v1.12.0/go.mod 
h1:99EvauvlcJ1U06amZiksfYz/3aFGyIhWGHVyiZXtBAI=
+github.com/1password/onepassword-sdk-go v0.1.0-beta.12 
h1:v9b2fow1cutaCWRsIU1sVxVSzzR90mfkDCwYJeaadWc=
+github.com/1password/onepassword-sdk-go v0.1.0-beta.12/go.mod 
h1:7wEQynLBXBC4svNx3X82QmCy0Adhm4e+UkM9t9mSSWA=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0 
h1:GJHeeA2N7xrG3q30L2UXDyuWRzDM900/65j70wcM4Ww=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.13.0/go.mod 
h1:l38EPgmsp71HHLq9j7De57JcKOWPyhrsW1Awm1JS6K0=
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0 
h1:tfLQ34V6F7tVSwoTf/4lH5sE0o6eCJuNDTmH09nDpbc=
 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.7.0/go.mod 
h1:9kIvujWAA58nmPmWB1m23fyWic1kYZMxD9CxaWn4Qpg=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.1 
h1:Xy/qV1DyOhhqsU/z0PyFMJfYCxnzna+vBEUtFW0ksQo=
-github.com/Azure/azure-sdk-for-go/sdk/internal v1.9.1/go.mod 
h1:oib6iWdC+sILvNUoJbbBn3xv7TXow7mEp/WRcsYvmow=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 
h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod 
h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY=
 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets v1.1.0 
h1:h4Zxgmi9oyZL2l8jeg1iRTqPloHktywWcu0nlJmo1tA=
 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azsecrets 
v1.1.0/go.mod h1:LgLGXawqSreJz135Elog0ywTJDsm0Hz2k+N+6ZK35u8=
 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.1 
h1:9fXQS/0TtQmKXp8SureKouF+idbQvp7cPUxykiohnBs=
@@ -68,10 +68,10 @@
 github.com/atotto/clipboard v0.1.4/go.mod 
h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI=
 github.com/aws/aws-sdk-go-v2 v1.30.3 
h1:jUeBtG0Ih+ZIFH0F4UkmL9w3cSpaMv9tYYDbzILP8dY=
 github.com/aws/aws-sdk-go-v2 v1.30.3/go.mod 
h1:nIQjQVp5sfpQcTc9mPSr1B0PaWK5ByX9MOoDadSN4lc=
-github.com/aws/aws-sdk-go-v2/config v1.27.26 
h1:T1kAefbKuNum/AbShMsZEro6eRkeOT8YILfE9wyjAYQ=
-github.com/aws/aws-sdk-go-v2/config v1.27.26/go.mod 
h1:ivWHkAWFrw/nxty5Fku7soTIVdqZaZ7dw+tc5iGW3GA=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.26 
h1:tsm8g/nJxi8+/7XyJJcP2dLrnK/5rkFp6+i2nhmz5fk=
-github.com/aws/aws-sdk-go-v2/credentials v1.17.26/go.mod 
h1:3vAM49zkIa3q8WT6o9Ve5Z0vdByDMwmdScO0zvThTgI=
+github.com/aws/aws-sdk-go-v2/config v1.27.27 
h1:HdqgGt1OAP0HkEDDShEl0oSYa9ZZBSOmKpdpsDMdO90=
+github.com/aws/aws-sdk-go-v2/config v1.27.27/go.mod 
h1:MVYamCg76dFNINkZFu4n4RjDixhVr51HLj4ErWzrVwg=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.27 
h1:2raNba6gr2IfA0eqqiP2XiQ0UVOpGPgDSi0I9iAP+UI=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.27/go.mod 
h1:gniiwbGahQByxan6YjQUMcW4Aov6bLC3m+evgcoN4r4=
 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11 
h1:KreluoV8FZDEtI6Co2xuNk/UqI9iwMrOx/87PBNIKqw=
 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.11/go.mod 
h1:SeSUYBLsMYFoRvHE0Tjvn7kbxaUhl75CJi1sbfhMxkU=
 github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.15 
h1:SoNJ4RlFEQEbtDcCEt+QG56MY4fm4W8rYirAmq+/DdU=
@@ -84,10 +84,10 @@
 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.3/go.mod 
h1:GlAeCkHwugxdHaueRr4nhPuY+WW+gR8UjlcqzPr1SPI=
 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17 
h1:HGErhhrxZlQ044RiM+WdoZxp0p+EGM62y3L6pwA4olE=
 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.17/go.mod 
h1:RkZEx4l0EHYDJpWppMJ3nD9wZJAa8/0lq9aVC+r2UII=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.3 
h1:ilavrucVBQHYnMjD2KmZQDCU1fuluQb0l9zRigGNVEc=
-github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.3/go.mod 
h1:TKKN7IQoM7uTnyuFm9bm9cw5P//ZYTl4m3htBWQ1G/c=
-github.com/aws/aws-sdk-go-v2/service/sso v1.22.3 
h1:Fv1vD2L65Jnp5QRsdiM64JvUM4Xe+E0JyVsRQKv6IeA=
-github.com/aws/aws-sdk-go-v2/service/sso v1.22.3/go.mod 
h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.4 
h1:NgRFYyFpiMD62y4VPXh4DosPFbZd4vdMVBWKk0VmWXc=
+github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.4/go.mod 
h1:TKKN7IQoM7uTnyuFm9bm9cw5P//ZYTl4m3htBWQ1G/c=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.4 
h1:BXx0ZIxvrJdSgSvKTZ+yRBeSqqgPM89VPlulEcl37tM=
+github.com/aws/aws-sdk-go-v2/service/sso v1.22.4/go.mod 
h1:ooyCOXjvJEsUw7x+ZDHeISPMhtwI3ZCB7ggFMcFfWLU=
 github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4 
h1:yiwVzJW2ZxZTurVbYWA7QOrAaCYQR72t0wrSBfoesUE=
 github.com/aws/aws-sdk-go-v2/service/ssooidc v1.26.4/go.mod 
h1:0oxfLkpz3rQ/CHlx5hB7H69YUpFiI1tql6Q6Ne+1bCw=
 github.com/aws/aws-sdk-go-v2/service/sts v1.30.3 
h1:ZsDKRLXGWHk8WdtyYMoGNO7bTudrvuKpDKgMVRlepGE=
@@ -112,16 +112,18 @@
 github.com/charmbracelet/bubbles v0.18.0/go.mod 
h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw=
 github.com/charmbracelet/bubbletea v0.26.6 
h1:zTCWSuST+3yZYZnVSvbXwKOPRSNZceVeqpzOLN2zq1s=
 github.com/charmbracelet/bubbletea v0.26.6/go.mod 
h1:dz8CWPlfCCGLFbBlTY4N7bjLiyOGDJEnd2Muu7pOWhk=
-github.com/charmbracelet/glamour v0.7.0 
h1:2BtKGZ4iVJCDfMF229EzbeR1QRKLWztO9dMtjmqZSng=
-github.com/charmbracelet/glamour v0.7.0/go.mod 
h1:jUMh5MeihljJPQbJ/wf4ldw2+yBP59+ctV36jASy7ps=
+github.com/charmbracelet/glamour v0.8.0 
h1:tPrjL3aRcQbn++7t18wOpgLyl8wrOHUEDS7IZ68QtZs=
+github.com/charmbracelet/glamour v0.8.0/go.mod 
h1:ViRgmKkf3u5S7uakt2czJ272WSg2ZenlYEZXT2x7Bjw=
 github.com/charmbracelet/harmonica v0.2.0 
h1:8NxJWRWg/bzKqqEaaeFNipOu77YR5t8aSwG4pgaUBiQ=
 github.com/charmbracelet/harmonica v0.2.0/go.mod 
h1:KSri/1RMQOZLbw7AHqgcBycp8pgJnQMYYT8QZRqZ1Ao=
 github.com/charmbracelet/lipgloss v0.12.1 
h1:/gmzszl+pedQpjCOH+wFkZr/N90Snz40J/NR7A0zQcs=
 github.com/charmbracelet/lipgloss v0.12.1/go.mod 
h1:V2CiwIuhx9S1S1ZlADfOj9HmxeMAORuz5izHb0zGbB8=
 github.com/charmbracelet/x/ansi v0.1.4 
h1:IEU3D6+dWwPSgZ6HBH+v6oUuZ/nVawMiWj5831KfiLM=
 github.com/charmbracelet/x/ansi v0.1.4/go.mod 
h1:dk73KoMTT5AX5BsX0KrqhsTqAnhZZoCBjs7dGWp4Ktw=
-github.com/charmbracelet/x/input v0.1.2 
h1:QJAZr33eOhDowkkEQ24rsJy4Llxlm+fRDf/cQrmqJa0=
-github.com/charmbracelet/x/input v0.1.2/go.mod 
h1:LGBim0maUY4Pitjn/4fHnuXb4KirU3DODsyuHuXdOyA=
+github.com/charmbracelet/x/exp/golden v0.0.0-20240715153702-9ba8adf781c4 
h1:6KzMkQeAF56rggw2NZu1L+TH7j9+DM1/2Kmh7KUxg1I=
+github.com/charmbracelet/x/exp/golden 
v0.0.0-20240715153702-9ba8adf781c4/go.mod 
h1:wDlXFlCrmJ8J+swcL/MnGUuYnqgQdW9rhSD61oNMb6U=
+github.com/charmbracelet/x/input v0.1.3 
h1:oy4TMhyGQsYs/WWJwu1ELUMFnjiUAXwtDf048fHbCkg=
+github.com/charmbracelet/x/input v0.1.3/go.mod 
h1:1gaCOyw1KI9e2j00j/BBZ4ErzRZqa05w0Ghn83yIhKU=
 github.com/charmbracelet/x/term v0.1.1 
h1:3cosVAiPOig+EV4X9U+3LDgtwwAoEzJjNdwbXDjF6yI=
 github.com/charmbracelet/x/term v0.1.1/go.mod 
h1:wB1fHt5ECsu3mXYusyzcngVWWlu1KKUmmLhfgr/Flxw=
 github.com/charmbracelet/x/windows v0.1.2 
h1:Iumiwq2G+BRmgoayww/qfcvof7W/3uLoelhxojXlRWg=
@@ -141,16 +143,16 @@
 github.com/creack/pty v1.1.21/go.mod 
h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4=
 github.com/creack/pty/v2 v2.0.0-20231209135443-03db72c7b76c 
h1:5l8y/PgjeX1aUyZxXabtAf2ahCYQaqWzlFzQgU16o0U=
 github.com/creack/pty/v2 v2.0.0-20231209135443-03db72c7b76c/go.mod 
h1:1gZ4PfMDNcYx8FxDdnF/6HYP327cTeB/ru6UdoWVQvw=
-github.com/cyphar/filepath-securejoin v0.3.0 
h1:tXpmbiaeBrS/K2US8nhgwdKYnfAOnVfkcLPKFgFHeA0=
-github.com/cyphar/filepath-securejoin v0.3.0/go.mod 
h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc=
+github.com/cyphar/filepath-securejoin v0.3.1 
h1:1V7cHiaW+C+39wEfpH6XlLBQo3j/PciWFrgfCLS8XrE=
+github.com/cyphar/filepath-securejoin v0.3.1/go.mod 
h1:F7i41x/9cBF7lzCrVsYs9fuzwRZm4NQsGTBdpp6mETc=
 github.com/danieljoos/wincred v1.2.2 
h1:774zMFJrqaeYCK2W57BgAem/MLi6mtSE47MB6BOJ0i0=
 github.com/danieljoos/wincred v1.2.2/go.mod 
h1:w7w4Utbrz8lqeMbDAK0lkNJUv5sAOkFi7nd/ogr0Uh8=
 github.com/davecgh/go-spew v1.1.0/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc 
h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod 
h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dlclark/regexp2 v1.11.2 
h1:/u628IuisSTwri5/UKloiIsH8+qF2Pu7xEQX+yIKg68=
-github.com/dlclark/regexp2 v1.11.2/go.mod 
h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
+github.com/dlclark/regexp2 v1.11.4 
h1:rPYF9/LECdNymJufQKmri9gV604RvvABwgOA8un7yAo=
+github.com/dlclark/regexp2 v1.11.4/go.mod 
h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
 github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
 github.com/dnaeon/go-vcr v1.2.0/go.mod 
h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
 github.com/dustin/go-humanize v1.0.1 
h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
@@ -163,8 +165,8 @@
 github.com/emirpasic/gods v1.18.1/go.mod 
h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ=
 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f 
h1:Y/CXytFA4m6baUTXGLOoWe4PQhGxaX0KpnayAqC48p4=
 github.com/erikgeiser/coninput v0.0.0-20211004153227-1c3628e74d0f/go.mod 
h1:vw97MGsxSvLiUE2X8qFplwetxpGLQrlU1Q9AUEIzCaM=
-github.com/extism/go-sdk v1.3.0 h1:DBd4FzDBUAL3P01MNqUD2+x8G7qyYdJ7pV96NIrfWXA=
-github.com/extism/go-sdk v1.3.0/go.mod 
h1:tPMWfCSOThie3LSTSZKbrQjRm2oAXxUUjSE4HJWjYQM=
+github.com/extism/go-sdk v1.3.1 h1:eVpuv36b67Km/tAb7Cq6msHEW8kkdFgpZO/7fCwjuoE=
+github.com/extism/go-sdk v1.3.1/go.mod 
h1:tPMWfCSOThie3LSTSZKbrQjRm2oAXxUUjSE4HJWjYQM=
 github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w=
 github.com/fatih/color v1.14.1/go.mod 
h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg=
 github.com/fatih/semgroup v1.2.0 
h1:h/OLXwEM+3NNyAdZEpMiH1OzfplU09i2qXPVThGZvyg=
@@ -310,10 +312,9 @@
 github.com/mattn/go-isatty v0.0.20/go.mod 
h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
 github.com/mattn/go-localereader v0.0.1 
h1:ygSAOl7ZXTx4RdPYinUpg6W99U8jWvWi9Ye2JC/oIi4=
 github.com/mattn/go-localereader v0.0.1/go.mod 
h1:8fBrzywKY7BI3czFoHkuzRoWE9C+EiG4R1k4Cjx5p88=
-github.com/mattn/go-runewidth v0.0.9/go.mod 
h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
 github.com/mattn/go-runewidth v0.0.12/go.mod 
h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
-github.com/mattn/go-runewidth v0.0.15 
h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U=
-github.com/mattn/go-runewidth v0.0.15/go.mod 
h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-runewidth v0.0.16 
h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod 
h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
 github.com/microcosm-cc/bluemonday v1.0.27 
h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk=
 github.com/microcosm-cc/bluemonday v1.0.27/go.mod 
h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA=
 github.com/mitchellh/copystructure v1.0.0/go.mod 
h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
@@ -342,16 +343,14 @@
 github.com/muesli/combinator v0.3.0/go.mod 
h1:ttPegJX0DPQaGDtJKMInIP6Vfp5pN8RX7QntFCcpy18=
 github.com/muesli/reflow v0.3.0 h1:IFsN6K9NfGtjeggFP+68I4chLZV2yIKsXJFNZ+eWh6s=
 github.com/muesli/reflow v0.3.0/go.mod 
h1:pbwTDkVPibjO2kyvBQRBxTWEEGDGq0FlB1BIKtnHY/8=
-github.com/muesli/termenv v0.15.2 
h1:GohcuySI0QmI3wN8Ok9PtKGkgkFIk7y6Vpb5PvrY+Wo=
-github.com/muesli/termenv v0.15.2/go.mod 
h1:Epx+iuz8sNs7mNKhxzH4fWXGNpZwUaJKRS1noLXviQ8=
+github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a 
h1:2MaM6YC3mGu54x+RKAA6JiFFHlHDY1UbkxqppT7wYOg=
+github.com/muesli/termenv v0.15.3-0.20240618155329-98d742f6907a/go.mod 
h1:hxSnBBYLK21Vtq/PHd0S2FYCxBXzBua8ov5s1RobyRQ=
 github.com/nats-io/nats.go v1.34.0 
h1:fnxnPCNiwIG5w08rlMcEKTUw4AV/nKyGCOJE8TdhSPk=
 github.com/nats-io/nats.go v1.34.0/go.mod 
h1:Ubdu4Nh9exXdSz0RVWRFBbRfrbSxOYd26oF0wkWclB8=
 github.com/nats-io/nkeys v0.4.7 h1:RwNJbbIdYCoClSDNY7QVKZlyb/wfT6ugvFCiKy6vDvI=
 github.com/nats-io/nkeys v0.4.7/go.mod 
h1:kqXRgRDPlGy7nGaEDMuYzmiJCIAAWDK0IMBtDmGD0nc=
 github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw=
 github.com/nats-io/nuid v1.0.1/go.mod 
h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c=
-github.com/olekukonko/tablewriter v0.0.5 
h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
-github.com/olekukonko/tablewriter v0.0.5/go.mod 
h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
 github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI=
 github.com/onsi/gomega v1.27.10/go.mod 
h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M=
 github.com/pelletier/go-toml v1.9.3 
h1:zeC5b1GviRUyKYd6OJPvBU/mcVDVoL1OhT17FCt5dSQ=
@@ -401,8 +400,8 @@
 github.com/sirupsen/logrus v1.7.0/go.mod 
h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/sirupsen/logrus v1.9.3 
h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
 github.com/sirupsen/logrus v1.9.3/go.mod 
h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
-github.com/skeema/knownhosts v1.2.2 
h1:Iug2P4fLmDw9f41PB6thxUkNUkJzB5i+1/exaj40L3A=
-github.com/skeema/knownhosts v1.2.2/go.mod 
h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo=
+github.com/skeema/knownhosts v1.3.0 
h1:AM+y0rI04VksttfwjkSTNQorvGqmwATnvnAHpSgc0LY=
+github.com/skeema/knownhosts v1.3.0/go.mod 
h1:sPINvnADmT/qYH1kfv+ePMmOBTH6Tbl7b5LvTDjFK7M=
 github.com/smarty/assertions v1.15.0 
h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY=
 github.com/smarty/assertions v1.15.0/go.mod 
h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec=
 github.com/smartystreets/goconvey v1.8.1 
h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY=
@@ -508,10 +507,10 @@
 golang.org/x/crypto v0.7.0/go.mod 
h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
 golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30=
 golang.org/x/crypto v0.25.0/go.mod 
h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M=
-golang.org/x/crypto/x509roots/fallback v0.0.0-20240709155400-d66d9c31b4ae 
h1:3Lr8+tydLa3EM5BMsp0/++1Pca9P3T3lnTTj6z5BqOc=
-golang.org/x/crypto/x509roots/fallback 
v0.0.0-20240709155400-d66d9c31b4ae/go.mod 
h1:kNa9WdvYnzFwC79zRpLRMJbdEFlhyM5RPFBBZp/wWH8=
-golang.org/x/exp v0.0.0-20240707233637-46b078467d37 
h1:uLDX+AfeFCct3a2C7uIWBKMJIR3CJMhcgfrUAqjRK6w=
-golang.org/x/exp v0.0.0-20240707233637-46b078467d37/go.mod 
h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
+golang.org/x/crypto/x509roots/fallback v0.0.0-20240726163919-3375612bf41a 
h1:+mrX96OoIUobm534myLOZMfVxVLWu/TpbYrUu6sn4tQ=
+golang.org/x/crypto/x509roots/fallback 
v0.0.0-20240726163919-3375612bf41a/go.mod 
h1:kNa9WdvYnzFwC79zRpLRMJbdEFlhyM5RPFBBZp/wWH8=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56 
h1:2dVuKD2vS7b0QIHQbpyTISPd0LeHDbnYEryqj5Q1ug8=
+golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod 
h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
 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.19.0 h1:fEdghXQSo20giMthA7cd28ZC+jts4amQ3YMXiP5oMQ8=
@@ -525,13 +524,13 @@
 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 golang.org/x/net v0.27.0 h1:5K3Njcw06/l2y9vpGCSdcxWOYHOUk3dVNGDXN+FvAys=
 golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE=
-golang.org/x/oauth2 v0.21.0 h1:tsimM75w1tF/uws5rbeHzIWxEqElMehnc+iW793zsZs=
-golang.org/x/oauth2 v0.21.0/go.mod 
h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.22.0 h1:BzDx2FehcG7jJwgWLELCdmLuxk2i+x9UDpSiss2u0ZA=
+golang.org/x/oauth2 v0.22.0/go.mod 
h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
 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=
-golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M=
-golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
+golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod 
h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -551,8 +550,8 @@
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI=
-golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.23.0 h1:YfKFowiIMvtgl1UERQoTPPToxltDeZfbj4H7dVUCwmM=
+golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 
h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk=
 golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod 
h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/chezmoi/chezmoi.go 
new/chezmoi-2.52.0/internal/chezmoi/chezmoi.go
--- old/chezmoi-2.51.0/internal/chezmoi/chezmoi.go      2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/chezmoi/chezmoi.go      2024-08-07 
22:11:15.000000000 +0200
@@ -321,6 +321,16 @@
        return len(bytes.TrimSpace(data)) == 0
 }
 
+// isPrivate returns if fileInfo is private.
+func isPrivate(fileInfo fs.FileInfo) bool {
+       return fileInfo.Mode().Perm()&0o77 == 0
+}
+
+// isReadOnly returns if fileInfo is read-only.
+func isReadOnly(fileInfo fs.FileInfo) bool {
+       return fileInfo.Mode().Perm()&0o222 == 0
+}
+
 // md5Sum returns the MD5 sum of data.
 func md5Sum(data []byte) []byte {
        md5SumArr := md5.Sum(data) //nolint:gosec
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/chezmoi/chezmoi_unix.go 
new/chezmoi-2.52.0/internal/chezmoi/chezmoi_unix.go
--- old/chezmoi-2.51.0/internal/chezmoi/chezmoi_unix.go 2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/chezmoi/chezmoi_unix.go 2024-08-07 
22:11:15.000000000 +0200
@@ -31,13 +31,3 @@
 func UserHomeDir() (string, error) {
        return os.UserHomeDir()
 }
-
-// isPrivate returns if fileInfo is private.
-func isPrivate(fileInfo fs.FileInfo) bool {
-       return fileInfo.Mode().Perm()&0o77 == 0
-}
-
-// isReadOnly returns if fileInfo is read-only.
-func isReadOnly(fileInfo fs.FileInfo) bool {
-       return fileInfo.Mode().Perm()&0o222 == 0
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/chezmoi/chezmoi_windows.go 
new/chezmoi-2.52.0/internal/chezmoi/chezmoi_windows.go
--- old/chezmoi-2.51.0/internal/chezmoi/chezmoi_windows.go      2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/chezmoi/chezmoi_windows.go      2024-08-07 
22:11:15.000000000 +0200
@@ -32,6 +32,9 @@
 // in the PATHEXT environment variable as per
 // 
https://www.nextofwindows.com/what-is-pathext-environment-variable-in-windows.
 func IsExecutable(fileInfo fs.FileInfo) bool {
+       if fileInfo.Mode().Perm()&0o111 != 0 {
+               return true
+       }
        if !fileInfo.Mode().IsRegular() {
                return false
        }
@@ -55,16 +58,6 @@
        return os.UserHomeDir()
 }
 
-// isPrivate returns false on Windows.
-func isPrivate(_ fs.FileInfo) bool {
-       return false
-}
-
-// isReadOnly returns false on Windows.
-func isReadOnly(_ fs.FileInfo) bool {
-       return false
-}
-
 // isSlash returns if c is a slash character.
 func isSlash(c byte) bool {
        return c == '\\' || c == '/'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmd/cmd.go 
new/chezmoi-2.52.0/internal/cmd/cmd.go
--- old/chezmoi-2.51.0/internal/cmd/cmd.go      2024-07-15 21:36:30.000000000 
+0200
+++ new/chezmoi-2.52.0/internal/cmd/cmd.go      2024-08-07 22:11:15.000000000 
+0200
@@ -13,6 +13,7 @@
        "strings"
 
        "github.com/charmbracelet/glamour"
+       "github.com/charmbracelet/glamour/styles"
        "github.com/spf13/cobra"
        "go.etcd.io/bbolt"
 
@@ -52,7 +53,7 @@
                panic(err)
        }
 
-       longHelpStyleConfig := glamour.ASCIIStyleConfig
+       longHelpStyleConfig := styles.ASCIIStyleConfig
        longHelpStyleConfig.Code.StylePrimitive.BlockPrefix = ""
        longHelpStyleConfig.Code.StylePrimitive.BlockSuffix = ""
        longHelpStyleConfig.Emph.BlockPrefix = ""
@@ -66,7 +67,7 @@
                panic(err)
        }
 
-       exampleStyleConfig := glamour.ASCIIStyleConfig
+       exampleStyleConfig := styles.ASCIIStyleConfig
        exampleStyleConfig.Code.StylePrimitive.BlockPrefix = ""
        exampleStyleConfig.Code.StylePrimitive.BlockSuffix = ""
        exampleStyleConfig.Document.Margin = nil
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmd/config.go 
new/chezmoi-2.52.0/internal/cmd/config.go
--- old/chezmoi-2.51.0/internal/cmd/config.go   2024-07-15 21:36:30.000000000 
+0200
+++ new/chezmoi-2.52.0/internal/cmd/config.go   2024-08-07 22:11:15.000000000 
+0200
@@ -438,6 +438,8 @@
                "gitHubLatestRelease":          
c.gitHubLatestReleaseTemplateFunc,
                "gitHubLatestReleaseAssetURL":  
c.gitHubLatestReleaseAssetURLTemplateFunc,
                "gitHubLatestTag":              c.gitHubLatestTagTemplateFunc,
+               "gitHubRelease":                c.gitHubReleaseTemplateFunc,
+               "gitHubReleaseAssetURL":        
c.gitHubReleaseAssetURLTemplateFunc,
                "gitHubReleases":               c.gitHubReleasesTemplateFunc,
                "gitHubTags":                   c.gitHubTagsTemplateFunc,
                "glob":                         c.globTemplateFunc,
@@ -475,8 +477,8 @@
                "output":                       c.outputTemplateFunc,
                "pass":                         c.passTemplateFunc,
                "passFields":                   c.passFieldsTemplateFunc,
-               "passhole":                     c.passholeTemplateFunc,
                "passRaw":                      c.passRawTemplateFunc,
+               "passhole":                     c.passholeTemplateFunc,
                "pruneEmptyDicts":              c.pruneEmptyDictsTemplateFunc,
                "quoteList":                    c.quoteListTemplateFunc,
                "rbw":                          c.rbwTemplateFunc,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmd/editcmd.go 
new/chezmoi-2.52.0/internal/cmd/editcmd.go
--- old/chezmoi-2.51.0/internal/cmd/editcmd.go  2024-07-15 21:36:30.000000000 
+0200
+++ new/chezmoi-2.52.0/internal/cmd/editcmd.go  2024-08-07 22:11:15.000000000 
+0200
@@ -1,6 +1,7 @@
 package cmd
 
 import (
+       "bytes"
        "log/slog"
        "os"
        "runtime"
@@ -87,6 +88,7 @@
        type transparentlyDecryptedFile struct {
                sourceAbsPath    chezmoi.AbsPath
                decryptedAbsPath chezmoi.AbsPath
+               preEditPlaintext []byte
        }
        var transparentlyDecryptedFiles []transparentlyDecryptedFile
 TARGET_REL_PATH:
@@ -119,6 +121,7 @@
                        transparentlyDecryptedFile := 
transparentlyDecryptedFile{
                                sourceAbsPath:    
c.SourceDirAbsPath.Join(sourceRelPath.RelPath()),
                                decryptedAbsPath: decryptedAbsPath,
+                               preEditPlaintext: contents,
                        }
                        transparentlyDecryptedFiles = 
append(transparentlyDecryptedFiles, transparentlyDecryptedFile)
                        editorArgs = append(editorArgs, 
decryptedAbsPath.String())
@@ -165,6 +168,13 @@
 
        postEditFunc := func() error {
                for _, transparentlyDecryptedFile := range 
transparentlyDecryptedFiles {
+                       postEditPlaintext, err := 
c.baseSystem.ReadFile(transparentlyDecryptedFile.decryptedAbsPath)
+                       if err != nil {
+                               return err
+                       }
+                       if bytes.Equal(postEditPlaintext, 
transparentlyDecryptedFile.preEditPlaintext) {
+                               return nil
+                       }
                        contents, err := 
c.encryption.EncryptFile(transparentlyDecryptedFile.decryptedAbsPath)
                        if err != nil {
                                return err
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmd/githubtemplatefuncs.go 
new/chezmoi-2.52.0/internal/cmd/githubtemplatefuncs.go
--- old/chezmoi-2.51.0/internal/cmd/githubtemplatefuncs.go      2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/cmd/githubtemplatefuncs.go      2024-08-07 
22:11:15.000000000 +0200
@@ -37,19 +37,21 @@
 }
 
 var (
-       gitHubKeysStateBucket          = []byte("gitHubLatestKeysState")
-       gitHubLatestReleaseStateBucket = []byte("gitHubLatestReleaseState")
-       gitHubReleasesStateBucket      = []byte("gitHubReleasesState")
-       gitHubTagsStateBucket          = []byte("gitHubTagsState")
+       gitHubKeysStateBucket           = []byte("gitHubLatestKeysState")
+       gitHubLatestReleaseStateBucket  = []byte("gitHubLatestReleaseState")
+       gitHubReleasesStateBucket       = []byte("gitHubReleasesState")
+       gitHubTagsStateBucket           = []byte("gitHubTagsState")
+       gitHubVersionReleaseStateBucket = []byte("gitHubVersionReleaseState")
 )
 
 type gitHubData struct {
-       client             *github.Client
-       clientErr          error
-       keysCache          map[string][]*github.Key
-       latestReleaseCache map[string]map[string]*github.RepositoryRelease
-       releasesCache      map[string]map[string][]*github.RepositoryRelease
-       tagsCache          map[string]map[string][]*github.RepositoryTag
+       client              *github.Client
+       clientErr           error
+       keysCache           map[string][]*github.Key
+       versionReleaseCache 
map[string]map[string]map[string]*github.RepositoryRelease
+       latestReleaseCache  map[string]map[string]*github.RepositoryRelease
+       releasesCache       map[string]map[string][]*github.RepositoryRelease
+       tagsCache           map[string]map[string][]*github.RepositoryTag
 }
 
 func (c *Config) gitHubKeysTemplateFunc(user string) []*github.Key {
@@ -108,11 +110,7 @@
        return allKeys
 }
 
-func (c *Config) gitHubLatestReleaseAssetURLTemplateFunc(ownerRepo, pattern 
string) string {
-       release, err := c.gitHubLatestRelease(ownerRepo)
-       if err != nil {
-               panic(err)
-       }
+func (c *Config) githubMatchingReleaseAssetURL(release 
*github.RepositoryRelease, pattern string) string {
        for _, asset := range release.Assets {
                if asset.Name == nil {
                        continue
@@ -127,6 +125,79 @@
        return ""
 }
 
+func (c *Config) gitHubLatestReleaseAssetURLTemplateFunc(ownerRepo, pattern 
string) string {
+       release, err := c.gitHubLatestRelease(ownerRepo)
+       if err != nil {
+               panic(err)
+       }
+       return c.githubMatchingReleaseAssetURL(release, pattern)
+}
+
+func (c *Config) gitHubReleaseAssetURLTemplateFunc(ownerRepo, version, pattern 
string) string {
+       release, err := c.gitHubRelease(ownerRepo, version)
+       if err != nil {
+               panic(err)
+       }
+       return c.githubMatchingReleaseAssetURL(release, pattern)
+}
+
+func (c *Config) gitHubRelease(ownerRepo, version string) 
(*github.RepositoryRelease, error) {
+       owner, repo, err := gitHubSplitOwnerRepo(ownerRepo)
+       if err != nil {
+               return nil, err
+       }
+
+       if c.gitHub.versionReleaseCache == nil {
+               c.gitHub.versionReleaseCache = 
make(map[string]map[string]map[string]*github.RepositoryRelease)
+       }
+       if c.gitHub.versionReleaseCache[owner] == nil {
+               c.gitHub.versionReleaseCache[owner] = 
make(map[string]map[string]*github.RepositoryRelease)
+       }
+       if c.gitHub.versionReleaseCache[owner][repo] == nil {
+               c.gitHub.versionReleaseCache[owner][repo] = 
make(map[string]*github.RepositoryRelease)
+       }
+
+       if release := c.gitHub.versionReleaseCache[owner][repo][version]; 
release != nil {
+               return release, nil
+       }
+
+       now := time.Now()
+       gitHubVersionReleaseKey := []byte(owner + "/" + repo + "/" + version)
+       if c.GitHub.RefreshPeriod != 0 {
+               var gitHubVersionReleaseStateValue gitHubLatestReleaseState
+               switch ok, err := chezmoi.PersistentStateGet(c.persistentState, 
gitHubVersionReleaseStateBucket, gitHubVersionReleaseKey, 
&gitHubVersionReleaseStateValue); {
+               case err != nil:
+                       return nil, err
+               case ok && 
now.Before(gitHubVersionReleaseStateValue.RequestedAt.Add(c.GitHub.RefreshPeriod)):
+                       return gitHubVersionReleaseStateValue.Release, nil
+               }
+       }
+
+       ctx, cancel := context.WithCancel(context.Background())
+       defer cancel()
+
+       gitHubClient, err := c.getGitHubClient(ctx)
+       if err != nil {
+               return nil, err
+       }
+
+       release, _, err := gitHubClient.Repositories.GetReleaseByTag(ctx, 
owner, repo, version)
+       if err != nil {
+               return nil, err
+       }
+
+       if err := chezmoi.PersistentStateSet(c.persistentState, 
gitHubVersionReleaseStateBucket, gitHubVersionReleaseKey, 
&gitHubLatestReleaseState{
+               RequestedAt: now,
+               Release:     release,
+       }); err != nil {
+               return nil, err
+       }
+
+       c.gitHub.versionReleaseCache[owner][repo][version] = release
+
+       return release, nil
+}
+
 func (c *Config) gitHubLatestRelease(ownerRepo string) 
(*github.RepositoryRelease, error) {
        owner, repo, err := gitHubSplitOwnerRepo(ownerRepo)
        if err != nil {
@@ -185,6 +256,14 @@
        if err != nil {
                panic(err)
        }
+       return release
+}
+
+func (c *Config) gitHubReleaseTemplateFunc(ownerRepo, version string) 
*github.RepositoryRelease {
+       release, err := c.gitHubRelease(ownerRepo, version)
+       if err != nil {
+               panic(err)
+       }
        return release
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmd/licensecmd.go 
new/chezmoi-2.52.0/internal/cmd/licensecmd.go
--- old/chezmoi-2.51.0/internal/cmd/licensecmd.go       2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/cmd/licensecmd.go       2024-08-07 
22:11:15.000000000 +0200
@@ -4,6 +4,7 @@
        "bytes"
 
        "github.com/charmbracelet/glamour"
+       "github.com/charmbracelet/glamour/styles"
        "github.com/spf13/cobra"
 
        "github.com/twpayne/chezmoi/v2/assets/chezmoi.io/docs"
@@ -27,7 +28,7 @@
 
 func (c *Config) runLicenseCmd(cmd *cobra.Command, args []string) error {
        renderer, err := glamour.NewTermRenderer(
-               glamour.WithStyles(glamour.ASCIIStyleConfig),
+               glamour.WithStyles(styles.ASCIIStyleConfig),
                glamour.WithWordWrap(80),
        )
        if err != nil {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmd/readdcmd.go 
new/chezmoi-2.52.0/internal/cmd/readdcmd.go
--- old/chezmoi-2.51.0/internal/cmd/readdcmd.go 2024-07-15 21:36:30.000000000 
+0200
+++ new/chezmoi-2.52.0/internal/cmd/readdcmd.go 2024-08-07 22:11:15.000000000 
+0200
@@ -4,7 +4,9 @@
        "bytes"
        "fmt"
        "io/fs"
+       "runtime"
        "sort"
+       "time"
 
        "github.com/spf13/cobra"
 
@@ -16,6 +18,23 @@
        recursive bool
 }
 
+// A fileInfo is a simple struct that implements the io/fs.FileInfo interface
+// for the purpose of overriding the mode on Windows.
+type fileInfo struct {
+       name    string
+       size    int64
+       mode    fs.FileMode
+       modTime time.Time
+       isDir   bool
+}
+
+func (fi *fileInfo) Name() string       { return fi.name }
+func (fi *fileInfo) Size() int64        { return fi.size }
+func (fi *fileInfo) Mode() fs.FileMode  { return fi.mode }
+func (fi *fileInfo) ModTime() time.Time { return fi.modTime }
+func (fi *fileInfo) IsDir() bool        { return fi.isDir }
+func (fi *fileInfo) Sys() any           { return nil } // Sys always returns 
nil to avoid any inconsistency.
+
 func (c *Config) newReAddCmd() *cobra.Command {
        reAddCmd := &cobra.Command{
                Use:               "re-add",
@@ -105,8 +124,15 @@
                if err != nil {
                        return err
                }
-               if bytes.Equal(actualContents, targetContents) && 
actualStateFile.Perm() == targetStateFile.Perm(c.Umask) {
-                       continue
+               if bytes.Equal(actualContents, targetContents) {
+                       // On Windows, ignore permission changes as they are 
not preserved
+                       // by the filesystem. On other systems, if there are no 
permission
+                       // changes, continue.
+                       //
+                       // See https://github.com/twpayne/chezmoi/issues/3891.
+                       if runtime.GOOS == "windows" || actualStateFile.Perm() 
== targetStateFile.Perm(c.Umask) {
+                               continue
+                       }
                }
 
                if c.interactive {
@@ -140,6 +166,21 @@
                        }
                }
 
+               // On Windows, as the file mode is not preserved by the 
filesystem, copy
+               // the existing mode from the target file. Hack this in by 
replacing the
+               // io/fs.FileInfo of the destination file with a new 
io/fs.FileInfo with
+               // the mode of the target file.
+               //
+               // See https://github.com/twpayne/chezmoi/issues/3891.
+               if runtime.GOOS == "windows" {
+                       destAbsPathInfo = &fileInfo{
+                               name:    destAbsPathInfo.Name(),
+                               size:    destAbsPathInfo.Size(),
+                               mode:    targetStateFile.Perm(0), // Use the 
mode from the target.
+                               modTime: destAbsPathInfo.ModTime(),
+                       }
+               }
+
                destAbsPathInfos := map[chezmoi.AbsPath]fs.FileInfo{
                        destAbsPath: destAbsPathInfo,
                }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmd/readdcmd_test.go 
new/chezmoi-2.52.0/internal/cmd/readdcmd_test.go
--- old/chezmoi-2.51.0/internal/cmd/readdcmd_test.go    1970-01-01 
01:00:00.000000000 +0100
+++ new/chezmoi-2.52.0/internal/cmd/readdcmd_test.go    2024-08-07 
22:11:15.000000000 +0200
@@ -0,0 +1,40 @@
+package cmd
+
+import (
+       "io/fs"
+       "runtime"
+       "testing"
+
+       "github.com/alecthomas/assert/v2"
+       "github.com/twpayne/go-vfs/v5"
+       "github.com/twpayne/go-vfs/v5/vfst"
+
+       "github.com/twpayne/chezmoi/v2/internal/chezmoitest"
+)
+
+var _ fs.FileInfo = &fileInfo{}
+
+func TestIssue3891(t *testing.T) {
+       if runtime.GOOS != "windows" {
+               t.Skip("Windows only")
+       }
+
+       chezmoitest.WithTestFS(t, map[string]any{
+               "/home/user": map[string]any{
+                       "run.sh": "#!/bin/sh\n",
+                       ".local/share/chezmoi": map[string]any{
+                               "executable_run.sh": "#!/bin/sh",
+                       },
+               },
+       }, func(fileSystem vfs.FS) {
+               assert.NoError(t, newTestConfig(t, 
fileSystem).execute([]string{"re-add"}))
+               vfst.RunTests(t, fileSystem, "",
+                       
vfst.TestPath("/home/user/.local/share/chezmoi/executable_run.sh",
+                               vfst.TestContentsString("#!/bin/sh\n"),
+                       ),
+                       vfst.TestPath("/home/user/.local/share/chezmoi/run.sh",
+                               vfst.TestDoesNotExist(),
+                       ),
+               )
+       })
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmd/statecmd.go 
new/chezmoi-2.52.0/internal/cmd/statecmd.go
--- old/chezmoi-2.51.0/internal/cmd/statecmd.go 2024-07-15 21:36:30.000000000 
+0200
+++ new/chezmoi-2.52.0/internal/cmd/statecmd.go 2024-08-07 22:11:15.000000000 
+0200
@@ -171,14 +171,15 @@
 
 func (c *Config) runStateDumpCmd(cmd *cobra.Command, args []string) error {
        data, err := chezmoi.PersistentStateData(c.persistentState, 
map[string][]byte{
-               "configState":              chezmoi.ConfigStateBucket,
-               "entryState":               chezmoi.EntryStateBucket,
-               "gitHubKeysState":          gitHubKeysStateBucket,
-               "gitHubLatestReleaseState": gitHubLatestReleaseStateBucket,
-               "gitHubReleasesState":      gitHubReleasesStateBucket,
-               "gitHubTagsState":          gitHubTagsStateBucket,
-               "gitRepoExternalState":     chezmoi.GitRepoExternalStateBucket,
-               "scriptState":              chezmoi.ScriptStateBucket,
+               "configState":               chezmoi.ConfigStateBucket,
+               "entryState":                chezmoi.EntryStateBucket,
+               "gitHubKeysState":           gitHubKeysStateBucket,
+               "gitHubLatestReleaseState":  gitHubLatestReleaseStateBucket,
+               "gitHubReleasesState":       gitHubReleasesStateBucket,
+               "gitHubTagsState":           gitHubTagsStateBucket,
+               "gitHubVersionReleaseState": gitHubVersionReleaseStateBucket,
+               "gitRepoExternalState":      chezmoi.GitRepoExternalStateBucket,
+               "scriptState":               chezmoi.ScriptStateBucket,
        })
        if err != nil {
                return err
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/internal/cmd/testdata/scripts/configstate.txtar 
new/chezmoi-2.52.0/internal/cmd/testdata/scripts/configstate.txtar
--- old/chezmoi-2.51.0/internal/cmd/testdata/scripts/configstate.txtar  
2024-07-15 21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/cmd/testdata/scripts/configstate.txtar  
2024-08-07 22:11:15.000000000 +0200
@@ -71,6 +71,7 @@
 gitHubLatestReleaseState: {}
 gitHubReleasesState: {}
 gitHubTagsState: {}
+gitHubVersionReleaseState: {}
 gitRepoExternalState: {}
 scriptState: {}
 -- home/user/.local/share/chezmoi/.chezmoi.toml.tmpl --
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/internal/cmd/testdata/scripts/externalguess.txtar 
new/chezmoi-2.52.0/internal/cmd/testdata/scripts/externalguess.txtar
--- old/chezmoi-2.51.0/internal/cmd/testdata/scripts/externalguess.txtar        
2024-07-15 21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/cmd/testdata/scripts/externalguess.txtar        
2024-08-07 22:11:15.000000000 +0200
@@ -9,10 +9,10 @@
 cmp $HOME/.dir/dir/file golden/dir/file
 
 # test that chezmoi sniffs the format of tar.bz2 files
-exec tar -cjf www/archive.tar.bz2 archive/
-cp www/archive.tar.bz2 www/archive
-exec chezmoi apply --force --refresh-externals
-cmp $HOME/.dir/dir/file golden/dir/file
+[exec:bzip2] exec tar -cjf www/archive.tar.bz2 archive/
+[exec:bzip2] cp www/archive.tar.bz2 www/archive
+[exec:bzip2] exec chezmoi apply --force --refresh-externals
+[exec:bzip2] cmp $HOME/.dir/dir/file golden/dir/file
 
 # test that chezmoi sniffs the format of tar.gz files
 exec tar -czf www/archive.tar.gz archive/
@@ -20,20 +20,18 @@
 exec chezmoi apply --force --refresh-externals
 cmp $HOME/.dir/dir/file golden/dir/file
 
-[!exec:zip] stop 'zip not found in $PATH'
-
 # test that chezmoi sniffs the format of zip files
-exec zip -r www/archive.zip archive
-cp www/archive.zip www/archive
-exec chezmoi apply --force --refresh-externals
-cmp $HOME/.dir/dir/file golden/dir/file
+[exec:zip] exec zip -r www/archive.zip archive
+[exec:zip] cp www/archive.zip www/archive
+[exec:zip] exec chezmoi apply --force --refresh-externals
+[exec:zip] cmp $HOME/.dir/dir/file golden/dir/file
 
 chhome home2/user
 
 # test that chezmoi allows the format to be overridden
-cp www/archive.zip www/archive2.tar.gz
-exec chezmoi apply --force
-cmp $HOME/.dir/dir/file golden/dir/file
+[exec:zip] cp www/archive.zip www/archive2.tar.gz
+[exec:zip] exec chezmoi apply --force
+[exec:zip] cmp $HOME/.dir/dir/file golden/dir/file
 
 -- archive/dir/file --
 # contents of dir/file
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/internal/cmd/testdata/scripts/githubtemplatefuncs.txtar 
new/chezmoi-2.52.0/internal/cmd/testdata/scripts/githubtemplatefuncs.txtar
--- old/chezmoi-2.51.0/internal/cmd/testdata/scripts/githubtemplatefuncs.txtar  
2024-07-15 21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/cmd/testdata/scripts/githubtemplatefuncs.txtar  
2024-08-07 22:11:15.000000000 +0200
@@ -16,9 +16,14 @@
 exec chezmoi execute-template '{{ (index (gitHubTags "twpayne/chezmoi") 
0).Name }}'
 stdout ^v2\.
 
+# test gitHubRelease template function
+exec chezmoi execute-template '{{ (gitHubRelease "twpayne/chezmoi" 
"v2.49.0").TagName }}'
+stdout ^v2\.49\.0
+
+# test gitHubReleaseAssetURL template function
+[!windows] exec chezmoi execute-template '{{ gitHubReleaseAssetURL 
"twpayne/chezmoi" "v2.50.0" (printf "chezmoi-%s-%s" .chezmoi.os .chezmoi.arch) 
}}'
+[!windows] stdout 
https://github.com/twpayne/chezmoi/releases/download/v2\.50\.0/chezmoi-
+
 # test gitHubReleases template functions
 exec chezmoi execute-template '{{ (index (gitHubReleases "twpayne/chezmoi") 
0).TagName }}'
 stdout ^v2\.
-
-# gitHubReleases
-# gitHubTags
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/internal/cmd/testdata/scripts/issue3887.txtar 
new/chezmoi-2.52.0/internal/cmd/testdata/scripts/issue3887.txtar
--- old/chezmoi-2.51.0/internal/cmd/testdata/scripts/issue3887.txtar    
1970-01-01 01:00:00.000000000 +0100
+++ new/chezmoi-2.52.0/internal/cmd/testdata/scripts/issue3887.txtar    
2024-08-07 22:11:15.000000000 +0200
@@ -0,0 +1,21 @@
+[!exec:age] skip 'age not found in path'
+
+mkageconfig
+mkgitconfig
+
+# add an initial encrypted file
+exec chezmoi init
+exec chezmoi add --encrypt ${HOME}${/}.encrypted
+exec chezmoi git add .
+exec chezmoi git commit -- -m 'initial commit' .
+
+# test that chezmoi edit on an encrypted file with no changes does not change 
the ciphertext
+prependline ${CHEZMOICONFIGDIR}/chezmoi.toml 'edit.command = "true"'
+exec chezmoi edit ${HOME}${/}.encrypted
+exec chezmoi diff
+! stdout .
+exec chezmoi git diff
+! stdout .
+
+-- home/user/.encrypted --
+plaintext
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/internal/cmd/testdata/scripts/issue3891.txtar 
new/chezmoi-2.52.0/internal/cmd/testdata/scripts/issue3891.txtar
--- old/chezmoi-2.51.0/internal/cmd/testdata/scripts/issue3891.txtar    
1970-01-01 01:00:00.000000000 +0100
+++ new/chezmoi-2.52.0/internal/cmd/testdata/scripts/issue3891.txtar    
2024-08-07 22:11:15.000000000 +0200
@@ -0,0 +1,10 @@
+[!windows] skip 'Windows only'
+
+# test that chezmoi re-add does not remove the executable_ attribute on Windows
+exec chezmoi apply
+exec chezmoi re-add --debug
+exists $CHEZMOISOURCEDIR/executable_run.sh
+! exists $CHEZMOISOURCEDIR/run.sh
+
+-- home/user/.local/share/chezmoi/executable_run.sh --
+#!/bin/sh
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/internal/cmd/testdata/scripts/state_unix.txtar 
new/chezmoi-2.52.0/internal/cmd/testdata/scripts/state_unix.txtar
--- old/chezmoi-2.51.0/internal/cmd/testdata/scripts/state_unix.txtar   
2024-07-15 21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/cmd/testdata/scripts/state_unix.txtar   
2024-08-07 22:11:15.000000000 +0200
@@ -44,6 +44,7 @@
 gitHubLatestReleaseState: {}
 gitHubReleasesState: {}
 gitHubTagsState: {}
+gitHubVersionReleaseState: {}
 gitRepoExternalState: {}
 scriptState: {}
 -- home/user/.local/share/chezmoi/run_once_script.sh --
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/chezmoi-2.51.0/internal/cmd/testdata/scripts/state_windows.txtar 
new/chezmoi-2.52.0/internal/cmd/testdata/scripts/state_windows.txtar
--- old/chezmoi-2.51.0/internal/cmd/testdata/scripts/state_windows.txtar        
2024-07-15 21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/cmd/testdata/scripts/state_windows.txtar        
2024-08-07 22:11:15.000000000 +0200
@@ -25,6 +25,7 @@
 gitHubLatestReleaseState: {}
 gitHubReleasesState: {}
 gitHubTagsState: {}
+gitHubVersionReleaseState: {}
 gitRepoExternalState: {}
 scriptState: {}
 -- home/user/.local/share/chezmoi/run_once_script.cmd --
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/chezmoi-2.51.0/internal/cmds/lint-whitespace/main.go 
new/chezmoi-2.52.0/internal/cmds/lint-whitespace/main.go
--- old/chezmoi-2.51.0/internal/cmds/lint-whitespace/main.go    2024-07-15 
21:36:30.000000000 +0200
+++ new/chezmoi-2.52.0/internal/cmds/lint-whitespace/main.go    2024-08-07 
22:11:15.000000000 +0200
@@ -18,10 +18,9 @@
                regexp.MustCompile(`\A\.git\z`),
                regexp.MustCompile(`\A\.idea\z`),
                regexp.MustCompile(`\A\.vagrant\z`),
-               regexp.MustCompile(`\A\.venv\z`),
+               regexp.MustCompile(`\b\.?venv\b`),
                regexp.MustCompile(`\A\.vscode\z`),
                regexp.MustCompile(`\ACOMMIT\z`),
-               regexp.MustCompile(`\Aassets/chezmoi\.io/\.venv\z`),
                regexp.MustCompile(`\Aassets/chezmoi\.io/site\z`),
                regexp.MustCompile(`\Aassets/scripts/install\.ps1\z`),
                regexp.MustCompile(`\Acompletions/chezmoi\.ps1\z`),

++++++ chezmoi.obsinfo ++++++
--- /var/tmp/diff_new_pack.dUDvqM/_old  2024-08-09 16:15:36.833310474 +0200
+++ /var/tmp/diff_new_pack.dUDvqM/_new  2024-08-09 16:15:36.837310641 +0200
@@ -1,5 +1,5 @@
 name: chezmoi
-version: 2.51.0
-mtime: 1721072190
-commit: 2a7845f4ffe2fd427c140711c0d7d46424747363
+version: 2.52.0
+mtime: 1723061475
+commit: 64f40d93ea1f1456a6788798b9e9c4813156d86e
 

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

Reply via email to