#+title: Install Script This can be run as =./install=, so make it explicit what binary to run it with (POSIX shell). #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes #!/bin/sh #+end_src Save the old log file. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes mv ~/.update-home.log ~/.update-home.log.old #+end_src Install the dotfiles repository at =~/.dotfiles= if it doesn't already exist. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes if ! test -d ~/.dotfiles; then echo Installing dotfiles... git clone git@git.sr.ht:~jjanzen/.dotfiles ~/.dotfiles >> ~/.update-home.log fi #+end_src POSIX shell doesn't have =pushd= and =popd=. We do it manually by saving the current path before moving to =~/.dotfiles=. Exit if the =cd= call fails (it shouldn't). #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes CWD=$(pwd) cd ~/.dotfiles || exit #+end_src Stash any existing changes before moving to the main branch and pulling any new changes from the remote. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes { git stash git checkout main git pull --rebase } >> ~/.update-home.log #+end_src If the =update-home= executable has changed, replace it and bootstrap into the new one. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes if ! diff ~/.dotfiles/install ~/.local/bin/update-home >> ~/.update-home.log; then cp ~/.dotfiles/install ~/.local/bin/update-home || exit 1 echo Changes have been made to the install script. echo Running the new install script. ~/.local/bin/update-home exit fi #+end_src Extract each configuration file from its literate =.org= file into its correct location by running =org-babel-tangle= on each =.org= file. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes echo Installing configuration files... find -- . -type f -name "*.org" | while read -r file; do emacs --batch "${file}" -f package-initialize --eval '(org-babel-tangle)' >> ~/.update-home.log done #+end_src Install the [[./wallpaper.png][wallpaper]] file. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes echo Installing wallpaper... cp wallpaper.png ~/.wallpaper #+end_src Install any missing fonts by extracting the corresponding =tar.gz= archive. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes fonts_changed=false if ! test -d ~/.local/share/fonts/ComputerModern; then echo Computer Modern font missing. Installing... tar xf ~/.dotfiles/local/share/fonts/ComputerModern.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log fonts_changed=true fi if ! test -f ~/.local/share/fonts/NFM.ttf; then echo Nerd Font Mono font missing. Installing... tar xf ~/.dotfiles/local/share/fonts/NFM.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log fonts_changed=true fi if ! test -d ~/.local/share/fonts/SauceCodePro; then echo Source Code Pro Nerd Font missing. Installing... tar xf ~/.dotfiles/local/share/fonts/SauceCodePro.tar.gz -C ~/.local/share/fonts >> ~/.update-home.log fonts_changed=true fi #+end_src If any missing fonts were installed, update the font cache. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes if [ $fonts_changed = true ]; then echo Updating the font cache... fc-cache -f >> ~/.update-home.log fi #+end_src Move the user back to where they came from. #+begin_src sh :tangle ~/.dotfiles/install :mkdirp yes cd "${CWD}" || exit #+end_src