codesearch is dead, long live the codesearch!

Это произошло. codesearch.google.com или google.com/codesearch больше нет.
Я пользовался этим сервисом часто, и теперь я даже не знаю что делать.
Но, спасибо Робу Пайку и Россу Коксу, которые тоже тяжело переживают эту утрату.
Они начали новый проект — codesearch.

Проект позволяет очень быстро искать по исходникам, правда только на локальной машине, а не на серверах гугла.

Для неленивых

Проект написан на Go. Поэтому все кто собирать его вручную — сначала установите Go.

Затем:

cd $GOROOT/src/pkg
# Возможно go install может установить все автоматически прямо с сайта,
# но у меня не получилось.
mkdir -p code.google.com/p/codesearch
hg clone https://code.google.com/p/codesearch code.google.com/p/codesearch
cd code.google.com/p/codesearch/lib
# buildall перебирает все архитектуры и собирает под все что можно, 
# изучите его, закомментируйте то что вам не надо (напр. упаковку результатов
# сборки в *.zip), и тогда запускайте.
./buildall

После этого у вас в $GOBIN появятся три утилиты: cindex, csearch, cgrep.

Для ленивых

Качаем утилиты с сайта проекта и распаковываем куда удобно.

Начало работы

Проиндексируем какую-нибудь папку, напр. наш /usr/include:

$ cindex /usr/include

В результате получим «базу» для поиска в файле ~/.csearchindex

UPD: Описанный ниже баг уже оперативно исправили.
У меня в 64-битной Gentoo произошла ошибка, cindex не смог смержить пустую базу в .csearchindex и временную базу по /usr/include (.csearchindex~ — с тильдой в конце). Проблема была в том, что делали mmap для размера в 0 байт (файл-то пустой), получали ошибку, и завершали программу. Не знаю, это баг Go или codesearch, но уже сообщил о нем. Временный фикс:
$ cp ~/.csearchindex\~ ~/.csearchindex
Так ведь у нас мержат пустой файл с непустым? 🙂
Это надо делать только для 1-го запуска cindex. Дальше все как по маслу.

Войдя в азарт я проиндексировал /usr/src/linux и еще пару мелких проектов.
Размер ~/.csearchindex составил около 50 Мб, что в целом неплохо для всех include и ядра линукса.

Поиск

Для поиска я использовал csearch. В результатах отображается файл и (опционально) номер строки. Конечно, не так красиво как было у codesearch, но пользоваться можно. Глядишь — web-интерфейс сделают когда-нибудь.

$ csearch hcd_bus_
/usr/src/linux/drivers/usb/core/generic.c:		rc = hcd_bus_suspend(udev, msg);
/usr/src/linux/drivers/usb/core/generic.c:		rc = hcd_bus_resume(udev, msg);
/usr/src/linux/drivers/usb/core/hcd.c:int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg)
/usr/src/linux/drivers/usb/core/hcd.c:int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg)
/usr/src/linux/include/linux/usb/hcd.h:extern int hcd_bus_suspend(struct usb_device *rhdev, pm_message_t msg);
/usr/src/linux/include/linux/usb/hcd.h:extern int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg);

time вернул: csearch hcd_bus_ 0.02s user 0.01s system 74% cpu 0.031 total. Неплохой показатель, и глазом не моргнул. Старикашка grep тут бы трудился около минуты.

# Смотрим где объявлены функции для работы с интерфейсами в libusb (поиск по regex)
$ csearch -n "libusb_.+_interface"
2012/01/19 22:46:58 56591902 56594432
/usr/include/libusb-1.0/libusb.h:803:int libusb_claim_interface(libusb_device_handle *dev, int iface);
/usr/include/libusb-1.0/libusb.h:804:int libusb_release_interface(libusb_device_handle *dev, int iface);
/usr/include/libusb-1.0/libusb.h:809:int libusb_set_interface_alt_setting(libusb_device_handle *dev,

А вот бы еще…

Проект свою функцию выполняет — ищет, и ищет очень быстро. Но аппетит разыгрался. Хочу инверсный поиск (все что не regex), хочу текст до и после совпадающей строки, хочу цепочки фильтров, хочу упрощенный синтаксис наряду с regex, хочу красивый интерфейс (ох как непривычно от самого себя такое слышать). Другие пожелания думаю тоже можно в Issue ребятам писать, так что не скромничайте.

А может взять да и форкнуть? И сделать круто? Робу Пайку думаю не до интерфейсов, а вот самому сделать бы да покрасивше.. Или может взять дерево исходников, скажем, ядра или андроида, да сделать проект на Google App Engine для быстрого поиска по этому дереву прям онлайн, чтобы себе репозитории огромные не качать. Круто, да? Ау, есть желающие? У кого какие еще есть идеи?

Реклама