From 98fbc7a88f84327cf9100d03e6c74918bc575433 Mon Sep 17 00:00:00 2001 From: Steve Riesenberg Date: Thu, 9 Jun 2022 15:30:37 -0500 Subject: [PATCH] Calculate release day from the first Monday Fixes an issue where the first day of the month is (for example) a Tuesday causing the 2nd Tuesday and 3rd Monday to be over a week apart. Issue gh-10458 --- .../github/milestones/SpringReleaseTrain.java | 14 ++++++++------ .../github/milestones/SpringReleaseTrainTests.java | 8 ++++---- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/buildSrc/src/main/java/org/springframework/gradle/github/milestones/SpringReleaseTrain.java b/buildSrc/src/main/java/org/springframework/gradle/github/milestones/SpringReleaseTrain.java index cce1c0bc85..e0ed561eb6 100644 --- a/buildSrc/src/main/java/org/springframework/gradle/github/milestones/SpringReleaseTrain.java +++ b/buildSrc/src/main/java/org/springframework/gradle/github/milestones/SpringReleaseTrain.java @@ -20,6 +20,8 @@ import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Month; import java.time.Year; +import java.time.temporal.TemporalAdjuster; +import java.time.temporal.TemporalAdjusters; import java.util.LinkedHashMap; import java.util.Map; @@ -123,12 +125,12 @@ public final class SpringReleaseTrain { } private static LocalDate calculateReleaseDate(Year year, Month month, DayOfWeek dayOfWeek, int dayOffset) { - LocalDate firstDayOfMonth = year.atMonth(month).atDay(1); - int dayOfWeekOffset = dayOfWeek.getValue() - firstDayOfMonth.getDayOfWeek().getValue(); - if (dayOfWeekOffset < 0) { - dayOfWeekOffset += 7; - } + TemporalAdjuster nextMonday = TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY); + TemporalAdjuster nextDayOfWeek = TemporalAdjusters.nextOrSame(dayOfWeek); - return firstDayOfMonth.plusDays(dayOfWeekOffset).plusDays(dayOffset); + LocalDate firstDayOfMonth = year.atMonth(month).atDay(1); + LocalDate firstMondayOfMonth = firstDayOfMonth.with(nextMonday); + + return firstMondayOfMonth.with(nextDayOfWeek).plusDays(dayOffset); } } diff --git a/buildSrc/src/test/java/org/springframework/gradle/github/milestones/SpringReleaseTrainTests.java b/buildSrc/src/test/java/org/springframework/gradle/github/milestones/SpringReleaseTrainTests.java index 4721aca6ce..69bce2df80 100644 --- a/buildSrc/src/test/java/org/springframework/gradle/github/milestones/SpringReleaseTrainTests.java +++ b/buildSrc/src/test/java/org/springframework/gradle/github/milestones/SpringReleaseTrainTests.java @@ -90,7 +90,7 @@ public class SpringReleaseTrainTests { assertThat(trainDates).hasSize(5); assertThat(trainDates.get("1.0.0-M1")).isEqualTo(LocalDate.of(2020, 7, 14)); assertThat(trainDates.get("1.0.0-M2")).isEqualTo(LocalDate.of(2020, 8, 11)); - assertThat(trainDates.get("1.0.0-M3")).isEqualTo(LocalDate.of(2020, 9, 8)); + assertThat(trainDates.get("1.0.0-M3")).isEqualTo(LocalDate.of(2020, 9, 15)); assertThat(trainDates.get("1.0.0-RC1")).isEqualTo(LocalDate.of(2020, 10, 13)); assertThat(trainDates.get("1.0.0")).isEqualTo(LocalDate.of(2020, 11, 10)); } @@ -110,8 +110,8 @@ public class SpringReleaseTrainTests { Map trainDates = releaseTrain.getTrainDates(); assertThat(trainDates).hasSize(5); assertThat(trainDates.get("1.0.0-M1")).isEqualTo(LocalDate.of(2022, 1, 11)); - assertThat(trainDates.get("1.0.0-M2")).isEqualTo(LocalDate.of(2022, 2, 8)); - assertThat(trainDates.get("1.0.0-M3")).isEqualTo(LocalDate.of(2022, 3, 8)); + assertThat(trainDates.get("1.0.0-M2")).isEqualTo(LocalDate.of(2022, 2, 15)); + assertThat(trainDates.get("1.0.0-M3")).isEqualTo(LocalDate.of(2022, 3, 15)); assertThat(trainDates.get("1.0.0-RC1")).isEqualTo(LocalDate.of(2022, 4, 12)); assertThat(trainDates.get("1.0.0")).isEqualTo(LocalDate.of(2022, 5, 10)); } @@ -134,7 +134,7 @@ public class SpringReleaseTrainTests { assertThat(trainDates.get("1.0.0-M2")).isEqualTo(LocalDate.of(2022, 8, 9)); assertThat(trainDates.get("1.0.0-M3")).isEqualTo(LocalDate.of(2022, 9, 13)); assertThat(trainDates.get("1.0.0-RC1")).isEqualTo(LocalDate.of(2022, 10, 11)); - assertThat(trainDates.get("1.0.0")).isEqualTo(LocalDate.of(2022, 11, 8)); + assertThat(trainDates.get("1.0.0")).isEqualTo(LocalDate.of(2022, 11, 15)); } @Test