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