统计同一个项目在不同时期的代码新增情况
统计同一个项目在不同时期的代码新增情况Ruby代码1.# encoding: utf-8
2.module ProjectCodeStatistics
3. module FetchFile
4. def recursion_fetch(dir=nil)
5. dir = @base_dir if dir == nil
6. Dir.foreach(dir).each do |file_dir|
7. dir_path = File.join(dir,file_dir)
8. ifFile.directory?(dir_path)then
9. recursion_fetch(dir_path) unless file_dir =~ /^\./
10. else
11. if [/\.java$/,/\.jsp$/,/\.js$/,/\.xml$/].any?{|reg| reg=~file_dir}
12. @all_file_with_row_number = File.new(dir_path).readlines.size
13. end
14. end
15. end
16. end
17. end
18.
19. class Calculate
20. include FetchFile
21. attr_reader :all_file_with_row_number
22.
23. def initialize(dir)
24. @base_dir, @all_file_with_row_number = dir, {}
25. recursion_fetch
26. end
27. # 分类统计所有文件数量
28. def file_total_numbers()
29. row_numbers(:xml,:js,:jsp,:java,@all_file_with_row_number)
30. end
31.
32. # 分类统计新加入的文件代码行总量的
33. def add_file_row_numbers(other)
34. add_file_keys = @all_file_with_row_number.keys - other.all_file_with_row_number.keys
35. add_file_hash = @all_file_with_row_number.find_all{|key,value| add_file_keys.include? key}
36. row_numbers(:xml,:js,:jsp,:java,add_file_hash)
37. end
38.
39. # 分类统计新加入的各种类型文件总量
40. def compare_add_file_count(other)
41. add_file_keys = @all_file_with_row_number.keys - other.all_file_with_row_number.keys
42. file_numbers(:xml,:js,:jsp,:java,add_file_keys)
43. end
44.
45. # 分类统计修改过的文件
46. def compare_each_modify_file(other)
47. file_hash = @all_file_with_row_number
48. calculated_hash =other.all_file_with_row_number.find_all.inject({}) do |hash,item|
49. hash] = (file_hash] - item) if file_hash.include?(item) && file_hash] != item
50. hash
51. end
52. row_numbers(:xml,:js,:jsp,:java,calculated_hash)
53. end
54.
55. def file_numbers(*parameter)
56. last = parameter.reverse!.shift
57. parameter.reverse.inject([]) do |total,type|
58. regexp=eval('/' + type.to_s + '$/')
59. total.push(last.find_all{|key,value| regexp =~ key}.size)
60. end
61. end
62.
63. def row_numbers(*parameter)
64. last = parameter.reverse!.shift
65. parameter.reverse.inject([]) do |total,type|
66. regexp=eval('/' + type.to_s + '$/')
67. total.push last.find_all{|key,value| regexp =~ key}.inject(0){|sum,item| sum + item }
68. end
69. end
70. end
71.
72. class Statistics
73. def initialize(new_project,old_project,new_desc="新工程",old_desc="老工程")
74. @new_project = Calculate.new(new_project)
75. @old_project = Calculate.new(old_project)
76. @new_desc,@old_desc = new_desc,old_desc
77. end
78.
79. def print
80. old_total = @old_project.file_total_numbers
81. new_total = @new_project.file_total_numbers
82. puts '系统代码统计'
83. puts "#{@old_desc}代码总量统计,总计:#{old_total.reduce(:+)}行, java:#{old_total}行,jsp: #{old_total}行,js: #{old_total}行,sql: #{old_total}行 "
84. puts "#{@new_desc}代码总量统计,总计:#{new_total.reduce(:+)}行,java:#{new_total}行,jsp: #{new_total}行,js: #{new_total}行,sql: #{new_total}行 "
85. puts "新增总量 #{new_total.reduce(:+) - old_total.reduce(:+)}行"
86.
87. add_files = @new_project.compare_add_file_count(@old_project)
88. new_rows = @new_project.add_file_row_numbers(@old_project)
89. modify_rows = @new_project.compare_each_modify_file(@old_project)
90. total_change = (new_rows.zipmodify_rows).inject([]) {|n,a|n<<a.reduce(:+)}
91. puts
92. puts"新增加的文件数量,java:#{add_files}个,jsp: #{add_files}个,js: #{add_files}个, sql: #{add_files}个 "
93. puts
94. puts"新增加的文件代码行,java:#{new_rows}行,jsp: #{new_rows}行,js: #{new_rows}行, sql: #{new_rows}行 "
95. puts"新增加的代码行, java:#{modify_rows}行,jsp: #{modify_rows}行,js: #{modify_rows}行, sql: #{modify_rows}行 "
96. puts"新增加的代码行总计,java:#{total_change}行,jsp: #{total_change}行,js: #{total_change}行, sql: #{total_change}行 "
97. puts"新增总量 #{new_rows.reduce(:+) + modify_rows.reduce(:+)}行"
98. end
99. end
100.end
101.
102.s = ProjectCodeStatistics::Statistics.new('D:\boss\Code\udrm\src','D:\boss\Code\digital20110726\src')
103.s.print 这个任务通常都是git/svn/cvs去做的吧 恩 楼上的说的有理 :em03:
页:
[1]