Welcome to mirror list, hosted at ThFree Co, Russian Federation.

freeze_period_status.rb « ci « models « app - gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: befa935e750e7174f265e2b88e196e7475cefbf2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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