Mercurial 用于调整RCS/CVS,v文件中的历史记录的脚本
为了准备迁移到Mercurial,我想对数千个,v文件进行一些系统性的更改。(我会编辑原件的副本,我赶紧补充。) 我所追求的各种变化的示例:Mercurial 用于调整RCS/CVS,v文件中的历史记录的脚本,mercurial,cvs,rcs,Mercurial,Cvs,Rcs,为了准备迁移到Mercurial,我想对数千个,v文件进行一些系统性的更改。(我会编辑原件的副本,我赶紧补充。) 我所追求的各种变化的示例: 对于消息以指示已知用户名的文本开头的每个版本(例如,[Fred Bloggs]),如果注释中的用户名与v文件中的作者匹配,则从提交消息中删除不必要的用户名文本 如果,v包含有用的描述,请将其附加到修订版1.1的提交消息中(cvs2hg忽略该描述-但我们的许多CVS文件实际上来自RCS,在RCS中很容易错误地将初始提交消息放入描述字段) 对于从某些共享用户帐
[Fred Bloggs]
),如果注释中的用户名与v文件中的作者匹配,则从提交消息中删除不必要的用户名文本rcs-m
更改此历史记录。这方面的问题包括:
- 似乎没有办法将文本文件传递给
——因此,如果修订消息包含单引号和/或双引号,或者跨越多行,那么在脚本中正确引用它将是一个相当大的挑战rcs-m
- 我看不到rcs或cvs设施可以更改与修订相关的作者名称
- 不那么重要的是,它可能会启动大量的进程——我认为这可能会变得缓慢
- 在我们的,v文件中混合了行尾-包括一些本应为文本的二进制文件,反之亦然-因此需要非常小心,以免损坏文件
- 如果@字符落在多行注释的行首,则在任何提交消息中引用@字符时都需要小心
- 如果提交文件的最后一行已更改,并且没有换行符,则需要注意修订,这意味着,v在行尾有一个@,而不是前面有
\n
是否有其他方法可以减少工作量,或者有任何现有代码可以实现这种功能?您的第一种方法可能是最好的方法。我知道在Perl中,处理引号和多行不会是问题。例如:
my $revision = ...;
my $log_message = ...;
system('rcs', "-m$revision:$log_message", $filename);
其中,$log\u message
可以包含任意文本。由于字符串不经过shell,因此不会重新解释换行符和其他元字符。我相信你可以用Python做同样的事情
(至于第二种方法,我不认为行结尾会有问题。如果您有Unix风格的\n
结尾和Windows风格的\r\n
结尾,您可以将尾部的\r
作为行的一部分,并且所有内容都应该保持一致。我在这里对,v
的布局进行一些假设我编写了一个Python库(),它实现了,因此用户可以将RCS文件作为Python对象树加载,以编程方式修改它并保存到一个新的RCS文件
您可以使用mapDeltas()将函数应用于每个修订版,例如to;或使用getNext()遍历树以获得更复杂的内容,例如一起使用。谢谢-两个非常有用的建议。您可以使用:
rcs-m1.2:$(cat/path/to/file)将文本文件从shell传递到rcs-m
但是正确的引用确实很棘手!