diff --git a/dotfiles.sh b/dotfiles.sh index c10290d..97327be 100755 --- a/dotfiles.sh +++ b/dotfiles.sh @@ -1,19 +1,19 @@ -#!/bin/bash +#!/bin/sh -if [ "$(dirname $0)" != "." ]; then +if [ "$(dirname "$0")" != "." ]; then echo "Please run this script from the directory it resides." exit fi PACKAGE_FILE="./packages" -FILES=$(find . \( -path ./.git -o \ - -path ./dotfiles.sh -o \ - -path $PACKAGE_FILE -o \ - -path ./README.md -o \ - -path ./screenshot.png \) -prune -o -type f -print) +FILES="$(find . \( -path ./.git -o \ + -path ./dotfiles.sh -o \ + -path $PACKAGE_FILE -o \ + -path ./README.md -o \ + -path ./screenshot.png \) -prune -o -type f -print)" -if [ "$1" == "help" ] || [ "$1" == "" ]; then +help() { B=$(tput bold) N=$(tput sgr0) @@ -46,73 +46,96 @@ ${B}COMMANDS${N} Store the list of all the installed packages on the system. ${B}packages install${N} - Install all the core packages of the list. + Install all the core packages of the stored list. EOF +} -elif [ "$1" == "list" ]; then +list() { for f in $FILES; do - echo $f + echo "${f#??}" done +} -elif [ "$1" == "get" ] && [ "$2" != "" ]; then - FILE=$(readlink -f $2) - FILE_CUT_HOME="$(echo $FILE | sed -nr 's/^\/home\/'$USER'\/(.*)$/\1/p')" +get() { + if [ "$1" = "" ]; then + echo "Missing argument " + return + fi + + FILE=$(readlink -f "$1") + FILE_CUT_HOME="$(echo "$FILE" | sed -nr 's/^\/home\/'"$USER"'\/(.*)$/\1/p')" # /home// if [ -n "$FILE_CUT_HOME" ]; then - mkdir -p $(pwd)/$(dirname $FILE_CUT_HOME) - cp $FILE $(pwd)/$FILE_CUT_HOME + mkdir -p "$(pwd)/$(dirname "$FILE_CUT_HOME")" + cp "$FILE" "$(pwd)/$FILE_CUT_HOME" # / else - mkdir -p $(pwd)/$(dirname $FILE) - cp $FILE $(pwd)/$FILE + mkdir -p "$(pwd)/$(dirname "$FILE")" + cp "$FILE" "$(pwd)/$FILE" + fi +} + +pullpush() { + if [ "$1" = "" ]; then + return fi -elif [ "$1" == "pull" ] || [ "$1" == "push" ]; then for f in $FILES; do # Remove the first character (.) from the string - f=${f:1} + f=${f#?} # Resolved symbolic link - fr=$(readlink -f $f) + fr=$(readlink -f "$f") # The filepath starts with '/boot/', '/etc/', '/usr/share/' - if [ -n "$(echo $fr | sed -nr 's/^(\/(boot|etc|usr\/share)\/).*$/\1/p')" ]; then - if [ "$1" == "pull" ]; then - sudo cp $fr $(pwd)/$fr - else - sudo cp $(pwd)/$fr $fr + if [ -n "$(echo "$fr" | sed -nr 's/^(\/(boot|etc|usr\/share)\/).*$/\1/p')" ]; then + if [ "$1" = "pull" ]; then + sudo cp "$fr" "$(pwd)/$fr" + elif [ "$1" = "push" ]; then + sudo cp "$(pwd)/$fr" "$fr" fi else - if [ "$1" == "pull" ]; then + if [ "$1" = "pull" ]; then # cp /home// /home//[/]dotfiles/ - cp $HOME$f $(pwd)/$f - else - cp $(pwd)/$f $HOME$f + cp "$HOME$f" "$(pwd)/$f" + elif [ "$1" = "push" ]; then + cp "$(pwd)/$f" "$HOME$f" fi fi done +} -elif [ "$1" == "packages" ]; then - PACKAGE_LIST=$(comm -23 <(pacman -Qeq | sort) <(pacman -Qgq base base-devel | sort)) +pull() { + pullpush "pull" +} - if [ "$2" == "list" ] || [ "$2" == "" ]; then +push() { + pullpush "push" +} + +packages() { + PACKAGE_LIST="$(pacman -Qqe | sort | grep -vx "$(pacman -Qqg base base-devel | sort)")" + + if [ "$1" = "list" ] || [ "$1" = "" ]; then echo "$PACKAGE_LIST" - elif [ "$2" == "store" ]; then + elif [ "$1" = "store" ]; then if [ ! -s $PACKAGE_FILE ]; then touch "$PACKAGE_FILE" else truncate -s 0 "$PACKAGE_FILE" fi echo "$PACKAGE_LIST" > "$PACKAGE_FILE" - elif [ "$2" == "install" ]; then + elif [ "$1" = "install" ]; then # Install core packages - sudo pacman -S --needed $(comm -12 <(pacman -Slq | sort) <(sort $PACKAGE_FILE)) + sudo pacman -S --needed --noconfirm "$(cat "$PACKAGE_FILE")" # For AUR packages, run: -S - < packages fi -else - echo "./dotfiles.sh: '$1' is not a dotfiles command. \ -See './dotfiles.sh help'." +} +if type "$1" 2> /dev/null | grep -q "function"; then + "$@" +else + help fi # @Todo: