用于在checkout / update上重命名成员变量的svn脚本

时间:2009-05-27 05:23:24

标签: c++ svn

我与一个喜欢使用mCamelCase约定命名其成员变量的人合作,例如:mSomeVar或mSomeOtherVar。我不能忍受这种格式。我更喜欢m_camelCase对流,例如:m_someVar或m_someOtherVar。我们互相疯狂地看着对方的代码。

现在我们已经为团队添加了一个新人,他根本不喜欢任何前缀。由于我们使用svn,我们认为我们可以开发一个svn脚本,当您从服务器下载代码时,它会动态重命名成员变量。这样每个人都可以获得他们想要的成员变量。

有没有人有任何可以做这种事情的svn脚本示例?我见过更改注释标题的脚本,但我们需要包含C ++处理器的东西。

3 个答案:

答案 0 :(得分:5)

听起来像灾难的食谱。为了使其工作,您需要决定存储库范围的标准,其中每个文件使用相同的变量命名约定。如果你能做到这一点,为什么不让每个人都这样编码?!关于约定的重要事项不是你使用 约定,而是每个人实际使用 相同的 约定!

找一个具有资历的人来打电话(或者如果可以的话,拉一个等级),其他人只需要把它搞砸。

答案 1 :(得分:5)

我假设你想改变用于研究目的的风格,问题只是假设。 Joel S.似乎认为简单地说你做错事的答案根本就不是好的答案,所以我会试着给你一些途径来解决你的问题。

svn在转换方面最接近的事情是它可以更改签出结束时的行,并在签入时再次更改它。这允许存储库只有一个行结束的概念,并允许不同的客户端将文件修改为其首选项。虽然这个功能听起来相当直接,但很多人似乎都无法正常工作。只需谷歌'svn eol-style'

由于svn不提供任何类型的可自定义客户端过滤器,我认为可以安全地假设您需要修改svn客户端,并为自己的目的编译它。也许您可以将补丁或扩展名提交回svn。

所以在这一点上,你应该已经下载了svn源代码,并且能够让它来编译客户端。此时,请将注意力转移到libsvn_subr/subst.c。此文件包含要转换为各种格式的例程。目前它在关键字扩展和eol上进行翻译。

您只需要创建一个新属性,可能称为member-variable-style。对于设置了此标志的文件,您可以在subst.c代码中调用特殊变换。您可以通过查看对svn_subst_translate_stream3的调用来跟踪svn中的引用到转换代码。

行。这很容易。现在,您需要获得一个函数,以便将代码从一种形式正确地转换为另一种形式。你不能简单地从ccc中取出cpp处理器,因为无法保证代码有效/编译。你必须尽最大努力创建lexing规则,希望能在正确的变量上做正确的事情。对于以m_或m开头的变量,这是相当直接的。不幸的是,对于团队中完全不使用m_的成员来说,确定它在C ++中的成员变量是一个很大的挑战。幸运的是,创建语法高亮代码的人在该领域中进行了相当多的研究。我会四处寻找并找到一些能够突出显示C ++代码的代码。

最后,由于这些转换可能变得非常复杂,我建议你在这个阶段将svn shell发送到过滤器程序。这对于性能来说并不是很好,但它可以使编写和调试过滤器变得更加容易。然后,您可以使用Perl或您选择的语言编写过滤器。有关使用外部过滤器程序的一个很好的示例,请参阅Squid redirectors

祝你好运!

答案 2 :(得分:3)

Subversion没有可用于更新的钩子 - 你可以有一个post-commit hook *,允许你从一个约定转换到另一个约定(存储库标准),你可以使用你自己编写的脚本做结帐,然后执行必要的调整,但这会给你svn diff等的错误读数。

我的建议是与同事坐下来并就标准达成一致。但是,提交后的钩子仍然可以用来捕捉失误。

*我正在考虑发生提交的事情,自动检出并修改代码以遵守存储库标准约定,然后在必要时提交。另一种选择是使用预提交钩子,如果代码不符合标准,则禁止提交。