Скрипт для настройки истории в RCS/CVS,v файл

Готовясь к переходу на Mercurial, я хотел бы внести некоторые систематические изменения во многие тысячи v-файлов. (Я буду редактировать копии оригиналов, спешу добавить.)

Примеры видов изменений, за которыми я следую:

  1. Для каждой ревизии, сообщение которой начинается с некоторого текста, который указывает известное имя пользователя (например, [Fred Bloggs]), если имя пользователя в комментарии совпадает с именем автора в файле, v, то удалите ненужный текст имени пользователя из сообщения фиксации.
  2. Если, v содержит полезное описание, добавьте его к сообщению фиксации для ревизии 1.1 (cvs2hg игнорирует описание - но многие из наших файлов CVS фактически пришли из RCS, где было легко поместить начальное сообщение фиксации в поле описания с помощью ошибка)
  3. Для правок, внесенных из определенных общих учетных записей пользователей, измените автора в зависимости от содержимого сообщения фиксации.

Вещи, которые я рассмотрел:

  1. Запуск 'cvs log' для каждого отдельного файла, v файла - анализ выходных данных и использование rcs -m изменить эту историю. Проблемы с этим включают в себя:
    • кажется, нет способа передать текстовый файл rcs -m - поэтому, если сообщение о ревизии содержит одинарные и / или двойные кавычки или занимает несколько строк, было бы довольно сложно правильно его процитировать в сценарии
    • Я не вижу средства rcs или cvs для изменения имени автора, связанного с ревизией
    • менее важно, что это может привести к запуску огромного количества процессов, которые, я думаю, могут быть медленными
  2. Написание Python для разбора файла, v и настройки содержимого. Проблемы с этим включают в себя:
    • в наших файлах v есть несколько концовок строк, включая некоторые двоичные файлы, которые должны были быть текстовыми, и наоборот, поэтому необходимо соблюдать особую осторожность, чтобы не повредить файлы.
    • осторожность будет необходима для цитирования символа @ в любых сообщениях фиксации, если он попадает в начало строки в многострочном комментарии
    • необходимо также соблюдать осторожность в отношении ревизий, в которых последняя строка подтвержденного файла была изменена и не имеет новой строки - это означает, что, v имеет символ @ в самом конце строки, а не предшествует \n
  3. Клонируйте версию 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() для чего-то более сложного, например, для объединения двух историй файлов вместе.

Другие вопросы по тегам