dotfiles script v0.2.0

- add help text
- add 'install' command
- add 'diff' command
- add 'link' command
- add 'pull' command (alias for 'git pull')
- remove 'createlinks' command
This commit is contained in:
Lexi / Zoe 2019-01-05 01:02:40 +01:00
parent ed1031d0f2
commit 801cabcba4
Signed by: binaryDiv
GPG Key ID: F8D4956E224DA232
2 changed files with 99 additions and 97 deletions

View File

@ -2,8 +2,33 @@
## ##
## binaryDiv's dotfiles management script ## binaryDiv's dotfiles management script
## Version 0.2.0
## ##
usage() {
cat <<- END_OF_HELPTEXT
Usage: $(basename $0) COMMAND [...]
Manage dotfiles via git.
General commands:
help print this help message
Installation:
install run this on first start: install dotfiles script in ~/bin, configure git, ...
(this will NOT create links for all dotfiles, though)
Dotfile management:
ls [DIR] list contents of .dotfiles directory (or DIR relative to it)
diff FILE use vimdiff to compare ~/FILE to ~/.dotfiles/FILE
link FILE... create a symlink from ~/FILE to ~/.dotfiles/FILE (multiple files possible)
Synchronization:
git ARGS... wrapper for git (all arguments are passed on to git)
pull shortcut for git pull
END_OF_HELPTEXT
}
# Define root dir for dotfiles management (defaults to $HOME, can be overridden # Define root dir for dotfiles management (defaults to $HOME, can be overridden
# with environment variables for debugging) # with environment variables for debugging)
if [ -z "$DOTFILESROOT" ]; then if [ -z "$DOTFILESROOT" ]; then
@ -15,54 +40,94 @@ homedir="$DOTFILESROOT"
dotfilesdir="$DOTFILESROOT/.dotfiles" dotfilesdir="$DOTFILESROOT/.dotfiles"
# Check for command # Get command
if [ $# -eq 0 ]; then [ $# -gt 0 ] || { usage; exit 1; }
echo "no command given"
exit 1
fi
# Fetch command
cmd=$1 cmd=$1
shift shift
# Parse command # Parse command
case "$cmd" in case "$cmd" in
help) help|--help|-h)
# help: print usage help usage
echo "help: not implemented yet, sorry /o\\"
exit 1 exit 1
;; ;;
install)
bin_source="$dotfilesdir/bin/dotfiles"
bin_target="$homedir/bin/dotfiles"
bin_dir="$homedir/bin"
if [ ! -e "$bin_target" ]; then
echo "* Installing dotfiles script in $bin_dir/..."
mkdir -pv "$bin_dir"
ln -sr "$bin_source" "$bin_target" || exit 1
elif [ ! "$(realpath $bin_target)" -ef "$bin_source" ]; then
echo "! Warning: File $bin_target already exists but is NOT a link to $bin_source"
fi
if [[ ":$PATH:" != *":$bin_dir:"* ]]; then
echo "! Warning: $bin_dir is not in your PATH."
fi
echo "* Configuring git settings..."
git -C "$dotfilesdir" config merge.ff only
;;
ls) ls)
# ls: list dotfiles via ls lsdir="$dotfilesdir"
echo "$dotfilesdir:" [ -n "$1" ] && lsdir="$lsdir/$1"
ls -lAh --color=auto "$dotfilesdir/"
;; echo "$lsdir:"
ls -lAh --color=auto "$lsdir"
;;
# TODO: Command 'status' or 'linkstatus' to show which files are linked and which are not
diff)
[ -n "$1" ] || { echo "$(basename $0) $cmd: Missing argument."; exit 1; }
file_A="$homedir/$1"
file_B="$dotfilesdir/$1"
if [ "$(realpath "$file_A")" -ef "$file_B" ]; then
echo "$file_A is a link to $file_B"
else
vimdiff "$file_A" "$file_B"
fi
;;
link)
[ -n "$1" ] || { echo "$(basename $0) $cmd: Missing argument."; exit 1; }
for filename in "$@"; do
file_home="$homedir/$filename"
file_dotfiles="$dotfilesdir/$filename"
if [ ! -e "$file_dotfiles" ]; then
echo "! $file_dotfiles: target file does not exist"
exit 1
elif [ -e "$file_home" ]; then
if [ ! "$(realpath "$file_home")" -ef "$file_dotfiles" ]; then
echo "! $file_home already exists but is NOT a link to $file_dotfiles, please fix manually"
exit 1
fi
else
echo "* Creating link $file_home -> $file_dotfiles"
ln -sr "$file_dotfiles" "$file_home" || exit 1
fi
done
;;
git) git)
# git: do git commands (forwards all arguments)
git -C "$dotfilesdir" "$@" git -C "$dotfilesdir" "$@"
;; ;;
createlinks)
# createlinks: create or update links for dotfiles in home dir
# (Use an extra script for this to separate the management script from pull)
# user specific dotfiles) git -C "$dotfilesdir" pull "$@"
if [ -f "$dotfilesdir/createlinks.sh" ]; then ;;
# arguments: home dir and .dotfiles dir
bash "$dotfilesdir/createlinks.sh" "$homedir" "$dotfilesdir"
else
echo "no createlinks.sh found in $dotfilesdir"
exit 1
fi
;;
*) *)
# unknown command echo "Unknown command '$cmd', use 'help' to show all commands."
echo "unknown command '$cmd'"
exit 1 exit 1
;; ;;
esac esac

View File

@ -1,63 +0,0 @@
#!/bin/bash
if [ $# -ne 2 ]; then
echo "wrong argument count"
fi
# Set variables
homedir="$1"
dotfilesdir="$2"
# Change directory to home dir
cd "$homedir"
# Define a function that create a link unless it already exists
makelink() {
test $# -eq 2 || { echo "makelink: invalid function call"; exit 1; }
if [ ! -e "$1" ]; then
echo "can't create link '$2': target '$1' does not exist"
return
fi
if [ ! -e "$2" ]; then
# Create link
ln -sr "$1" "$2"
elif [ ! -L "$2" ]; then
# A file with the same name exists and it's not a link
# -> warn user!
echo "can't create link '$2': file already exists"
fi
}
makelink_simple() {
test $# -eq 1 || { echo "makelink_simple: invalid function call"; exit 1; }
makelink "$dotfilesdir/$1" "$1"
}
# -- CREATE THE LINKS HERE --
# ~/bin
makelink "$dotfilesdir/bin/" bin
# bash, profile, etc.
makelink_simple .profile
makelink_simple .bashrc
makelink_simple .bash_profile
makelink_simple .bash_logout
# vim
makelink_simple .vimrc
makelink_simple .gvimrc
# misc apps
makelink_simple .bcrc
makelink_simple .toprc
# X stuff
makelink_simple .Xdefaults
makelink_simple .xprofile
# TODO more links...