Skip to content

Commit

Permalink
fix(chezmoi): chezmoi-update.service fails when dotfiles have changed (
Browse files Browse the repository at this point in the history
  • Loading branch information
fiftydinar authored May 9, 2024
2 parents 99235ba + d1ff4ad commit c3084ad
Showing 3 changed files with 31 additions and 2 deletions.
9 changes: 9 additions & 0 deletions modules/chezmoi/README.md
Original file line number Diff line number Diff line change
@@ -6,6 +6,15 @@ Each feature can be enabled or disabled individually.
Installation of the `chezmoi` binary happens at build time and is done by downloading the `amd64` binary from the latest release to `/usr/bin/chezmoi`.
This can be disabled by setting `install` to false. (defaults: true)

Choose how `chezmoi` handles changed files with `changed-file-policy`.
The following values are valid:
`"skip"` Will not take any action if the file has changed from what is in your dotfiles repository.
This executes `chezmoi update --no-tty --keep-going` under the hood.
`"replace"` Will overwrite the file if it has changed from what is in your dotfiles repository.
This executes `chezmoi update --no-tty --force` under the hood.

See `chezmoi`s documentation for [`--no-tty`](https://www.chezmoi.io/reference/command-line-flags/global/#-no-tty), [`--keep-going`](https://www.chezmoi.io/reference/command-line-flags/global/#-k-keep-going) and [`--force`](https://www.chezmoi.io/reference/command-line-flags/global/#-force) for details.

A systemd user service is installed that will initialize a `chezmoi` repository on chezmoi's default path (`~/.local/share/chezmoi`) for any user when it logs in, or at boot if it has lingering enabled.
The service will only run if `~/.local/share/chezmoi` does not exist.
Set `repository` to the URL of your dotfiles repository. (eg. `repository: https://example.org/user/dotfiles`)
22 changes: 20 additions & 2 deletions modules/chezmoi/chezmoi.sh
Original file line number Diff line number Diff line change
@@ -10,7 +10,7 @@ set -euo pipefail
# -u = Treat unset variables as errors. Useful for spotting typos.
# -x = Show expanded input for conditional statements.
DEBUG=false
if [[ $DEBUG ]]; then
if [[ $DEBUG == true ]]; then
echo "Running in debug mode. If you didn't enable this yourself, this is a bug."
set -vux
fi
@@ -66,6 +66,24 @@ if [[ -z $DISABLE_UPDATE || $DISABLE_UPDATE == "null" ]]; then
DISABLE_UPDATE=false
fi

# Determines how chezmoi handles duplicate files. (default: "skip")
# "skip" will not replace files that have changed.
# "replace" will overwrite all files that have changed.
CHANGED_FILE_POLICY=$(echo "$1" | yq -I=0 ".changed-file-policy") # (string)
if [[ -z $CHANGED_FILE_POLICY || $CHANGED_FILE_POLICY == "null" ]]; then
CHANGED_FILE_POLICY="skip"
fi

if [[ $CHANGED_FILE_POLICY == "skip" ]]; then
CHANGED_FILE_POLICY_FLAGS="--no-tty --keep-going"
elif [[ $CHANGED_FILE_POLICY == "replace" ]]; then
CHANGED_FILE_POLICY_FLAGS="--no-tty --force"
else
echo "ERROR: 'duplicate-file-policy' has an invalid value."
echo "Only \"skip\" or \"replace\" are acceptable values"
exit 1
fi

echo "Checking for conflicting arguments"
if [[ (-z $DOTFILE_REPOSITORY || $DOTFILE_REPOSITORY == "null") && $DISABLE_INIT == false ]]; then
echo "ERROR: Invalid Config: 'repository' is not set, but initialization is not disabled."
@@ -117,7 +135,7 @@ if [[ $DISABLE_UPDATE == false ]]; then
Description=Chezmoi Update
[Service]
ExecStart=/usr/bin/chezmoi update
ExecStart=/usr/bin/chezmoi update ${CHANGED_FILE_POLICY_FLAGS}
Type=oneshot
EOF

2 changes: 2 additions & 0 deletions modules/chezmoi/module.yml
Original file line number Diff line number Diff line change
@@ -17,3 +17,5 @@ example: |
disable_init: false # Optional - Default: false - Expects type: boolean
# Disable the timer that updates chezmoi with the interval set above
disable_update: false # Optional - Default: false - Expects type: boolean
# Policy for handling file that has changed on disk compared to your repo. Accepts "skip" or "replace"
changed-file-policy: "skip" # Optional - Default: "skip" - Expects type: string

0 comments on commit c3084ad

Please sign in to comment.