#!/bin/sh # Bare Metal Alchemist, 2022 ############################################# # Lead - ♄ # ############################################# # The most basic ingredient in an Alchemy recipe, lead is used in all # recipes in this repository to standardize some simple things that I # rely on to make scripts concise and pleasant to use # --------------- Escape Codes --------------- # These constants are used to add color and text formatting to the # terminal's output -- Further reading: ANSI Escape Codes RED="\e[0;31m" GREEN="\e[0;32m" BLUE="\e[0;34m" BOLD="\e[1m" ULINE="\e[4m" RESET="\e[0m" # --------------- Traps --------------- # Traps, in the case of shell scripting, listen for certain signals # that are broadcast by the system and execute a command in response # We only want these to activate if we're running a recipe if [[ $SHLVL -gt 1 ]]; then # Make sure that ctrl+C consistently exits the script trap "exit" INT # Give informative error messages when we receive ERR trap 'echo -e "${RED}Oops...${RESET} Something went wrong on line $LINENO of this script. Exit code was $?" >&2' ERR fi # --------------- Environment Setup --------------- # If there's an env file, export it's contents to the environment if [ -f .env ]; then export $(grep -v '^#' .env | xargs) else if [ -z $ALCHEMY ]; then echo "No .env file, this might cause some issues..." fi fi # --------------- Functions --------------- # Coding Moment: generally, whenever you see something with brackets # at the end of it, like this() or like(this), it's a function! # It takes inputs and gives (or does) something as an output # Checks to see if we can use a command or not check_exists() { command -v "$1" >/dev/null } # This one installs utilities to your OS (If you need them!) install_if_needed() { for package in "$@" # $@ means "all the arguments you passed do case $DISTRO in "debian") # TODO Better installation detection than check_exists if [ -z $(check_exists $package) ]; then echo "installing" $package sudo apt install -y $package else echo $package 'already installed!' fi ;; "arch") if pacman -Qi $package &>/dev/null; then echo $package 'already installed!' else echo "installing" $package sudo pacman -S $package --noconfirm --needed fi ;; "fedora") # TODO Better installation detection than "check_exists" if [ -z $(check_exists $package) ]; then echo "installing" $package sudo dnf install -y $package else echo $package 'already installed!' fi ;; "mac") # TODO Better installation detection than "check_exists" if [ -z $(check_exists $package) ]; then echo "installing" $package brew install $package else echo $package 'already installed!' fi ;; esac done } # These two might look like gibberish because we're using regex, don't worry. # It takes values and stores them away in the env for later reference forget() { unset ${1} sed -i "/^${1}.*$/d" .env } remember() { KEY=$(echo ${1} | cut -d'=' -f 1) VALUE=$(echo ${1} | cut -d'=' -f 2) if [[ ! $KEY =~ ^[A-Z_]+$ ]]; then echo "Keys must consist only of capital letters and underscores" fi if [[ ! $VALUE =~ ^[A-Za-z0-9/_.]+$ ]]; then echo "Valid characters for env values: letters, numbers, \".\",\"/\",\"_\"" fi # If we're setting a valid key/value pair if [[ ${1} =~ ^[A-Z_]+\=[A-Za-z0-9/._]*$ ]]; then # If we're trying to set the value to something new if [[ ! $(env | grep ${KEY}) = $1 ]]; then echo -e "${BLUE}${KEY}${RESET} has already been defined in the env!" echo -en "would you like to overwrite it? ${BLUE}(y/n)${RESET} " read overwrite case $overwrite in "y" | "Y") unset ${KEY} sed -i "/^${KEY}.*$/d" .env echo "${1}" >> .env export ${1} ;; esac else forget ${KEY} echo "${1}" >> .env export ${1} fi fi } LEAD=1