feiyang10086 发表于 2011-11-03 17:39

统计同一个项目在不同时期的代码新增情况

统计同一个项目在不同时期的代码新增情况


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

coolesting 发表于 2011-11-04 15:04

这个任务通常都是git/svn/cvs去做的吧

liaoliaofannao 发表于 2011-11-04 15:22

恩 楼上的说的有理 :em03:
页: [1]
查看完整版本: 统计同一个项目在不同时期的代码新增情况