#!/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