Skip to main content

Module release_diff

Module release_diff 

Source
Expand description

release-diff (T16.6a) — diff two IANA tzdb releases per identifier.

Given two tzdata.zi source releases (OLD, NEW), this compiles each identifier in both and classifies how it changed. It keeps two axes strictly separate — exactly as the rest of the project does (CORE.1 behaviour vs T8 structural parity are never collapsed):

  • structural — always available: decode each side’s TZif and compare the Shape (version / timecnt / typecnt / charcnt / isutcnt / isstdcnt / leapcnt / footer), reusing the T8 taxonomy (ParityClass).
  • behavioural — only when a zdump oracle is available: dump each side over the declared horizon and report whether behaviour changed in the past window (years [lo, split-1]), the future window (years [split, hi]), or both. split is an exclusive seam (T17.3): the split year belongs to the future window, so a change in the split year is behavior_future, never double-counted as both. The split is a declared year, never host-now (determinism: the same inputs always yield the same diff, independent of when or where it runs). Oracle absence is surfaced (oracle_mode = unavailable + reason), never silently treated as “no change”.

Non-claims: a diff is scoped to the declared horizon + split, not all-time; the behaviour axis requires the oracle; and it says nothing about why a zone changed (that is IANA’s NEWS, not ours). Identifiers zic-rs cannot compile (out of its declared subset) are reported as errors, never guessed.

Structs§

BehaviourDelta
The per-window behavioural delta (counts of differing zdump lines), present only when the oracle ran.
DiffError
An identifier that could not be compared (one side failed to compile within zic-rs’s subset).
DiffRow
One identifier’s release-to-release comparison.
ReleaseDiffOptions
Options for a release diff.
ReleaseDiffReport
The complete release diff.

Enums§

OracleFailureScope
Why the behaviour axis could not assess something (T17.3 — was conflated into one “flip the whole run unavailable” path). The distinction is load-bearing: a tool that cannot be resolved at all is a global outage (the whole axis is unavailable), but a failure assessing one identifier (a bad path/data for that zone) is row-scoped and must not poison the rest of the run.
ReleaseChangeKind
How one identifier changed between the two releases. Exactly one kind per identifier (precedence is resolved in build_release_diff: presence → link → byte-identity → leap → behaviour).

Constants§

SCHEMA
The schema id (versioned, immutable).

Functions§

build_release_diff
Diff two parsed releases into a ReleaseDiffReport.