OpenGrok

Такие проекты как AOSP (Android open source project) или LLVM содержат в себе примерно 2.5 и 11 миллионов строчек кода соответственно. Встроенный в IDE поиск или grep недостаточно эффективны при работе с такими большими кодовыми базами, не говоря уже о поиске в GitLab или GitHub.

Тем кто работают с Linux Kernel хорошо известен сервис bootlin.com. Именно этого — практически мгновенного структурированного поиска по сложной кодовой базе, не хватает многим открытым и «закрытым» — приватным проектам.

Именно для таких случаев многие крупные копании озаботились разработкой собственных инструментов для индексации и поиска, например Code Search от Google.
На мой взгляд лучшим решением из тех, что есть в открытом доступе является OpenGrok от Oracle.

Давайте рассмотрим как можно уменьшить порог вхождения в проекты со сложной кодовой базой, на простом примере. Для этого нам понадобится OpenGrok, Docker и vcstool.

OpenGrok

OpenGrok прекрасно работает в Docker-контейнерах, поэтому нам не придется долго возится с установкой:

docker run --rm -d \
    	--name opengrok \
    	-p 8080:8080/tcp \
	-e SYNC_PERIOD_MINUTES="10" \
	-v ~/opengrok-src/:/opengrok/src/ \
    	-v ~/opengrok-etc/:/opengrok/etc/ \
    	-v ~/opengrok-data/:/opengrok/data/ \
    	opengrok/docker:latest

Через несколько минут после запуска веб-интерфейс OpenGrok станет доступен по на 8080 порту:

http://IP_ADDRESS:8080

Перед тем как начать работать с поиском, нужно будет предоставить OpenGrok исходники одного или нескольких проектов.
Vcstool — это «обертка» для нескольких SCM инструментов (git, mercurial, subversion, bazaar), которая облегчает работу с несколькими репозиториями.

Установка vcstool:

yum install python3-pip
sudo pip3 install -U vcstool

Сначала создадим простой манифест со списком необходимых репозиториев:

- git:
    local-name: taskflow
    uri: https://github.com/taskflow/taskflow.git
    version: master
- git:
    local-name: renode
    uri: https://github.com/renode/renode.git
    version: master
- git:
    local-name: cartographer
    uri: https://github.com/googlecartographer/cartographer.git
    version: master
- git:
    local-name: pigweed
    uri: https://github.com/google/pigweed.git
    version: main
- git:
    local-name: jetson-inference
    uri: https://github.com/dusty-nv/jetson-inference.git
    version: master
- git:
   local-name: jetson-containers
   uri: https://github.com/dusty-nv/jetson-containers.git
   version: master

Затем используем для vcstool для синхронизации:

vcs-import --input repos.yml ~/opengrok-src/

Через несколько минут после перезапуска контейнера OpenGrok, проекты станут доступными в веб-интерфейсе.

docker stop opengrok && docker rm opengrok
docker run --rm -d \
    	--name opengrok \
    	-p 8080:8080/tcp \
	-e SYNC_PERIOD_MINUTES="10" \
	-v ~/opengrok-src/:/opengrok/src/ \
    	-v ~/opengrok-etc/:/opengrok/etc/ \
    	-v ~/opengrok-data/:/opengrok/data/ \
    	opengrok/docker:latest

OpenGrok

OpenGrok

© Habrahabr.ru