Превращаем Midnight Commander в консольный браузер для GIT
Вместо предисловия...
Мне давно хотелось отсматривать код примерно как это сделано в meld, но только в консоли, и еще мне хотелось чтобы это все было увязано с системой управления версиями файлов GIT. В общем чтобы все делалось 1 кнопкой не выходя из mc.
Ydiff
Однажды у нас на канале (или это было на траке...) проявился некто Daniel Borca пошумел-пошумел и убежал, видимо не понравилась ему наша бюрократия, но зато оставил он после себя несколько сыроватых патчей, к готовившемуся релизу 4.7.0-pre1 миднайт коммандера.
Один из них содержал в себе ydiff.[ch] и zdiff.[ch]... Как оказалось, то что я хотел получить, было давно уже реализовано в древнем форке mc-mp и в последней версии ru-fork. После 2-х дневного "перепиливания" я подключил функцию сравнения файлов к последней версии mc... Полдела было сделано. :)
Просмотр репозитария GIT
Панельный плагин gitfs
Второй проблемой было то что мне хотелось бы просматривать патчи из репозитария GIT непосредственно в миднайт коммандер, прямо из каталога репозитария. И я задумался над написанием VFS для миднайт коммандер с помощью которого можно было бы производить навигацию по репозитарию в нужной панели. Через несколько минут "ковыряния" родился первый сырой вариант gitfs
текущий полностью рабочий, но не окончательный вариант представлен ниже:
case "$1" in
list) gitfs_list "$@" ;;
copyout) gitfs_copyout "$@" ;;
*) exit 1 ;;
esac
exit 0
Панельный плагин gitlogfs
Мне хотелось не только производить навигацию по репозитарию, но так-же иметь возможность получать файлы любой ревизии. Для этого был написан плагин gitlogfs
case "$1" in
list) changesetfs_list "$@"; exit 0;;
copyout) changesetfs_copyout "$@"; exit 0;;
esac
exit 1
Подключение плагинов gitfs и gitlogfs к миднайт коммандер
Для того чтобы любые панельные плагины подключились к mc, достаточно положить их в домашний каталог миднайт коммандера ~/.mc/extfs.d. Для того чтобы вызывался плагин gitlogfs при нажатии на любой файл, начинающийся с префикса (git) необходимо в файле ~/.mc/bindings добавить описание данного типа файла, примерно так:
regex/^\(git\)
Open=%cd %p#gitlogfs
Иллюстрации
Вызов gitfs производится командой cd #gitfs в каталоге репозитария GIT.
Навигация по репозитарию происходит как по любой файловой системе.
Вход в gitlogfs производится нажатием ентер на либом файле проекта с префиксом (git)
Сравнение 2-х произвольных ревизий файла производятся с помощью горячей клавиши Ctrl-x, Ctrl-y