Введение
Возникла идея сделать свою систему контроля версий. А чтобы всё было по взрослому, то она должна поддерживать систему исключений. Для чего было бы очень полезно использовать синтаксис git, а именно его правила в файлах .gitignore.
Самое очевидное решение - взять данную функцию из исходников git. Проблема в том, что эта функция "прибита гвоздями" к исходникам git. Т.е. нельзя просто взять и вытащить нужную функцию так как это потянет за собой и множество другого кода.
Поэтому решил что сделаю свою реализацию и выложу в открытый доступ. Однако в результате реализации стал замечать, что этот функционал я уже к своему коду "прибиваю гвоздями". Поэтому вместо готового кода решил выложить алгоритм преобразования правила .gitignore в регулярное выражение. Это позволит любому сделать реализацию на нужном ему языке программирования.
Правила замены
Правило состоит из следующих полей[значение по умолчанию]:
bool is_not - Отрицание
bool is_dir - Правило для директории
string re_str - Строка регулярного выражения
**line** - входная строка правила из файла .gitignore
Процесс разбора состоит из трех функций: **parse**, **parse2**, **parse3**.
Функция parse(line)
![](https://habrastorage.org/getpro/habr/upload_files/6d0/ac2/c79/6d0ac2c797bd2293c2a512b647b9d126.png)
Функция parse2(line)
![](https://habrastorage.org/getpro/habr/upload_files/966/b81/647/966b8164770f12ee4c2d592a7818d7bd.png)
Функция parse3(line)
![](https://habrastorage.org/getpro/habr/upload_files/7e1/607/3ff/7e16073ff2b910b31288a54dc17b1d9a.png)
После вызова функции parse(line) переменная line Содержит текст регулярного выражения. После обработки файла .gitignore получаем список правил rules. Для проверки соответствия элемента файловой системы правилу используется функция test(filepath, filename), где:
filepath - полное имя файла
filename - имя файла относительно директории нахождения файла .gitignore с начальным слешем в начале.
Функция test(filepath, filename)
![](https://habrastorage.org/getpro/habr/upload_files/081/b5f/e98/081b5fe986dbc741fd685c67af169cf9.png)
Если после выполнения функции ret = true значит элемент файловой системы нужно игнорировать.
Для тестирования функционала написал консольную программу для Windows. Вот ссылка на архив на архив. Файл содержит две команды:
* run_git - для генерации отчета со списком игнорирований
* run - для запуска тестов. Команда запускает тесты и выводит результаты в виде
![Вывод результатов тестов Вывод результатов тестов](https://habrastorage.org/getpro/habr/upload_files/7dc/ec2/e34/7dcec2e34ba8145859c69245bb347ae0.png)
Для каждого теста выводится результат отработки. Если игнорируется, то выводится правило из файла + регулярное выражение в которое это правило трансформировалось.
При добавлении новых/изменении существующих тестов необходимо запустить команду run_git (для чего необходимо наличие установленной git).
UPDATE: обновил ссылку для скачивания тестов. Раньше она не скачивалась так как сертификата на сайте не было. Точнее скачивалась, но только при дополнительном подтверждении так как была в виде http.