* NEWS: Mention this. * zic.c (writezone): When optimizing, discard a transition if it is marked as mergable and if it changes neither the UT offset, nor the isdst flag, nor the time zone abbreviation. This removes a few useless transitions and types from the output when they are merely artifacts of how the input was written. For example, without this fix Europe/London generates a useless transition at the start of 1996, because the line "0:00 GB-Eire %s 1996" has an UNTIL field that specifies 1996-01-01 00:00:00 *local time*, unlike the previous transition specified at 1995-10-22 01:00:00 *UTC*, which means addtype will incorrectly consider the 1996 transition as being significant (as the two time types differ in their ttisgmt value even though they do not differ in UT offset, isdst flag, or time zone abbreviation). --- NEWS | 3 +++ zic.c | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index eb837ea..56bbc7f 100644 --- a/NEWS +++ b/NEWS @@ -48,6 +48,9 @@ Unreleased, experimental changes longer needed for current tzdata, and caused problems with newlib when used with older tzdata (reported by David Gauchard). + zic no longer generates some artifact transitions. For example, + Europe/London no longer has a no-op transition in January 1996. + Changes to build procedure tzdata.zi now assumes zic 2017c or later. This shrinks tzdata.zi diff --git a/zic.c b/zic.c index 3e27a48..d43cc0d 100644 --- a/zic.c +++ b/zic.c @@ -1873,7 +1873,12 @@ writezone(const char *const name, const char *const string, char version, } if (toi == 0 || attypes[fromi].dontmerge - || attypes[toi - 1].type != attypes[fromi].type) + || (gmtoffs[attypes[toi - 1].type] + != gmtoffs[attypes[fromi].type]) + || (isdsts[attypes[toi - 1].type] + != isdsts[attypes[fromi].type]) + || (abbrinds[attypes[toi - 1].type] + != abbrinds[attypes[fromi].type])) attypes[toi++] = attypes[fromi]; } timecnt = toi; -- 2.21.0