diff options
author | Fabio Pitino <fpitino@gitlab.com> | 2019-05-02 13:29:51 +0100 |
---|---|---|
committer | Fabio Pitino <fpitino@gitlab.com> | 2019-05-07 08:06:49 +0100 |
commit | 673ea5d2ac50e17a1839d0db83641e6851422f88 (patch) | |
tree | e98145643cb4269c81fcc86479c2c8ca1154d631 | |
parent | 0edd1e6714385a87f0cacb25497204d89535d35f (diff) | |
download | gitlab-ce-673ea5d2ac50e17a1839d0db83641e6851422f88.tar.gz |
Rescue RuntimeError when "too many loops" occur
With this workaround we temporarily prevent an
exception from Fugit gem to be raised in
Gitlab::Ci::CronParser
-rw-r--r-- | lib/gitlab/ci/cron_parser.rb | 10 | ||||
-rw-r--r-- | spec/lib/gitlab/ci/cron_parser_spec.rb | 7 |
2 files changed, 16 insertions, 1 deletions
diff --git a/lib/gitlab/ci/cron_parser.rb b/lib/gitlab/ci/cron_parser.rb index 94f4a4e36c9..ae524654b7d 100644 --- a/lib/gitlab/ci/cron_parser.rb +++ b/lib/gitlab/ci/cron_parser.rb @@ -13,7 +13,7 @@ module Gitlab def next_time_from(time) @cron_line ||= try_parse_cron(@cron, @cron_timezone) - @cron_line.next_time(time).utc.in_time_zone(Time.zone) if @cron_line.present? + find_next_time(time) if @cron_line.present? end def cron_valid? @@ -49,6 +49,14 @@ module Gitlab def try_parse_cron(cron, cron_timezone) Fugit::Cron.parse("#{cron} #{cron_timezone}") end + + def find_next_time(time) + @cron_line.next_time(time).utc.in_time_zone(Time.zone) + rescue RuntimeError => error + raise error unless error.message =~ /too many loops/ + # Fugit::Cron raises a RuntimeError if :next_time does not find the next schedule + # given an invalid pattern - E.g. try_parse_cron('0 12 31 2 *') + end end end end diff --git a/spec/lib/gitlab/ci/cron_parser_spec.rb b/spec/lib/gitlab/ci/cron_parser_spec.rb index 491e3fba9d9..a228334d53e 100644 --- a/spec/lib/gitlab/ci/cron_parser_spec.rb +++ b/spec/lib/gitlab/ci/cron_parser_spec.rb @@ -181,6 +181,13 @@ describe Gitlab::Ci::CronParser do it { expect(subject).to be_nil } end + + context 'when cron is scheduled to a non existent day' do + let(:cron) { '0 12 31 2 *' } + let(:cron_timezone) { 'UTC' } + + it { expect(subject).to be_nil } + end end describe '#cron_valid?' do |