1

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

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

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

我考虑过的事情:

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

是否有任何其他方法可以减少工作量,或者是否有任何现有的代码可以实现这种功能?

4

2 回答 2

2

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

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

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

(至于您的第二种方法,我不认为行尾会成为问题。如果您有 Unix 风格的\n结尾和 Windows 风格的\r\n结尾,您可以将尾随\r视为行的一部分,并且一切都应该保持一致。我在这里对,v文件的布局做了一些假设。)

于 2012-06-05T05:01:13.710 回答
0

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

您可以使用 mapDeltas() 将函数应用于每个修订版,例如更改作者姓名;或者使用 getNext() 遍历树来处理更复杂的事情,例如将两个文件历史连接在一起。

于 2019-07-09T18:58:01.787 回答