#!/bin/bash # # This script can be "curl-piped" into bash to bootstrap a dotfiles repo when # yadm is not locally installed. Read below for instructions. # # DISCLAIMER: In general, I would advise against piping someone's code directly # from the Internet into an interpreter (like Bash). You should # probably review any code like this prior to executing it. I leave # it to you to decide if this is risky behavior or not. The main # reason this script exists is because I find it to be a pragmatic # way to bootstrap my dotfiles, and install yadm in one step # (allowing the yadm project to be a submodule of my dotfiles # repo). # # Invoke with: # # curl -fsSL 'https://tinyurl.com/yadm-bootstrap' | bash # # OR # # curl -fsSL 'https://github.com/TheLocehiliosan/yadm/raw/master/bootstrap' | bash [-s -- REPO_URL [YADM_RELEASE]] YADM_REPO="https://github.com/TheLocehiliosan/yadm" YADM_RELEASE="master" REPO_URL="" function yadm() { if command -v which >/dev/null 2>&1 && which yadm >/dev/null 2>&1; then echo "Found yadm installed locally, removing remote yadm() function" unset -f yadm command yadm "$@" else echo WARNING: Using yadm remotely. You should install yadm locally. curl -fsSL "$YADM_REPO/raw/$YADM_RELEASE/yadm" | bash -s -- "$@" fi } export -f yadm # if being sourced, return here, otherwise continue processing return 2>/dev/null unset -f yadm function remote_yadm() { curl -fsSL "$YADM_REPO/raw/$YADM_RELEASE/yadm" | bash -s -- "$@" } function ask_about_source() { if ! command -v yadm >/dev/null 2>&1; then echo echo "***************************************************" echo "yadm is NOT currently installed." echo "You should install it locally, this link may help:" echo "https://thelocehiliosan.github.io/yadm/docs/install" echo "***************************************************" echo echo "If installation is not possible right now, you can temporarily \"source\"" echo "in a yadm() function which fetches yadm remotely each time it is called." echo echo " source <(curl -fsSL '$YADM_REPO/raw/$YADM_RELEASE/bootstrap')" echo fi } function build_url() { echo "No repo URL provided." echo echo "Where is your repo?" echo echo " 1. GitHub" echo " 2. Bitbucket" echo " 3. GitLab" echo " 4. Other" echo read -r -p "Where is your repo? (1/2/3/4) ->" choice < /dev/tty case $choice in 1) REPO_URL="https://github.com/" ;; 2) REPO_URL="https://bitbucket.org/" ;; 3) REPO_URL="https://gitlab.com/" ;; *) echo echo Please specify the full URL of your dotfiles repo read -r -p "URL ->" choice < /dev/tty REPO_URL="$choice" return ;; esac echo echo "Provide your user and repo separated by '/'" echo "For example: UserName/dotfiles" echo read -r -p "User/Repo ->" choice < /dev/tty [[ "$choice" =~ ^[^[:space:]]+/[^[:space:]]+$ ]] || { echo "Not formatted as USER/REPO" REPO_URL= return } REPO_URL="${REPO_URL}${choice}.git" } function main() { [ -n "$1" ] && REPO_URL="$1" [ -n "$2" ] && YADM_RELEASE="$2" [ -z "$REPO_URL" ] && build_url [ -z "$REPO_URL" ] && echo "Unable to determine the repo URL" && exit 1 echo "Using URL: $REPO_URL" remote_yadm clone "$REPO_URL" ask_about_source } main "$@"