Скрипт для настройки истории в RCS/CVS,v файл
Готовясь к переходу на Mercurial, я хотел бы внести некоторые систематические изменения во многие тысячи v-файлов. (Я буду редактировать копии оригиналов, спешу добавить.)
Примеры видов изменений, за которыми я следую:
- Для каждой ревизии, сообщение которой начинается с некоторого текста, который указывает известное имя пользователя (например,
[Fred Bloggs]
), если имя пользователя в комментарии совпадает с именем автора в файле, v, то удалите ненужный текст имени пользователя из сообщения фиксации. - Если, v содержит полезное описание, добавьте его к сообщению фиксации для ревизии 1.1 (cvs2hg игнорирует описание - но многие из наших файлов CVS фактически пришли из RCS, где было легко поместить начальное сообщение фиксации в поле описания с помощью ошибка)
- Для правок, внесенных из определенных общих учетных записей пользователей, измените автора в зависимости от содержимого сообщения фиксации.
Вещи, которые я рассмотрел:
- Запуск 'cvs log' для каждого отдельного файла, v файла - анализ выходных данных и использование
rcs -m
изменить эту историю. Проблемы с этим включают в себя:- кажется, нет способа передать текстовый файл
rcs -m
- поэтому, если сообщение о ревизии содержит одинарные и / или двойные кавычки или занимает несколько строк, было бы довольно сложно правильно его процитировать в сценарии - Я не вижу средства rcs или cvs для изменения имени автора, связанного с ревизией
- менее важно, что это может привести к запуску огромного количества процессов, которые, я думаю, могут быть медленными
- кажется, нет способа передать текстовый файл
- Написание Python для разбора файла, v и настройки содержимого. Проблемы с этим включают в себя:
- в наших файлах v есть несколько концовок строк, включая некоторые двоичные файлы, которые должны были быть текстовыми, и наоборот, поэтому необходимо соблюдать особую осторожность, чтобы не повредить файлы.
- осторожность будет необходима для цитирования символа @ в любых сообщениях фиксации, если он попадает в начало строки в многострочном комментарии
- необходимо также соблюдать осторожность в отношении ревизий, в которых последняя строка подтвержденного файла была изменена и не имеет новой строки - это означает, что, v имеет символ @ в самом конце строки, а не предшествует
\n
- Клонируйте версию cvs2hg, которую мы используем, и попробуйте настроить ее код, чтобы внести необходимые изменения на месте
Существуют ли какие-либо другие подходы, которые были бы менее эффективными, или какой-либо существующий код, который реализует такую функциональность?
1 ответ
Ваш первый подход может быть лучшим. Я знаю, что в Perl обработка кавычек и нескольких строк не будет проблемой. Например:
my $revision = ...;
my $log_message = ...;
system('rcs', "-m$revision:$log_message", $filename);
где $log_message
может содержать любой произвольный текст. Поскольку строка не проходит через оболочку, символы новой строки и другие метасимволы не будут интерпретироваться повторно. Я уверен, что вы можете сделать то же самое в Python.
(Что касается вашего второго подхода, я бы не ожидал, что конец строки будет проблемой. Если у вас Unix-стиль \n
окончания и стиль Windows \r\n
окончания, вы можете просто лечить трейлинг \r
как часть линии, и все должно оставаться последовательным. Я делаю некоторые предположения здесь о расположении ,v
файлы.)
Я написал библиотеку Python EditRCS (PyPi), которая реализует формат RCS, поэтому пользователь может загрузить файл RCS в виде дерева объектов Python, изменить его программно и сохранить в новый файл RCS.
Вы можете применить функцию к каждой ревизии, используя mapDeltas(), например, чтобы изменить имя автора; или пройтись по дереву с помощью getNext() для чего-то более сложного, например, для объединения двух историй файлов вместе.