diff options
Diffstat (limited to 'app/models/ci/freeze_period_status.rb')
-rw-r--r-- | app/models/ci/freeze_period_status.rb | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/app/models/ci/freeze_period_status.rb b/app/models/ci/freeze_period_status.rb new file mode 100644 index 00000000000..befa935e750 --- /dev/null +++ b/app/models/ci/freeze_period_status.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +module Ci + class FreezePeriodStatus + attr_reader :project + + def initialize(project:) + @project = project + end + + def execute + project.freeze_periods.any? { |period| within_freeze_period?(period) } + end + + def within_freeze_period?(period) + # previous_freeze_end, ..., previous_freeze_start, ..., NOW, ..., next_freeze_end, ..., next_freeze_start + # Current time is within a freeze period if + # it falls between a previous freeze start and next freeze end + start_freeze = Gitlab::Ci::CronParser.new(period.freeze_start, period.cron_timezone) + end_freeze = Gitlab::Ci::CronParser.new(period.freeze_end, period.cron_timezone) + + previous_freeze_start = previous_time(start_freeze) + previous_freeze_end = previous_time(end_freeze) + next_freeze_start = next_time(start_freeze) + next_freeze_end = next_time(end_freeze) + + previous_freeze_end < previous_freeze_start && + previous_freeze_start <= time_zone_now && + time_zone_now <= next_freeze_end && + next_freeze_end < next_freeze_start + end + + private + + def previous_time(cron_parser) + cron_parser.previous_time_from(time_zone_now) + end + + def next_time(cron_parser) + cron_parser.next_time_from(time_zone_now) + end + + def time_zone_now + @time_zone_now ||= Time.zone.now + end + end +end |