Какой рейтинг вас больше интересует?
|
Переименование переменных и слияние изменений в Darcs2009-10-28 17:23:00 (читать в оригинале)Ныне к традиционным холиварам, вроде vi против emacs , прибавился ещё hg (Mercurial) против git . И то, и другое — распределённые системы управления версиями (уже написано. Впрочем, выбор этими двумя системами не ограничивается, отдельные маньяки успешно пользуются и другими системами. А среди альтернативных систем совершенно особняком стоит darcs .Почитал я тут руководство по darcs , и обнаружил что есть у него одна удивительная возможность, которой, насколько мне известно, у его более популярных собратьев нет. А именно, поддержка замен в управляемых файлах. Например, можно переименовать в одной ветке функцию или переменную, в другой ветке делать другие изменения, затрагивающие эти же строки, а потом совершенно волшебным способом автоматически объединить изменения обеих веток. И ручное слияние изменений не потребуется. Возможность настолько необычная, что захотелось поделиться.Основное отличие darcs от собратьев: он отслеживает не состояние каталога с файлами (и историю его изменений), а хранит сами изменения — патчи. А уж состояние рабочего каталога определяется просто как результат применения всех накопленных изменений-патчей. Всякое такое изменение обратимо, а некоторые можно безболезненно переставлять местами (и это очень облегчает слияния).В случае обычных DVCS, каждое изменение определяется разницей двух состояний каталога. Чтобы объединить такие изменения, нужен их общий «предок», к которому изменения можно применить. В darcs изменение не обязательно должно определяться разницей между двумя состояниями каталога. Это позвляет создавать разные типы изменений, и автор может определить что именно изменение делает (семантически). В том числе есть и такой вид изменений: замена слов в файле (token replace patch).Покажу, как это работает, а вы уж сами судите, насколько это круто :-) ЗавязкаИтак, создадим вначале исходный репозиторий и поместим в него простую программку. Тут отличия между darcs и hg или git минимальны:$ mkdir repo-0 А теперь создадим две ветки. В каждой ветке сделаем свои изменения. В одной (A) изменим название переменной what на name , а в другой (B) переименуем и перепишем функцию hello() .Внезапно!Клонируем исходный репозиторий: repo-0$ cd .. И переименовываем в этой ветке переменную. Только хитрость, мы хотим не просто сделать замену слов в файле, а мы хотим явно указать darcs -у, что это именно замена слов. Поэтому вместо текстового редактора выполняем такую вот команду:$ cd repo-A Убеждаемся, что программка изменилась: repo-A$ cat hello.py И записываем изменения в репозиторий: repo-A$ darcs record -m 'renamed: what to name' hello.py Тем временем...Параллельно создаём другую ветку и как-нибудь меняем функцию hello :repo-A$ cd .. Изменения настолько серьёзны, что старое имя функции уже не подходит. Переименовываем её с помощью darcs replace :repo-B$ darcs replace hello greet hello.py И записываем изменения: repo-B$ darcs record -m 'changed hello and renamed to greet' hello.py Кровавый финалА теперь возвращаемся в исходный репозиторий и объединяем изменения: repo-B$ cd ../repo-0 И что же мы видим? repo-0$ cat hello.py Изменения объединились правильно. Система управления версиями оказалась достаточно умной, чтобы применить изменения в нужном порядке (вначале переписать функцию, а уж потом переименовать все случаи использования переменной). Я впечатлён.
|
Категория «Программы»
Взлеты Топ 5
Падения Топ 5
Популярные за сутки
|
Загрузка...
BlogRider.ru не имеет отношения к публикуемым в записях блогов материалам. Все записи
взяты из открытых общедоступных источников и являются собственностью их авторов.
взяты из открытых общедоступных источников и являются собственностью их авторов.