commit 3c276979052fe9a7a3d7362790a8f291671e539a Author: RedHood Date: Sun Jul 19 16:58:10 2020 +1000 Создание проекта diff --git a/gitler.fish b/gitler.fish new file mode 100644 index 0000000..3d62ca3 --- /dev/null +++ b/gitler.fish @@ -0,0 +1,397 @@ +#!/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