Всем привет, дорогие друзья! Мне как любителю новых фич на GitHub было очень интересно узнать, что скоро все мы сможем быстро и качественно искать по кодовой базе GitHub. Это может быть очень удобно, особенно в случае, если нужно найти изощренный способ использования какого-то инструмента. “GitHub Code Search: Find more, search less” — GitHub запустил поисковой движок - 1Особенно это резонирует с тем, что в России открыли будущего конкурента GitHub. Поэтому GitHub точно не стоит почивать на лаврах несмотря на то, что они несомненно лидеры на рынке. Нужно идти дальше и развиваться, а то не ровен час и конкуренты догонят и сметут. И пусть это не кажется таким уж невероятным. Как пример: много ли еще осталось тех, использует телефоны Nokia? Кто вообще знает, что они делали телефоны? В свое время они были просто недосягаемые, бесспорные лидеры рынка… А теперь значатся где-то в области статистической погрешности.

Первое впечатление

В GitHub создали проект, в котором можно искать, проводить навигацию и анализировать свой код и код миллиарда строк, опубликованных на GitHub. Важно отметить, что поиск масштабируемый, быстрый и точный. Создан он с нуля специально для поиска кода. Навигация работает для 10 основных языков программирования без настроек (надеемся, что список в будущем будет расти). Поиск можно производить по регулярному выражению, что очень круто. Также доступны и другие фильтры:
  • по организациям;
  • по языкам программирования;
  • по конкретному владельцу;
  • по расширению файла;
  • по регулярному выражению.
Перечень и так уже впечатляющий! Выходит, что поисковой движок дает нам возможность создавать сложные запросы для поиска, в которых можно четко определить границы, по которым нужен поиск. Вторая важная часть движка — это навигация по коду 😳 Чем удобны среды разработки и почему за них платят деньги? Потому что они облегчают нам жизнь, помогают проводить навигацию в коде, чтобы скорость разработки и чтения кода росла. И эту классную фичу теперь предлагает нам GitHub. Это невероятно. Да, я знаю, что на данный момент есть уже что-то похожее на навигацию в GitHub, но функционал еще очень короткий и сырой. То есть без среды разработки можно искать где используются те или иные методы, где их определили. Это просто прекрасно. GitHub ты меня радуешь. Навигация по импортам в классах также доступна. Это решает множество проблем в поиске и изучении той или иной библиотеки на GitHub. Теперь этот процесс ускоряется многократно. И это все бесплатно. Просто превосходно. Будет ли он востребован? Я уверен, что да!

Поговорим более детально про поиск

Очень интересно заглянуть и попытаться поискать самому: так ли это удобно, как об этом говорят? Пока что этой фичи нет в общем доступе и можно добавить себя в лист ожидания по ссылке. Там заполняем все пункты, вопросы простые, здесь описывать не буду. В итоге добавляемся в лист ожидания и идем дальше. В результате, будет вот такой ответ: “GitHub Code Search: Find more, search less” — GitHub запустил поисковой движок - 2Осталось просто ждать. Как только меня добавят, я обязательно все вам покажу. Не затягивайте, добавляйтесь, чтобы потом в первых рядах разобраться и пользоваться себе на радость) А так конечно очень жаль, что нельзя сразу же опробовать новый инструмент, поэтому разберем их документацию и опишем более детально, как мы сможем использовать этот инструмент для нашей работы. Теперь и про поиск. В нем буду использовать классы и конструкции, которые имеют смысл в библиотеке, что я пишу. Так мне будет понятней и проще, надеюсь и вам.

Базовый поиск

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/*
И это, скажу я вам, просто невероятно. Так просто, быстро, лаконично и понятно составлен запрос на поиск, что не будет никаких проблем в поиске и чтении запроса.

Небольшое отступление

Пока наш восторг еще не остыл, хочется вернуться в 2018 год и вспомнить кое-что… Помните, когда только все узнали, что Microsoft покупает GitHub, то все думали, что проект будет похоронен? Что его судьба — это путь второго Skype? Как все повально начали переносить свои проекты на GitLab? Да чего греха таить, на волне этого хайпа и я создал и что-то перенес. Но если ответить честно, то я больше ни разу не навещал то место, куда перенес проекты. И как-то не хочется. А почему? Есть тоже мысли об этом. Напомню вам, что после продажи GitHub’a Биллу Гейтсу, в проект добавили возможность бесплатно иметь приватные репозитории, вышли GitHub Actions для CI/CD процесса и многое другое. А теперь еще и мощный поисковой движок. Это не похоже на желание потопить проект. Это больше похоже на то, что Microsoft не хотели платить налоги с прибыли и сделали удачную покупку к концу года на 9 с лишним миллиардов долларов 😁 А потом после всего этого еще и решили развивать этот проект. И ведь правда, для open-source разработчика — это отличное место для хранения своего кода. Можно полностью заниматься разработкой продукта, не выходя из GitHub.

В конце

Написал статью на одном дыхании. Очень люблю, когда слова и эмоции просто бьют гейзером. Это то, что двигает технологии вперед. Так что держим руку на пульсе, не отпускаем ситуацию. Я уверен, что каждому из нас стоит научиться это использовать. Всем, кто не зарегистрировался на GitHub, я настоятельно рекомендую это сделать. Это стоит того. Как всегда, друзья, не забывайте подписываться на мой телеграм-канал, в котором я объединяю всю свою публичную деятельность. Помимо статей, что я здесь публикую, я там пишу более короткие посты, в которых затрагиваю интересные мне темы из мира разработки и ИТ в целом. Нас там уже больше 800 подписчиков! И, конечно же, мой GitHub-аккаунт, там я публикую все демо-проекты к статьям, обновляю свои библиотеки и развиваю open-source организации.На этом все, всем спасибо за чтение, не прощаемся 👌