With V2.63.2, ToStrings Is Not Working With List Of Path
With v2.63.2, toStrings
is not working with list of path
Describe the Bug
With the latest version 2.62.3, a template is generating a wrong output compared to the previous version. The issue arises from the use of toStrings
function in the template. The template is supposed to generate a list of paths joined by a colon, but instead, it's producing a single path with the entire list of paths concatenated together.
Below is the snippet from the @twpayne
config that's causing the issue:
# If you come from bash you might have to change your $PATH.
{{- $paths := list }}
{{- $homeDir := .chezmoi.homeDir }}
{{- range $_, $relPath := list "bin" "go/bin" ".cargo/bin" ".local/bin" }}
{{ $path := joinPath $homeDir $relPath }}
{{- if stat $path }}
{{- $paths = mustAppend $paths $path }}
{{- end }}
{{- end }}
{{- if $paths }}
export PATH={{ toStrings $paths | join ":" }}:$PATH
{{- end }}
The expected behavior is that the toStrings
function should convert the list of paths into a string, and then join them with a colon. However, the actual output is a single path with the entire list of paths concatenated together.
Expected Behavior
The expected behavior is that the toStrings
function should correctly convert the list of paths into a string, and then join them with a colon. The output should be a list of paths joined by a colon, like this:
export PATH=/Users/ds/.cargo/bin:/Users/ds/.local/bin:$PATH
Output of Command with the --verbose
Flag
$ chezmoi --verbose $COMMAND
This command is used to enable verbose mode, which provides more detailed output. However, in this case, the output is not relevant to the issue at hand.
Output of chezmoi doctor
$ chezmoi doctor
RESULT CHECK MESSAGE
ok version v2.62.3, commit 803db0df6fd7108be0a81bbee4fb06f17e3d972c, built at 2025-05-06T21:11:19Z, built by Homebrew
ok latest-version v2.62.3
ok os-arch darwin/arm64
ok uname Darwin artemis.lan 24.4.0 Darwin Kernel Version 24.4.0: Wed Mar 19 21:18:03 PDT 2025; root:xnu-11417.101.15~1/RELEASE_ARM64_T8112 arm64
ok go-version go1.24.3 (gc)
ok executable /opt/homebrew/bin/chezmoi
ok upgrade-method brew-upgrade
ok config-file found ~/.config/chezmoi/chezmoi.toml, last modified 2025-04-23T21:34:40-04:00
warning source-dir ~/.local/share/chezmoi is a git working tree (dirty)
ok suspicious-entries no suspicious entries
warning working-tree local/share/chezmoi is a git working tree (dirty)
ok dest-dir ~ is a directory
ok umask 022
ok cd-command found /bin/zsh
ok cd-args /bin/zsh
info diff-command not set
ok edit-command found /opt/homebrew/bin/nvim
ok edit-args /opt/homebrew/bin/nvim
ok git-command found /usr/bin/git, version 2.39.5
ok merge-command found /usr/bin/vimdiff
ok shell-command found /bin/zsh
ok shell-args /bin/zsh
ok age-command found /opt/homebrew/bin/age, version 1.2.1
info gpg-command gpg not found in $PATH
info pinentry-command not set
info 1password-command op not found in $PATH
info bitwarden-command bw not found in $PATH
info bitwarden-secrets-command bws not found in $PATH
info dashlane-command dcli not found in $PATH
info doppler-command doppler not found in $PATH
info gopass-command gopass not found in $PATH
info keepassxc-command keepassxc-cli not found in $PATH
info keepassxc-db not set
info keeper-command keeper not found in $PATH
info lastpass-command lpass not found in $PATH
info pass-command pass not found in $PATH
info passhole-command ph not found in $PATH
info rbw-command rbw not found in $PATH
info vault-command vault not found in $PATH
info vlt-command vlt not found in $PATH
info secret-command not set
Solution
The issue is caused by the toStrings
function not being able to handle the list of paths correctly. To fix this issue, we need to modify the template to use the join
function instead of toStrings
. Here's the modified template:
# If you come from bash you might have to change your $PATH.
{{- $paths := list }}
{{- $homeDir := .chezmoi.homeDir }}
{{- range $_, $relPath := list "bin" "go/bin" ".cargo/bin" ".local/bin" }}
{{ $path := joinPath $homeDir $relPath }}
{{- if stat $path }}
{{- $paths = mustAppend $paths $path }}
{{- end }}
{{- end }}
{{- if $paths }}
export PATH={{ join $paths ":" }}:$PATH
{{- end }}
By using the join
function, we can correctly join the list of paths with a colon. This should fix the issue and produce the expected output.
With v2.63.2, toStrings
is not working with list of path: Q&A
Q: What is the issue with toStrings
in v2.63.2?
A: The issue is that toStrings
is not correctly handling the list of paths, resulting in a single path with the entire list of paths concatenated together.
Q: What is the expected behavior of toStrings
?
A: The expected behavior of toStrings
is to correctly convert the list of paths into a string, and then join them with a colon.
Q: How can I fix the issue with toStrings
?
A: To fix the issue, you can modify the template to use the join
function instead of toStrings
. Here's an example of the modified template:
# If you come from bash you might have to change your $PATH.
{{- $paths := list }}
{{- $homeDir := .chezmoi.homeDir }}
{{- range $_, $relPath := list "bin" "go/bin" ".cargo/bin" ".local/bin" }}
{{ $path := joinPath $homeDir $relPath }}
{{- if stat $path }}
{{- $paths = mustAppend $paths $path }}
{{- end }}
{{- end }}
{{- if $paths }}
export PATH={{ join $paths ":" }}:$PATH
{{- end }}
Q: What is the difference between toStrings
and join
?
A: toStrings
is a function that converts a list of strings into a single string, while join
is a function that joins a list of strings with a specified separator.
Q: Can I use toStrings
with a list of paths?
A: No, toStrings
is not designed to handle lists of paths correctly. It's recommended to use the join
function instead.
Q: How can I troubleshoot the issue with toStrings
?
A: To troubleshoot the issue, you can try enabling verbose mode with the --verbose
flag and check the output for any errors or warnings.
Q: Is this issue specific to v2.63.2?
A: No, this issue is not specific to v2.63.2. It's a general issue with the toStrings
function and can occur in any version of the software.
Q: Can I report this issue to the developers?
A: Yes, you can report this issue to the developers by opening a new issue on the project's issue tracker. Be sure to include a clear description of the issue and any relevant code or logs.
Q: How can I prevent this issue in the future?
A: To prevent this issue in the future, you can use the join
function instead of toStrings
when working with lists of paths. Additionally, you can keep your software up to date by regularly checking for updates and patches.