gitler/gitler.fish

398 lines
24 KiB
Fish
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/fish
if test (string match -ri "ru" "$LANG")
function help -d "Вывод мануала по работе с программой"
echo
set_color yellow; echo -n " Шаблон: "; set_color white; echo -n " gitler "; set_color brmagenta; echo "[репозиторий] [флаги]"
echo
set_color green; echo -n " -c --create "; set_color brcyan; echo -n ": "; set_color white; echo "Создать репозиторий"
set_color green; echo -n " -d --delete "; set_color brcyan; echo -n ": "; set_color white; echo "Удалить репозиторий"
set_color green; echo -n " -f --force "; set_color brcyan; echo -n ": "; set_color white; echo "Перезаписывать или игнорировать, если потребуется"
set_color green; echo -n " -p --path "; set_color brmagenta; echo -n "[путь] "; set_color brcyan; echo -n ": "; set_color white; echo "Путь до родительского каталога репозитория"
set_color green; echo -n " -i --import "; set_color brmagenta; echo -n "[путь] "; set_color brcyan; echo -n ": "; set_color white; echo "Путь до каталога для импорта"
echo
set_color green; echo -n " -h --help "; set_color brcyan; echo -n ": "; set_color white; echo "Общая информация (этот текст)"
set_color green; echo -n " -r --rules "; set_color brcyan; echo -n ": "; set_color white; echo "Правила обработки параметров"
echo
exit 1
end
function rules -d "Вывод правил обработки параметров"
echo
set_color brmagenta; echo -n " [репозиторий] "; set_color brcyan; echo -n ": "; set_color yellow; echo "/^[A-z_1-9]+\$/"
set_color brmagenta; echo -n " [флаги] "; set_color brcyan; echo -n ": "; set_color yellow; echo "/^-[a-z1-9]?\s*[A-z_1-9]*\$/"
set_color brmagenta; echo -n " [путь] "; set_color brcyan; echo -n ": "; set_color yellow; echo "/^[\/?[A-z_1-9]+]*\$/"
echo
exit 1
end
function print -a CATEGORY TYPE PARAM1 PARAM2 -d "Вывод сообщений по категориям"
switch $CATEGORY
case REQUEST
switch $TYPE
case IMPORT_REQUEST_INFO
set_color yellow; echo -n "[GITLER] "; set_color blue; echo -n "[ЗАДАЧА] "; set_color white; echo -n "Импортировать файл: "; set_color cyan; echo -n "$PARAM1 "; set_color white; echo "?"
case IMPORT_REQUEST
set_color yellow; echo -n "[GITLER] "; set_color brcyan; echo -n "[РЕШИТЬ] "; set_color white; echo -n "YES (!y) : NO (n) : SKIP (s) : ALL (a) "; set_color white; echo "> "
case DELETE_REQUEST_INFO
set_color yellow; echo -n "[GITLER] "; set_color blue; echo -n "[ЗАДАЧА] "; set_color white; echo -n "Удалить файл: "; set_color cyan; echo -n "$PARAM1 "; set_color white; echo "?"
case DELETE_REQUEST
set_color yellow; echo -n "[GITLER] "; set_color brcyan; echo -n "[РЕШИТЬ] "; set_color white; echo -n "YES (!y) : NO (n) : SKIP (s) : ALL (a) "; set_color white; echo "> "
end
case INFO
switch $TYPE
case CREATE
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Создан репозиторий: "; set_color cyan; echo "$PARAM1"
case DELETE_FILE
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Удалён файл: "; set_color cyan; echo "$PARAM1"
case DELETE_CATALOG
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Удалён пустой каталог: "; set_color cyan; echo "$PARAM1"
case DELETE_NOT_EMPTY
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Не удалён каталог содержащий файлы: "; set_color cyan; echo "$PARAM1"
case DELETE_FORCE
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Удалён репозиторий: "; set_color cyan; echo "$PARAM1"
case WORKPATH
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Установлен каталог для выполнения: "; set_color cyan; echo "$PARAM1"
case IMPORT
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Файл импортирован: "; set_color cyan; echo "$PARAM1"
case IMPORT_FORCE
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Грубо импортирован файл (-f --force): "; set_color cyan; echo "$PARAM1"
case IMPORT_END
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo "Импортирование завершено"
case OPTION_SET
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[РАБОТА] "; set_color white; echo -n "Установлена опция "; set_color cyan; echo -n "$PARAM1 "; echo -n "в репозитории "; set_color cyan; echo "$PARAM2"
end
case ERROR
switch $TYPE
case REPO_EXIST
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ОШИБКА] "; set_color white; echo -n "Репозиторий уже существует: "; set_color cyan; echo "$PARAM1"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[ПОМОЩЬ] "; set_color white; echo "Удалите репозиторий (-d --delete) или используйте (-f --force)"
case WRONG_NAME
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ОШИБКА] "; set_color white; echo -n "Неправильное название репозитория: "; set_color cyan; echo "$PARAM1"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[ПОМОЩЬ] "; set_color white; echo "Шаблон обработки: /^[A-z_1-9]+\$/"
case REPO_NOT_FOUND
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ОШИБКА] "; set_color white; echo -n "Не найден репозиторий: "; set_color cyan; echo "$PARAM1"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[ПОМОЩЬ] "; set_color white; echo "Проверьте существование, права доступа и введённые данные"
case IMPORT_NOT_SET
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ОШИБКА] "; set_color white; echo "Не задан каталог для импорта файлов"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[ПОМОЩЬ] "; set_color white; echo "Пример: gitler my_repo -i ~/examples"
case IMPORT_NOT_FOUND
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ОШИБКА] "; set_color white; echo -n "Не найден каталог для импорта файлов: "; set_color cyan; echo "$PARAM1"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[ПОМОЩЬ] "; set_color white; echo "Проверьте существование, права доступа и введённые данные"
end
end
end
else
function help -d "Show the manual for working with the program"
echo
set_color yellow; echo -n " Template: "; set_color white; echo -n " gitler "; set_color brmagenta; echo "[repository] [flags]"
echo
set_color green; echo -n " -c --create "; set_color brcyan; echo -n ": "; set_color white; echo "Create repository"
set_color green; echo -n " -d --delete "; set_color brcyan; echo -n ": "; set_color white; echo "Delete repository"
set_color green; echo -n " -f --force "; set_color brcyan; echo -n ": "; set_color white; echo "Overwrite or ignore as needed"
set_color green; echo -n " -p --path "; set_color brmagenta; echo -n "[path] "; set_color brcyan; echo -n ": "; set_color white; echo "Path to the parent directory of the repository"
set_color green; echo -n " -i --import "; set_color brmagenta; echo -n "[path] "; set_color brcyan; echo -n ": "; set_color white; echo "Directory path for import"
echo
set_color green; echo -n " -h --help "; set_color brcyan; echo -n ": "; set_color white; echo "General information (this text)"
set_color green; echo -n " -r --rules "; set_color brcyan; echo -n ": "; set_color white; echo "Parameter processing rules"
echo
exit 1
end
function rules -d "Displaying rules for processing parameters"
echo
set_color brmagenta; echo -n " [repository] "; set_color brcyan; echo -n ": "; set_color yellow; echo "/^[A-z_1-9]+\$/"
set_color brmagenta; echo -n " [flags] "; set_color brcyan; echo -n ": "; set_color yellow; echo "/^-[a-z1-9]?\s*[A-z_1-9]*\$/"
set_color brmagenta; echo -n " [path] "; set_color brcyan; echo -n ": "; set_color yellow; echo "/^[\/?[A-z_1-9]+]*\$/"
echo
exit 1
end
function print -a CATEGORY TYPE PARAM1 PARAM2 -d "Display messages by category"
switch $CATEGORY
case REQUEST
switch $TYPE
case IMPORT_REQUEST_INFO
set_color yellow; echo -n "[GITLER] "; set_color blue; echo -n "[TASK] "; set_color white; echo -n "Import file: "; set_color cyan; echo -n "$PARAM1 "; set_color white; echo "?"
case IMPORT_REQUEST
set_color yellow; echo -n "[GITLER] "; set_color brcyan; echo -n "[DECIDE] "; set_color white; echo -n "YES (!y) : NO (n) : SKIP (s) : ALL (a) "; set_color white; echo "> "
case DELETE_REQUEST_INFO
set_color yellow; echo -n "[GITLER] "; set_color blue; echo -n "[TASK] "; set_color white; echo -n "Delete a file: "; set_color cyan; echo -n "$PARAM1 "; set_color white; echo "?"
case DELETE_REQUEST
set_color yellow; echo -n "[GITLER] "; set_color brcyan; echo -n "[DECIDE] "; set_color white; echo -n "YES (!y) : NO (n) : SKIP (s) : ALL (a) "; set_color white; echo "> "
end
case INFO
switch $TYPE
case CREATE
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "Repository created: "; set_color cyan; echo "$PARAM1"
case DELETE_FILE
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "File deleted: "; set_color cyan; echo "$PARAM1"
case DELETE_CATALOG
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "Removed empty directory: "; set_color cyan; echo "$PARAM1"
case DELETE_NOT_EMPTY
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "The directory is not deleted because it contains files: "; set_color cyan; echo "$PARAM1"
case DELETE_FORCE
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "Removed repository: "; set_color cyan; echo "$PARAM1"
case WORKPATH
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "Installed execution directory: "; set_color cyan; echo "$PARAM1"
case IMPORT
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "File imported: "; set_color cyan; echo "$PARAM1"
case IMPORT_FORCE
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "Hard imported file (-f --force): "; set_color cyan; echo "$PARAM1"
case IMPORT_END
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo "Import completed"
case OPTION_SET
set_color yellow; echo -n "[GITLER] "; set_color green; echo -n "[WORK] "; set_color white; echo -n "Option installed "; set_color cyan; echo -n "$PARAM1 "; echo -n "in repository "; set_color cyan; echo "$PARAM2"
end
case ERROR
switch $TYPE
case REPO_EXIST
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ERROR] "; set_color white; echo -n "Repository already exists: "; set_color cyan; echo "$PARAM1"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[HELP] "; set_color white; echo "Delete the repository (-d --delete) or use (-f --force)"
case WRONG_NAME
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ERROR] "; set_color white; echo -n "Incorrect repository name: "; set_color cyan; echo "$PARAM1"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[HELP] "; set_color white; echo "Processing template: /^[A-z_1-9]+\$/"
case REPO_NOT_FOUND
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ERROR] "; set_color white; echo -n "Repository not found: "; set_color cyan; echo "$PARAM1"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[HELP] "; set_color white; echo "Check existence, access rights and entered data"
case IMPORT_NOT_SET
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ERROR] "; set_color white; echo "Import directory not specified"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[HELP] "; set_color white; echo "Sample: gitler my_repo -i ~/examples"
case IMPORT_NOT_FOUND
set_color yellow; echo -n "[GITLER] "; set_color red; echo -n "[ERROR] "; set_color white; echo -n "Directory to import files not found: "; set_color cyan; echo "$PARAM1"
set_color yellow; echo -n "[GITLER] "; set_color brmagenta; echo -n "[HELP] "; set_color white; echo "Check existence, access rights and entered data"
end
end
end
end
if test (count $argv) = 0
help
end
# Сохраняю изначальное количество аргументов
# При обработке аргумента вычитается единица
# Таким образом я определяю порядок аргументов
set ARGV_AMOUNT_ORIGINAL (count $argv)
set ARGV_AMOUNT $ARGV_AMOUNT_ORIGINAL
# Обработка параметров запуска
getopts $argv | \
while read -l key value
# Первый параметр
if test "$ARGV_AMOUNT" = "$ARGV_AMOUNT_ORIGINAL"
if test "$key" = _
if test (string match -r '^[A-z_1-9]+$' $value)
set NAME $value
else
print ERROR WRONG_NAME $value
exit 1
end
else
help
end
# Флаги
else
switch $key
case _
set -a OPTIONS $value
case h help
help
case r rules
rules
case f force
set FLAG_FORCE 1
case c create
set FLAG_CREATE 1
case d delete
set FLAG_DELETE 1
case p path
set WORKPATH $value
case i import
if test -n $value -a true != $value
set IMPORT $value
else
print ERROR IMPORT_NOT_SET $value
exit 1
end
end
end
set ARGV_AMOUNT (math $ARGV_AMOUNT - 1)
end
# Инициализация рабочей директории, если не был передан параметр
if test -z "$WORKPATH"
set fish_prompt_pwd_dir_length 0
set WORKPATH (prompt_pwd)
print INFO WORKPATH $WORKPATH
end
# [ФУНКЦИЯ] Создание репозитория (-c --create)
if test "$FLAG_CREATE" = "1"
if test -d "$WORKPATH/$NAME" -a ! "$FLAG_FORCE" = "1"
print ERROR REPO_EXIST "$WORKPATH/$NAME"
exit 1
else
# Создание директории репозитория
mkdir -p "$WORKPATH/$NAME"
# Сохранение текущей рабочей директории
set fish_prompt_pwd_dir_length 0
set OLD_WORKPATH (prompt_pwd)
# Переход в директорию репозитория
cd "$WORKPATH/$NAME"
# Создание репозитория
git --bare init > /dev/null
# Возврат в стартовую рабочую директорию
cd $OLD_WORKPATH
print INFO CREATE $NAME
end
end
# [ФУНКЦИЯ] Установка опций
if test -n "$OPTIONS"
# Проверяет существование репозитория
if test ! -d "$WORKPATH/$NAME"
print ERROR REPO_NOT_FOUND "$WORKPATH/$NAME"
exit 1
end
# Перебор всех полученных опций
for OPTION in $OPTIONS
# Разделение строки на опции
echo $OPTION | read OPTION_KEY OPTION_VALUE
# Добавление опции
sudo git -C "$WORKPATH/$NAME" config --local $OPTION_KEY $OPTION_VALUE
sudo git update-server-info
print INFO OPTION_SET $OPTION "$WORKPATH/$NAME"
end
end
# [ФУНКЦИЯ] Импортирование (-i --import [path])
if test -n "$IMPORT"
# Проверяет существование репозитория
if test ! -d "$WORKPATH/$NAME"
print ERROR REPO_NOT_FOUND "$WORKPATH/$NAME"
exit 1
end
# Проверяет существование каталога для импорта
if test ! -d $IMPORT
print ERROR IMPORT_NOT_FOUND $IMPORT
exit 1
end
# Активация грубого импортирования
if test "$FLAG_FORCE" = "1"
set IMPORT_ALL 1
end
# Сохранение текущей рабочей директории
set fish_prompt_pwd_dir_length 0
set OLD_WORKPATH (prompt_pwd)
# Переход в импортируемую директорию
cd "$IMPORT"
# Поиск всех файлов для импортирования и обработка каждого в цикле
find ./* |
while read -al FILE
# Проверка активации "импортировать всё"
if test "$IMPORT_ALL" != "1"
# Запрос на подтверждение импортирования
print REQUEST IMPORT_REQUEST_INFO $FILE
set RESPONSE (read -n 1 -p "print REQUEST IMPORT_REQUEST $FILE")
bind -e y
bind -e n
bind -e s
bind -e a
end
# Обработка ответа: "пропустить"
if test (string match -ri 'n' "$RESPONSE")
continue
# Обработка ответа: "импортировать всё"
else if test (string match -ari '^all$|^a$' "$RESPONSE")
set IMPORT_ALL 1
# Обработка ответа: "пропустить всё"
else if test (string match -ari '^skip$|^s$' "$RESPONSE")
break
end
# Импортирование
cp -a "$FILE" "$WORKPATH/$NAME/$FILE"
print INFO IMPORT $FILE
end
# Возврат в стартовую рабочую директорию
cd $OLD_WORKPATH
# Уведомление об окончании импортирования
print INFO IMPORT_END $FILE
end
# [ФУНКЦИЯ] Удаление репозитория (-d --delete)
if test "$FLAG_DELETE" = "1"
# Проверяет существование репозитория
if test ! -d "$WORKPATH/$NAME"
print ERROR REPO_NOT_FOUND "$WORKPATH/$NAME"
exit 1
end
# Сценарий грубого удаления
if test "$FLAG_FORCE" = "1"
rm -rf "$WORKPATH/$NAME"
print INFO DELETE_FORCE $NAME
# Сценарий обычного удаления
else
# Поиск всех файлов для удаления и обработка каждого в цикле
find $WORKPATH/$NAME -type f |
while read -al FILE
# Проверка активации "удалить всё"
if test "$DELETE_ALL" != "1"
# Запрос на подтверждение удаления
print REQUEST DELETE_REQUEST_INFO $FILE
set RESPONSE (read -n 1 -p "print REQUEST DELETE_REQUEST $FILE")
end
# Обработка ответа: "пропустить"
if test (string match -ri 'n' "$RESPONSE")
continue
# Обработка ответа: "удалить всё"
else if test (string match -ari '^all$|^a$' "$RESPONSE")
set DELETE_ALL 1
# Обработка ответа: "пропустить всё"
else if test (string match -ari '^skip$|^s$' "$RESPONSE")
break
end
# Удаление
rm -f "$FILE"
print INFO DELETE_FILE $FILE
end
# Удаление оставшихся пустых каталогов
find $WORKPATH/$NAME -type d | sort -r |
while read -al FILE
# Проверка на то, что не активирован пропуск удаления всего
if test ! (string match -ari '^skip$|^s$' "$RESPONSE")
# Если получена ошибка (каталог не пустой)
if test (cat (rm -d "$FILE" 2>| psub))
print INFO DELETE_NOT_EMPTY $FILE
# Если ошибки нет и удаление прошло успешно
else
print INFO DELETE_CATALOG $FILE
end
end
end
end
end
# sudo useradd $OWNER
# sudo chown -R www-data:www-data /var/www/git/projects/$REPOSITORY
# sudo chmod -R 755 /var/www/git/projects/$REPOSITORY
exit 0