Rcov report for: app/models/hudson_build_rotator.rb

NameTotal linesLines of codeTotal coverageCode coverage
app/models/hudson_build_rotator.rb8149
100.00%
100.00%
1 # To change this template, choose Tools | Templates
2 # and open the template in the editor.
3 
4 class HudsonBuildRotator
5   unloadable
6   
7   def initialize(job_settings)
8     raise ArgumentError.new("arg job_settings is nil") unless job_settings
9     raise ArgumentError.new("arg job_settings should be HudsonJobSetting") unless job_settings.is_a?(HudsonJobSettings)
10     @job_settings = job_settings
11   end
12 
13   def execute
14     return unless @job_settings.do_rotate?
15 
16     HudsonBuild.destroy_all(HudsonBuildRotator.create_cond_to_delete(@job_settings))
17 
18   end
19 
20 end
21 
22 def HudsonBuildRotator.can_store?(job, number)
23   return false unless job
24   return false unless number
25 
26   job_settings = job.job_settings
27   return true unless job_settings
28   return true unless job_settings.do_rotate?
29 
30   cond = HudsonBuildRotator.create_cond_to_delete(job_settings)
31 
32   # get oldest data
33   oldest = HudsonBuild.find(:first,
34                             :conditions => ["#{HudsonBuild.table_name}.hudson_job_id = ? and #{HudsonBuild.table_name}.id not in (select #{HudsonBuild.table_name}.id from #{HudsonBuild.table_name} where #{cond})", job.id],
35                             :order => "#{HudsonBuild.table_name}.number")
36 
37   return true unless oldest
38 
39   return number.to_i >= oldest.number.to_i
40 
41 end
42 
43 def HudsonBuildRotator.create_cond_to_delete(job_settings)
44 
45   cond = "#{HudsonBuild.table_name}.hudson_job_id = #{job_settings.hudson_job_id}"
46 
47   delete_conds = []
48   delete_conds << HudsonBuildRotator.create_cond_days_to_delete(job_settings.build_rotator_days_to_keep)
49   delete_conds << HudsonBuildRotator.create_cond_num_to_delete(job_settings.hudson_job_id, job_settings.build_rotator_num_to_keep)
50   delete_conds.delete("")
51 
52   delete_cond = delete_conds.join(" OR ")
53 
54   cond << " AND (#{delete_cond})"
55 
56   return cond
57 
58 end
59 
60 def HudsonBuildRotator.create_cond_days_to_delete(days_to_keep)
61   return "" unless (days_to_keep && days_to_keep > 0)
62 
63   date_to_delete = Date.today - days_to_keep
64   return "#{HudsonBuild.table_name}.finished_at <= '#{date_to_delete} 23:59:59'"
65 end
66 
67 def HudsonBuildRotator.create_cond_num_to_delete(job_id, num_to_keep)
68   return "" unless (num_to_keep && num_to_keep > 0)
69 
70   # because, MySQL can't use limit in subquery
71   # http://dev.mysql.com/doc/refman/5.0/en/subquery-errors.html
72   build_count = HudsonBuild.count(:conditions => "#{HudsonBuild.table_name}.hudson_job_id = #{job_id}")
73   delete_count = build_count - num_to_keep
74 
75   return "" unless delete_count > 0
76 
77   delete_builds = HudsonBuild.find(:all, :conditions => "#{HudsonBuild.table_name}.hudson_job_id = #{job_id}", :order => "#{HudsonBuild.table_name}.number ASC", :limit => delete_count, :offset => delete_count - 1)
78   return "" unless delete_builds.length > 0
79 
80   return "#{HudsonBuild.table_name}.number <= #{delete_builds[0].number}"
81 end