| 41 | | # day |
|---|
| 42 | | month_days = (1 .. month_days(year, month)) |
|---|
| 43 | | days = @day.select do |d| month_days === d end |
|---|
| 44 | | unless days.include?(day) |
|---|
| 45 | | next_day = days.detect(lambda { days.min }) do |d| d > day end |
|---|
| 46 | | hour, min, sec = @hour.min, @min.min, @sec.min |
|---|
| 47 | | if next_day.nil? or next_day < day |
|---|
| 48 | | day = next_day.nil? ? @day.min : next_day |
|---|
| 49 | | month += 1 |
|---|
| 50 | | retry |
|---|
| 51 | | end |
|---|
| 52 | | day = next_day |
|---|
| 53 | | end |
|---|
| 54 | | |
|---|
| | 41 | # according to crontab(5): |
|---|
| | 42 | # Note: The day of a commandâs execution can be specified by two fields â day of month, and day of week. |
|---|
| | 43 | # If both fields are restricted (i.e., arenât *), the command will be run when either |
|---|
| | 44 | # field matches the current time. For example, ââ30 4 1,15 * 5ââ would cause a command to be |
|---|
| | 45 | # run at 4:30 am on the 1st and 15th of each month, plus every Friday. |
|---|
| | 46 | if !day_restricted? and wday_restricted? |
|---|
| | 47 | # unrestricted day, restricted wday. go by wday |
|---|
| | 48 | unless @wday.include?(wday) |
|---|
| | 49 | next_wday = @wday.detect(lambda { @wday.min }) do |w| w > wday end |
|---|
| | 50 | hour, min, sec = @hour.min, @min.min, @sec.min |
|---|
| | 51 | if next_wday < wday |
|---|
| | 52 | # next week. |
|---|
| | 53 | day += + 7 - (wday - next_wday) |
|---|
| | 54 | if day > month_days(year, month) |
|---|
| | 55 | day -= month_days(year, month) |
|---|
| | 56 | month += 1 |
|---|
| | 57 | end |
|---|
| | 58 | wday = next_wday |
|---|
| | 59 | retry |
|---|
| | 60 | end |
|---|
| | 61 | |
|---|
| | 62 | day += (next_wday - wday) |
|---|
| | 63 | wday = next_wday |
|---|
| | 64 | end |
|---|
| | 65 | elsif !wday_restricted? and day_restricted? |
|---|
| | 66 | # unrestricted wday, restricted day. go by day |
|---|
| | 67 | month_days = (1 .. month_days(year, month)) |
|---|
| | 68 | days = @day.select do |d| month_days === d end |
|---|
| | 69 | unless days.include?(day) |
|---|
| | 70 | next_day = days.detect(lambda { days.min }) do |d| d > day end |
|---|
| | 71 | hour, min, sec = @hour.min, @min.min, @sec.min |
|---|
| | 72 | if next_day.nil? or next_day < day |
|---|
| | 73 | day = next_day.nil? ? @day.min : next_day |
|---|
| | 74 | month += 1 |
|---|
| | 75 | retry |
|---|
| | 76 | end |
|---|
| | 77 | day = next_day |
|---|
| | 78 | end |
|---|
| | 79 | else |
|---|
| | 80 | # both @day and @wday are restricted, or unrestricted |
|---|
| | 81 | month_days = (1 .. month_days(year, month)) |
|---|
| | 82 | days = @day.select do |d| month_days === d end |
|---|
| | 83 | unless days.include?(day) || @wday.include?(wday) |
|---|
| | 84 | next_day = days.detect(lambda { days.min }) do |d| d > day end |
|---|
| | 85 | next_wday = @wday.detect(lambda { @wday.min }) do |w| w > wday end |
|---|
| | 86 | hour, min, sec = @hour.min, @min.min, @sec.min |
|---|
| | 87 | |
|---|
| | 88 | # which is less? next_day or next_wday? |
|---|
| | 89 | # just calculate how many days from 'day' they both are. |
|---|
| | 90 | |
|---|
| | 91 | if next_day.nil? or next_day < day |
|---|
| | 92 | next_by_mday = month_days(year, month) - day + (next_day.nil? ? @day.min : next_day) |
|---|
| | 93 | else |
|---|
| | 94 | next_by_mday = next_day - day |
|---|
| | 95 | end |
|---|
| | 96 | |
|---|
| | 97 | if next_wday.nil? or next_wday < wday |
|---|
| | 98 | next_by_wday = 7 - wday + (next_wday.nil? ? @day.min : next_wday) |
|---|
| | 99 | else |
|---|
| | 100 | next_by_wday = next_wday - wday |
|---|
| | 101 | end |
|---|
| | 102 | |
|---|
| | 103 | next_day = [next_by_wday, next_by_mday].min |
|---|
| | 104 | if next_day + day > month_days(year, month) |
|---|
| | 105 | # next fire lands on next month |
|---|
| | 106 | day += next_day - month_days(year, month) |
|---|
| | 107 | wday += next_day % 7 |
|---|
| | 108 | wday -= 7 if wday > 6 |
|---|
| | 109 | month += 1 |
|---|
| | 110 | if month > 12 |
|---|
| | 111 | year += 1 |
|---|
| | 112 | month = 1 |
|---|
| | 113 | end |
|---|
| | 114 | retry |
|---|
| | 115 | end |
|---|
| | 116 | day += next_day |
|---|
| | 117 | end |
|---|
| | 118 | end |
|---|
| | 119 | |
|---|
| | 120 | |
|---|
| | 121 | |
|---|