我与一个喜欢使用mCamelCase约定命名其成员变量的人合作,例如:mSomeVar或mSomeOtherVar。我不能忍受这种格式。我更喜欢m_camelCase对流,例如:m_someVar或m_someOtherVar。我们互相疯狂地看着对方的代码。
现在我们已经为团队添加了一个新人,他根本不喜欢任何前缀。由于我们使用svn,我们认为我们可以开发一个svn脚本,当您从服务器下载代码时,它会动态重命名成员变量。这样每个人都可以获得他们想要的成员变量。
有没有人有任何可以做这种事情的svn脚本示例?我见过更改注释标题的脚本,但我们需要包含C ++处理器的东西。
答案 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
等的错误读数。
我的建议是与同事坐下来并就标准达成一致。但是,提交后的钩子仍然可以用来捕捉失误。
*我正在考虑发生提交的事情,自动检出并修改代码以遵守存储库标准约定,然后在必要时提交。另一种选择是使用预提交钩子,如果代码不符合标准,则禁止提交。