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 |