#!/bin/sh # TODO: Make "command -v " wrapper with support for multiple arguments. # TODO: Create a separate profile in /tmp to install gnupg, git, etc. then delete it when it's over. # TODO: Run guix pull if OPT_UPDATE and if guix chekout is more than some days old, as specified by an environment variable. # TODO: Guix pull on commit specified in package-lists/guix-version? # TODO: On foreign distro, use local package manager to install Guix. (Start with pacman.) # TODO: Test if TTY and set pinentry appropriately without clobbering # ~/.gnupg/gpg-agent.conf # TODO: Make functions to make it easier to re-order calls? HTTPS_ROOT=https://gitlab.com/ SSH_ROOT=git@gitlab.com: ROOT=$HTTPS_ROOT [ -z "$SOURCEDIR" ] && SOURCEDIR="$HOME/personal" [ -z "$XDG_CONFIG_HOME" ] && XDG_CONFIG_HOME="$HOME/.config" [ -z "$XDG_DATA_HOME" ] && XDG_DATA_HOME="$HOME/.local/share" [ -z "$EMACS_MIN_VERSION" ] && EMACS_MIN_VERSION=26 if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then cat <&2 Usage: ${0##*/} Initialize user profile: install packages, set up folders, etc. Options: -u: Skip large updates (packages, emails, etc.) Environment variables: SOURCEDIR=$SOURCEDIR XDG_CONFIG_HOME=$XDG_CONFIG_HOME XDG_DATA_HOME=$XDG_DATA_HOME EMACS_MIN_VERSION=$EMACS_MIN_VERSION Direct link: ${HTTPS_ROOT}ambrevar/dotfiles/raw/master/.local/bin/homeinit EOF exit fi OPT_UPDATE=true if [ "$1" = "-u" ]; then OPT_UPDATE=false shift fi RED='\033[0;31m\033[1m' GREEN='\033[0;32m\033[1m' YELLOW='\033[0;33m\033[1m' BOLD='\033[0m\033[1m' NORMAL='\033[0m' section() { echo -e "$GREEN==> $@$NORMAL" } message() { echo -e "$YELLOW:: $@$NORMAL" } warning() { echo -e "${YELLOW}WARNING:: $@$NORMAL" } ## "ln" wrapper. ## If $2 is a folder, create the link in it using the basename of $1. ## Existing files are no clobbered, unless they already are a symlink. lnn() { # $1=TARGET $2=LINK|FOLDER if [ -d "$2" ]; then set -- "$1" "$2/$(basename "$1")" fi if [ ! -e "$2" ] || [ -h "$2" ]; then ln -svnf "$1" "$2" fi } ################################################################################ # section "Initial packages" if command -v guix >/dev/null 2>&1; then ## TODO: Should openssh be an input of Git? guix package --install openssh gnupg git stow password-store elif command -v pacman >/dev/null 2>&1; then sudo pacman --noconfirm -S --needed openssh gnupg git stow password-store fi section "GPG" if [ -d ~/.gnupg ]; then ROOT=$SSH_ROOT ## Set up gpg-agent to authenticate to SSH_ROOT. chmod go-rwx ~/.gnupg ~/.gnupg/* export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket) guix package -i pinentry-tty gpg-connect-agent updatestartuptty /bye if [ -e "$SOURCEDIR" ]; then git -C "$SOURCEDIR" pull else git clone ${SSH_ROOT}Ambrevar/personal fi if [ -e ~/.password-store ]; then git -C ~/.password-store pull else git clone ${SSH_ROOT}Ambrevar/password-store ~/.password-store ## The following is necessary to make sure the 'diff' GPG filter is properly set up. pass git init fi else warning "~/.gnupg not found." fi section "Persistent folders" for i in .config .emacs.d .local/share projects temp; do mkdir -pv "$HOME/$i" done section "dotfiles" if [ -e ~/dotfiles ]; then git -C ~/dotfiles remote set-url origin ${ROOT}Ambrevar/dotfiles git -C ~/dotfiles pull else git clone ${ROOT}Ambrevar/dotfiles fi pushd ~/dotfiles ## .bash_profile may prevent .profile from being parsed, so we remove it. [ -e ~/.bash_profile ] && mv -v ~/.bash_profile ~/.bash_profile.old stow -v . || exit 1 popd section "System packages" if command -v guix >/dev/null 2>&1; then ## TODO: The manifest will uninstall other unspecified packages. Is this ## really what we want? export GUIX_PACKAGE_PATH=$HOME/.guix-packages guix package --manifest=$HOME/.package-lists/guix-manifest.scm --keep-failed elif command -v pacman >/dev/null 2>&1; then pacman_list="" if [ -f ~/.package-lists/arch-official ]; then pacman_list="$(cat ~/.package-lists/arch-official)" fi sudo pacman --noconfirm -S --needed base base-devel $pacman_list if ! command -v cower >/dev/null 2>&1; then mkdir -p /tmp/cower pushd /tmp/cower curl https://aur.archlinux.org/cgit/aur.git/plain/PKGBUILD?h=cower > PKGBUILD makepkg --noconfirm -si popd fi if ! command -v pacaur >/dev/null 2>&1; then mkdir -p /tmp cower -d pacaur pushd /tmp/pacaur makepkg --noconfirm -si popd fi if $OPT_UPDATE && [ -f ~/.package-lists/arch-aur ]; then pacaur --noconfirm --noedit -y --needed "$(cat ~/.package-lists/arch-aur)" fi pacman_list=$(pacman -Qdtq) if [ -n "$pacman_list" ]; then sudo pacman --noconfirm -Rs "$pacman_list" fi fi section "Bookmarks" if command -v qutebrowser >/dev/null 2>&1; then mkdir -pv "$XDG_CONFIG_HOME/qutebrowser/bookmarks" lnn "$SOURCEDIR/bookmarks/bookmarks" "$XDG_CONFIG_HOME/qutebrowser/bookmarks/urls" lnn "$SOURCEDIR/bookmarks/quickmarks" "$XDG_CONFIG_HOME/qutebrowser/" fi section "Emacs" if ! command -v emacs >/dev/null 2>&1 || \ [ $(emacs --quick --batch --eval '(message "%s" emacs-major-version)' 2>&1) -lt $EMACS_MIN_VERSION ]; then message "Emacs: Installing latest development version" pushd "$HOME/projects" [ -e emacs ] || git clone https://git.savannah.gnu.org/git/emacs.git mkdir -pv ../emacs-build cd ../emacs-build ../emacs/configure \ --disable-gtk-deprecation-warnings \ --without-pop \ --without-kerberos \ --without-kerberos5 \ --with-x-toolkit=gtk3 \ --with-jpeg \ --with-tiff \ --with-gif \ --with-png \ --with-rsvg \ --with-xml2 \ --with-imagemagick \ --with-xft \ --with-libotf \ --without-gsettings \ --without-gconf \ --with-gnutls \ --with-modules \ --with-threads sudo make install popd fi if command -v emacs >/dev/null 2>&1; then message "Emacs cache folder" mkdir -pv "$HOME/.cache/emacs/" if ! command -v guix >/dev/null 2>&1; then if $OPT_UPDATE; then message "Emacs ELPA packages" yes | emacs --batch -l ~/.emacs.d/init.el --eval '(progn (package-refresh-contents) (package-install-selected-packages))' fi fi message "Emacs local packages" if [ -e ~/.local/share/emacs/site-lisp ]; then for i in ~/.local/share/emacs/site-lisp/*; do echo "$i" git -C "$i" pull done else mkdir -pv ~/.local/share/emacs/site-lisp fi fi section "locate db" if [ -x ~/.local/bin/updatedb-local ]; then ~/.local/bin/updatedb-local fi section "Mail" lnn "$SOURCEDIR/mail/mbsyncrc" "$HOME/.mbsyncrc" lnn "$SOURCEDIR/mail/authinfo.gpg" "$HOME/.authinfo.gpg" mkdir -pv "$HOME/.cache/mail/" while IFS= read -r i; do ## Warning: We need to eval here to expand the "~". mkdir -pv $(eval echo $i) done <