updatedb refuses to run at all on a config that defines a variable twice
("variable `PRUNEPATHS' was already defined"), so any rewrite that misses
an existing line and appends a second one takes the locate index down
rather than fixing it. Two shapes updatedb accepts got missed: a trailing
comment after the value, and a setting indented by whitespace.
Read the existing paths out of the quoted value and write the whole
setting back canonically instead of splicing into a line of unknown
shape. Quotes are not optional to updatedb ("value in quotes expected
after `='"), so a bare value is already a broken config: rewriting it
quoted repairs the file as a side effect.
The tests now hand every rewritten file to the real parser through
`updatedb --config-file`, which is what caught this.
Read the Snapper config as root when the running user cannot read it.
snapper create-config leaves the config root-only, and a config the user
cannot read was passing for one that wants its timeline snapshots kept.
Report the snapshots the drain could not delete. omarchy-migrate writes
the completion marker whether or not the batches succeeded, so there is
no later run to pick up the remainder, whatever the comment claimed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
33 lines
1.6 KiB
Bash
33 lines
1.6 KiB
Bash
UPDATEDB_CONF_PATH="${OMARCHY_UPDATEDB_CONF_PATH:-/etc/updatedb.conf}"
|
|
|
|
echo "Configuring locate to skip Btrfs snapshots and index Btrfs subvolumes"
|
|
|
|
[[ -f $UPDATEDB_CONF_PATH ]] || exit 0
|
|
|
|
# updatedb refuses to run at all on a config that defines a variable twice, so
|
|
# every setting here is rewritten where it already stands and only appended
|
|
# when the file has no line for it.
|
|
|
|
# Btrfs subvolume mounts (like /home) look like bind mounts, so pruning
|
|
# bind mounts leaves them out of the index entirely.
|
|
if grep -qE '^[[:space:]]*PRUNE_BIND_MOUNTS[[:space:]]*=' "$UPDATEDB_CONF_PATH"; then
|
|
sed -i -E 's|^[[:space:]]*PRUNE_BIND_MOUNTS[[:space:]]*=.*|PRUNE_BIND_MOUNTS = "no"|' "$UPDATEDB_CONF_PATH"
|
|
else
|
|
printf '%s\n' 'PRUNE_BIND_MOUNTS = "no"' >>"$UPDATEDB_CONF_PATH"
|
|
fi
|
|
|
|
# Snapper snapshots are nested subvolumes reached by plain directory
|
|
# traversal, so without this updatedb indexes the system once per snapshot.
|
|
if grep -qE '^[[:space:]]*PRUNEPATHS[[:space:]]*=' "$UPDATEDB_CONF_PATH"; then
|
|
# updatedb only accepts quoted values and allows a comment after them. Read
|
|
# back what the machine already prunes and write the whole setting out again
|
|
# rather than splicing into a line of unknown shape.
|
|
pruned=$(sed -nE 's|^[[:space:]]*PRUNEPATHS[[:space:]]*=[[:space:]]*"([^"]*)".*|\1|p' "$UPDATEDB_CONF_PATH" | tail -n 1)
|
|
|
|
if [[ " $pruned " != *" /.snapshots "* ]]; then
|
|
sed -i -E "s|^[[:space:]]*PRUNEPATHS[[:space:]]*=.*|PRUNEPATHS = \"/.snapshots${pruned:+ $pruned}\"|" "$UPDATEDB_CONF_PATH"
|
|
fi
|
|
else
|
|
printf '%s\n' 'PRUNEPATHS = "/.snapshots"' >>"$UPDATEDB_CONF_PATH"
|
|
fi
|