diff --git a/.local/share/fonts/GALLAUDET.ttf b/.local/share/fonts/GALLAUDET.ttf
new file mode 100644
index 00000000..dba6a281
Binary files /dev/null and b/.local/share/fonts/GALLAUDET.ttf differ
diff --git a/.local/share/fonts/IntelOneMono-Bold.ttf b/.local/share/fonts/IntelOneMono-Bold.ttf
new file mode 100644
index 00000000..b0b38b4c
Binary files /dev/null and b/.local/share/fonts/IntelOneMono-Bold.ttf differ
diff --git a/.local/share/fonts/IntelOneMono-BoldItalic.ttf b/.local/share/fonts/IntelOneMono-BoldItalic.ttf
new file mode 100644
index 00000000..b7e230c9
Binary files /dev/null and b/.local/share/fonts/IntelOneMono-BoldItalic.ttf differ
diff --git a/.local/share/fonts/IntelOneMono-Italic.ttf b/.local/share/fonts/IntelOneMono-Italic.ttf
new file mode 100644
index 00000000..5bf56f47
Binary files /dev/null and b/.local/share/fonts/IntelOneMono-Italic.ttf differ
diff --git a/.local/share/fonts/IntelOneMono-Light.ttf b/.local/share/fonts/IntelOneMono-Light.ttf
new file mode 100644
index 00000000..7c8319fa
Binary files /dev/null and b/.local/share/fonts/IntelOneMono-Light.ttf differ
diff --git a/.local/share/fonts/IntelOneMono-LightItalic.ttf b/.local/share/fonts/IntelOneMono-LightItalic.ttf
new file mode 100644
index 00000000..8b93c29d
Binary files /dev/null and b/.local/share/fonts/IntelOneMono-LightItalic.ttf differ
diff --git a/.local/share/fonts/IntelOneMono-Medium.ttf b/.local/share/fonts/IntelOneMono-Medium.ttf
new file mode 100644
index 00000000..4edc9f76
Binary files /dev/null and b/.local/share/fonts/IntelOneMono-Medium.ttf differ
diff --git a/.local/share/fonts/IntelOneMono-MediumItalic.ttf b/.local/share/fonts/IntelOneMono-MediumItalic.ttf
new file mode 100644
index 00000000..f1a7d189
Binary files /dev/null and b/.local/share/fonts/IntelOneMono-MediumItalic.ttf differ
diff --git a/.local/share/fonts/IntelOneMono-Regular.ttf b/.local/share/fonts/IntelOneMono-Regular.ttf
new file mode 100644
index 00000000..386b9acc
Binary files /dev/null and b/.local/share/fonts/IntelOneMono-Regular.ttf differ
diff --git a/.local/share/fonts/OpenGorton-Bold.otf b/.local/share/fonts/OpenGorton-Bold.otf
new file mode 100644
index 00000000..e3cc07a0
Binary files /dev/null and b/.local/share/fonts/OpenGorton-Bold.otf differ
diff --git a/.local/share/fonts/OpenGorton-Regular.otf b/.local/share/fonts/OpenGorton-Regular.otf
new file mode 100644
index 00000000..f4e08078
Binary files /dev/null and b/.local/share/fonts/OpenGorton-Regular.otf differ
diff --git a/.local/share/fonts/RobotoMono-Italic-VariableFont_wght.ttf b/.local/share/fonts/RobotoMono-Italic-VariableFont_wght.ttf
new file mode 100644
index 00000000..1a4d6948
Binary files /dev/null and b/.local/share/fonts/RobotoMono-Italic-VariableFont_wght.ttf differ
diff --git a/.local/share/fonts/RobotoMono-VariableFont_wght.ttf b/.local/share/fonts/RobotoMono-VariableFont_wght.ttf
new file mode 100644
index 00000000..fc02de43
Binary files /dev/null and b/.local/share/fonts/RobotoMono-VariableFont_wght.ttf differ
diff --git a/.local/share/fonts/code128.ttf b/.local/share/fonts/code128.ttf
new file mode 100644
index 00000000..92466dcb
Binary files /dev/null and b/.local/share/fonts/code128.ttf differ
diff --git a/install.sh b/install.sh
index d94b6e40..b1cd40a2 100755
--- a/install.sh
+++ b/install.sh
@@ -30,7 +30,11 @@ PERSONAL_FILES=(
.zprofile .zshenv .zshrc
)
-# Directories deployed wholesale to $HOME/
/.
+# Directories whose contents are merged into $HOME//, 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/ 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/ to $HOME/. 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/ 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