add unlink and help
This commit is contained in:
parent
2b3c8f3962
commit
63b595383c
1 changed files with 77 additions and 20 deletions
97
dotlink
97
dotlink
|
|
@ -17,8 +17,44 @@ function warning {
|
||||||
|
|
||||||
function error {
|
function error {
|
||||||
echo -ne "${text_bold}${text_red}ERROR${text_reset} $1\n"
|
echo -ne "${text_bold}${text_red}ERROR${text_reset} $1\n"
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function print_usage {
|
||||||
|
cat <<EOF
|
||||||
|
Usage: dotlink [OPTIONS]
|
||||||
|
|
||||||
|
Simple dotfile management based on symlinks.
|
||||||
|
|
||||||
|
OPTIONS
|
||||||
|
-h, --help Show this help message
|
||||||
|
-u, --unlink Remove current links
|
||||||
|
EOF
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
# Set default values
|
||||||
|
unlink=false
|
||||||
|
|
||||||
|
# Parse arguments
|
||||||
|
while (( "$#" )); do
|
||||||
|
case "$1" in
|
||||||
|
-h|--help)
|
||||||
|
print_usage
|
||||||
|
;;
|
||||||
|
-u|--unlink)
|
||||||
|
unlink=true
|
||||||
|
shift
|
||||||
|
;;
|
||||||
|
-*|--*=)
|
||||||
|
error "Unsupported flag: $1"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
error "Unsupported argument: $1"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
# Get current dotfile directory for later linking
|
# Get current dotfile directory for later linking
|
||||||
dotfiles="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
dotfiles="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"
|
||||||
|
|
||||||
|
|
@ -32,35 +68,56 @@ fi
|
||||||
cd "$dotfiles/machines/$HOSTNAME"
|
cd "$dotfiles/machines/$HOSTNAME"
|
||||||
files=( $(find -L -type f -printf '%P\n'))
|
files=( $(find -L -type f -printf '%P\n'))
|
||||||
|
|
||||||
log "Linking $text_bold${#files[@]}$text_reset files..\n"
|
if [ "$unlink" == true ]; then
|
||||||
|
log "Unlinking $text_bold${#files[@]}$text_reset files..\n"
|
||||||
|
else
|
||||||
|
log "Linking $text_bold${#files[@]}$text_reset files..\n"
|
||||||
|
fi
|
||||||
|
|
||||||
# Link files
|
|
||||||
for file in "${files[@]}"; do
|
for file in "${files[@]}"; do
|
||||||
|
|
||||||
# Check if target is a link
|
|
||||||
if [ -L "$HOME/$file" ]; then
|
|
||||||
|
|
||||||
if [ "$(readlink $HOME/$file)" != "$dotfiles/machines/$HOSTNAME/$file" ]; then
|
# Unlink files
|
||||||
warning "$text_bold$HOME/$file$text_reset is a link but doesn't point to this repository, it will not be linked"
|
if [ "$unlink" == true ]; then
|
||||||
continue
|
|
||||||
|
if [ -L "$HOME/$file" ] && [ "$(readlink $HOME/$file)" == "$dotfiles/machines/$HOSTNAME/$file" ]; then
|
||||||
|
|
||||||
|
rm "$HOME/$file"
|
||||||
|
log "Unlinked $text_bold$HOME/$file$text_reset"
|
||||||
|
|
||||||
|
# Remove base directory if empty
|
||||||
|
if ! [ "$(ls -A $(dirname $HOME/$file))" ]; then
|
||||||
|
rmdir "$(dirname $HOME/$file)"
|
||||||
|
log "Removed empty directory $text_bold$(dirname $HOME/$file)$text_reset"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Check if target is a file or directory
|
# Link files
|
||||||
elif [ -f "$HOME/$file" ]; then
|
|
||||||
|
|
||||||
warning "$text_bold$HOME/$file$text_reset exists and will not be linked"
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Create link
|
|
||||||
else
|
else
|
||||||
|
|
||||||
# Create target directory if not existent
|
# Check if target is a link
|
||||||
mkdir -p "$(dirname $HOME/$file)"
|
if [ -L "$HOME/$file" ]; then
|
||||||
|
|
||||||
# Link file
|
if [ "$(readlink $HOME/$file)" != "$dotfiles/machines/$HOSTNAME/$file" ]; then
|
||||||
ln -s "$dotfiles/machines/$HOSTNAME/$file" "$HOME/$file"
|
warning "$text_bold$HOME/$file$text_reset is a link but doesn't point to this repository, it will not be linked"
|
||||||
log "Linked $text_bold$dotfiles/$file$text_reset to $text_bold$HOME/$file$text_reset"
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if target is a file or directory
|
||||||
|
elif [ -f "$HOME/$file" ]; then
|
||||||
|
|
||||||
|
warning "$text_bold$HOME/$file$text_reset exists and will not be linked"
|
||||||
|
continue
|
||||||
|
|
||||||
|
# Create link
|
||||||
|
else
|
||||||
|
|
||||||
|
# Create target directory if not existent
|
||||||
|
mkdir -p "$(dirname $HOME/$file)"
|
||||||
|
|
||||||
|
# Link file
|
||||||
|
ln -s "$dotfiles/machines/$HOSTNAME/$file" "$HOME/$file"
|
||||||
|
log "Linked $text_bold$dotfiles/$file$text_reset to $text_bold$HOME/$file$text_reset"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
done
|
done
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue