@@ -151,6 +151,7 @@ private static class Runtime implements Serializable {
151
151
private final @ Nullable String beforeYear ;
152
152
private final @ Nullable String afterYear ;
153
153
private final boolean updateYearWithLatest ;
154
+ private final boolean licenseHeaderWithRange ;
154
155
155
156
/** The license that we'd like enforced. */
156
157
private Runtime (String licenseHeader , String delimiter , String yearSeparator , boolean updateYearWithLatest ) {
@@ -166,18 +167,28 @@ private Runtime(String licenseHeader, String delimiter, String yearSeparator, bo
166
167
167
168
Optional <String > yearToken = getYearToken (licenseHeader );
168
169
if (yearToken .isPresent ()) {
169
- yearToday = String .valueOf (YearMonth .now ().getYear ());
170
+ this . yearToday = String .valueOf (YearMonth .now ().getYear ());
170
171
int yearTokenIndex = licenseHeader .indexOf (yearToken .get ());
171
- beforeYear = licenseHeader .substring (0 , yearTokenIndex );
172
- afterYear = licenseHeader .substring (yearTokenIndex + yearToken .get ().length ());
173
- yearSepOrFull = yearSeparator ;
172
+ this . beforeYear = licenseHeader .substring (0 , yearTokenIndex );
173
+ this . afterYear = licenseHeader .substring (yearTokenIndex + yearToken .get ().length ());
174
+ this . yearSepOrFull = yearSeparator ;
174
175
this .updateYearWithLatest = updateYearWithLatest ;
176
+
177
+ boolean hasHeaderWithRange = false ;
178
+ int yearPlusSep = 4 + yearSeparator .length ();
179
+ if (beforeYear .endsWith (yearSeparator ) && yearTokenIndex > yearPlusSep ) {
180
+ // year from in range
181
+ String yearFrom = licenseHeader .substring (yearTokenIndex - yearPlusSep , yearTokenIndex ).substring (0 , 4 );
182
+ hasHeaderWithRange = YYYY .matcher (yearFrom ).matches ();
183
+ }
184
+ this .licenseHeaderWithRange = hasHeaderWithRange ;
175
185
} else {
176
- yearToday = null ;
177
- beforeYear = null ;
178
- afterYear = null ;
186
+ this . yearToday = null ;
187
+ this . beforeYear = null ;
188
+ this . afterYear = null ;
179
189
this .yearSepOrFull = licenseHeader ;
180
190
this .updateYearWithLatest = false ;
191
+ this .licenseHeaderWithRange = false ;
181
192
}
182
193
}
183
194
@@ -243,7 +254,11 @@ private String calculateYearExact(String parsedYear) {
243
254
return parsedYear ;
244
255
} else if (YYYY .matcher (parsedYear ).matches ()) {
245
256
if (updateYearWithLatest ) {
246
- return parsedYear + yearSepOrFull + yearToday ;
257
+ if (licenseHeaderWithRange ) {
258
+ return yearToday ;
259
+ } else {
260
+ return parsedYear + yearSepOrFull + yearToday ;
261
+ }
247
262
} else {
248
263
// it's already good as a single year
249
264
return parsedYear ;
@@ -266,7 +281,15 @@ private String calculateYearBySearching(String content) {
266
281
} else {
267
282
secondYear = null ;
268
283
}
269
- return secondYear == null ? firstYear : firstYear + yearSepOrFull + secondYear ;
284
+ if (secondYear == null ) {
285
+ return firstYear ;
286
+ } else {
287
+ if (licenseHeaderWithRange ) {
288
+ return secondYear ;
289
+ } else {
290
+ return firstYear + yearSepOrFull + secondYear ;
291
+ }
292
+ }
270
293
} else {
271
294
System .err .println ("Can't parse copyright year '" + content + "', defaulting to " + yearToday );
272
295
// couldn't recognize the year format
0 commit comments