Внедрение RESTful API над репозиториями git с помощью Node.js может быть быстрым решением задач, связанных с получением информации о репозитории git. Ниже приведено описание создания API с использованием фреймворка Express.

Для начала вам нужно добавить в проект Express, а также библиотеку nodegit, которая предоставляет обертку над CLI git, библиотеку pg для создания пула соединений в базу данных Postgre (если в ней хранятся ссылки или имена репозиториев), btoa — для кодирования в BASE64, child_process — для выполнения bash-команд на сервере:

npm install express nodegit pg btoa child_process — save

После установки импортируем модули в файл server.js и описываем запуск сервера на порту 3031 (если в переменных окружения не указан другой порт):

В этом примере будет рассмотрена возможность работы с несколькими репозиториями. Список репозиториев, для которых будет предоставляться API, можно получить различными доступными способами. Ниже приведен пример того, как можно получить список репозиториев непосредственно из базы данных:

Функция YAMLconvert выполняет здесь преобразование YAML в JSON. В результате выполнения массив репозиториев будет содержать список объектов, содержащих информацию о доступных репозиториях и данные для аутентификации. В общем, для работы с удалённым репозиторием его нужно клонировать на ноду. Для этого создадим функцию клонирования:

Функция клонирования использует объект счетчика для обхода списка репозиториев и клонирования на сервер. Если клонирование предполагается выполнять однократно при старте сервера или по запросу в начале пути пользователя, допустимо объявить такой объект внутри обработчика запроса на клонирование, как в примере ниже:

Этот обработчик будет выполняться на GET-запросе по пути /git/api/clone, счетчик будет содержать количество уже клонированных репозиториев из списка в разрешенном поле и будет вызывать функцию клонирования до тех пор, пока не будет пройден весь список. Однако в этом случае внутри обратного вызова clone мы получаем объект, который мутирует снаружи. Такое поведение может негативно повлиять на выполнение, поэтому вы можете реализовать объект счетчика как итерируемый:

Затем в функции клонирования вы можете сделать строки:

counter.resolved += 1;
counter.onResolve();

заменить на:

counter.next();

После того, как репозитории уже клонированы на сервер, над ними можно выполнять действия для получения информации о коммитах, ветках и т.д. Например, для получения веток по имени репозитория с помощью GET-запроса можно реализовать следующее:

Получение коммитов репозитория:

Получите список файлов для ветки по определенному пути в дереве каталогов репозитория с разбивкой на страницы:

Функция walkTree нужна для фильтрации списка файлов для запрашиваемой директории, так как при формировании списка в eventEmmiter имена файлов пишутся с полным путем от корня репозитория: