Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5bed5f7746 | |||
| 59a5c0bbf8 |
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1
-1
@@ -126,4 +126,4 @@
|
||||
# http://gitfu.wordpress.com/2008/04/20/git-rerere-rereremember-what-you-did-last-time/
|
||||
enabled = true
|
||||
[include]
|
||||
path = .gitconfig.user
|
||||
path = ~/.gitconfig.user
|
||||
|
||||
+74
-14
@@ -30,7 +30,11 @@ PERSONAL_FILES=(
|
||||
.zprofile .zshenv .zshrc
|
||||
)
|
||||
|
||||
# Directories deployed wholesale to $HOME/<dir>/.
|
||||
# Directories whose contents are merged into $HOME/<dir>/, file by file. Files
|
||||
# the repo provides replace conflicting on-disk versions (with the displaced
|
||||
# version preserved in $BACKUP_DIR); files outside the repo's tree are left
|
||||
# untouched. This deliberately avoids wholesale-replacing $HOME/.local etc.,
|
||||
# which would sweep away unrelated user data (fonts, app state, ...).
|
||||
PERSONAL_DIRS=(
|
||||
.fonts .irssi .nano .themes .local .mplayer
|
||||
)
|
||||
@@ -83,31 +87,80 @@ else
|
||||
fi
|
||||
|
||||
# 3. Deploy personal dotfiles
|
||||
backup_one() {
|
||||
local src_name="$1"
|
||||
local dst="$HOME/$src_name"
|
||||
|
||||
# Move $HOME/<rel> aside into $BACKUP_DIR, preserving its sub-path.
|
||||
backup_one_path() {
|
||||
local rel="$1"
|
||||
local dst="$HOME/$rel"
|
||||
if [ -e "$dst" ] || [ -L "$dst" ]; then
|
||||
mkdir -p "$BACKUP_DIR/$(dirname "$src_name")"
|
||||
mv "$dst" "$BACKUP_DIR/$src_name"
|
||||
mkdir -p "$BACKUP_DIR/$(dirname "$rel")"
|
||||
mv "$dst" "$BACKUP_DIR/$rel"
|
||||
fi
|
||||
}
|
||||
|
||||
deploy_one() {
|
||||
local name="$1"
|
||||
local src="$YADR_DIR/$name"
|
||||
local dst="$HOME/$name"
|
||||
# Returns 0 iff $1 and $2 are equivalent (same symlink target, or identical
|
||||
# regular-file content). Used to make re-runs idempotent: unchanged files get
|
||||
# skipped instead of needlessly backed up.
|
||||
paths_equivalent() {
|
||||
local a="$1" b="$2"
|
||||
if [ -L "$a" ] && [ -L "$b" ]; then
|
||||
[ "$(readlink "$a")" = "$(readlink "$b")" ]
|
||||
elif [ -L "$a" ] || [ -L "$b" ]; then
|
||||
return 1
|
||||
elif [ -f "$a" ] && [ -f "$b" ]; then
|
||||
cmp -s "$a" "$b"
|
||||
else
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Deploy one file or symlink at $YADR_DIR/<rel> to $HOME/<rel>. If a different
|
||||
# file/symlink is already at the destination, it's moved into $BACKUP_DIR first.
|
||||
deploy_file() {
|
||||
local rel="$1"
|
||||
local src="$YADR_DIR/$rel"
|
||||
local dst="$HOME/$rel"
|
||||
if [ ! -e "$src" ] && [ ! -L "$src" ]; then
|
||||
return
|
||||
fi
|
||||
backup_one "$name"
|
||||
if paths_equivalent "$src" "$dst"; then
|
||||
return
|
||||
fi
|
||||
backup_one_path "$rel"
|
||||
mkdir -p "$(dirname "$dst")"
|
||||
cp -a "$src" "$dst"
|
||||
info "$name"
|
||||
info "$rel"
|
||||
}
|
||||
|
||||
# Deploy a directory by walking its tree and deploying each file/symlink in
|
||||
# turn. Directories get mkdir'd; existing entries inside $HOME/<rel> that the
|
||||
# repo doesn't know about are left alone. This is the merge semantics that
|
||||
# protects e.g. $HOME/.local/share/fonts from being clobbered when the repo
|
||||
# only tracks $HOME/.local/bin.
|
||||
deploy_dir() {
|
||||
local rel="$1"
|
||||
local src="$YADR_DIR/$rel"
|
||||
if [ ! -d "$src" ] || [ -L "$src" ]; then
|
||||
return
|
||||
fi
|
||||
mkdir -p "$HOME/$rel"
|
||||
local sub sub_rel src_path
|
||||
while IFS= read -r -d '' sub; do
|
||||
sub="${sub#./}"
|
||||
[ "$sub" = "." ] && continue
|
||||
sub_rel="$rel/$sub"
|
||||
src_path="$YADR_DIR/$sub_rel"
|
||||
if [ -d "$src_path" ] && [ ! -L "$src_path" ]; then
|
||||
mkdir -p "$HOME/$sub_rel"
|
||||
continue
|
||||
fi
|
||||
deploy_file "$sub_rel"
|
||||
done < <(cd "$src" && find . -mindepth 1 -print0)
|
||||
}
|
||||
|
||||
log "Deploying personal dotfiles"
|
||||
for f in "${PERSONAL_FILES[@]}"; do deploy_one "$f"; done
|
||||
for d in "${PERSONAL_DIRS[@]}"; do deploy_one "$d"; done
|
||||
for f in "${PERSONAL_FILES[@]}"; do deploy_file "$f"; done
|
||||
for d in "${PERSONAL_DIRS[@]}"; do deploy_dir "$d"; done
|
||||
|
||||
# .local/bin/claude is a relative symlink to ../share/claude/versions/...
|
||||
# If that target isn't present on this machine, remove the dangling link so
|
||||
@@ -137,6 +190,13 @@ if [ -d "$HOME/.local/bin" ]; then
|
||||
find "$HOME/.local/bin" -maxdepth 1 -type f -exec chmod +x {} \; 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# 5. Refresh font cache so newly-deployed .fonts/ and .local/share/fonts/
|
||||
# entries are visible to apps without a logout/login.
|
||||
if have fc-cache; then
|
||||
log "Refreshing font cache"
|
||||
fc-cache -f >/dev/null 2>&1 || warn "fc-cache returned non-zero; continuing"
|
||||
fi
|
||||
|
||||
echo
|
||||
log "Done."
|
||||
if [ -d "$BACKUP_DIR" ]; then
|
||||
|
||||
Reference in New Issue
Block a user