47 lines
1.4 KiB
Ruby
47 lines
1.4 KiB
Ruby
# 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
|