小赖子的英国生活和资讯

SVN统计一下谁写的质量差的代码最多[POWERSHELL]

阅读 桌面完整版

在一个代码开发团队里,有人写代码就是很臭.比如这篇英文博文里, 就讲了关于使用通用异常(GENERAL EXCEPTION)处理代码的问题.

通用异常简单来说就是

1
2
3
4
5
try {
 
} catch (Exception anything) {
  // 隐藏错误
}
try {

} catch (Exception anything) {
  // 隐藏错误
}

不管代码出不出错都加一个保险的处理方式,反正有错误抛出,都会被捕获.改BUG用这种方法实在是效率高.

下面的POWERSHELL脚本能统计出每个开发人员写的通用异常的数目.这样研发经理就可以时不是观察和保证代码的质量.遇到喜欢用TRY-CATCH的开发人员, 需要及时沟通和培训.

svn blame, svn praisesvn annotate 都是一样作用的, 其实就是看当时的心情.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
    # 工程目录
    $SolutionDir = "E:\Trunk4.0\Project"
 
    # 获得有效的源文件列表
    $files = Get-ChildItem "$SolutionDir" -filter "*.cs" -Recurse | Where-Object {!(($_.FullName -like "*esigner*.cs") -or ($_.FullName -like "*AssemblyInfo*.cs"))}
 
    # 总的次数
    $cnt = 0
 
    # 通用异常的正则表达式
    $pattern = "catch(\s*\(\s*Exception[\w\s]*\)|\s*$\s*\{|\s*\{)"
 
    # 用于保存每个开发人员的次数
    $dict = @{}
 
    for ($i = 0; $i -lt $files.Count; $i++) { # 检查每一文件
        $filename = $files[$i].FullName
        if (Test-Path $filename) {        
            $content = (Get-Content $filename -Raw)  # 读文件
            if ($content.Length -gt 0) {
                $matches = [regex]::matches($content, $pattern)                
                if ($matches.Count -gt 0) {  # 如果有犯规
                    Write-Host "Processing $filename"
                    $cnt = $cnt + $matches.Count
                    $output = &svn blame -g -x -b "$filename" | grep -n -P "$pattern"
                    ForEach ($obj in $output) {
                        $author = $obj.Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)
                        if ($author.Length -gt 3) { # 有效数据
                            if ($dict.ContainsKey($author[2])) { # 更新统计结果
                                $cur = $dict[$author[2]]
                                $dict[$author[2]] = $cur + 1
                            } else {
                                $dict[$author[2]] = 1
                            }
                        }
                    }
                }
            }
        }
    }
 
    $dict.GetEnumerator() | Sort-Object Value -descending
    Write-Host "Total = $cnt"
    # 工程目录
    $SolutionDir = "E:\Trunk4.0\Project"

    # 获得有效的源文件列表
    $files = Get-ChildItem "$SolutionDir" -filter "*.cs" -Recurse | Where-Object {!(($_.FullName -like "*esigner*.cs") -or ($_.FullName -like "*AssemblyInfo*.cs"))}

    # 总的次数
    $cnt = 0

    # 通用异常的正则表达式
    $pattern = "catch(\s*\(\s*Exception[\w\s]*\)|\s*$\s*\{|\s*\{)"

    # 用于保存每个开发人员的次数
    $dict = @{}

    for ($i = 0; $i -lt $files.Count; $i++) { # 检查每一文件
        $filename = $files[$i].FullName
        if (Test-Path $filename) {        
            $content = (Get-Content $filename -Raw)  # 读文件
            if ($content.Length -gt 0) {
                $matches = [regex]::matches($content, $pattern)                
                if ($matches.Count -gt 0) {  # 如果有犯规
                    Write-Host "Processing $filename"
                    $cnt = $cnt + $matches.Count
                    $output = &svn blame -g -x -b "$filename" | grep -n -P "$pattern"
                    ForEach ($obj in $output) {
                        $author = $obj.Split(" ", [System.StringSplitOptions]::RemoveEmptyEntries)
                        if ($author.Length -gt 3) { # 有效数据
                            if ($dict.ContainsKey($author[2])) { # 更新统计结果
                                $cur = $dict[$author[2]]
                                $dict[$author[2]] = $cur + 1
                            } else {
                                $dict[$author[2]] = 1
                            }
                        }
                    }
                }
            }
        }
    }

    $dict.GetEnumerator() | Sort-Object Value -descending
    Write-Host "Total = $cnt"

svn blame 命令最耗时,因为需要连接代码服务器去统计每一行最后修改的人员.脚本执行完之后大概是这样的输出结果:

Name                           Value                                                                                                                                                                                                                                           
----                           -----                                                                                                                                                                                                                                           
Jack                           184
Tom                            180
Total = 364

我们使用 [regex]::matches($content, $pattern) 先检查每个源文件是否有这样的错误.然后再使用 svn blame 去获得每一行具体是谁改的并且用 GREP来过滤. 随着错误减少,检查的时间就会相应的快许多.

参数 -g 则会考虑分支的合并.参数-x -b 则会排除 无意义的修改(比如空格)

最后通过 $dict.GetEnumerator() | Sort-Object Value -descending 根据次数来倒序. 下一步则是在 CI服务器上针对每一个开发者实时画一曲线.

英文: How to use SVN blame to count the ugly code (e.g. general exceptions) for each developer? [PowerShell Script]

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version