Всем привет, дорогие друзья!
Мне как любителю новых фич на GitHub было очень интересно узнать, что скоро все мы сможем быстро и качественно искать по кодовой базе GitHub. Это может быть очень удобно, особенно в случае, если нужно найти изощренный способ использования какого-то инструмента.
Особенно это резонирует с тем, что в России открыли будущего конкурента GitHub.
Поэтому GitHub точно не стоит почивать на лаврах несмотря на то, что они несомненно лидеры на рынке. Нужно идти дальше и развиваться, а то не ровен час и конкуренты догонят и сметут.
И пусть это не кажется таким уж невероятным. Как пример: много ли еще осталось тех, использует телефоны Nokia? Кто вообще знает, что они делали телефоны? В свое время они были просто недосягаемые, бесспорные лидеры рынка… А теперь значатся где-то в области статистической погрешности.
Первое впечатление
В GitHub создали проект, в котором можно искать, проводить навигацию и анализировать свой код и код миллиарда строк, опубликованных на GitHub. Важно отметить, что поиск масштабируемый, быстрый и точный. Создан он с нуля специально для поиска кода. Навигация работает для 10 основных языков программирования без настроек (надеемся, что список в будущем будет расти). Поиск можно производить по регулярному выражению, что очень круто. Также доступны и другие фильтры:- по организациям;
- по языкам программирования;
- по конкретному владельцу;
- по расширению файла;
- по регулярному выражению.
Поговорим более детально про поиск
Очень интересно заглянуть и попытаться поискать самому: так ли это удобно, как об этом говорят? Пока что этой фичи нет в общем доступе и можно добавить себя в лист ожидания по ссылке. Там заполняем все пункты, вопросы простые, здесь описывать не буду. В итоге добавляемся в лист ожидания и идем дальше. В результате, будет вот такой ответ: Осталось просто ждать. Как только меня добавят, я обязательно все вам покажу. Не затягивайте, добавляйтесь, чтобы потом в первых рядах разобраться и пользоваться себе на радость) А так конечно очень жаль, что нельзя сразу же опробовать новый инструмент, поэтому разберем их документацию и опишем более детально, как мы сможем использовать этот инструмент для нашей работы. Теперь и про поиск. В нем буду использовать классы и конструкции, которые имеют смысл в библиотеке, что я пишу. Так мне будет понятней и проще, надеюсь и вам.Базовый поиск
ImageComparison — самый простой поиск, который ищет в точности с запросом в именах файлов и в их содержимом. Здесь все кажется очень простым. Если мы хотим найти четко по имени класса, где он объявлен и где используется — такой поиск нам в этом поможет. При вводе нескольких слов, разделенных пробелами, в результате будет поиск по всем отдельно: Image Comparison то есть он найдет файлы и код и для Image, и для Comparison. Если нужно проводить поиск по какой-то строке, содержащей пробелы, то для этого просто нужно использовать кавычки. Например: “ImageComparison comparison = new ImageComparison()” и тогда поиск будет идти на совпадение всей строки. Для экранирования используем как и всегда “\”. Пока что все интуитивно понятно и зачастую так и делается. Далее, к этому базовому поиску мы можем накидывать фильтры. Поэтому поговорим о каждом из них. Это будут логические “И” к уже созданному нами фильтру.Фильтр по репозиторию
Когда наш базовый фильтр готов, можно сузить поиск и искать по конкретному репозиторию, что очень удобно. Не нужно искать в какой там папке находится класс, можно просто написать:repo:romankh3/image-comparison ImageComparisonResult
Где нам нужно указать repo:${user_name}/${repo_name}.
Также можно осуществлять поиск по нескольким репозиториям, просто добавив OR:
repo:romankh3/image-comparison OR repo:romankh3/usage-image-comparison ImageComparisonResult
Как указано на GitHub, на данный момент они не поддерживают поиск по репозиториям, где имя указано как регулярное выражение… А это значит, что добавить такую возможность планируют и значит, что проект не остановится на заявленном функционале и будет развиваться дальше.
Фильтр по организации
Поиск по организации или пользователю делается точно также, как и поиск по репозиторию, только ключевое слово будет не repo, a org:org:romankh3 ImageComparison
И тогда поиск будет проходить по всем репозиториям пользователя/организации.
Фильтр по языкам программирования
Также можно указать поиск по файлам определенного языка программирования. Здесь конструкция такая же, как для репозитория и организации, только слово ключевое language:language:java ImageComparison
Так же, как и для репозитория, здесь поддерживается поиск по нескольким языкам сразу при помощи ключевого слова OR:
language:java OR language:ruby ImageComparison
Полный список языков поддерживаемых GitHub можно найти по ссылке. Интересно, а BrainFuck там есть? 😂
Фильтр по пути файла
Каждый файл в проекте имеет свой путь и по нему можно проводить также поиск, добавляя фильтр. Например, есть файл ImageComparisonResult, у него есть путь:src/main/java/com/github/romankh3/image/comparison/model/ImageComparisonResult.java
Так вот, чтобы найти все классы, у которых путь начинается с src/main/java/com/github/romankh3/image, нужно:
path:src/main/java/com/github/romankh3/image
Может быть полезным в случае, когда мы не хотим, чтобы тестовые классы не попадали в результате нашего поиска. Или наоборот только тесты. Благодаря этому поиск становится более гибким.
Фильтр по пути файла можно задавать через регулярное выражение. Например, нам нужно найти
path:src/*/*.js
Булевые операции
И конечно же кульминация всего построения фильтров — это объединение этого дела воедино при помощи булевых операций. Для этого у нас есть AND, OR, AND NOT. Думаю, этого нам должно хватить. Например, составим сложный запрос поиска: код из продакшена по Java или Kotlin у конкретного пользователя/организации:repo:romankh3 AND (language:java OR language:kotlin) AND NOT path:*/test/*
И это, скажу я вам, просто невероятно. Так просто, быстро, лаконично и понятно составлен запрос на поиск, что не будет никаких проблем в поиске и чтении запроса.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ