获取svn diff以在提交期间显示C ++函数

时间:2009-06-17 14:55:42

标签: c++ regex linux svn diff

每当我在svn中执行提交循环时,我会在编写注释时检查差异。我认为在显示差异时显示我进行修改的实际功能真的很棒。

我检查了this page,其中提到-p选项将显示更改所在的C函数。但是,当我尝试将-p选项与某些C ++代码一起使用时,它通常会返回访问权限说明符(私人,公共,受保护等),这不是非常方便。

我注意到diff的-F选项与-p相同,但是使用了用户指定的正则表达式。 我想知道:是否有一个简单的正则表达式来匹配C ++函数?似乎只需要这一切就可以实现这一点。

我会花一些时间自己看这个,但是工作处于紧缩模式,这似乎是很多人会觉得有用的东西,所以我想我会在这里发布。

编辑:我不是在寻找一个满贯扣篮的正则表达式,但是只需在区域差异上方找到最近函数定义的东西就会显示出来。事实上它不会完美,而且有些马车对我来说没问题。只要它正常工作,就像60%的时间可以显着提高生产力恕我直言。

4 个答案:

答案 0 :(得分:3)

是否有一个简单的正则表达式来匹配C ++函数?否。

是否存在匹配C ++的(复杂)正则表达式。也许或者可以写一个。

但我会说正则表达式既不容易达到这样的任务(假设你需要某种匹配),它们也不适合这样的任务。

想想case就像这样。你会怎么处理这些东西。

void (*function(int, void (*)(int)))(int);

func1(int), func2(double); double func3(int);

唯一真正的解决方案是使用yacc / lex的解析器。对于您的用例当然不会做任何事情。

所以要么修复一些不完整的正则表达式,它适合代码中的大多数函数签名

答案 1 :(得分:2)

如果您要将此仅应用于您的提交,我建议养成向该函数添加提交注释的习惯,例如:

void something () 
{
    ...
    some thing = 1;
    ...
}

void something () 
// last change by me: a better value for thing
{
    ...
    some thing = 2;
    ...
}

将显示您的评论功能。作为奖励,其他人将能够理解你在做什么。

答案 2 :(得分:1)

TortoiseSVN在其C ++文件的提交对话框中使用以下正则表达式来自动完成支持:

.h, .hpp, .hxx = ^\s*(?:class|struct)\s+([\w_]+)|\W([\w_]+)\(
.cpp, .c, .cxx = \W(([\w_]+)::([\w_]+))|\W([\w_]+)\(

我不知道他们有多准确。

答案 3 :(得分:1)

我不知道SVN中会有这样做的选项,基于正则表达式的解决方案可能是以下一种或多种:

  • 编码和维护的噩梦,有很多特殊情况
  • 不正确,缺少几个有效的C ++函数

你需要某种解析器。从技术上讲,可以枚举所有可能的正则表达式案例,但编写解析器是解决此问题的正确方法。如果你有时间推出自己的解决方案,我会查看ANTLR,他们在这个页面上有几个C / C ++语法:

ANTLR Grammar Lists