Переглянути джерело

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
Steve Riesenberg 3 роки тому
батько
коміт
98fbc7a88f

+ 7 - 5
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) {
+		TemporalAdjuster nextMonday = TemporalAdjusters.nextOrSame(DayOfWeek.MONDAY);
+		TemporalAdjuster nextDayOfWeek = TemporalAdjusters.nextOrSame(dayOfWeek);
+
 		LocalDate firstDayOfMonth = year.atMonth(month).atDay(1);
-		int dayOfWeekOffset = dayOfWeek.getValue() - firstDayOfMonth.getDayOfWeek().getValue();
-		if (dayOfWeekOffset < 0) {
-			dayOfWeekOffset += 7;
-		}
+		LocalDate firstMondayOfMonth = firstDayOfMonth.with(nextMonday);
 
-		return firstDayOfMonth.plusDays(dayOfWeekOffset).plusDays(dayOffset);
+		return firstMondayOfMonth.with(nextDayOfWeek).plusDays(dayOffset);
 	}
 }

+ 4 - 4
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<String, LocalDate> 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