用于调整RCS / CVS,v文件中的历史记录的脚本

时间:2012-06-04 21:48:19

标签: mercurial cvs rcs

在准备迁移到Mercurial时,我想对数千个v文件进行一些系统的更改。 (我将编辑原件的副本,我赶紧补充。)

我所追求的各种变化的例子:

  1. 对于其消息以指示已知用户名的某些文本开头的每个修订版(例如[Fred Bloggs]),如果注释中的用户名与v文件中的作者匹配,则从提交中删除不必要的用户名文本消息
  2. 如果,v包含有用的描述,请将其附加到修订版1.1的提交消息(cvs2hg忽略描述 - 但我们的许多CVS文件实际上来自RCS,在那里很容易将初始提交消息放入错误地描述字段)
  3. 对于从某些共享用户帐户进行的编辑,请根据提交邮件的内容调整作者。
  4. 我考虑过的事情:

    1. 在每个vv文件上运行'cvs log' - 解析输出,并使用rcs -m更改此历史记录。这方面的问题包括:
      • 似乎没有办法将文本文件传递给rcs -m - 所以如果修订版消息包含单引号和/或双引号,或跨越多行,那将是一个相当挑战的引用它在脚本中正确
      • 我看不到rcs或cvs工具来更改与修订版相关联的作者姓名
      • 不太重要的是,它可能会启动大量的流程 - 我认为这可能会变慢
    2. 编写Python来解析,v file,并调整内容。这方面的问题包括:
      • 我们的v文件中包含一些行结尾 - 包括一些应该是文本的二进制文件,反之亦然 - 所以要非常小心不要破坏文件
      • 在任何提交消息中引用@字符时需要小心,如果它在多行注释中落在行的开头
      • 还需要关注修改,其中提交文件的最后一行被更改,并且没有换行符 - 意味着,v在一行的最后有一个@,而不是在前面\n
    3. 克隆我们正在使用的cvs2hg版本,并尝试调整其代码以便就地进行所需的修改
    4. 是否有其他方法可以减少工作量,或者是否有任何实现此类功能的现有代码?

2 个答案:

答案 0 :(得分:2)

您的第一种方法可能是最好的方法。我知道在Perl中,处理引号和多行不会有问题。例如:

my $revision = ...;
my $log_message = ...;
system('rcs', "-m$revision:$log_message", $filename);

其中$log_message可以包含任意文本。由于字符串不通过shell,因此不会重新解释换行符和其他元字符。我相信你可以用Python做同样的事情。

(至于你的第二种方法,我不希望行结尾成为一个问题。如果你有Unix风格的\n结尾和Windows风格的\r\n结尾,你可以只对待尾随\r作为行的一部分,一切都应该保持一致。我在这里假设,v文件的布局。)

答案 1 :(得分:0)

我编写了一个Python库EditRCSPyPi),该库实现了RCS format,因此用户可以将RCS文件作为Python对象树加载,以编程方式对其进行修改并保存到一个新的RCS文件。

您可以使用mapDeltas()将函数应用于每个修订版,例如应用于change an author's name;或使用getNext()一起走到更复杂的地方,例如joining two file histories