Dotfiles.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
5.0 KiB

12 years ago
#!/bin/bash
#Создан: Пт 23 авг 2013 19:57:29
7 years ago
#Изменён: Пн 26 фев 2018 17:07:29
#
# (c) 2013, Maxim Lihachev, <envrm@yandex.ru>
#
# Скрипт создания ссылок на файлы настроек.
#
# Список файлов содержится в RCLIST и заполняется по правилам:
#
# # Строка комментария, который нужно вывести
# : Строка комментария, который не будет выведен
#
# + установить_файл /куда/устанавливать
# - не_устанавливать_файл /куда/устанавливать
# любая другая строка будет исполнена как команда оболочки
#
# Пустые строки выводятся.
#
# ИСПОЛЬЗОВАНИЕ: installrc.sh --install-all - установка всех файлов
# --uninstall-all - удаление всех ссылок
# --check-rc-files - проверка доступности файлов настроек
#
# При установке имеющиеся ссылки и файлы будут переименованы в файл.<дата>.
#
12 years ago
#Директория для установки
RCDIR=$(pwd)
RCLIST=$RCDIR/rc.$OSTYPE
ROOTDIR=$HOME
#Настройка цветовых кодов
rstc="\033[00m"
yellow="\033[1;33m"
red="\033[1;31m"
green="\033[1;32m"
white="\033[1;1m"
#Вывод [цветного] сообщения с заполнением строки до 30 колонки знаком "."
# msg1 msg2 ?color?
12 years ago
report() {
len=$((30 - $(echo -e -n $2 | wc -m)))
echo -e -n " ${3:-$rstc} $1 $2 $rstc"
eval printf "%-.s-" {1..$len}
}
#Проверка доступности файла настроек
# file
12 years ago
check() {
report Поиск $(basename $1)
if [ -a $RCDIR/$1 ]; then
echo OK
else
echo -e "$red ФАЙЛ НАСТРОЕК НЕ СУЩЕСТВУЕТ: $RCDIR/$1 $rstc" >&2
fi
}
#Резервирование файла
# file
12 years ago
backup() {
report Сохранение $(basename $filename) $yellow
date=$(\date "+%Y.%m.%e_%H.%M")
\mv "$link"{,.$date} && \
echo -e "${green}Резервная копия: $link.$date ${rstc}"
}
#Скрытие ссылки, если она расположена в ROOTDIR
#
# Если в правилах указано место установки ~, а ROOTDIR=$HOME,
# то ссылка будет расположена в ~/.link.
#
# Если указать иную директорию, то ссылка не будет скрыта:
# mc ~/.config ---> ~/.config/mc
#
# file
12 years ago
dotfile() {
if [[ "$(dirname $1)" == $ROOTDIR ]]; then
echo "$(dirname $1)/.$(basename $1)"
else
echo $1
fi
}
#Создание ссылки на конфигурационный файл
# source destination
12 years ago
mklink() {
SRC=$1
DST=$2
#Файл существует?
12 years ago
if [ -a $RCDIR/$SRC ]; then
filename=$(basename $SRC)
report Установка $filename
link=$(dotfile "$DST/${filename//\.$(uname -i)}")
#Файл существует?
12 years ago
if [ -a $link ]; then
#Файл -- ссылка?
12 years ago
if [ -L $link ]; then
ref=$(readlink $link)
if [ $ref == $RCDIR/$SRC ]; then
echo -e "Установка не требуется"
return
else
echo -e "$redНайденная ссылка указывает на другой файл: $ref$rstc"
fi
else
echo -e "$redНайден конфигурационный файл$rstc"
fi
backup $link && \
mklink $SRC $DST
else
#Ссылка на файл-источник
12 years ago
ln -s $RCDIR/$SRC $(dotfile $DST/${filename//\.$(uname -i)}) 2>&- && \
echo -e "${green}OK${rstc}"
fi
else
echo -e "$red ФАЙЛ НАСТРОЕК НЕ СУЩЕСТВУЕТ: $RCDIR/$SRC $rstc" >&2
fi
}
#Удаление ссылки на файл
# sourcefile link
12 years ago
rmlink() {
FILE=$(basename $1)
LINK=$(dotfile $2/${FILE//\.$(uname -i)})
if [[ ( -a $LINK ) && (-L $LINK)]]; then
report Удаление $FILE $red
\rm "$LINK" && echo -e "${green}OK${rstc}" || echo -e "Ошибка удаления"
fi
}
#Установка настроек
12 years ago
installrc() {
while read line; do
if [[ "$line" =~ ^\s*\+\s*.*$ ]]; then
#Установить файл
12 years ago
eval $(echo -e "$line" | sed 's/^+/mklink /')
elif [[ "$line" =~ ^\s*-\s*.*$ ]]; then
#Не устанавливать файл
12 years ago
eval $(echo -e "$line" | sed 's/^-/rmlink /')
elif [[ ("$line" =~ ^\#.*) || ("$line" =~ ^\s*$) ]]; then
#Вывод комментариев и пустых строк
12 years ago
echo -e "${white}$line${rstc}" | tr '#' ' '
else
#Выполнение строки
12 years ago
eval $line
fi
done < $1
}
#Разбор аргументов командной строки и выполнение скрипта
12 years ago
case "$1" in
--install-all) alias rmlink=mklink;;
--uninstall-all) alias mklink=rmlink;;
--check-rc-files) alias mklink=check; alias rmlink=check;;
*) : ;;
esac
installrc $RCLIST