From a45cb890bbc2454926058b6a806b18822b82317a Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Tue, 25 Jul 2023 10:00:05 -0400 Subject: [PATCH 01/29] Reintroduce downloading build --- src/tzdata/TZData.jl | 1 + src/tzdata/build.jl | 56 ++++++++++++++++++++++++++++++++++++++++++ src/tzdata/download.jl | 22 +++++++++++++++++ 3 files changed, 79 insertions(+) diff --git a/src/tzdata/TZData.jl b/src/tzdata/TZData.jl index 11df5246..548ae276 100644 --- a/src/tzdata/TZData.jl +++ b/src/tzdata/TZData.jl @@ -25,6 +25,7 @@ end include("timeoffset.jl") include("version.jl") +include("archive.jl") include("download.jl") include("compile.jl") include("build.jl") diff --git a/src/tzdata/build.jl b/src/tzdata/build.jl index f97eaad3..4dc3ced6 100644 --- a/src/tzdata/build.jl +++ b/src/tzdata/build.jl @@ -87,3 +87,59 @@ function build(version::AbstractString=tzdata_version(); returned::Symbol=:versi throw(ArgumentError("Unhandled return option: $returned")) end end + +_archive_relative_dir() = "archive" +_tz_source_relative_dir(version::AbstractString) = joinpath("tzsource", version) +_compiled_relative_dir(version::AbstractString) = joinpath("compiled", "tzjf", "v$(TZJFile.DEFAULT_VERSION)", version) + +# Only accepts a real tzdata version (not latest) +function build(version::AbstractString, working_dir::AbstractString) + tzdata_archive_dir = joinpath(working_dir, _archive_relative_dir()) + tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(version)) + compiled_dir = joinpath(working_dir, _compiled_relative_dir(version)) + + url = tzdata_url(version) + tzdata_archive_file = joinpath(tzdata_archive_dir, basename(url)) + if !isfile(tzdata_archive_file) + @info "Downloading tzdata $version archive" + mkpath(tzdata_archive_dir) + download(url, tzdata_archive_file) + end + + if !isdir(tz_source_dir) + @info "Decompressing tzdata $version region data" + mkpath(tz_source_dir) + + # TODO: Confirm that "utc" was ever included in the tzdata archives + regions = intersect!(list(tzdata_archive_file), REGIONS) + unpack(tzdata_archive_file, tz_source_dir, regions; verbose=true) + + for custom_region in CUSTOM_REGIONS + cp(joinpath(CUSTOM_REGION_DIR, custom_region), joinpath(tz_source_dir, custom_region)) + push!(regions, custom_region) + end + else + regions = readdir(tz_source_dir) + end + + if !isdir(compiled_dir) + @info "Compiling tzdata $version region data" + mkpath(compiled_dir) + tz_source = TZSource(joinpath.(tz_source_dir, regions)) + compile(tz_source, compiled_dir) + end + + return compiled_dir +end + +function cleanup(version::AbstractString, working_dir::AbstractString) + tzdata_archive_file = joinpath(working_dir, _archive_relative_dir(), basename(tzdata_url(version))) + tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(version)) + compiled_dir = joinpath(working_dir, _compiled_relative_dir(version)) + + isfile(tzdata_archive_file) && rm(tzdata_archive_file) + isdir(tz_source_dir) && rm(tz_source_dir; recursive=true) + isdir(compiled_dir) && rm(compiled_dir; recursive=true) + + return nothing +end diff --git a/src/tzdata/download.jl b/src/tzdata/download.jl index a84232a6..583c36ef 100644 --- a/src/tzdata/download.jl +++ b/src/tzdata/download.jl @@ -84,3 +84,25 @@ function tzdata_latest_version() return latest_version end + +""" + tzdata_url(version::AbstractVersion) -> AbstractString + +Generate a HTTPS URL for the specified tzdata version. Typical version strings are +formatted as 4-digit year followed by a lowercase ASCII letter. Available versions can be +listed with [`tzdata_versions`](@ref) or by viewing the contents of +"https://data.iana.org/time-zones/releases/" and looking at the files starting with +"tzdata". + +# Examples +```julia +julia> tzdata_url("2017a") +"https://data.iana.org/time-zones/releases/tzdata2017a.tar.gz" +``` +""" +function tzdata_url(version::AbstractString) + # Note: IANA also provides tzdata via an FTP server at "ftp://ftp.iana.org/tz/releases/" + # but this service is unreliable and likely to break if accessing the service from + # behind a firewall. + return "https://data.iana.org/time-zones/releases/tzdata$version.tar.gz" +end From d5d7e0a05a50278af62db146350311485af82565 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Tue, 25 Jul 2023 10:01:14 -0400 Subject: [PATCH 02/29] Drop _tz_source_dir/_compiled_dir functions --- src/TimeZones.jl | 6 +----- src/tzdata/compile.jl | 7 +++---- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/TimeZones.jl b/src/TimeZones.jl index 5076be1e..8f0fb15d 100644 --- a/src/TimeZones.jl +++ b/src/TimeZones.jl @@ -2,7 +2,7 @@ module TimeZones using Dates using Printf -using Scratch +using Scratch: @get_scratch! using RecipesBase: RecipesBase, @recipe using Unicode using InlineStrings: InlineString15 @@ -32,10 +32,6 @@ export TimeZone, @tz_str, istimezone, FixedTimeZone, VariableTimeZone, ZonedDate guess _scratch_dir() = @get_scratch!("build") -_tz_source_dir(version::AbstractString) = joinpath(_scratch_dir(), "tzsource", version) -function _compiled_dir(version::AbstractString) - joinpath(_scratch_dir(), "compiled", "tzjf", "v$(TZJFile.DEFAULT_VERSION)", version) -end const _COMPILED_DIR = Ref{String}() diff --git a/src/tzdata/compile.jl b/src/tzdata/compile.jl index e45b5f0a..e04e196a 100644 --- a/src/tzdata/compile.jl +++ b/src/tzdata/compile.jl @@ -1,9 +1,8 @@ using Dates using Dates: parse_components -using ...TimeZones: _tz_source_dir, _compiled_dir using ...TimeZones: TimeZones, TimeZone, FixedTimeZone, VariableTimeZone, Transition, Class -using ...TimeZones: rename +using ...TimeZones: rename, _scratch_dir using ..TZData: TimeOffset, ZERO, MIN_GMT_OFFSET, MAX_GMT_OFFSET, MIN_SAVE, MAX_SAVE, ABS_DIFF_OFFSET @@ -710,8 +709,8 @@ end # TODO: Deprecate? function compile( - tz_source_dir::AbstractString=_tz_source_dir(tzdata_version()), - dest_dir::AbstractString=_compiled_dir(tzdata_version()); + tz_source_dir::AbstractString=joinpath(_scratch_dir(), _tz_source_relative_dir(tzdata_version())), + dest_dir::AbstractString=joinpath(_scratch_dir(), _compiled_relative_dir(tzdata_version())), kwargs... ) results = compile(TZSource(readdir(tz_source_dir; join=true)), dest_dir; kwargs...) From 5c5379a5e35570491e9d514f1e096d9641c6a245 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Tue, 25 Jul 2023 10:02:03 -0400 Subject: [PATCH 03/29] Initial ext tzdata support --- Project.toml | 1 + src/TimeZones.jl | 10 +++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index f9a5b1d3..c2eb1c72 100644 --- a/Project.toml +++ b/Project.toml @@ -13,6 +13,7 @@ Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" Scratch = "6c6a2e73-6563-6170-7368-637461726353" Unicode = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +tzdata_jll = "01e7d521-e644-4b5e-a2a1-bf894ef92cce" [compat] InlineStrings = "1" diff --git a/src/TimeZones.jl b/src/TimeZones.jl index 8f0fb15d..f528fc2b 100644 --- a/src/TimeZones.jl +++ b/src/TimeZones.jl @@ -6,6 +6,7 @@ using Scratch: @get_scratch! using RecipesBase: RecipesBase, @recipe using Unicode using InlineStrings: InlineString15 +using tzdata_jll: tzdata_jll import Dates: TimeZone, UTC @@ -41,7 +42,14 @@ abstract type Local <: TimeZone end function __init__() # Write out our compiled tzdata representations into a scratchspace - _COMPILED_DIR[] = _compiled_dir(tzdata_version()) + version = TZData.tzdata_version() + + _COMPILED_DIR[] = if false && version == tzdata_jll.version() + tzdata_jll.compiled_dir() + else + @info "Loading tzdata $version" + TZData.build(version, _scratch_dir()) + end # Load the pre-computed TZData into memory. Skip pre-fetching the first time # TimeZones.jl is loaded by `deps/build.jl` as we have yet to compile the tzdata. From 1f930f6ba5dd7c1cc7914267d796243778ad5631 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Tue, 25 Jul 2023 10:02:51 -0400 Subject: [PATCH 04/29] Automatically build Windows translation file --- src/winzone/WindowsTimeZoneIDs.jl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/winzone/WindowsTimeZoneIDs.jl b/src/winzone/WindowsTimeZoneIDs.jl index 8916dcfd..d39cb032 100644 --- a/src/winzone/WindowsTimeZoneIDs.jl +++ b/src/winzone/WindowsTimeZoneIDs.jl @@ -17,6 +17,8 @@ function __init__() _WINDOWS_XML_FILE_PATH[] = joinpath(_scratch_dir(), "local", "windowsZones.xml") if isfile(_WINDOWS_XML_FILE_PATH[]) copy!(WINDOWS_TRANSLATION, compile(_WINDOWS_XML_FILE_PATH[])) + else + build() end end From ef737bb3f5cd0acea80cf2ca3e84946e51b018a0 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 29 Jul 2023 18:04:27 -0400 Subject: [PATCH 05/29] Restore src/tzdata/archive.jl --- src/tzdata/archive.jl | 72 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 src/tzdata/archive.jl diff --git a/src/tzdata/archive.jl b/src/tzdata/archive.jl new file mode 100644 index 00000000..c9c7f236 --- /dev/null +++ b/src/tzdata/archive.jl @@ -0,0 +1,72 @@ + + +""" + unpack(archive, directory, [files]; [verbose=false]) -> Nothing + +Unpacks files from a compressed tar `archive` to the specified `directory`. If `files` is +specified only the files given will be extracted. The `verbose` flag can be used to display +additional information to STDOUT. +""" +function unpack(archive, directory, files=String[]; verbose::Bool=false) + @static if Sys.iswindows() + cmd = pipeline(`$exe7z x $archive -y -so`, `$exe7z x -si -y -ttar -o$directory $files`) + else + cmd = `tar xvf $archive --directory=$directory $files` + end + + if !verbose + cmd = pipeline(cmd, stdout=devnull, stderr=devnull) + end + + run(cmd) +end + +""" + isarchive(path) -> Bool + +Determines if the given `path` is an archive. +""" +function isarchive(path) + @static if Sys.iswindows() + success(`$exe7z t $path -y`) + else + success(`tar tf $path`) + end +end + +""" + list(archive) -> Vector{AbstractString} + +Returns the file names contained in the `archive`. +""" +function list(archive) + @static if Sys.iswindows() + files = AbstractString[] + header = "-" ^ 24 + content = false + + cmd = pipeline(`$exe7z x $archive -y -so`, `$exe7z l -si -y -ttar`) + output = readchomp(pipeline(cmd, stderr=devnull)) + for line in split(output, "\r\n") + # Extract the file name from the last column in the 7-zip output table. + # Note: We can just write `line[54:end]` on Julia 0.5 and up (JuliaLang/julia#15624) + len = length(line) + file = len >= 54 ? line[54:len] : "" + + if file == header + if !content + content = true + else + break + end + elseif content + push!(files, file) + end + end + + return files + else + output = readchomp(pipeline(`tar tf $archive`, stderr=devnull)) + return split(output, '\n') + end +end From c5f46bc765ece443d0358c570b12f84b2af6b429 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 29 Jul 2023 18:04:36 -0400 Subject: [PATCH 06/29] Update tests --- test/runtests.jl | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/test/runtests.jl b/test/runtests.jl index 8087a102..7364da38 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -3,32 +3,30 @@ using Mocking using RecipesBase using Test using TimeZones -using TimeZones.TZData: TZSource, compile, build +using TimeZones.TZData: TZSource, compile, build, _tz_source_relative_dir using Unicode Mocking.activate() const TZDATA_VERSION = "2016j" -const TZ_SOURCE_DIR = get(ENV, "TZ_SOURCE_DIR", joinpath(@__DIR__, "tzsource")) const TZFILE_DIR = joinpath(@__DIR__, "tzfile", "data") const TEST_REGIONS = ["asia", "australasia", "europe", "northamerica"] -isdir(TZ_SOURCE_DIR) || mkdir(TZ_SOURCE_DIR) +# By default use a specific version of tzdata so we just testing for TimeZones.jl code +# changes and not changes to the dataa. +build(TZDATA_VERSION, TimeZones._scratch_dir()) +tz_source_dir = joinpath(TimeZones._scratch_dir(), _tz_source_relative_dir(TZDATA_VERSION)) -# By default use a specific version of the tz database so we just testing for TimeZones.jl -# changes and not changes to the tzdata. -build(TZDATA_VERSION, TEST_REGIONS, TZ_SOURCE_DIR) - -# For testing we'll reparse the tzdata every time to instead of using the serialized data. -# This should make the development/testing cycle simplier since you won't be forced to -# re-build the cache every time you make a change. +# For testing we'll reparse the tzdata every time to instead of using the compiled data. +# This should make interactive development/testing cycles simplier since you won't be forced +# to re-build the cache every time you make a change. # # Note: resolving only the time zones we want is much faster than running compile which # recompiles all the time zones. tzdata = Dict{String,TZSource}() for name in TEST_REGIONS - tzdata[name] = TZSource(joinpath(TZ_SOURCE_DIR, name)) + tzdata[name] = TZSource(joinpath(tz_source_dir, name)) end include("helpers.jl") From 641d05b23a81d1a168ea1ef04715f0bb61c94e39 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 29 Jul 2023 18:12:15 -0400 Subject: [PATCH 07/29] Functional --- Project.toml | 1 - src/TimeZones.jl | 5 +---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/Project.toml b/Project.toml index c2eb1c72..f9a5b1d3 100644 --- a/Project.toml +++ b/Project.toml @@ -13,7 +13,6 @@ Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" Scratch = "6c6a2e73-6563-6170-7368-637461726353" Unicode = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" -tzdata_jll = "01e7d521-e644-4b5e-a2a1-bf894ef92cce" [compat] InlineStrings = "1" diff --git a/src/TimeZones.jl b/src/TimeZones.jl index f528fc2b..a430e0e3 100644 --- a/src/TimeZones.jl +++ b/src/TimeZones.jl @@ -6,7 +6,6 @@ using Scratch: @get_scratch! using RecipesBase: RecipesBase, @recipe using Unicode using InlineStrings: InlineString15 -using tzdata_jll: tzdata_jll import Dates: TimeZone, UTC @@ -44,9 +43,7 @@ function __init__() # Write out our compiled tzdata representations into a scratchspace version = TZData.tzdata_version() - _COMPILED_DIR[] = if false && version == tzdata_jll.version() - tzdata_jll.compiled_dir() - else + _COMPILED_DIR[] = begin @info "Loading tzdata $version" TZData.build(version, _scratch_dir()) end From 150325b741fbbc5ee1ba1206864ed557810b74cc Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 29 Jul 2023 18:13:39 -0400 Subject: [PATCH 08/29] Use TZJData for compiled time zones --- Project.toml | 1 + src/TimeZones.jl | 11 +++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Project.toml b/Project.toml index f9a5b1d3..0ac4a86c 100644 --- a/Project.toml +++ b/Project.toml @@ -12,6 +12,7 @@ Mocking = "78c3b35d-d492-501b-9361-3d52fe80e533" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" Scratch = "6c6a2e73-6563-6170-7368-637461726353" +TZJData = "dc5dba14-91b3-4cab-a142-028a31da12f7" Unicode = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" [compat] diff --git a/src/TimeZones.jl b/src/TimeZones.jl index a430e0e3..c38af468 100644 --- a/src/TimeZones.jl +++ b/src/TimeZones.jl @@ -6,6 +6,7 @@ using Scratch: @get_scratch! using RecipesBase: RecipesBase, @recipe using Unicode using InlineStrings: InlineString15 +using TZJData: TZJData import Dates: TimeZone, UTC @@ -41,11 +42,13 @@ abstract type Local <: TimeZone end function __init__() # Write out our compiled tzdata representations into a scratchspace - version = TZData.tzdata_version() + desired_version = TZData.tzdata_version() - _COMPILED_DIR[] = begin - @info "Loading tzdata $version" - TZData.build(version, _scratch_dir()) + _COMPILED_DIR[] = if desired_version == TZJData.TZDATA_VERSION + TZJData.ARTIFACT_DIR + else + @info "Loading tzdata $desired_version" + TZData.build(desired_version, _scratch_dir()) end # Load the pre-computed TZData into memory. Skip pre-fetching the first time From 8c6bfd8ac4e89f7f90527c9e9f892b903208ffe7 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 29 Jul 2023 18:38:12 -0400 Subject: [PATCH 09/29] Use Artifacts instead of LazyArtifacts --- Project.toml | 2 +- src/tzdata/TZData.jl | 2 +- src/winzone/WindowsTimeZoneIDs.jl | 2 +- test/artifacts.jl | 7 ++++--- test/runtests.jl | 11 +++++++---- test/tzdata/version.jl | 11 +++++++---- 6 files changed, 21 insertions(+), 14 deletions(-) diff --git a/Project.toml b/Project.toml index 0ac4a86c..f22d0219 100644 --- a/Project.toml +++ b/Project.toml @@ -4,10 +4,10 @@ authors = ["Curtis Vogt "] version = "1.11.0" [deps] +Artifacts = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6" InlineStrings = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" -LazyArtifacts = "4af54fe1-eca0-43a8-85a7-787d91b784e3" Mocking = "78c3b35d-d492-501b-9361-3d52fe80e533" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" diff --git a/src/tzdata/TZData.jl b/src/tzdata/TZData.jl index 548ae276..faaf8349 100644 --- a/src/tzdata/TZData.jl +++ b/src/tzdata/TZData.jl @@ -1,7 +1,7 @@ module TZData +using Artifacts: @artifact_str using Dates: Dates, DateTime -using LazyArtifacts using Printf using ...TimeZones: TZJFile, _scratch_dir diff --git a/src/winzone/WindowsTimeZoneIDs.jl b/src/winzone/WindowsTimeZoneIDs.jl index d39cb032..50bf22a8 100644 --- a/src/winzone/WindowsTimeZoneIDs.jl +++ b/src/winzone/WindowsTimeZoneIDs.jl @@ -1,6 +1,6 @@ module WindowsTimeZoneIDs -using LazyArtifacts +using Artifacts: @artifact_str using ...TimeZones: _scratch_dir const UNICODE_CLDR_VERSION = "release-43-1" diff --git a/test/artifacts.jl b/test/artifacts.jl index aa979c43..50e6cad1 100644 --- a/test/artifacts.jl +++ b/test/artifacts.jl @@ -1,7 +1,8 @@ -using LazyArtifacts, TimeZones, Test - @testset "Artifacts" begin - all_artifacts = LazyArtifacts.select_downloadable_artifacts(TimeZones.TZData.ARTIFACT_TOML; include_lazy=true) + all_artifacts = select_downloadable_artifacts( + TimeZones.TZData.ARTIFACT_TOML; + include_lazy=true + ) non_lazy_artifacts = String[] # Collect all `tzdata` artifacts, assert that they are all lazy except for the default one diff --git a/test/runtests.jl b/test/runtests.jl index 7364da38..7712b8d6 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,9 +1,12 @@ using Mocking +using Artifacts: select_downloadable_artifacts using RecipesBase using Test using TimeZones -using TimeZones.TZData: TZSource, compile, build, _tz_source_relative_dir +using TimeZones: _scratch_dir +using TimeZones.TZData: TZSource, compile, build, tzdata_url, unpack, + _tz_source_relative_dir, _archive_relative_dir using Unicode Mocking.activate() @@ -12,11 +15,11 @@ Mocking.activate() const TZDATA_VERSION = "2016j" const TZFILE_DIR = joinpath(@__DIR__, "tzfile", "data") const TEST_REGIONS = ["asia", "australasia", "europe", "northamerica"] +const TEST_TZ_SOURCE_DIR = joinpath(_scratch_dir(), _tz_source_relative_dir(TZDATA_VERSION)) # By default use a specific version of tzdata so we just testing for TimeZones.jl code # changes and not changes to the dataa. -build(TZDATA_VERSION, TimeZones._scratch_dir()) -tz_source_dir = joinpath(TimeZones._scratch_dir(), _tz_source_relative_dir(TZDATA_VERSION)) +build(TZDATA_VERSION, _scratch_dir()) # For testing we'll reparse the tzdata every time to instead of using the compiled data. # This should make interactive development/testing cycles simplier since you won't be forced @@ -26,7 +29,7 @@ tz_source_dir = joinpath(TimeZones._scratch_dir(), _tz_source_relative_dir(TZDAT # recompiles all the time zones. tzdata = Dict{String,TZSource}() for name in TEST_REGIONS - tzdata[name] = TZSource(joinpath(tz_source_dir, name)) + tzdata[name] = TZSource(joinpath(TEST_TZ_SOURCE_DIR, name)) end include("helpers.jl") diff --git a/test/tzdata/version.jl b/test/tzdata/version.jl index 0451df96..d7d83e27 100644 --- a/test/tzdata/version.jl +++ b/test/tzdata/version.jl @@ -1,4 +1,3 @@ -using LazyArtifacts: @artifact_str using TimeZones.TZData: TZDATA_VERSION_REGEX, TZDATA_NEWS_REGEX using TimeZones.TZData: read_news, tzdata_version_dir, tzdata_version_archive, tzdata_version @@ -29,11 +28,15 @@ end @test match(TZDATA_NEWS_REGEX, "Release 199") === nothing @test match(TZDATA_NEWS_REGEX, "Release 19999") === nothing -artifact_dir = @artifact_str "tzdata$TZDATA_VERSION" mktempdir() do temp_dir - # Read the first tzdata version - cp(joinpath(artifact_dir, "NEWS"), joinpath(temp_dir, "NEWS")) + tzdata_archive_file = joinpath( + _scratch_dir(), + _archive_relative_dir(), + basename(tzdata_url(TZDATA_VERSION)), + ) + unpack(tzdata_archive_file, temp_dir, "NEWS") + # Read the first tzdata version versions = read_news(joinpath(temp_dir, "NEWS"), 1) @test versions == [TZDATA_VERSION] From cb916b15fe11afbe622e8746e11a12f6c35dc657 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 29 Jul 2023 18:46:33 -0400 Subject: [PATCH 10/29] Artifact tests for unicode-cldr --- test/artifacts.jl | 31 ++++++++++++++++--------------- test/runtests.jl | 1 + 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/test/artifacts.jl b/test/artifacts.jl index 50e6cad1..78283dfc 100644 --- a/test/artifacts.jl +++ b/test/artifacts.jl @@ -1,20 +1,21 @@ @testset "Artifacts" begin - all_artifacts = select_downloadable_artifacts( - TimeZones.TZData.ARTIFACT_TOML; - include_lazy=true - ) - non_lazy_artifacts = String[] + @testset "unicode-cldr" begin + platforms = [ + Platform("x86_64", "windows"), + Platform("i686", "windows"), + ] - # Collect all `tzdata` artifacts, assert that they are all lazy except for the default one - for (name, meta) in all_artifacts - if !startswith(name, "tzdata") - continue - end - if get(meta, "lazy", "false") == "false" - push!(non_lazy_artifacts, name) + for platform in platforms + dict = select_downloadable_artifacts( + TimeZones.TZData.ARTIFACT_TOML; + platform, + include_lazy=true, + ) + @test length(dict) == 1 + + name, info = first(dict) + @test startswith(name, "unicode-cldr") + @test get(info, "lazy", false) == false end end - - @test length(non_lazy_artifacts) == 1 - @test only(non_lazy_artifacts) == string("tzdata", TimeZones.TZData.DEFAULT_TZDATA_VERSION) end diff --git a/test/runtests.jl b/test/runtests.jl index 7712b8d6..81c9f70e 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -1,6 +1,7 @@ using Mocking using Artifacts: select_downloadable_artifacts +using Base.BinaryPlatforms: Platform using RecipesBase using Test using TimeZones From b6e8388c7912188956e35faf86dd2bf3c3c7e9b3 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 29 Jul 2023 18:59:02 -0400 Subject: [PATCH 11/29] Remove tzdata artifacts --- Artifacts.toml | 2103 ------------------------------------- dev/Manifest.toml | 22 +- dev/generate_artifacts.jl | 68 +- 3 files changed, 24 insertions(+), 2169 deletions(-) diff --git a/Artifacts.toml b/Artifacts.toml index 1bf4a3e9..cffa2b12 100644 --- a/Artifacts.toml +++ b/Artifacts.toml @@ -1,2106 +1,3 @@ -[tzdata1996l] -git-tree-sha1 = "835e88b3b0a560e79dfc0a2a6c350adeaa4ef907" -lazy = true - - [[tzdata1996l.download]] - sha256 = "623a48745864731e7ecb4d97d9174b3e0e856a1c25d79cd5fb64942cf282d3e1" - url = "https://data.iana.org/time-zones/releases/tzdata1996l.tar.gz" - -[tzdata1996n] -git-tree-sha1 = "41df1c2e7f1ab4ae8e9c3ed1904c807238a11e16" -lazy = true - - [[tzdata1996n.download]] - sha256 = "9f26873c22d1cb313bc4713eb575c2cfc98e1ce590aac4fd0cfb9f5ed7557d6e" - url = "https://data.iana.org/time-zones/releases/tzdata1996n.tar.gz" - -[tzdata1997a] -git-tree-sha1 = "96f3d0c18031ba923b5599815aa55b96aa563a56" -lazy = true - - [[tzdata1997a.download]] - sha256 = "5713250de4af5a0c17e2df3db754b3dd9857be64f33ba0eab9c9a7b7c0ed1624" - url = "https://data.iana.org/time-zones/releases/tzdata1997a.tar.gz" - -[tzdata1997b] -git-tree-sha1 = "00af50ba7c66b49ad97fdf7a529e476aec5039ad" -lazy = true - - [[tzdata1997b.download]] - sha256 = "8a6c0801bb2474342a48d6c2253e7983d50d4c6d80a1d455c06fa4e4434df3b3" - url = "https://data.iana.org/time-zones/releases/tzdata1997b.tar.gz" - -[tzdata1997c] -git-tree-sha1 = "191a315cdfccae9f67c584f39c7341182fef2d7d" -lazy = true - - [[tzdata1997c.download]] - sha256 = "ed75b22a4c854aef3d4523716523b37d79596527bc3fa6264297ec0964c886f1" - url = "https://data.iana.org/time-zones/releases/tzdata1997c.tar.gz" - -[tzdata1997d] -git-tree-sha1 = "191a315cdfccae9f67c584f39c7341182fef2d7d" -lazy = true - - [[tzdata1997d.download]] - sha256 = "05733d47c02b294dc13501c34e7bd5dc7ab8065a9e62381994c6bc1c458a0e46" - url = "https://data.iana.org/time-zones/releases/tzdata1997d.tar.gz" - -[tzdata1997e] -git-tree-sha1 = "2fb6063591916dc30e7663adc314a23f86d72793" -lazy = true - - [[tzdata1997e.download]] - sha256 = "4172655ddfe5dd78bc64881e1b7dad8279a8240da1a8f69cd9b0682870f9452c" - url = "https://data.iana.org/time-zones/releases/tzdata1997e.tar.gz" - -[tzdata1997f] -git-tree-sha1 = "d18f39d3c92f216c3229f733572c72a87778b74c" -lazy = true - - [[tzdata1997f.download]] - sha256 = "8e127212db36db93d4e5a4b87f3af96b549d1b3da49a1b6d61dd21456420892a" - url = "https://data.iana.org/time-zones/releases/tzdata1997f.tar.gz" - -[tzdata1997g] -git-tree-sha1 = "1ad1a3f95648f825590f3766d24d2178ef759eeb" -lazy = true - - [[tzdata1997g.download]] - sha256 = "a6bb1b29a9e2288f4ade4611d6dc6b7c2fd72b2e3f7e40b9eeb8df2d24867251" - url = "https://data.iana.org/time-zones/releases/tzdata1997g.tar.gz" - -[tzdata1997h] -git-tree-sha1 = "27b5676af22c37a5a99ba78ce516c16639644c03" -lazy = true - - [[tzdata1997h.download]] - sha256 = "dba0f910df5fa9dce68d5083847b387fe7551e83d64d127c17f7811a71a79380" - url = "https://data.iana.org/time-zones/releases/tzdata1997h.tar.gz" - -[tzdata1997i] -git-tree-sha1 = "43ddd29e6f7efca9f917412beb5285189e3d4254" -lazy = true - - [[tzdata1997i.download]] - sha256 = "aeb468b7f52097c46793a5d585840e0562728cf0129f2c2b5da8e8658542bca2" - url = "https://data.iana.org/time-zones/releases/tzdata1997i.tar.gz" - -[tzdata1997j] -git-tree-sha1 = "b2a758d41cee560ab9778e8978910661d637a6eb" -lazy = true - - [[tzdata1997j.download]] - sha256 = "7d5a15ec86a40cc8c1718301753602d828121b9b19c3a4627bf53b004dd7a7e9" - url = "https://data.iana.org/time-zones/releases/tzdata1997j.tar.gz" - -[tzdata1997k] -git-tree-sha1 = "9c4dc8d866cf286e5ccedd64c85617e23b82c0fc" -lazy = true - - [[tzdata1997k.download]] - sha256 = "c05ff9b2576f9650a8fb0219c3a0b54cf245a5cb48a1eb28ac802b23aca9aa63" - url = "https://data.iana.org/time-zones/releases/tzdata1997k.tar.gz" - -[tzdata1998a] -git-tree-sha1 = "db72b938d2cfb3fe354af8f6842300c8d6208da6" -lazy = true - - [[tzdata1998a.download]] - sha256 = "066479d0da15f3fbf82d40e6b3f0043a8ae6aa18dab3170724e2ea1aa1003b4e" - url = "https://data.iana.org/time-zones/releases/tzdata1998a.tar.gz" - -[tzdata1998b] -git-tree-sha1 = "bd903db705630d9671a37262d344f54ac5acf12f" -lazy = true - - [[tzdata1998b.download]] - sha256 = "4313a44490b8ec8e5cd20742ce39306cd363622583fcc624c4fbf3f7719df7e4" - url = "https://data.iana.org/time-zones/releases/tzdata1998b.tar.gz" - -[tzdata1998c] -git-tree-sha1 = "f8e0116f6deda1b223f843658effb45b48163116" -lazy = true - - [[tzdata1998c.download]] - sha256 = "554807903af354384520f2bf03419f041616616394a341345a7ee20fd2a47ef7" - url = "https://data.iana.org/time-zones/releases/tzdata1998c.tar.gz" - -[tzdata1998d] -git-tree-sha1 = "5614016e3724d1ed8998394a6126b4661358de44" -lazy = true - - [[tzdata1998d.download]] - sha256 = "8991a7066d46f2300f7cdbc59417d256280ec99c3cb563dedab1cce24db23747" - url = "https://data.iana.org/time-zones/releases/tzdata1998d.tar.gz" - -[tzdata1998e] -git-tree-sha1 = "2ed0eb26e4a2af5633cb0bc731ae163c9fab28f2" -lazy = true - - [[tzdata1998e.download]] - sha256 = "8bdd9ae68bc39cb2bcae6bdc338225f31d548413c9f656856f97a6f1c885e289" - url = "https://data.iana.org/time-zones/releases/tzdata1998e.tar.gz" - -[tzdata1998h] -git-tree-sha1 = "95cf198cf7786b9bd01c473acef97a83df3c568f" -lazy = true - - [[tzdata1998h.download]] - sha256 = "860728777a740bba36afff8eb5fffb00eec289308786c6e03af6d61c2036def7" - url = "https://data.iana.org/time-zones/releases/tzdata1998h.tar.gz" - -[tzdata1998i] -git-tree-sha1 = "20780fe7a8774baffbeecc2f9a7367d4e8162500" -lazy = true - - [[tzdata1998i.download]] - sha256 = "d2dde4ba94058ba2ad128f3d0bf9198892514a58ad3a65802a100a8a0277d4e1" - url = "https://data.iana.org/time-zones/releases/tzdata1998i.tar.gz" - -[tzdata1999a] -git-tree-sha1 = "20780fe7a8774baffbeecc2f9a7367d4e8162500" -lazy = true - - [[tzdata1999a.download]] - sha256 = "ae74120ccb18998eea9ce654d299392a4d5dc20b539eacd76e88bde1071485ef" - url = "https://data.iana.org/time-zones/releases/tzdata1999a.tar.gz" - -[tzdata1999b] -git-tree-sha1 = "e9c33069a661dfae70aa6054ffa41acfbc6755ea" -lazy = true - - [[tzdata1999b.download]] - sha256 = "d18af887eac875bd97b10efa4dee2a3eeb80a1881c50818db34a73b37ff330a2" - url = "https://data.iana.org/time-zones/releases/tzdata1999b.tar.gz" - -[tzdata1999c] -git-tree-sha1 = "b4d095b8742cd706d4b4d4025f28462c82d68067" -lazy = true - - [[tzdata1999c.download]] - sha256 = "7d3f04a9a6ed8e1ad2a214990c8e499b40e914f744a10a2e0bb508624da51f73" - url = "https://data.iana.org/time-zones/releases/tzdata1999c.tar.gz" - -[tzdata1999d] -git-tree-sha1 = "f0f2360afc47afe32557f639ab19e8f1323cb330" -lazy = true - - [[tzdata1999d.download]] - sha256 = "42b558313ecf1e4e927b3acc6f48ddb34f4db9e377121852443460c735deeef2" - url = "https://data.iana.org/time-zones/releases/tzdata1999d.tar.gz" - -[tzdata1999e] -git-tree-sha1 = "232ead96202bafd93c01c3ecc7d3304ab560105d" -lazy = true - - [[tzdata1999e.download]] - sha256 = "d1189cc273a655081891bf7a92103cf394015511033f8eb239acba6fdf453aa4" - url = "https://data.iana.org/time-zones/releases/tzdata1999e.tar.gz" - -[tzdata1999f] -git-tree-sha1 = "02232194ac597e358d30e1f7da36e8ef2ecea1ca" -lazy = true - - [[tzdata1999f.download]] - sha256 = "c710988ec840f8c268acb20c3e580fe3d6421473e1d1b0b52f9a25f47c98e5ab" - url = "https://data.iana.org/time-zones/releases/tzdata1999f.tar.gz" - -[tzdata1999g] -git-tree-sha1 = "d21e24382e4f5f62b11ef48b54d92c2a98fc1761" -lazy = true - - [[tzdata1999g.download]] - sha256 = "63c60c56d256a59c4a7deef06380b14aa52fe4ffbe32aeb0ab61bb0901480578" - url = "https://data.iana.org/time-zones/releases/tzdata1999g.tar.gz" - -[tzdata1999h] -git-tree-sha1 = "127445424481c738a13513ec8416ae4d9f8e89db" -lazy = true - - [[tzdata1999h.download]] - sha256 = "073e16f4bfcf2f4b8a142b4daca8e538448e3f2db4f9cf899c23e1e425337c6c" - url = "https://data.iana.org/time-zones/releases/tzdata1999h.tar.gz" - -[tzdata1999i] -git-tree-sha1 = "f70f34e93ba2a198f18939d025cfb779526ff06c" -lazy = true - - [[tzdata1999i.download]] - sha256 = "1026cdf0e426202a6ebf987f35d4e7d364a1c2cde43ee12e3c58eca979367a9f" - url = "https://data.iana.org/time-zones/releases/tzdata1999i.tar.gz" - -[tzdata1999j] -git-tree-sha1 = "c0241ac58a3d4615d3cc20c0825323ab03781983" -lazy = true - - [[tzdata1999j.download]] - sha256 = "4b3c7b2146bf247fbc3287f55fddc48b372b2b8e9b981e39dede047dbd6f20bc" - url = "https://data.iana.org/time-zones/releases/tzdata1999j.tar.gz" - -[tzdata2000a] -git-tree-sha1 = "e7a30b675eaac813b7dc3e749d8d4a4684e14e94" -lazy = true - - [[tzdata2000a.download]] - sha256 = "da127977a0bd4832fadb45b81ebc084dbbca8b02cb23487a0d83174929ff5dc6" - url = "https://data.iana.org/time-zones/releases/tzdata2000a.tar.gz" - -[tzdata2000b] -git-tree-sha1 = "e1454e5128d1692a0ceee0c5dab015fef66cc79c" -lazy = true - - [[tzdata2000b.download]] - sha256 = "7b0a6e582b0973106e63965d94e362903ee5e387f10999bacb8796e23eebdcdb" - url = "https://data.iana.org/time-zones/releases/tzdata2000b.tar.gz" - -[tzdata2000c] -git-tree-sha1 = "7b115993cbb9bf173c5ba9dbdf0bc74d5beccda2" -lazy = true - - [[tzdata2000c.download]] - sha256 = "263862e60d7c0ddf93d660489c4250cf0088a306b324b31c25bf6c9ce03916d2" - url = "https://data.iana.org/time-zones/releases/tzdata2000c.tar.gz" - -[tzdata2000d] -git-tree-sha1 = "e36937a9d04159b13130710c56e98f7ca47e3e93" -lazy = true - - [[tzdata2000d.download]] - sha256 = "287f1e87957cc79d6f8cfb085473ef147a338621b486b346d819b681d0f03365" - url = "https://data.iana.org/time-zones/releases/tzdata2000d.tar.gz" - -[tzdata2000e] -git-tree-sha1 = "4ae48399d3ffcceddbbe0e364dac9fc3b8e7fd36" -lazy = true - - [[tzdata2000e.download]] - sha256 = "a121d69fd837a0e99b0b807d0b5de447344b7660011bdbdc0b8d6ba6ed81b26f" - url = "https://data.iana.org/time-zones/releases/tzdata2000e.tar.gz" - -[tzdata2000f] -git-tree-sha1 = "7c99b04697ed5d56d11cbc10f8fecfaa3a385d4e" -lazy = true - - [[tzdata2000f.download]] - sha256 = "c70b89795dd46b06cf16f3bd19f85f817173d3964478b680fbcf956ee32d928c" - url = "https://data.iana.org/time-zones/releases/tzdata2000f.tar.gz" - -[tzdata2000g] -git-tree-sha1 = "ca401f65a295565ce881c9dab1cdeab64bb5c183" -lazy = true - - [[tzdata2000g.download]] - sha256 = "41c608cbacd4a6ccc39e835062841ee08c76f289e1ede77aa51435bdffbc5dab" - url = "https://data.iana.org/time-zones/releases/tzdata2000g.tar.gz" - -[tzdata2000h] -git-tree-sha1 = "4dc1e88d7a3760cc96bc9c4757b925df83ac47d7" -lazy = true - - [[tzdata2000h.download]] - sha256 = "b69cdac96691679157077fbd375c50588e25e8f0bb0a5d6c942ae8e8745baacf" - url = "https://data.iana.org/time-zones/releases/tzdata2000h.tar.gz" - -[tzdata2001a] -git-tree-sha1 = "004eafdccbb9f9bd68b9c3a01a25312d2126fc8f" -lazy = true - - [[tzdata2001a.download]] - sha256 = "49cd0f48fd1d7f81e5aad3b1244cb1338b770b8e3e1f5e0c9af9b7222e3062ea" - url = "https://data.iana.org/time-zones/releases/tzdata2001a.tar.gz" - -[tzdata2001b] -git-tree-sha1 = "71a35d7b783a5e821aedb72fd77c8d7557ed9475" -lazy = true - - [[tzdata2001b.download]] - sha256 = "9ec6c36fe2af023f58938f83e3ffb7d489fb4447e2cd52917557761bcdeb6784" - url = "https://data.iana.org/time-zones/releases/tzdata2001b.tar.gz" - -[tzdata2001c] -git-tree-sha1 = "17321bcd802497dc4f56c4465d0905caa470066b" -lazy = true - - [[tzdata2001c.download]] - sha256 = "481ed23a9e705e0bb86e3634f89ff3028e86dbe31ce9088db9834620985b47bd" - url = "https://data.iana.org/time-zones/releases/tzdata2001c.tar.gz" - -[tzdata2001d] -git-tree-sha1 = "2bb1cab747342b51710b417290dade36b7c2f752" -lazy = true - - [[tzdata2001d.download]] - sha256 = "ef1b55d0d611a4be164d1209013fff6727cddc1fde858ebb6dcd3f903760b62e" - url = "https://data.iana.org/time-zones/releases/tzdata2001d.tar.gz" - -[tzdata2002b] -git-tree-sha1 = "0c104e1a84371860973049404d9550eaea1ec363" -lazy = true - - [[tzdata2002b.download]] - sha256 = "d1a9d1c36b1d08745d405cf2e5ed4c7224093a8d53f141b90d5bed5641f5e59d" - url = "https://data.iana.org/time-zones/releases/tzdata2002b.tar.gz" - -[tzdata2002c] -git-tree-sha1 = "3665c7afaab6a1f06dee60021b4d2eedb01a9cc7" -lazy = true - - [[tzdata2002c.download]] - sha256 = "f85e764207a693f8cc10ac7259da28029bfb1c3409c02274ec45cb52689c5fa3" - url = "https://data.iana.org/time-zones/releases/tzdata2002c.tar.gz" - -[tzdata2002d] -git-tree-sha1 = "41cf88f7b28ae614dfe8e4cf2d0f976cdf5cadbe" -lazy = true - - [[tzdata2002d.download]] - sha256 = "357cebd44837bc255e01f65072325b26590b3d4c7abb3e850a21e2ee18699a57" - url = "https://data.iana.org/time-zones/releases/tzdata2002d.tar.gz" - -[tzdata2003a] -git-tree-sha1 = "505173c636d3daf410d3efcf5466d2080f40d187" -lazy = true - - [[tzdata2003a.download]] - sha256 = "d804af81f58ece4b13700f7b59f970354a213d82f010349d4b3146ad5a0b864e" - url = "https://data.iana.org/time-zones/releases/tzdata2003a.tar.gz" - -[tzdata2003b] -git-tree-sha1 = "9019d1e894cfddcb8aa3ff37592320941d743e10" -lazy = true - - [[tzdata2003b.download]] - sha256 = "d62280b493eaabd094c69b92dbbc4e62432310e71d90965597959cbce11e2c1b" - url = "https://data.iana.org/time-zones/releases/tzdata2003b.tar.gz" - -[tzdata2003c] -git-tree-sha1 = "9019d1e894cfddcb8aa3ff37592320941d743e10" -lazy = true - - [[tzdata2003c.download]] - sha256 = "aeb4aa79d15d5b4a4dc56f4e16ac2991188edca7046be78e497c082f0b5a1770" - url = "https://data.iana.org/time-zones/releases/tzdata2003c.tar.gz" - -[tzdata2003d] -git-tree-sha1 = "c29930b9aa9daf238f29ff3e4c0c034cb8d79e8d" -lazy = true - - [[tzdata2003d.download]] - sha256 = "6f9eb3f50ac114994a50ceb411d8e064514b3ebd7b2d25eff703ae4be4e8ea88" - url = "https://data.iana.org/time-zones/releases/tzdata2003d.tar.gz" - -[tzdata2003e] -git-tree-sha1 = "b12b5ac230ccc80abb7fcafecf5291a893bbe66b" -lazy = true - - [[tzdata2003e.download]] - sha256 = "0a1216c18395ec1dfe0557ba37aed932db1237d6a4d6bcd8d02d36c589079d79" - url = "https://data.iana.org/time-zones/releases/tzdata2003e.tar.gz" - -[tzdata2004a] -git-tree-sha1 = "7007a0cd1a2193c994245082bf54cf50533e7d17" -lazy = true - - [[tzdata2004a.download]] - sha256 = "ad07c4ab84ea8c87aa07220d421d02d95fd14e2a8de5e78f443949fe992886e3" - url = "https://data.iana.org/time-zones/releases/tzdata2004a.tar.gz" - -[tzdata2004b] -git-tree-sha1 = "31285cab8eea6dce31e35c4773eeb0c40e2d4d08" -lazy = true - - [[tzdata2004b.download]] - sha256 = "2e0b133c09b35632e994e05ce732221c40b1bcdcab3030eaac1b9d0b816c2a7a" - url = "https://data.iana.org/time-zones/releases/tzdata2004b.tar.gz" - -[tzdata2004d] -git-tree-sha1 = "8c53ae59c082b63c7ed0261ac99eb2bd30675aa4" -lazy = true - - [[tzdata2004d.download]] - sha256 = "5f29f06a404cfc437402b54cff64158c7cd1af81f97101fc6b516a51ab3ea206" - url = "https://data.iana.org/time-zones/releases/tzdata2004d.tar.gz" - -[tzdata2004e] -git-tree-sha1 = "a6e571519d7f510b2e1ebaa49db74e92e07a7d3b" -lazy = true - - [[tzdata2004e.download]] - sha256 = "1c50a26f165f38cfd9bf65b913f58fa849463c5d395faf38dd579916427aced8" - url = "https://data.iana.org/time-zones/releases/tzdata2004e.tar.gz" - -[tzdata2004g] -git-tree-sha1 = "d92d3e2b8cd9c1973d30d9b1a35d6888d23a03c3" -lazy = true - - [[tzdata2004g.download]] - sha256 = "950efec3d662b31f617cf79cc6d99ffe84f2269f8ba9a892aa5c0662a51adcfc" - url = "https://data.iana.org/time-zones/releases/tzdata2004g.tar.gz" - -[tzdata2005a] -git-tree-sha1 = "d92d3e2b8cd9c1973d30d9b1a35d6888d23a03c3" -lazy = true - - [[tzdata2005a.download]] - sha256 = "5157c42015c8068068a8510c0f9dc07586169ee5a8fc99c691783126fe3b42c1" - url = "https://data.iana.org/time-zones/releases/tzdata2005a.tar.gz" - -[tzdata2005b] -git-tree-sha1 = "4dcd67504bc1d9b7ea201b4709a3695ec276f8b8" -lazy = true - - [[tzdata2005b.download]] - sha256 = "6a4bc268eff4e4ce9b012cfca9ba1efeb52c9ee5d696f48c9c4b6440929ad40e" - url = "https://data.iana.org/time-zones/releases/tzdata2005b.tar.gz" - -[tzdata2005c] -git-tree-sha1 = "d6e40575c974dc69fe359462a242f19a113814e3" -lazy = true - - [[tzdata2005c.download]] - sha256 = "9d883f614f6a73cef98e137466e464954900bf8ddf25cd6c4e87f103c81dc7a1" - url = "https://data.iana.org/time-zones/releases/tzdata2005c.tar.gz" - -[tzdata2005e] -git-tree-sha1 = "276c761771ee0e9b0005960d073ff7e92d1134a2" -lazy = true - - [[tzdata2005e.download]] - sha256 = "54fa34db60e0d867c6384f7d91e04eba91e5b0bc7e9c90384f47186bde913691" - url = "https://data.iana.org/time-zones/releases/tzdata2005e.tar.gz" - -[tzdata2005f] -git-tree-sha1 = "bd457274ad54c27ed0b413fc9fac9305b3f6c56c" -lazy = true - - [[tzdata2005f.download]] - sha256 = "1ce924ac48678710d228483d65ef79bf2cfc4735fda0dec2d8af3343c57d2f3c" - url = "https://data.iana.org/time-zones/releases/tzdata2005f.tar.gz" - -[tzdata2005g] -git-tree-sha1 = "eb7ed525a9ada80055e1100174b68335b48f1e1f" -lazy = true - - [[tzdata2005g.download]] - sha256 = "60e842ee850a0910e90c898e258ec4b9548264e285bd0d0db2d8dac460ce5679" - url = "https://data.iana.org/time-zones/releases/tzdata2005g.tar.gz" - -[tzdata2005h] -git-tree-sha1 = "4d9088654728df3e80820989aee0600722c05c92" -lazy = true - - [[tzdata2005h.download]] - sha256 = "6e6a21957097f8c7e8d5b78c814aabf6647130a2db12000d4244f261ea0367d6" - url = "https://data.iana.org/time-zones/releases/tzdata2005h.tar.gz" - -[tzdata2005i] -git-tree-sha1 = "9b0435894c57daa25578d4437524b4b9d37f0c24" -lazy = true - - [[tzdata2005i.download]] - sha256 = "8f416e8816d4ee3a53f218639d2aa00731e951a884d689ac76e2766b2169d610" - url = "https://data.iana.org/time-zones/releases/tzdata2005i.tar.gz" - -[tzdata2005j] -git-tree-sha1 = "256fcacc2297a699c532ab70eed6f6b4c2acdeee" -lazy = true - - [[tzdata2005j.download]] - sha256 = "0d5a71126fe16439eb50552d0734873cbca48ddf9d5143a30a0bfd669f363bae" - url = "https://data.iana.org/time-zones/releases/tzdata2005j.tar.gz" - -[tzdata2005k] -git-tree-sha1 = "64f37180776f8cb700eb34fb0177fb7f5edd0a7f" -lazy = true - - [[tzdata2005k.download]] - sha256 = "c091080e1562a6c3673ef84e3a988c0d96baeba9959fc55f904b10ff520ee5f6" - url = "https://data.iana.org/time-zones/releases/tzdata2005k.tar.gz" - -[tzdata2005l] -git-tree-sha1 = "9b99f20e11aa8f57b27403ab496eb43833ef675b" -lazy = true - - [[tzdata2005l.download]] - sha256 = "9fca3fd22acc1a8488ee5cdfe523701acef936299944384235fe5cb37b1fc748" - url = "https://data.iana.org/time-zones/releases/tzdata2005l.tar.gz" - -[tzdata2005m] -git-tree-sha1 = "d81a8327ecf60f04c5b0b2e052d7b8088ceb31fb" -lazy = true - - [[tzdata2005m.download]] - sha256 = "406a84f30884e6dcbbdb827152216e7a6d1284fb118d7cf4498c998575dd9339" - url = "https://data.iana.org/time-zones/releases/tzdata2005m.tar.gz" - -[tzdata2005n] -git-tree-sha1 = "3c7318fb6f8b54dbd0b536cf8341a9367174e6e8" -lazy = true - - [[tzdata2005n.download]] - sha256 = "3a9d172a56f6535f1361f972bbba9228f83e4f5ab594b43ef0df09bef1df8302" - url = "https://data.iana.org/time-zones/releases/tzdata2005n.tar.gz" - -[tzdata2005o] -git-tree-sha1 = "0dd8db7853a6f776b478e465ac45bca646278245" -lazy = true - - [[tzdata2005o.download]] - sha256 = "f8dc475e443e259e9f69b65523974338dee4393c8d73779847c2cc49261c6933" - url = "https://data.iana.org/time-zones/releases/tzdata2005o.tar.gz" - -[tzdata2005p] -git-tree-sha1 = "f6615351c754a9458dffdcca196e0ae970a5a731" -lazy = true - - [[tzdata2005p.download]] - sha256 = "d0713c9e0e99990185ab00e5a5cedb17d2b502b49826874170af2de50612a734" - url = "https://data.iana.org/time-zones/releases/tzdata2005p.tar.gz" - -[tzdata2005q] -git-tree-sha1 = "7bf009d1354c839b04424fb830c70dc41dd74be1" -lazy = true - - [[tzdata2005q.download]] - sha256 = "d260f2a89499c2ca76ad87d33bad360c9a858b1503a192c71ffea06529716996" - url = "https://data.iana.org/time-zones/releases/tzdata2005q.tar.gz" - -[tzdata2005r] -git-tree-sha1 = "b042f5b9f046b1051d99b73516d2c7cccfff2869" -lazy = true - - [[tzdata2005r.download]] - sha256 = "5cd4058b54fd2ce9d63af112847aaa2141db955726c416071c37050a2756e648" - url = "https://data.iana.org/time-zones/releases/tzdata2005r.tar.gz" - -[tzdata2006a] -git-tree-sha1 = "f8f8bfa1687b4698005cd64db1ff57ae21b17261" -lazy = true - - [[tzdata2006a.download]] - sha256 = "76c5d3b373c8f65968fd6e7bb2222fb0f0e33ef1a58c519527aa68c537d2b448" - url = "https://data.iana.org/time-zones/releases/tzdata2006a.tar.gz" - -[tzdata2006b] -git-tree-sha1 = "1c85fdc740aef2bf4d24e327a4b1168736b56c0d" -lazy = true - - [[tzdata2006b.download]] - sha256 = "aab3cf0e8c9db27df345571e224d04ed0cd7e41399bd59dd3db20d9c3b45beb2" - url = "https://data.iana.org/time-zones/releases/tzdata2006b.tar.gz" - -[tzdata2006c] -git-tree-sha1 = "6118d6f353572bf308cbdef2cd0a6b7bd29fcc26" -lazy = true - - [[tzdata2006c.download]] - sha256 = "54f07a727eff281cebd7d997726584207eb6bfbf8080f9b32f085963b1070aa1" - url = "https://data.iana.org/time-zones/releases/tzdata2006c.tar.gz" - -[tzdata2006d] -git-tree-sha1 = "db6499a675a5b0a29a09435db680de34aa4409de" -lazy = true - - [[tzdata2006d.download]] - sha256 = "67993be3fd800f82f552171cab781a5736b1a5c0bc834e29e83a4be5d7b5b321" - url = "https://data.iana.org/time-zones/releases/tzdata2006d.tar.gz" - -[tzdata2006f] -git-tree-sha1 = "237b36be50ceefe169041b91c80e3e98c7b28b44" -lazy = true - - [[tzdata2006f.download]] - sha256 = "95eb97eae2efbd355b2f7e3aef50b2cb971246966dcd0cd692d6f178df341f0c" - url = "https://data.iana.org/time-zones/releases/tzdata2006f.tar.gz" - -[tzdata2006g] -git-tree-sha1 = "cda12ceaf5011117f92b3c2fe493fc093ccb3fa2" -lazy = true - - [[tzdata2006g.download]] - sha256 = "028a5d8bc3771876cf43b497e8b8691acae8263af34b0a8de3e014f01a5558d0" - url = "https://data.iana.org/time-zones/releases/tzdata2006g.tar.gz" - -[tzdata2006j] -git-tree-sha1 = "cf0a1e6c32af07f93ddeb9ecbaf13a97cacdd630" -lazy = true - - [[tzdata2006j.download]] - sha256 = "afa77e59020f7d111ba8059cc8877b4f6dd972a3d3a14c118a2b876269c9ee84" - url = "https://data.iana.org/time-zones/releases/tzdata2006j.tar.gz" - -[tzdata2006k] -git-tree-sha1 = "cdf33c168106f747d96cd2e540f971cc9d45bfb0" -lazy = true - - [[tzdata2006k.download]] - sha256 = "2d74ecaedd4a8b8c5ee6d74b7fe776ddf5f73fbb6cb39718d3d677d49fba99a5" - url = "https://data.iana.org/time-zones/releases/tzdata2006k.tar.gz" - -[tzdata2006l] -git-tree-sha1 = "139d31d9fc6ea75882b1975a94a9380dcad96fbb" -lazy = true - - [[tzdata2006l.download]] - sha256 = "b142459df80b724ca7d8eec0020b1bd97bbbc58f9223b8a3774151cbc5ba48d2" - url = "https://data.iana.org/time-zones/releases/tzdata2006l.tar.gz" - -[tzdata2006m] -git-tree-sha1 = "ab7ad828525be554c36380e06ecb112be2df67f2" -lazy = true - - [[tzdata2006m.download]] - sha256 = "b0c42aa6e48d1eb4ad79aa3961541ff536f139c955a49893171814dead78d6a1" - url = "https://data.iana.org/time-zones/releases/tzdata2006m.tar.gz" - -[tzdata2006n] -git-tree-sha1 = "d1e51661456d09635672072e7247985c134bfe4f" -lazy = true - - [[tzdata2006n.download]] - sha256 = "406896398bb307eea317758790f320e3d5f2c61eceb7442ec1461c7bfcd66a60" - url = "https://data.iana.org/time-zones/releases/tzdata2006n.tar.gz" - -[tzdata2006o] -git-tree-sha1 = "91a0e3720eed47131f3607a5a4b409d16b99c24b" -lazy = true - - [[tzdata2006o.download]] - sha256 = "89637e234141fb03f5485b1fb7bf871202568c8daf5933e5e4a04b4ceabf3dfa" - url = "https://data.iana.org/time-zones/releases/tzdata2006o.tar.gz" - -[tzdata2006p] -git-tree-sha1 = "6969154dde2c75adacf99c64af0ad8292b35fca5" -lazy = true - - [[tzdata2006p.download]] - sha256 = "6b246374b468d8ead477541f4624b74cd1da2b3de7ef757a3fc40ca29cfb29bc" - url = "https://data.iana.org/time-zones/releases/tzdata2006p.tar.gz" - -[tzdata2007a] -git-tree-sha1 = "6f0e322b00c80197a3477b47397955e94a0ad5c0" -lazy = true - - [[tzdata2007a.download]] - sha256 = "7866826c0fd0810af2bb2b240c81961b0350c1fa42db870baa33c6126039e0d3" - url = "https://data.iana.org/time-zones/releases/tzdata2007a.tar.gz" - -[tzdata2007b] -git-tree-sha1 = "ddae6fd0e44ad5e8b5088072a4a03fd2c3b67fcb" -lazy = true - - [[tzdata2007b.download]] - sha256 = "f1dcc1c615a792c0f72704119faf141e7408f8c94d876e478e052fa33b5a1cb1" - url = "https://data.iana.org/time-zones/releases/tzdata2007b.tar.gz" - -[tzdata2007c] -git-tree-sha1 = "28c8af4e53b63eef3c98b279170875dc0449598b" -lazy = true - - [[tzdata2007c.download]] - sha256 = "3575df0a341fef53240620423da519c6cba16212ab8b2576c9595b80deaf3af2" - url = "https://data.iana.org/time-zones/releases/tzdata2007c.tar.gz" - -[tzdata2007d] -git-tree-sha1 = "f0c2ec1a9f4f35b55e8b3a2bbf1dde988d3319d0" -lazy = true - - [[tzdata2007d.download]] - sha256 = "33e6f84422c84bc02d83bb03fd741479896a9bb485fea3424afc406c32fb2278" - url = "https://data.iana.org/time-zones/releases/tzdata2007d.tar.gz" - -[tzdata2007e] -git-tree-sha1 = "1be0ada460ed4f4907c4ed480d615a2cc5c99b0c" -lazy = true - - [[tzdata2007e.download]] - sha256 = "51d14a60ea12aa901bf91e5d39ea30c13ffdc299640e8ec9cb0d35a128874767" - url = "https://data.iana.org/time-zones/releases/tzdata2007e.tar.gz" - -[tzdata2007f] -git-tree-sha1 = "6b5d95e7e14d78660dd6daceeb134147ae281ba1" -lazy = true - - [[tzdata2007f.download]] - sha256 = "cfedfd49351d41da0fe5a26be2eadc8ae0cf1b5b1cea1d31aafb6913f907493e" - url = "https://data.iana.org/time-zones/releases/tzdata2007f.tar.gz" - -[tzdata2007g] -git-tree-sha1 = "da5486252cd73bc05cb7c4625f84353cd07b60b7" -lazy = true - - [[tzdata2007g.download]] - sha256 = "082943adc009753b046227f143051ef41d9c549292f0415242188aaac9e2ee5b" - url = "https://data.iana.org/time-zones/releases/tzdata2007g.tar.gz" - -[tzdata2007h] -git-tree-sha1 = "a7cafb0f0a64faf3a997bb6365bf12da1f0fcd1a" -lazy = true - - [[tzdata2007h.download]] - sha256 = "8f16f0db83073c8ccb3702f9173c4991200c78e64ebd358fce9cbbf4371a2148" - url = "https://data.iana.org/time-zones/releases/tzdata2007h.tar.gz" - -[tzdata2007i] -git-tree-sha1 = "64fc7257e66321f4e71620d4ddeeefad277d437e" -lazy = true - - [[tzdata2007i.download]] - sha256 = "70bb254ae0da44d71f6d0932ffe34f61457bf41c38dfd389a7bf5bfb544a362b" - url = "https://data.iana.org/time-zones/releases/tzdata2007i.tar.gz" - -[tzdata2007j] -git-tree-sha1 = "c2195a5dcf2c70dba634c35a008ef300508cb6e7" -lazy = true - - [[tzdata2007j.download]] - sha256 = "0319a3dc08f05a92b5c409cc7278a45fa6194bcdfdd27918554bd3d8d6d33c6d" - url = "https://data.iana.org/time-zones/releases/tzdata2007j.tar.gz" - -[tzdata2007k] -git-tree-sha1 = "b41f9f08304c5c309b8d3304b573699f57cb36b7" -lazy = true - - [[tzdata2007k.download]] - sha256 = "37e986086ce1a1ccb9a4f24c2b77ede54f0eae2ee9959e7a191a49cedb405783" - url = "https://data.iana.org/time-zones/releases/tzdata2007k.tar.gz" - -[tzdata2008a] -git-tree-sha1 = "c6fb0ae3f5d8e2684cf3635222e3b636fc324cd1" -lazy = true - - [[tzdata2008a.download]] - sha256 = "104a270bdc7a511cffd41d2722ff3fafd0caf221b4344263316177e8a64abbf1" - url = "https://data.iana.org/time-zones/releases/tzdata2008a.tar.gz" - -[tzdata2008b] -git-tree-sha1 = "43f3b86f92af2ba91b6442bce417feb05c9ede85" -lazy = true - - [[tzdata2008b.download]] - sha256 = "633d76612d73a7add41a3b90fe5721ea5f4282d52bd8408b9d4fab261443aa6c" - url = "https://data.iana.org/time-zones/releases/tzdata2008b.tar.gz" - -[tzdata2008c] -git-tree-sha1 = "43b1e749971f5fa0a1fb39161c35f7825a368aed" -lazy = true - - [[tzdata2008c.download]] - sha256 = "ae32f514a57bbd4d8ff5ec280aa0eb7c27cb6c8c9a9167a1397e6788900cb41b" - url = "https://data.iana.org/time-zones/releases/tzdata2008c.tar.gz" - -[tzdata2008d] -git-tree-sha1 = "709cee3e17d5888f872e2544595690a5ae92ad3a" -lazy = true - - [[tzdata2008d.download]] - sha256 = "913b384dfcf541d340f251bc20cf2475d8f13a38ad38acfc2d901fc3c7bc4a71" - url = "https://data.iana.org/time-zones/releases/tzdata2008d.tar.gz" - -[tzdata2008e] -git-tree-sha1 = "26b5a67abaf0279400cea663658bc776ef880d6d" -lazy = true - - [[tzdata2008e.download]] - sha256 = "ddd526edfaf0d43fbe8facf772feb13266ae3cdddaf69a612b7a74cf37036548" - url = "https://data.iana.org/time-zones/releases/tzdata2008e.tar.gz" - -[tzdata2008f] -git-tree-sha1 = "ec27ba702b29ecb10abba5ad02b936da38eb8640" -lazy = true - - [[tzdata2008f.download]] - sha256 = "81e0d0d86acd072f233a7ac9413f95f147ac64355e3d09708c228af115c05678" - url = "https://data.iana.org/time-zones/releases/tzdata2008f.tar.gz" - -[tzdata2008g] -git-tree-sha1 = "7fc663380f8c8e80136786da7239a9c5cac6c774" -lazy = true - - [[tzdata2008g.download]] - sha256 = "78a90cf70e9cd661ba253236b558216d2f707f3457b20a05e7ede04ab5acf0b6" - url = "https://data.iana.org/time-zones/releases/tzdata2008g.tar.gz" - -[tzdata2008h] -git-tree-sha1 = "0779712241bffbd77e9639b67d2d4372777b969a" -lazy = true - - [[tzdata2008h.download]] - sha256 = "64070f1f31ab64f6c36f50cd462df9a74a6fa3613d73384c8dd62c3e8f716df3" - url = "https://data.iana.org/time-zones/releases/tzdata2008h.tar.gz" - -[tzdata2008i] -git-tree-sha1 = "fad57e12815a91684070858d9c34edc58a952846" -lazy = true - - [[tzdata2008i.download]] - sha256 = "ec8824897cc79308b4ec6946a049d4680539e8de9c764b592bcf126f9060d7af" - url = "https://data.iana.org/time-zones/releases/tzdata2008i.tar.gz" - -[tzdata2009a] -git-tree-sha1 = "bf0d4ff5506df515f443d8bdacffe10f8f04bc35" -lazy = true - - [[tzdata2009a.download]] - sha256 = "c704d5a99f4e995b68e0463f206aad38dbddea7e9338d0ccc0abca901dd40100" - url = "https://data.iana.org/time-zones/releases/tzdata2009a.tar.gz" - -[tzdata2009b] -git-tree-sha1 = "09eb5721b745bbc8021d64fe7d70ddfaa2871067" -lazy = true - - [[tzdata2009b.download]] - sha256 = "f2c4e8f816a1e15c46ec78e23fcbe18d559e925cc2c99799243e5a749b2a8c68" - url = "https://data.iana.org/time-zones/releases/tzdata2009b.tar.gz" - -[tzdata2009c] -git-tree-sha1 = "503e142d64b2c092828af30571e8528044c2bb7e" -lazy = true - - [[tzdata2009c.download]] - sha256 = "3dd1bd0014e7c9a74cab9a21fd32c9cadd30b2c69340f32a685e7b52207c1db8" - url = "https://data.iana.org/time-zones/releases/tzdata2009c.tar.gz" - -[tzdata2009d] -git-tree-sha1 = "e224dead63f2362679e775cc8c9c92e41d8c8ada" -lazy = true - - [[tzdata2009d.download]] - sha256 = "f884ff8af90824cac55786e4b3a6048af10702a5f15036bf55f33d74704ad102" - url = "https://data.iana.org/time-zones/releases/tzdata2009d.tar.gz" - -[tzdata2009e] -git-tree-sha1 = "ca14bdd73df939e23b617bfc0233b6b4e9098253" -lazy = true - - [[tzdata2009e.download]] - sha256 = "6f4e88fefd72b9ed9c6fde56ebc434c86cd597114685bf98ae7aab031a8cce8c" - url = "https://data.iana.org/time-zones/releases/tzdata2009e.tar.gz" - -[tzdata2009f] -git-tree-sha1 = "e8be8dd48e75c8de6596190dd8e4e61f796d34e6" -lazy = true - - [[tzdata2009f.download]] - sha256 = "654b309a0c130a156cc81787f8af4dc9a517d283606f420e89364bc93c83da6c" - url = "https://data.iana.org/time-zones/releases/tzdata2009f.tar.gz" - -[tzdata2009g] -git-tree-sha1 = "bc85ddfdfaa94045cdbbb27e73059e302ade763c" -lazy = true - - [[tzdata2009g.download]] - sha256 = "da033acc418328edcb32a089c26c1f6a828f596b4f3aa26c9319e3ab19e05073" - url = "https://data.iana.org/time-zones/releases/tzdata2009g.tar.gz" - -[tzdata2009h] -git-tree-sha1 = "c9fe5f15341dc73b8cbf332fc932b6d1ecfa70df" -lazy = true - - [[tzdata2009h.download]] - sha256 = "4eaa785fccc13fe26a1c92518e59108b78422115eaf9cb5a6bb95168bb5e92ab" - url = "https://data.iana.org/time-zones/releases/tzdata2009h.tar.gz" - -[tzdata2009i] -git-tree-sha1 = "c833ad3be0ba34cf91e05889bb43145b44dbb09b" -lazy = true - - [[tzdata2009i.download]] - sha256 = "475b52311b2e0267cfb81138af1b985384ea53ce71b2d39744d7645f1e48db6e" - url = "https://data.iana.org/time-zones/releases/tzdata2009i.tar.gz" - -[tzdata2009j] -git-tree-sha1 = "d81472e3667e5b97ec190a015ba78c69d5155dd3" -lazy = true - - [[tzdata2009j.download]] - sha256 = "ab6fb5b3588208ab0cade05dfa8d6ef9516bc719613a0676137e56c336cb7bb7" - url = "https://data.iana.org/time-zones/releases/tzdata2009j.tar.gz" - -[tzdata2009k] -git-tree-sha1 = "dcc448b9dfbe2df610cabea89ac31c2c79d944b9" -lazy = true - - [[tzdata2009k.download]] - sha256 = "fa82480e7e291b2273c7e4c0bc934aa93bc8567525ff7042cc821db816aa303a" - url = "https://data.iana.org/time-zones/releases/tzdata2009k.tar.gz" - -[tzdata2009l] -git-tree-sha1 = "8fcc7370d049d05b8b1ca872b49060c3536be2f3" -lazy = true - - [[tzdata2009l.download]] - sha256 = "a0caab89a45261137f38f61d19329fffe0e45e2c6d6e7a9b70ebef37c0fdde5f" - url = "https://data.iana.org/time-zones/releases/tzdata2009l.tar.gz" - -[tzdata2009m] -git-tree-sha1 = "db6d3129149358ce6fde1c1a642a06b1ec5ddf61" -lazy = true - - [[tzdata2009m.download]] - sha256 = "7609980204940ceaf74b5a48d15ea0c079eaec627e149cf3d986cfed268881fe" - url = "https://data.iana.org/time-zones/releases/tzdata2009m.tar.gz" - -[tzdata2009n] -git-tree-sha1 = "293ce4ca6ace46bf3ce152f86665c9398a2bc99a" -lazy = true - - [[tzdata2009n.download]] - sha256 = "7b08bb8a98ad8a06e2cafda05ab21f2a69b2d64252dfc9435c93094d979e7c5a" - url = "https://data.iana.org/time-zones/releases/tzdata2009n.tar.gz" - -[tzdata2009o] -git-tree-sha1 = "916b8d04fae4f987a90380ac7743d03f1ab7fab2" -lazy = true - - [[tzdata2009o.download]] - sha256 = "5fbd4053a4eb01b814799855e35a3c01743f98acf9fcd167522e6484a2edd7b7" - url = "https://data.iana.org/time-zones/releases/tzdata2009o.tar.gz" - -[tzdata2009p] -git-tree-sha1 = "3067e95a7ceebc5b9c6b9a8bda89f84f66894ed4" -lazy = true - - [[tzdata2009p.download]] - sha256 = "7182ad6f03bfe16ccdbac4a3efb9e765ea7c51afc33c3a7fefb053122aa6da2c" - url = "https://data.iana.org/time-zones/releases/tzdata2009p.tar.gz" - -[tzdata2009q] -git-tree-sha1 = "9a48f5c5461744bc122cc7f8fa12a5f9c28a13f8" -lazy = true - - [[tzdata2009q.download]] - sha256 = "5ea1abc8b08dd7f67b53488a497d61f9617ed92d094e508e103049430518a19a" - url = "https://data.iana.org/time-zones/releases/tzdata2009q.tar.gz" - -[tzdata2009r] -git-tree-sha1 = "b049e5ca923113cf5fbd59acb9e10ef78173735f" -lazy = true - - [[tzdata2009r.download]] - sha256 = "684d23e3ebe825c9db90732534446f4e33f5ad4455980b15fd9eb2e4ba5a6731" - url = "https://data.iana.org/time-zones/releases/tzdata2009r.tar.gz" - -[tzdata2009s] -git-tree-sha1 = "35d2496619ee14a17f269fd0fb9a4c14a5ebc746" -lazy = true - - [[tzdata2009s.download]] - sha256 = "ee9000a0276675ed697f8d404edf80104fd338c3fb979907e4ee63ca83d65e5e" - url = "https://data.iana.org/time-zones/releases/tzdata2009s.tar.gz" - -[tzdata2009t] -git-tree-sha1 = "532f4b15f6e758737886ddd06c5ab1729db4b187" -lazy = true - - [[tzdata2009t.download]] - sha256 = "e9968d213481d7a869ba1afe6167d78d57320364487be9a74e04910a9fce3f85" - url = "https://data.iana.org/time-zones/releases/tzdata2009t.tar.gz" - -[tzdata2009u] -git-tree-sha1 = "7b6c645aa38fe80d9ab522b45ad05fdaece40c48" -lazy = true - - [[tzdata2009u.download]] - sha256 = "7cbd82597590ca279e042dbeace91553806c4b4dbff25c34b843a4f1d07e0384" - url = "https://data.iana.org/time-zones/releases/tzdata2009u.tar.gz" - -[tzdata2010a] -git-tree-sha1 = "ab1fdbdcdf5c8c57c66cfe27b0640ae76e6660a0" -lazy = true - - [[tzdata2010a.download]] - sha256 = "d9dab04cbbc52a7f19363958402b1c9cc6724e587f2af822c3e40e52767dfee8" - url = "https://data.iana.org/time-zones/releases/tzdata2010a.tar.gz" - -[tzdata2010b] -git-tree-sha1 = "5700a4ad8ec7d43962914e568bf7bcf603b90ea5" -lazy = true - - [[tzdata2010b.download]] - sha256 = "a93208ae389cc0d3618731cc9f406ba2cfc6aac39668a06c687d3fae2a7e8210" - url = "https://data.iana.org/time-zones/releases/tzdata2010b.tar.gz" - -[tzdata2010c] -git-tree-sha1 = "f2b45547673a59012429b67701a2eb1de7d3feaf" -lazy = true - - [[tzdata2010c.download]] - sha256 = "e5fa92874b6f051166cf2fc2dced0dea165c4d7508a173ea6d232bdee7e05201" - url = "https://data.iana.org/time-zones/releases/tzdata2010c.tar.gz" - -[tzdata2010d] -git-tree-sha1 = "0ec11f957dd8a61142f48e15f13a063490c04484" -lazy = true - - [[tzdata2010d.download]] - sha256 = "c18916b1e0d91dd7a0f8a26a570e40db06bdd0dc06cf8d66c06f78704d8b3b78" - url = "https://data.iana.org/time-zones/releases/tzdata2010d.tar.gz" - -[tzdata2010e] -git-tree-sha1 = "0050463a62ae4b3d4c682f489d322ffab3deffe5" -lazy = true - - [[tzdata2010e.download]] - sha256 = "09ebe8787560ef0a0b8b27a115d0d79d4b9e4ed9d48e768426c59ad18b73abd6" - url = "https://data.iana.org/time-zones/releases/tzdata2010e.tar.gz" - -[tzdata2010f] -git-tree-sha1 = "a925467928d61950a085ba9c4e8203517acb8a57" -lazy = true - - [[tzdata2010f.download]] - sha256 = "823361e38da3f79a34c0adb835b1b6d2ae640937e3f7a7f4a2181500eeff0e94" - url = "https://data.iana.org/time-zones/releases/tzdata2010f.tar.gz" - -[tzdata2010g] -git-tree-sha1 = "224a8021b537b72eaf90775b3ee3c076bad26cc1" -lazy = true - - [[tzdata2010g.download]] - sha256 = "a069dbea2989613466f9f4adb6de381efb46aeb9ff89e03fabb23dcae2c4cd90" - url = "https://data.iana.org/time-zones/releases/tzdata2010g.tar.gz" - -[tzdata2010h] -git-tree-sha1 = "711ec1643b290c625cab8697f2716d7633830ff5" -lazy = true - - [[tzdata2010h.download]] - sha256 = "a4918d60f63440ba9b6050205881e8a98d718dc0c2b7df5955f43e781eab6e7d" - url = "https://data.iana.org/time-zones/releases/tzdata2010h.tar.gz" - -[tzdata2010i] -git-tree-sha1 = "201c1199b6c813036cacbf10738e0bc77ba296a1" -lazy = true - - [[tzdata2010i.download]] - sha256 = "bee0a26cca54db3413416d968c0a6361d83188b112d2512559d0e3602f254dc3" - url = "https://data.iana.org/time-zones/releases/tzdata2010i.tar.gz" - -[tzdata2010j] -git-tree-sha1 = "853437e5ce5056745b00375a26a2a34d843acae0" -lazy = true - - [[tzdata2010j.download]] - sha256 = "dcf2101d0c5bb20a7f182866ea3e52b54c8f4d129c025a96c9a31377676f554b" - url = "https://data.iana.org/time-zones/releases/tzdata2010j.tar.gz" - -[tzdata2010k] -git-tree-sha1 = "ba2f93c0ab0060979f7a0ad4a9bad6cbf84cd091" -lazy = true - - [[tzdata2010k.download]] - sha256 = "ef69c99504c0fd9864ba8ef1daae5f2d4df097cf7dc350f09b8f70386272408d" - url = "https://data.iana.org/time-zones/releases/tzdata2010k.tar.gz" - -[tzdata2010l] -git-tree-sha1 = "51e2040d0f52458d3177e5ec16f36c23f1cbbbd4" -lazy = true - - [[tzdata2010l.download]] - sha256 = "bae7b4a8364f7ab3d6d644eb6075de1e9a0c72fb3fb5843fc217d2ff57408577" - url = "https://data.iana.org/time-zones/releases/tzdata2010l.tar.gz" - -[tzdata2010m] -git-tree-sha1 = "db3c52afca438555adc49b5ef6b42e66b747fa73" -lazy = true - - [[tzdata2010m.download]] - sha256 = "1454a13a32e23e81195404d00ab97a64a356e9a5852fc7d121ed7e58cbdb75aa" - url = "https://data.iana.org/time-zones/releases/tzdata2010m.tar.gz" - -[tzdata2010n] -git-tree-sha1 = "aae2aa1c4adca2691342d0381e5fbcb223322419" -lazy = true - - [[tzdata2010n.download]] - sha256 = "5946bff5cef28feda6cff241f03c84e528cd4fcc0c2b27b537f52994f8afc70b" - url = "https://data.iana.org/time-zones/releases/tzdata2010n.tar.gz" - -[tzdata2010o] -git-tree-sha1 = "e455c906578d147be45bdfb24333ef1f4883eeaf" -lazy = true - - [[tzdata2010o.download]] - sha256 = "cd0f3799688b3b870cd988505e47c2975b1808e73ec0677bc9db4b705b534c07" - url = "https://data.iana.org/time-zones/releases/tzdata2010o.tar.gz" - -[tzdata2011a] -git-tree-sha1 = "4d36dca233d62c44e861af9ee674e4f785b2e046" -lazy = true - - [[tzdata2011a.download]] - sha256 = "782c691b4750bdefeb84063128db685a8b8f31dc2efb887ee841ae105bfa747b" - url = "https://data.iana.org/time-zones/releases/tzdata2011a.tar.gz" - -[tzdata2011b] -git-tree-sha1 = "978ca11bd0b05d32c2f11ddfb88ea97b9ef20a6b" -lazy = true - - [[tzdata2011b.download]] - sha256 = "ff45f5ddc2ec925249626d00d7bc2ffff587e0956a1d8245517a023bf27e4cc9" - url = "https://data.iana.org/time-zones/releases/tzdata2011b.tar.gz" - -[tzdata2011c] -git-tree-sha1 = "555a8eac2d62bb7816bd20dfedccd91d748e587f" -lazy = true - - [[tzdata2011c.download]] - sha256 = "c08fbf767280a6f6dc450306a39d3b5818a0a9792a0991320e00a1bb91e91a3b" - url = "https://data.iana.org/time-zones/releases/tzdata2011c.tar.gz" - -[tzdata2011d] -git-tree-sha1 = "c8bc147b13f6ad58cbf4a00837449acc70b10583" -lazy = true - - [[tzdata2011d.download]] - sha256 = "415a54774094e8dcdc9ba141fafbee4b3b2f2140a5b8cf012eea4b37fb9a23bd" - url = "https://data.iana.org/time-zones/releases/tzdata2011d.tar.gz" - -[tzdata2011e] -git-tree-sha1 = "fa03174c614d5ad1c2a53450da004d2e12294c8a" -lazy = true - - [[tzdata2011e.download]] - sha256 = "44fef01de4589a4979eb6b5fdbbfd21a3b135852af1ecbfb9e0368ae47392c79" - url = "https://data.iana.org/time-zones/releases/tzdata2011e.tar.gz" - -[tzdata2011f] -git-tree-sha1 = "1297e8df94ee949425959c71f3e7a414e9332f0b" -lazy = true - - [[tzdata2011f.download]] - sha256 = "9b7431f25afbc154290a4075e43dc8841ed11d602faaf5a861db7a334a6d37a4" - url = "https://data.iana.org/time-zones/releases/tzdata2011f.tar.gz" - -[tzdata2011g] -git-tree-sha1 = "0ba32e0ebe914a327893a7d1bf77cf319ef395a8" -lazy = true - - [[tzdata2011g.download]] - sha256 = "01a2a189eeda63baacc5e68e6c13afffc7edce182102fffc53acbf35e8703d3c" - url = "https://data.iana.org/time-zones/releases/tzdata2011g.tar.gz" - -[tzdata2011h] -git-tree-sha1 = "4a92eadfac2fe62912d0772769d0ef38d8ef4923" -lazy = true - - [[tzdata2011h.download]] - sha256 = "c098786d053736dd18d4f1fbebdf41554c6fd702a36f75c18f1c66712d2abc24" - url = "https://data.iana.org/time-zones/releases/tzdata2011h.tar.gz" - -[tzdata2011i] -git-tree-sha1 = "1609767fd9881858d3339747368ce55c2e43f465" -lazy = true - - [[tzdata2011i.download]] - sha256 = "f8dde7ca5e61f21ac34c8cdbef5568d00c829981211098f059d8104964c81ffa" - url = "https://data.iana.org/time-zones/releases/tzdata2011i.tar.gz" - -[tzdata2011j] -git-tree-sha1 = "f52ac2309b28b8d79776bbc014c63b9501a4caac" -lazy = true - - [[tzdata2011j.download]] - sha256 = "7e8540a85f1b474df1b40b403bea5748311ca7731b3038e51d6abc7f2d223c2a" - url = "https://data.iana.org/time-zones/releases/tzdata2011j.tar.gz" - -[tzdata2011k] -git-tree-sha1 = "dc0ced3040dcbc03630e65d2417945b814cb1608" -lazy = true - - [[tzdata2011k.download]] - sha256 = "51f7d2a42b7fb9465feced642a6676afdf8b04a071e55f3fef1f0925bd67ef21" - url = "https://data.iana.org/time-zones/releases/tzdata2011k.tar.gz" - -[tzdata2011l] -git-tree-sha1 = "a891850a4a2a9ff8bedd6d2736dac077bf8309c9" -lazy = true - - [[tzdata2011l.download]] - sha256 = "cb9fec68a19c9c3b900bb71f3ca20d0051a863f765387b52fc2d144a5bbb0c7d" - url = "https://data.iana.org/time-zones/releases/tzdata2011l.tar.gz" - -[tzdata2011m] -git-tree-sha1 = "cf7def70f6f91cb73b8db6db6692575724993cf2" -lazy = true - - [[tzdata2011m.download]] - sha256 = "c8e01f5b4a3cd8b8aee84b4befb4b671cef34353e5af022ed22071f5b86ef5f4" - url = "https://data.iana.org/time-zones/releases/tzdata2011m.tar.gz" - -[tzdata2011n] -git-tree-sha1 = "506825ef0f22a6bdfe8cea991aacf483d455ddb8" -lazy = true - - [[tzdata2011n.download]] - sha256 = "a343e542486b2b8ebdeca474eed79f1c04f69420ca943c2b9bdea1d2385e38cd" - url = "https://data.iana.org/time-zones/releases/tzdata2011n.tar.gz" - -[tzdata2012a] -git-tree-sha1 = "9759fc435e0fed2e5b6dc65e34da0ab5a6406711" -lazy = true - - [[tzdata2012a.download]] - sha256 = "c28f731e19e7b612e26b2a41e9089ebe0c67bad422d2b7882e4b32983277ee7d" - url = "https://data.iana.org/time-zones/releases/tzdata2012a.tar.gz" - -[tzdata2012b] -git-tree-sha1 = "9719cf7f1bc1a795249ff4c530a98dce586ea0ac" -lazy = true - - [[tzdata2012b.download]] - sha256 = "2f9f8e2d1ae087be5917f60c3946e8dc3fe1068d7738c3395f2125135309e745" - url = "https://data.iana.org/time-zones/releases/tzdata2012b.tar.gz" - -[tzdata2012c] -git-tree-sha1 = "ed5094090a386b0046403e2ec8a245a85398de68" -lazy = true - - [[tzdata2012c.download]] - sha256 = "33e19e1dd27bda5239812587d72971509a15b59baff7abd692b77ff66f168a82" - url = "https://data.iana.org/time-zones/releases/tzdata2012c.tar.gz" - -[tzdata2012d] -git-tree-sha1 = "b39d2ae205385ad6124a82d15e772741dc63585f" -lazy = true - - [[tzdata2012d.download]] - sha256 = "46c0e92a7aa89c3cfe571b585ceb6958bb444604aea3e09587f2cbe474c95575" - url = "https://data.iana.org/time-zones/releases/tzdata2012d.tar.gz" - -[tzdata2012e] -git-tree-sha1 = "febe69ddec72e7040ebe21fa643f05e01b1661d8" -lazy = true - - [[tzdata2012e.download]] - sha256 = "061c1c289e792f3661135d5ec542e4f9417d3cd7f232f3d54c1949573aadd0fc" - url = "https://data.iana.org/time-zones/releases/tzdata2012e.tar.gz" - -[tzdata2012f] -git-tree-sha1 = "b1cc2250912bf1b61c6687d6a5e360ee0ce906d0" -lazy = true - - [[tzdata2012f.download]] - sha256 = "afe95a49a445ee55391d2d4beccd4be6d61a090d5d8069c407390ff1502c26cc" - url = "https://data.iana.org/time-zones/releases/tzdata2012f.tar.gz" - -[tzdata2012g] -git-tree-sha1 = "335980e19adeb026ab139b51b593d4e75312346d" -lazy = true - - [[tzdata2012g.download]] - sha256 = "9a82e74f798d69c18b48e0128c46b6ea10132d9495cbcc4105e7483150a85bac" - url = "https://data.iana.org/time-zones/releases/tzdata2012g.tar.gz" - -[tzdata2012h] -git-tree-sha1 = "97790ee1282b4a87ba73c6fccacce8d3e652e5eb" -lazy = true - - [[tzdata2012h.download]] - sha256 = "65e53218eff4f71f8e7eaa0ae52aecec79e0ba186bd5badc27c099118d4cd065" - url = "https://data.iana.org/time-zones/releases/tzdata2012h.tar.gz" - -[tzdata2012i] -git-tree-sha1 = "7140f27bd72fd97f927b666a6188c42b478c993a" -lazy = true - - [[tzdata2012i.download]] - sha256 = "c9e5b6b6a2031236126409b3595cd8e1a730febc1e8b3802fdbdb417977cf162" - url = "https://data.iana.org/time-zones/releases/tzdata2012i.tar.gz" - -[tzdata2012j] -git-tree-sha1 = "e4216ad2e271c770f21e3e3c035a1814c2117779" -lazy = true - - [[tzdata2012j.download]] - sha256 = "4b6a3c2831bdbb68ab1a1bf906bcf11d18ab78009713a0339da6fe96b6afceaa" - url = "https://data.iana.org/time-zones/releases/tzdata2012j.tar.gz" - -[tzdata2013a] -git-tree-sha1 = "a6c3d71f651ce2bbb77391993c8bec4bb6ce8410" -lazy = true - - [[tzdata2013a.download]] - sha256 = "ed9f273f52d5df9ec09fdcf6684176bbdc86d0fbafcbc27b97e5a9c103024afc" - url = "https://data.iana.org/time-zones/releases/tzdata2013a.tar.gz" - -[tzdata2013b] -git-tree-sha1 = "31f27c304b7716bc02791ccdfa7e565bac220ac0" -lazy = true - - [[tzdata2013b.download]] - sha256 = "70d589d0e76a3749403d2bb404e9214c2520dda4c13e4b07b1b945ed2c64edb2" - url = "https://data.iana.org/time-zones/releases/tzdata2013b.tar.gz" - -[tzdata2013c] -git-tree-sha1 = "d05faca96ef7a35480b3bf36756a75756ea084d2" -lazy = true - - [[tzdata2013c.download]] - sha256 = "e597a7eb239155eb2247fd4788f7fa10bf21d6469961200a6ca202f19cc15c87" - url = "https://data.iana.org/time-zones/releases/tzdata2013c.tar.gz" - -[tzdata2013d] -git-tree-sha1 = "38ba2b6de800879f0c0e9da98e724422ff381738" -lazy = true - - [[tzdata2013d.download]] - sha256 = "cd1c96f0676e0edceebc6a418a2222ffb05becb41180dd9f847b9c7cef303b04" - url = "https://data.iana.org/time-zones/releases/tzdata2013d.tar.gz" - -[tzdata2013e] -git-tree-sha1 = "3dfbdb3d218c10d26dcdd381f846b26f9f728fab" -lazy = true - - [[tzdata2013e.download]] - sha256 = "d02891fbcca61d527263e9250b8cef2c93396ca05cd723832f04fe79e4058d97" - url = "https://data.iana.org/time-zones/releases/tzdata2013e.tar.gz" - -[tzdata2013f] -git-tree-sha1 = "12b5d2c7390549c88eb48c7d5ebbaa99144bd869" -lazy = true - - [[tzdata2013f.download]] - sha256 = "5b72ed29bea75e0b59cbd3f575db0aac62f96a2a36e652725f674a92a95d4ada" - url = "https://data.iana.org/time-zones/releases/tzdata2013f.tar.gz" - -[tzdata2013g] -git-tree-sha1 = "9c858b9af8c0d15139ab246d2bb70cc3f5d9ebf3" -lazy = true - - [[tzdata2013g.download]] - sha256 = "b6cdd3998dcc732a6ae5e101e1394f9d4d6dff68bd48a8fb78c44c2b997d3a4f" - url = "https://data.iana.org/time-zones/releases/tzdata2013g.tar.gz" - -[tzdata2013h] -git-tree-sha1 = "9fadafb63216a8590909eb5b47931b74ea890b4d" -lazy = true - - [[tzdata2013h.download]] - sha256 = "6b9e17e823eec0e09e12f74b452a70be4face1ef14c2fb1917b7c7e60564de27" - url = "https://data.iana.org/time-zones/releases/tzdata2013h.tar.gz" - -[tzdata2013i] -git-tree-sha1 = "dc8c5c0eb7bd707d2adc55407cf624063e34f8e4" -lazy = true - - [[tzdata2013i.download]] - sha256 = "1cd56a6ee964143ef0c65229968a5093988335b95e9115235b5e7b7e45e67dda" - url = "https://data.iana.org/time-zones/releases/tzdata2013i.tar.gz" - -[tzdata2014a] -git-tree-sha1 = "b360806993f1b54cf96dcaf7a0485f2f6e6bf235" -lazy = true - - [[tzdata2014a.download]] - sha256 = "7cff254ce85e11b21c994b284bccd1e12ecda9dadf947fbb32e1912fd520e8b1" - url = "https://data.iana.org/time-zones/releases/tzdata2014a.tar.gz" - -[tzdata2014b] -git-tree-sha1 = "0496f08c097b93e8acf041198aa5c1e9a20409c8" -lazy = true - - [[tzdata2014b.download]] - sha256 = "d1e1f3e0c253a8ac0b35ffe27ef95f6366c37beb953391806cd922efce2b1cb5" - url = "https://data.iana.org/time-zones/releases/tzdata2014b.tar.gz" - -[tzdata2014c] -git-tree-sha1 = "95e97c9112af6c4a00e6eb2c12ed0009d4a8b815" -lazy = true - - [[tzdata2014c.download]] - sha256 = "aa2924e012644de3a6cc3160ffff690cb3afecf350af435daefa43bb669fb8f1" - url = "https://data.iana.org/time-zones/releases/tzdata2014c.tar.gz" - -[tzdata2014d] -git-tree-sha1 = "3c40cfdb415c547de15eba0498d960715cfefe37" -lazy = true - - [[tzdata2014d.download]] - sha256 = "4b4966912f5d4a299b0bdf47e6f3103d82dc6a0b5a6b321e2b9d5662597a62f0" - url = "https://data.iana.org/time-zones/releases/tzdata2014d.tar.gz" - -[tzdata2014e] -git-tree-sha1 = "5b8ef0a6c63a6d860528daf448c88582976708ae" -lazy = true - - [[tzdata2014e.download]] - sha256 = "08e243a79051f838d86ac1311a78b74047951302d448024e823b5b7aa71f86c5" - url = "https://data.iana.org/time-zones/releases/tzdata2014e.tar.gz" - -[tzdata2014f] -git-tree-sha1 = "f170492ed2f8ba4dd32185720ee2f5b91af781c2" -lazy = true - - [[tzdata2014f.download]] - sha256 = "eed690a72124f380bcb14947d398a7a482acb9ab792ae78bd4554e52c5ca2001" - url = "https://data.iana.org/time-zones/releases/tzdata2014f.tar.gz" - -[tzdata2014g] -git-tree-sha1 = "37d16a3196381ddb48cfcad7ebbeeaa24092f79e" -lazy = true - - [[tzdata2014g.download]] - sha256 = "5547d5b7a982f7f53fffe68cb2a13692553f591a17d58c8ef15b20679d82a270" - url = "https://data.iana.org/time-zones/releases/tzdata2014g.tar.gz" - -[tzdata2014h] -git-tree-sha1 = "8e14c1bd3ded226a2085d8be6e93e08cc61f236e" -lazy = true - - [[tzdata2014h.download]] - sha256 = "e78152f616fb07c1dea124215ffca57d0de66d8897e00896086542e3de30f69e" - url = "https://data.iana.org/time-zones/releases/tzdata2014h.tar.gz" - -[tzdata2014i] -git-tree-sha1 = "38701498edf08394fb51ef22ef99351fde1de871" -lazy = true - - [[tzdata2014i.download]] - sha256 = "2af331bdd2b794ec59b8ded7300fb29dc3573a009ec14183f5c9ad38e3886153" - url = "https://data.iana.org/time-zones/releases/tzdata2014i.tar.gz" - -[tzdata2014j] -git-tree-sha1 = "70cabdcca17757e721ba256830353930e87038e7" -lazy = true - - [[tzdata2014j.download]] - sha256 = "a2d870320694d40535df822ac8074dc629a90e92abafa5d3373314f78ddc0e0d" - url = "https://data.iana.org/time-zones/releases/tzdata2014j.tar.gz" - -[tzdata2015a] -git-tree-sha1 = "8103fcb8cfd76f77b84ae37897fe4b1ae2f02153" -lazy = true - - [[tzdata2015a.download]] - sha256 = "c52490917d00a8e7fc9b5f0b1b65ef6ec76d612b5b20c81bf86a04147af18e4c" - url = "https://data.iana.org/time-zones/releases/tzdata2015a.tar.gz" - -[tzdata2015b] -git-tree-sha1 = "716574d218db2328a3059ba79f179695ef77fcda" -lazy = true - - [[tzdata2015b.download]] - sha256 = "556ac1a5b3a371adc1ad4e77138f78ddd7f8ddd7bc2b52545924598c7dc8ad62" - url = "https://data.iana.org/time-zones/releases/tzdata2015b.tar.gz" - -[tzdata2015c] -git-tree-sha1 = "1d5fd8d6bfe79b8a5678e3890a3171dc7e9290d8" -lazy = true - - [[tzdata2015c.download]] - sha256 = "860fac5f5f57f7a2dfc1ba682dbd1f5c0f0b597f761571277b6ed6561e22365a" - url = "https://data.iana.org/time-zones/releases/tzdata2015c.tar.gz" - -[tzdata2015d] -git-tree-sha1 = "73129ab667ff6e4f3623e96b7d48c3578f6150ca" -lazy = true - - [[tzdata2015d.download]] - sha256 = "8b9f5008277f09e251e97dba7813f56168d691115bda90ade4638d72f296d531" - url = "https://data.iana.org/time-zones/releases/tzdata2015d.tar.gz" - -[tzdata2015e] -git-tree-sha1 = "76dd3d064778ea8b569151e04193916946001e94" -lazy = true - - [[tzdata2015e.download]] - sha256 = "ffc9b5d38abda8277aa479e3f75aa7668819d0977cd1a0c8ef3b09128334ba6f" - url = "https://data.iana.org/time-zones/releases/tzdata2015e.tar.gz" - -[tzdata2015f] -git-tree-sha1 = "2b5b3816ec686a63e6755db6611fa87d90bd8345" -lazy = true - - [[tzdata2015f.download]] - sha256 = "959f81b541e042ecb13c50097d264ae92ff03a57979c478dbcf24d5da242531d" - url = "https://data.iana.org/time-zones/releases/tzdata2015f.tar.gz" - -[tzdata2015g] -git-tree-sha1 = "61c25a33348a187669c4975e16c5fb1476bb5201" -lazy = true - - [[tzdata2015g.download]] - sha256 = "b923cdbf078491696b17bc8d069c74bce73fabc5774629da2f410c9b31576161" - url = "https://data.iana.org/time-zones/releases/tzdata2015g.tar.gz" - -[tzdata2016a] -git-tree-sha1 = "ae31d90cddd593a1e9d8e9416c19a4235ff520ad" -lazy = true - - [[tzdata2016a.download]] - sha256 = "5efa6b324e64ef921ef700ac3273a51895f672684a30e342f68e47871c6a8cd1" - url = "https://data.iana.org/time-zones/releases/tzdata2016a.tar.gz" - -[tzdata2016b] -git-tree-sha1 = "642fcaa05e913808dbe7d810f9bfdaa69da975f8" -lazy = true - - [[tzdata2016b.download]] - sha256 = "6392091d92556a32de488ea06a055c51bc46b7d8046c8a677f0ccfe286b3dbdc" - url = "https://data.iana.org/time-zones/releases/tzdata2016b.tar.gz" - -[tzdata2016c] -git-tree-sha1 = "de5b0c31b9056c42615c16d103d7e248fe3f2a9f" -lazy = true - - [[tzdata2016c.download]] - sha256 = "8700d981e6f2007ac037dabb5d2b12f390e8629bbc30e564bc21cf0c069a2d48" - url = "https://data.iana.org/time-zones/releases/tzdata2016c.tar.gz" - -[tzdata2016d] -git-tree-sha1 = "2d1ac481d3dfb4d949aea596a5ac4456ace20dbd" -lazy = true - - [[tzdata2016d.download]] - sha256 = "d9554dfba0efd76053582bd89e8c7036ef12eee14fdd506675b08a5b59f0a1b4" - url = "https://data.iana.org/time-zones/releases/tzdata2016d.tar.gz" - -[tzdata2016e] -git-tree-sha1 = "8fdd056255162c5467a36664cd1bbdf681e253e1" -lazy = true - - [[tzdata2016e.download]] - sha256 = "ba00f899f18dc4048d7fa21f5e1fdef434496084eedc06f6caa15e5ecdb6bd81" - url = "https://data.iana.org/time-zones/releases/tzdata2016e.tar.gz" - -[tzdata2016f] -git-tree-sha1 = "24b2183dfcce9cf59400546351479c4142b04003" -lazy = true - - [[tzdata2016f.download]] - sha256 = "ed8c951008d12f1db55a11e96fc055718c6571233327d9de16a7f8475e2502b0" - url = "https://data.iana.org/time-zones/releases/tzdata2016f.tar.gz" - -[tzdata2016g] -git-tree-sha1 = "e23f9c1832e5312c899a2e1f2741ef5c02b6473b" -lazy = true - - [[tzdata2016g.download]] - sha256 = "3c7137b2bc47323b0de47b77786bacf81ed503d4b2c693ff8ada2fbd1281ebd1" - url = "https://data.iana.org/time-zones/releases/tzdata2016g.tar.gz" - -[tzdata2016h] -git-tree-sha1 = "7308b495214e2dcaa734093421d2e14fd22fe8a9" -lazy = true - - [[tzdata2016h.download]] - sha256 = "da1b74fc2dec2ce8b64948dafb0bfc2f923c830d421a7ae4d016226135697a64" - url = "https://data.iana.org/time-zones/releases/tzdata2016h.tar.gz" - -[tzdata2016i] -git-tree-sha1 = "6760b2b88260cce8298d95a98cf2f4d5c044f27b" -lazy = true - - [[tzdata2016i.download]] - sha256 = "b6966ec982ef64fe48cebec437096b4f57f4287519ed32dde59c86d3a1853845" - url = "https://data.iana.org/time-zones/releases/tzdata2016i.tar.gz" - -[tzdata2016j] -git-tree-sha1 = "d07b6f4c96583b520c598c2ec642997456bc7a31" -lazy = true - - [[tzdata2016j.download]] - sha256 = "f5ee4e0f115f6c2faee1c4b16193a97338cbd1b503f2cea6c5a768c82ff39dc8" - url = "https://data.iana.org/time-zones/releases/tzdata2016j.tar.gz" - -[tzdata2017a] -git-tree-sha1 = "6f4fe8b6dce87640ee57c01cba697a9fc19e83f5" -lazy = true - - [[tzdata2017a.download]] - sha256 = "df3a5c4d0a2cf0cde0b3f35796ccf6c9acfd598b8e70f8dece5404cd7626bbd6" - url = "https://data.iana.org/time-zones/releases/tzdata2017a.tar.gz" - -[tzdata2017b] -git-tree-sha1 = "d319f5cd4b83cb39e07982e57ec8fa0187c693f8" -lazy = true - - [[tzdata2017b.download]] - sha256 = "f8242a522ea3496b0ce4ff4f2e75a049178da21001a08b8e666d8cbe07d18086" - url = "https://data.iana.org/time-zones/releases/tzdata2017b.tar.gz" - -[tzdata2017c] -git-tree-sha1 = "741520f19d9ddc703d3456de6f51564110d02e4a" -lazy = true - - [[tzdata2017c.download]] - sha256 = "d6543f92a929826318e2f44ff3a7611ce5f565a43e10250b42599d0ba4cbd90b" - url = "https://data.iana.org/time-zones/releases/tzdata2017c.tar.gz" - -[tzdata2018a] -git-tree-sha1 = "4ff551e97f8fd00ea3049a044df6ade603555500" -lazy = true - - [[tzdata2018a.download]] - sha256 = "d2ea23a06783603a42c1a2665392e65958b0c8a341b2f2e7342d43343d7080dc" - url = "https://data.iana.org/time-zones/releases/tzdata2018a.tar.gz" - -[tzdata2018b] -git-tree-sha1 = "d056209a6744485ca649acc277f674448a886ad1" -lazy = true - - [[tzdata2018b.download]] - sha256 = "f87540b9050e1b0d772d19058fcb62f54baa505ecebf392ea825713c33bd9848" - url = "https://data.iana.org/time-zones/releases/tzdata2018b.tar.gz" - -[tzdata2018c] -git-tree-sha1 = "5584e5b3aa1c43a7343208f481012c4dcd49604c" -lazy = true - - [[tzdata2018c.download]] - sha256 = "2825c3e4b7ef520f24d393bcc02942f9762ffd3e7fc9b23850789ed8f22933f6" - url = "https://data.iana.org/time-zones/releases/tzdata2018c.tar.gz" - -[tzdata2018d] -git-tree-sha1 = "811a74dcd49f53216561231bce077a63467251ae" -lazy = true - - [[tzdata2018d.download]] - sha256 = "5106eddceb5f1ae3a91dbd3960e1b8b11ba0dc08579a31cf0724a7691b10c054" - url = "https://data.iana.org/time-zones/releases/tzdata2018d.tar.gz" - -[tzdata2018e] -git-tree-sha1 = "8d32dc27d64088c22f4dad04253bd28c083ffc23" -lazy = true - - [[tzdata2018e.download]] - sha256 = "6b288e5926841a4cb490909fe822d85c36ae75538ad69baf20da9628b63b692e" - url = "https://data.iana.org/time-zones/releases/tzdata2018e.tar.gz" - -[tzdata2018f] -git-tree-sha1 = "65cd4ceb082560b20fc03b165459297322077ff9" -lazy = true - - [[tzdata2018f.download]] - sha256 = "0af6a85fc4ea95832f76524f35696a61abb3992fd3f8db33e5a1f95653e043f2" - url = "https://data.iana.org/time-zones/releases/tzdata2018f.tar.gz" - -[tzdata2018g] -git-tree-sha1 = "8d770981e2746d6bbc4b70ed98510972e2041106" -lazy = true - - [[tzdata2018g.download]] - sha256 = "02dfde534872f6513ae4553a3388fdae579441e31b862ea99170dfc447f46a16" - url = "https://data.iana.org/time-zones/releases/tzdata2018g.tar.gz" - -[tzdata2018h] -git-tree-sha1 = "c5160ae03e3834688c95ea50253221648ffa93c0" -lazy = true - - [[tzdata2018h.download]] - sha256 = "b8cbcf3e46aed30ad27c40d5bed68c16cf759384d14cc6411b84460c88bdd91f" - url = "https://data.iana.org/time-zones/releases/tzdata2018h.tar.gz" - -[tzdata2018i] -git-tree-sha1 = "a66c62bfd0d160fe006cea0914c71854f81953b2" -lazy = true - - [[tzdata2018i.download]] - sha256 = "82c45ef84ca3bc01d0a4a397ba8adeb8f7f199c6550740587c6ac5a7108c00d9" - url = "https://data.iana.org/time-zones/releases/tzdata2018i.tar.gz" - -[tzdata2019a] -git-tree-sha1 = "be3ff7820ca5dd17ec538d074385134387ffff23" -lazy = true - - [[tzdata2019a.download]] - sha256 = "90366ddf4aa03e37a16cd49255af77f801822310b213f195e2206ead48c59772" - url = "https://data.iana.org/time-zones/releases/tzdata2019a.tar.gz" - -[tzdata2019b] -git-tree-sha1 = "f46add2b96b8f014435d278ae0ee0c1827c5e3f9" -lazy = true - - [[tzdata2019b.download]] - sha256 = "05d9092c90dcf9ec4f3ccfdea80c7dcea5e882b3b105c3422da172aaa9a50c64" - url = "https://data.iana.org/time-zones/releases/tzdata2019b.tar.gz" - -[tzdata2019c] -git-tree-sha1 = "b15518ce5eb429242908ee274a56bec03281f62b" -lazy = true - - [[tzdata2019c.download]] - sha256 = "79c7806dab09072308da0e3d22c37d3b245015a591891ea147d3b133b60ffc7c" - url = "https://data.iana.org/time-zones/releases/tzdata2019c.tar.gz" - -[tzdata2020a] -git-tree-sha1 = "7ee09e55cb1d3e25074e98beb83d2b3c1f59a4a5" -lazy = true - - [[tzdata2020a.download]] - sha256 = "547161eca24d344e0b5f96aff6a76b454da295dc14ed4ca50c2355043fb899a2" - url = "https://data.iana.org/time-zones/releases/tzdata2020a.tar.gz" - -[tzdata2020b] -git-tree-sha1 = "4bab760da0fc9a851df15d4a49b04f2fde77e9bc" -lazy = true - - [[tzdata2020b.download]] - sha256 = "9b053f951d245ce89d850b96ee4711d82d833559b1fc96ba19f90bc4d745e809" - url = "https://data.iana.org/time-zones/releases/tzdata2020b.tar.gz" - -[tzdata2020c] -git-tree-sha1 = "1cdce5cb827eb36655e4ac3bae4c179f68b00ab6" -lazy = true - - [[tzdata2020c.download]] - sha256 = "7890ac105f1aa4a5d15c5be2409580af401ee2f3fffe2a1e4748af589e194bd9" - url = "https://data.iana.org/time-zones/releases/tzdata2020c.tar.gz" - -[tzdata2020d] -git-tree-sha1 = "3bb4442c51d88ef5c319dd2080b5e778327ab8cc" -lazy = true - - [[tzdata2020d.download]] - sha256 = "8d813957de363387696f05af8a8889afa282ab5016a764c701a20758d39cbaf3" - url = "https://data.iana.org/time-zones/releases/tzdata2020d.tar.gz" - -[tzdata2020e] -git-tree-sha1 = "d28cef3bce8ceb2692d4303cd9fcde11859cb39b" -lazy = true - - [[tzdata2020e.download]] - sha256 = "0be1ba329eae29ae1b54057c3547b3e672f73b3ae7643aa87dac85122bec037e" - url = "https://data.iana.org/time-zones/releases/tzdata2020e.tar.gz" - -[tzdata2020f] -git-tree-sha1 = "f4432f9e5f3f7664ca0bc314701faedcf8ce8c7e" -lazy = true - - [[tzdata2020f.download]] - sha256 = "121131918c3ae6dc5d40f0eb87563a2be920b71a76e2392c09519a5e4a666881" - url = "https://data.iana.org/time-zones/releases/tzdata2020f.tar.gz" - -[tzdata2021a] -git-tree-sha1 = "6d94ada27957590cbd0d7678f5ae711232a4d714" -lazy = true - - [[tzdata2021a.download]] - sha256 = "39e7d2ba08c68cbaefc8de3227aab0dec2521be8042cf56855f7dc3a9fb14e08" - url = "https://data.iana.org/time-zones/releases/tzdata2021a.tar.gz" - -[tzdata2021b] -git-tree-sha1 = "a1435b8e2d4048e771e9d5e161447f5d8e880221" -lazy = true - - [[tzdata2021b.download]] - sha256 = "53d9e6dbdb59dffe2b7bff59d140148181386c06e175fa69eaeb4cc83bc3deb7" - url = "https://data.iana.org/time-zones/releases/tzdata2021b.tar.gz" - -[tzdata2021c] -git-tree-sha1 = "4af568c231533aebf764ec76d852aa746cc40c17" -lazy = true - - [[tzdata2021c.download]] - sha256 = "b4f1d1c8cb11c3500276dac862d8c7e6f88c69b1e8ee4c5e9d1daad17fbe3542" - url = "https://data.iana.org/time-zones/releases/tzdata2021c.tar.gz" - -[tzdata2021d] -git-tree-sha1 = "2ba1f3280e466ed64def0dd4a74a0a2f1322ab55" -lazy = true - - [[tzdata2021d.download]] - sha256 = "d7c188a2b33d4a3c25ee4a9fdc68c1ff462bfdb302cf41343d84ca5942dbddf6" - url = "https://data.iana.org/time-zones/releases/tzdata2021d.tar.gz" - -[tzdata2021e] -git-tree-sha1 = "ea98b1f1035a0cf1f1f6ab1953b255d049a2ad12" -lazy = true - - [[tzdata2021e.download]] - sha256 = "07ec42b737d0d3c6be9c337f8abb5f00554a0f9cc4fcf01a703d69403b6bb2b1" - url = "https://data.iana.org/time-zones/releases/tzdata2021e.tar.gz" - -[tzdata2022a] -git-tree-sha1 = "0a6b08679140a459a92cd574727bb18755249c48" -lazy = true - - [[tzdata2022a.download]] - sha256 = "ef7fffd9f4f50f4f58328b35022a32a5a056b245c5cb3d6791dddb342f871664" - url = "https://data.iana.org/time-zones/releases/tzdata2022a.tar.gz" - -[tzdata2022b] -git-tree-sha1 = "18d4de12617f98663540d55ea4ba10bd1fe69f53" -lazy = true - - [[tzdata2022b.download]] - sha256 = "f590eaf04a395245426c2be4fae71c143aea5cebc11088b7a0a5704461df397d" - url = "https://data.iana.org/time-zones/releases/tzdata2022b.tar.gz" - -[tzdata2022c] -git-tree-sha1 = "daa43fa9c236eedd0c28c74c21633ec7b5b539fd" -lazy = true - - [[tzdata2022c.download]] - sha256 = "6974f4e348bf2323274b56dff9e7500247e3159eaa4b485dfa0cd66e75c14bfe" - url = "https://data.iana.org/time-zones/releases/tzdata2022c.tar.gz" - -[tzdata2022d] -git-tree-sha1 = "fe6be7b3644b1bd3d6062041a67cbbb88697ea35" -lazy = true - - [[tzdata2022d.download]] - sha256 = "6ecdbee27fa43dcfa49f3d4fd8bb1dfef54c90da1abcd82c9abcf2dc4f321de0" - url = "https://data.iana.org/time-zones/releases/tzdata2022d.tar.gz" - -[tzdata2022e] -git-tree-sha1 = "117b5193f08e671e5090b60995a44893cde13ed7" -lazy = true - - [[tzdata2022e.download]] - sha256 = "8de4c2686dce3d1aae9030719e6814931c216a2d5e891ec3d332e6f6516aeccd" - url = "https://data.iana.org/time-zones/releases/tzdata2022e.tar.gz" - -[tzdata2022f] -git-tree-sha1 = "f493dea1da29efcdeaeffd223aaa572f140d1c44" -lazy = true - - [[tzdata2022f.download]] - sha256 = "9990d71f675d212567b931fe8aae1cab7027f89fefb8a79d808a6933a67af000" - url = "https://data.iana.org/time-zones/releases/tzdata2022f.tar.gz" - -[tzdata2022g] -git-tree-sha1 = "b215fdf1f9b031b7907ed99b70b1d6d2a6e4d81c" -lazy = true - - [[tzdata2022g.download]] - sha256 = "4491db8281ae94a84d939e427bdd83dc389f26764d27d9a5c52d782c16764478" - url = "https://data.iana.org/time-zones/releases/tzdata2022g.tar.gz" - -[tzdata2023a] -git-tree-sha1 = "5084ef52d1c2ed2936acfdf2a7ed12233f8002fd" -lazy = true - - [[tzdata2023a.download]] - sha256 = "a2a27edb7af5a384cfcefdae9defad6a7ed23f3f2cfdaf3d5394c1e8299710bc" - url = "https://data.iana.org/time-zones/releases/tzdata2023a.tar.gz" - -[tzdata2023b] -git-tree-sha1 = "f5e36d10d70c4f5dc0e853103312e1d848c7bdee" -lazy = true - - [[tzdata2023b.download]] - sha256 = "9b78fd264f95611fe987a95721456cd5aac9f55e6915be4a9ca2997bc7ce0e6c" - url = "https://data.iana.org/time-zones/releases/tzdata2023b.tar.gz" - -[tzdata2023c] -git-tree-sha1 = "47933a630d1ec1321efe0c1954d1cfecdeb5d8b9" - - [[tzdata2023c.download]] - sha256 = "3f510b5d1b4ae9bb38e485aa302a776b317fb3637bdb6404c4adf7b6cadd965c" - url = "https://data.iana.org/time-zones/releases/tzdata2023c.tar.gz" - -[tzdata93g] -git-tree-sha1 = "e7ddeb4a45080afa6dbdd7c38df81bcf8b9d8f1a" -lazy = true - - [[tzdata93g.download]] - sha256 = "453cd56c946c0f0c062bd0d4b42555bb55b76778f91bc2f85aa390bc7de95140" - url = "https://data.iana.org/time-zones/releases/tzdata93g.tar.gz" - -[tzdata94a] -git-tree-sha1 = "3792c6bcf2dd410edabc0de920b3262e9bcf08b9" -lazy = true - - [[tzdata94a.download]] - sha256 = "402e8b5e7a713bde8514832e50a8d4a56900deb8e1d60c9abe5a36a5cb195a06" - url = "https://data.iana.org/time-zones/releases/tzdata94a.tar.gz" - -[tzdata94b] -git-tree-sha1 = "ff665b96f7d50272d0a8e0e321d530c8b09380a5" -lazy = true - - [[tzdata94b.download]] - sha256 = "4357581dc85487bcb59a7141d4ed5ee742e4ecccc2da7684d7f168751c61fc18" - url = "https://data.iana.org/time-zones/releases/tzdata94b.tar.gz" - -[tzdata94d] -git-tree-sha1 = "ae7b60dc0c96fc76c945b5f95b464c2672a1f12b" -lazy = true - - [[tzdata94d.download]] - sha256 = "5a9bb009b8423b3f4d262b9cc9098384e073e26aaee991a4fe73c2619fbe02cd" - url = "https://data.iana.org/time-zones/releases/tzdata94d.tar.gz" - -[tzdata94e] -git-tree-sha1 = "90b27ec406fbe1e30a7b486edde037c7fa475c27" -lazy = true - - [[tzdata94e.download]] - sha256 = "d02b6b758f50502d2ef233c23a27b2cb3bbe85889b1d5dc3d68c3bafc0d270ca" - url = "https://data.iana.org/time-zones/releases/tzdata94e.tar.gz" - -[tzdata94f] -git-tree-sha1 = "120dc3d384840054741fa6d3b1d4bb8eba2396b6" -lazy = true - - [[tzdata94f.download]] - sha256 = "803238ec721289aac9a8f81f0325fca8476f2c6779368b3a1f384e0966b4c31f" - url = "https://data.iana.org/time-zones/releases/tzdata94f.tar.gz" - -[tzdata94h] -git-tree-sha1 = "a7192b7b16d072863839ee24cc68cb944f942fa4" -lazy = true - - [[tzdata94h.download]] - sha256 = "0df84818543f53783a6c7aa839bffd4cfbb3efccf441003b2cb1889869d2fedd" - url = "https://data.iana.org/time-zones/releases/tzdata94h.tar.gz" - -[tzdata95b] -git-tree-sha1 = "5cee98fd13b7cc03af48b926534759f515d2c1b6" -lazy = true - - [[tzdata95b.download]] - sha256 = "f0e65427d2e88a11d499ac0e0cfe19cb508c17aebcacf2b60428f07510a241f8" - url = "https://data.iana.org/time-zones/releases/tzdata95b.tar.gz" - -[tzdata95c] -git-tree-sha1 = "b973690beafaad07f8fe8172a664e3995665d510" -lazy = true - - [[tzdata95c.download]] - sha256 = "ab8f40e112941ce906cfa33fe896cedec845db2f2dad7a2d553b4516c4237c4b" - url = "https://data.iana.org/time-zones/releases/tzdata95c.tar.gz" - -[tzdata95d] -git-tree-sha1 = "4181abd2be1fc8f2964c0681d8bc3ff7d38c299a" -lazy = true - - [[tzdata95d.download]] - sha256 = "85e3833cb9471de65234ecbac0a57d10681bce98689f22a2e87e97c1be01358f" - url = "https://data.iana.org/time-zones/releases/tzdata95d.tar.gz" - -[tzdata95e] -git-tree-sha1 = "6ac70b261703c39615f2e7797aa3662f57e97a9a" -lazy = true - - [[tzdata95e.download]] - sha256 = "74a714c1913275256b5838bab29d97096519f1bc92d87e3df2992e5840fb761f" - url = "https://data.iana.org/time-zones/releases/tzdata95e.tar.gz" - -[tzdata95f] -git-tree-sha1 = "f052bec9396067db314ae37cba669e1fdb528742" -lazy = true - - [[tzdata95f.download]] - sha256 = "6f64cc52d9f9a5083e24e35f6db4ac5b93733896249df5ced0828cb3aa6c93a8" - url = "https://data.iana.org/time-zones/releases/tzdata95f.tar.gz" - -[tzdata95g] -git-tree-sha1 = "2ad4eaf2fd0db4fd756019cca85d1139303e0c6f" -lazy = true - - [[tzdata95g.download]] - sha256 = "48d06cc55d8007ff5be029f30a91cf8bd6cb1a5b9d69ac93b6d84ba51e99ad25" - url = "https://data.iana.org/time-zones/releases/tzdata95g.tar.gz" - -[tzdata95h] -git-tree-sha1 = "ab0e8405a16af3653a5610979ab2a7392ec4fbba" -lazy = true - - [[tzdata95h.download]] - sha256 = "f098b4cbfdaaa016fd324749997b0768ca6e92b36444bb64d11d765b23ab4ae6" - url = "https://data.iana.org/time-zones/releases/tzdata95h.tar.gz" - -[tzdata95i] -git-tree-sha1 = "d5506bf9dc54bddf87ce34e54075f1bdb8e1e01c" -lazy = true - - [[tzdata95i.download]] - sha256 = "473d5caabf161135321e6b783f8d42e799af56c8ee66618d64fd3165c72c8a51" - url = "https://data.iana.org/time-zones/releases/tzdata95i.tar.gz" - -[tzdata95k] -git-tree-sha1 = "4641d762bdfd45005ffe23a21bace16fb2e5c50a" -lazy = true - - [[tzdata95k.download]] - sha256 = "668316a70eb8cc1a8ed0a2ebd9b1e34bd4ec3eb9bcb3ad068b1cc6e4812d1caf" - url = "https://data.iana.org/time-zones/releases/tzdata95k.tar.gz" - -[tzdata95l] -git-tree-sha1 = "64afaaed2b88c38a29f9fb4198f22662323d3ceb" -lazy = true - - [[tzdata95l.download]] - sha256 = "f9c82e19c5837e737f59c1d6f61352e7d1ca5178839124a313b78f593254a80b" - url = "https://data.iana.org/time-zones/releases/tzdata95l.tar.gz" - -[tzdata95m] -git-tree-sha1 = "f7b20d08ea0fae0f43fce023421032eb9c839f27" -lazy = true - - [[tzdata95m.download]] - sha256 = "3574961976fc9762659d145a90b867d30bd88a1978ff65c1f07c7aec26a99e53" - url = "https://data.iana.org/time-zones/releases/tzdata95m.tar.gz" - -[tzdata96a] -git-tree-sha1 = "d979d12f0912737480e554e2915459b905220779" -lazy = true - - [[tzdata96a.download]] - sha256 = "d5170a362e7409fa7174042ee5cb4efa40a60c70ce36834969493cda46bc463e" - url = "https://data.iana.org/time-zones/releases/tzdata96a.tar.gz" - -[tzdata96b] -git-tree-sha1 = "214e8413b5da90d6e5d9f6d916be43b48a9f0669" -lazy = true - - [[tzdata96b.download]] - sha256 = "af6f0b66475d977a4040f73e31ae83186501020b0e54418d3b826cb0252f9321" - url = "https://data.iana.org/time-zones/releases/tzdata96b.tar.gz" - -[tzdata96c] -git-tree-sha1 = "0098bd8f0a47871e728d40fca476b7c42f988894" -lazy = true - - [[tzdata96c.download]] - sha256 = "3edcf59c3f79acb3035777348c8fdccf14786cf50f0e085035965d0945226660" - url = "https://data.iana.org/time-zones/releases/tzdata96c.tar.gz" - -[tzdata96d] -git-tree-sha1 = "c3abe4165d88d36b015eb341b65ff5c5a4c98bf4" -lazy = true - - [[tzdata96d.download]] - sha256 = "afc72ab3d82056409328e84c36a0fbbea9015a4f2733e7666b84bd63c5f5baf0" - url = "https://data.iana.org/time-zones/releases/tzdata96d.tar.gz" - -[tzdata96e] -git-tree-sha1 = "d34c0c6aeb16e0a4e1b4b06573459df0f4c86122" -lazy = true - - [[tzdata96e.download]] - sha256 = "1751e9dd15dfec61d9702920b4c3d4be42aa9964a5b8cce2b369854a1263d7b3" - url = "https://data.iana.org/time-zones/releases/tzdata96e.tar.gz" - -[tzdata96h] -git-tree-sha1 = "463561ed73c004096d46613a9c94af2b635c4ebf" -lazy = true - - [[tzdata96h.download]] - sha256 = "8264544985aaf12ff20ea14d963e361c4422ce8fd5bd8c69b92ec0e296f4fe32" - url = "https://data.iana.org/time-zones/releases/tzdata96h.tar.gz" - -[tzdata96i] -git-tree-sha1 = "33143e05ac18f5c2618df3b30ade30b488ecbc83" -lazy = true - - [[tzdata96i.download]] - sha256 = "8a26fd4aa3e7bf474f1d51be394e309737fb2c157dc8014cfcf2a5a3f4084289" - url = "https://data.iana.org/time-zones/releases/tzdata96i.tar.gz" - -[tzdata96k] -git-tree-sha1 = "7960910282bef13f94763d0c9782c6a905297f0f" -lazy = true - - [[tzdata96k.download]] - sha256 = "02f8321a3236105338a2a071f9f9ef98dadeb8f939cbe3dc2dd53e1931015604" - url = "https://data.iana.org/time-zones/releases/tzdata96k.tar.gz" - [[unicode-cldr-release-43-1]] arch = "x86_64" git-tree-sha1 = "40b35727ea0aff9a9f28b7454004b68849caf67b" diff --git a/dev/Manifest.toml b/dev/Manifest.toml index 81fa17ed..674f8390 100644 --- a/dev/Manifest.toml +++ b/dev/Manifest.toml @@ -60,9 +60,9 @@ uuid = "460bff9d-24e4-43bc-9d9f-a8973cb893f4" version = "0.1.9" [[deps.ExprTools]] -git-tree-sha1 = "c1d06d129da9f55715c6c212866f5b1bddc5fa00" +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.9" +version = "0.1.10" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" @@ -95,10 +95,6 @@ git-tree-sha1 = "5b62d93f2582b09e469b3099d839c2d2ebf5066d" uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" version = "1.13.1" -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" - [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" @@ -176,9 +172,9 @@ version = "3.0.9+0" [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "4b2e829ee66d4218e0cef22c0a64ee37cf258c29" +git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.7.1" +version = "2.7.2" [[deps.Pkg]] deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] @@ -247,6 +243,12 @@ deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" version = "1.0.3" +[[deps.TZJFileData]] +deps = ["Artifacts"] +path = "../../TZJFileData" +uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" +version = "0.0.1" + [[deps.Tar]] deps = ["ArgTools", "SHA"] uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" @@ -257,10 +259,10 @@ deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [[deps.TimeZones]] -deps = ["Dates", "Downloads", "InlineStrings", "LazyArtifacts", "Mocking", "Printf", "RecipesBase", "Scratch", "Unicode"] +deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "RecipesBase", "Scratch", "TZJFileData", "Unicode"] path = ".." uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" -version = "1.10.0" +version = "1.11.0" [[deps.TranscodingStreams]] deps = ["Random", "Test"] diff --git a/dev/generate_artifacts.jl b/dev/generate_artifacts.jl index ea04fc2a..97226216 100644 --- a/dev/generate_artifacts.jl +++ b/dev/generate_artifacts.jl @@ -1,59 +1,14 @@ using Base: SHA1 -using Base.BinaryPlatforms: HostPlatform, Platform +using Base.BinaryPlatforms: Platform using CodecZlib: GzipDecompressorStream using Downloads: download using JSON3: JSON3 using HTTP: HTTP -using Pkg.Artifacts: AbstractPlatform, artifact_hash, artifact_meta, bind_artifact!, - load_artifacts_toml, unbind_artifact! +using Pkg.Artifacts: bind_artifact!, load_artifacts_toml, unbind_artifact! using SHA: SHA using Tar: Tar using TimeZones.TZData: tzdata_versions - -function artifact_checksums(tarball_url::AbstractString) - tarball = download(tarball_url, IOBuffer()) - - # Compute the Artifact.toml `sha256` from the compressed archive. - sha256 = bytes2hex(SHA.sha256(seekstart(tarball))) - - # Compute the Artifact.toml `git-tree-sha1`. Usually this is computed via - # `Artifacts.create_artifact` but we want to avoid actually storing this data as an - # artifact. - git_tree_sha1 = SHA1(Tar.tree_hash(GzipDecompressorStream(seekstart(tarball)))) - - return git_tree_sha1, sha256 -end - -# Code loosely based upon: https://julialang.github.io/Pkg.jl/dev/artifacts/#Using-Artifacts-1 -function bind_artifact_url!( - artifacts_toml::String, - name::String, - url::String; - lazy::Bool=true, - platform::Union{AbstractPlatform,Nothing}=nothing, -) - p = something(platform, HostPlatform()) - - # Query the `Artifacts.toml` file for the hash associated with artifact name. If no such - # binding exists within the file then `nothing` will be returned. - git_tree_sha1 = artifact_hash(name, artifacts_toml; platform=p) - - if git_tree_sha1 === nothing - @info "Processing new artifact: $name" - git_tree_sha1, sha256 = artifact_checksums(url) - else - meta = artifact_meta(name, artifacts_toml; platform=p) - sha256 = only(meta["download"])["sha256"] - end - - download_info = [(url, sha256)] - - # Must unbind before we can call bind on an already bound artifact - unbind_artifact!(artifacts_toml, name) - bind_artifact!(artifacts_toml, name, git_tree_sha1; lazy, platform, download_info) -end - function update_uncode_cldr_artifacts!(artifacts_toml::AbstractString) @info "Checking for latest Unicode CLDR release..." response = HTTP.get("https://api.github.com/repos/unicode-org/cldr/releases/latest") @@ -76,7 +31,15 @@ function update_uncode_cldr_artifacts!(artifacts_toml::AbstractString) sha256 = only(info["download"])["sha256"] else @info "Processing new artifact: $name" - git_tree_sha1, sha256 = artifact_checksums(url) + tarball = download(tarball_url, IOBuffer()) + + # Compute the Artifact.toml `sha256` from the compressed archive. + sha256 = bytes2hex(SHA.sha256(seekstart(tarball))) + + # Compute the Artifact.toml `git-tree-sha1`. Usually this is computed via + # `Artifacts.create_artifact` but we want to avoid actually storing this data as an + # artifact. + git_tree_sha1 = SHA1(Tar.tree_hash(GzipDecompressorStream(seekstart(tarball)))) end download_info = [(url, sha256)] @@ -97,17 +60,10 @@ end function update_artifacts!(artifacts_toml::String) - @info "Checking for missing tzdata versions..." + @info "Determining latest tzdata version..." versions = tzdata_versions() latest_tzdata = last(versions) - for version in versions - artifact_name = "tzdata$version" - url = "https://data.iana.org/time-zones/releases/tzdata$version.tar.gz" - lazy = version != latest_tzdata - bind_artifact_url!(artifacts_toml, artifact_name, url; lazy) - end - latest_unicode_cldr = update_uncode_cldr_artifacts!(artifacts_toml) # Display the information on the latest releases which is useful for updating the From 621822e24f89b62d611f05e22a4ad912c9d5371b Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sat, 29 Jul 2023 18:59:20 -0400 Subject: [PATCH 12/29] Fix archive.jl --- src/tzdata/archive.jl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/tzdata/archive.jl b/src/tzdata/archive.jl index c9c7f236..f4fb5517 100644 --- a/src/tzdata/archive.jl +++ b/src/tzdata/archive.jl @@ -1,4 +1,10 @@ - +const exe7z = if Sys.iswindows() + if isdefined(Base, :LIBEXECDIR) + joinpath(Sys.BINDIR, Base.LIBEXECDIR, "7z.exe") + else + joinpath(Sys.BINDIR, "7z.exe") + end +end """ unpack(archive, directory, [files]; [verbose=false]) -> Nothing From f4a9e08b95defe049cdf5d5f6119bbc6b51ccd43 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Sun, 6 Aug 2023 23:19:11 -0500 Subject: [PATCH 13/29] Update dev/Manifest.toml --- dev/Manifest.toml | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/dev/Manifest.toml b/dev/Manifest.toml index 674f8390..0e529800 100644 --- a/dev/Manifest.toml +++ b/dev/Manifest.toml @@ -27,9 +27,9 @@ version = "0.7.2" [[deps.Compat]] deps = ["UUIDs"] -git-tree-sha1 = "5ce999a19f4ca23ea484e92a1774a61b8ca4cf8e" +git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.8.0" +version = "4.9.0" [deps.Compat.extensions] CompatLinearAlgebraExt = "LinearAlgebra" @@ -91,9 +91,9 @@ version = "1.4.1" [[deps.JSON3]] deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] -git-tree-sha1 = "5b62d93f2582b09e469b3099d839c2d2ebf5066d" +git-tree-sha1 = "95220473901735a0f4df9d1ca5b171b568b2daa3" uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" -version = "1.13.1" +version = "1.13.2" [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] @@ -166,9 +166,9 @@ version = "1.4.1" [[deps.OpenSSL_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] -git-tree-sha1 = "cae3153c7f6cf3f069a853883fd1919a6e5bab5b" +git-tree-sha1 = "e78db7bd5c26fc5a6911b50a47ee302219157ea8" uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" -version = "3.0.9+0" +version = "3.0.10+0" [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] @@ -243,11 +243,11 @@ deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" version = "1.0.3" -[[deps.TZJFileData]] +[[deps.TZJData]] deps = ["Artifacts"] -path = "../../TZJFileData" +git-tree-sha1 = "b32799596731e3d712cdf085b18a26f271ce110c" uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" -version = "0.0.1" +version = "0.0.1+2023c" [[deps.Tar]] deps = ["ArgTools", "SHA"] @@ -259,7 +259,7 @@ deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [[deps.TimeZones]] -deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "RecipesBase", "Scratch", "TZJFileData", "Unicode"] +deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "RecipesBase", "Scratch", "TZJData", "Unicode"] path = ".." uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" version = "1.11.0" @@ -271,9 +271,9 @@ uuid = "3bb67fe8-82b1-5028-8e26-92a6c54297fa" version = "0.9.13" [[deps.URIs]] -git-tree-sha1 = "074f993b0ca030848b897beff716d93aca60f06a" +git-tree-sha1 = "b7a5e99f24892b6824a954199a45e9ffcc1c70f0" uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" -version = "1.4.2" +version = "1.5.0" [[deps.UUIDs]] deps = ["Random", "SHA"] From de80ebba02474c52bc2586a9816b0f0122f5f120 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Mon, 7 Aug 2023 00:17:27 -0500 Subject: [PATCH 14/29] Remove deps/build.jl --- deps/build.jl | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 deps/build.jl diff --git a/deps/build.jl b/deps/build.jl deleted file mode 100644 index 17cfff64..00000000 --- a/deps/build.jl +++ /dev/null @@ -1,3 +0,0 @@ -using TimeZones: build - -build() From e069996070418fa9189c688a008bf1d1921ea2c6 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Mon, 7 Aug 2023 00:25:40 -0500 Subject: [PATCH 15/29] Corrections to CI tests --- test/ci.jl | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/test/ci.jl b/test/ci.jl index ebbbbf81..c0d007bd 100644 --- a/test/ci.jl +++ b/test/ci.jl @@ -5,18 +5,20 @@ using TimeZones: TZData # Julia sessions or just leave the end-users system in a inconsistent state. @testset "build process" begin + working_dir = _scratch_dir() + # Clean out deps directories for a clean re-build - compiled_dir = TZData._compiled_dir(TZDATA_VERSION) - tz_source_dir = TZData._tz_source_dir(TZDATA_VERSION) + TZData.cleanup(TZDATA_VERSION, working_dir) - isdir(compiled_dir) && rm(compiled_dir, recursive=true) - isdir(tz_source_dir) && rm(tz_source_dir, recursive=true) + tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(version)) + compiled_dir = joinpath(working_dir, _compiled_relative_dir(version)) @test !isdir(compiled_dir) - @test !isdir(tz_source_dir) + @test !isdir(tz_source_dir + # TODO: Comment incorrect # Using a version we already have avoids triggering a download - TimeZones.build(TZDATA_VERSION) + TimeZones.build(TZDATA_VERSION, working_dir) @test isdir(compiled_dir) @test length(readdir(compiled_dir)) > 0 From ebe603e9f0ac6bc51fc5c106d9e0eb11bd80605d Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Mon, 7 Aug 2023 00:29:55 -0500 Subject: [PATCH 16/29] Update docs/Manifest.toml --- docs/Manifest.toml | 45 ++++++++++++++++----------------------------- 1 file changed, 16 insertions(+), 29 deletions(-) diff --git a/docs/Manifest.toml b/docs/Manifest.toml index 28283672..88a4253b 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -1,6 +1,6 @@ # This file is machine-generated - editing it directly is not advised -julia_version = "1.9.0" +julia_version = "1.9.1" manifest_format = "2.0" project_hash = "b0e0fdd6d2084cf873bc7d6040a84520736d76d6" @@ -21,9 +21,9 @@ uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" [[deps.Compat]] deps = ["UUIDs"] -git-tree-sha1 = "7a60c856b9fa189eb34f5f8a6f6b5529b7942957" +git-tree-sha1 = "e460f044ca8b99be31d35fe54fc33a5c33dd8ed7" uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" -version = "4.6.1" +version = "4.9.0" [deps.Compat.extensions] CompatLinearAlgebraExt = "LinearAlgebra" @@ -44,9 +44,9 @@ version = "0.9.3" [[deps.Documenter]] deps = ["ANSIColoredPrinters", "Base64", "Dates", "DocStringExtensions", "IOCapture", "InteractiveUtils", "JSON", "LibGit2", "Logging", "Markdown", "REPL", "Test", "Unicode"] -git-tree-sha1 = "58fea7c536acd71f3eef6be3b21c0df5f3df88fd" +git-tree-sha1 = "39fd748a73dce4c05a9655475e437170d8fb1b67" uuid = "e30172f5-a6a5-5a46-863b-614d45cd2de4" -version = "0.27.24" +version = "0.27.25" [[deps.Downloads]] deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] @@ -54,9 +54,9 @@ uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" version = "1.6.0" [[deps.ExprTools]] -git-tree-sha1 = "c1d06d129da9f55715c6c212866f5b1bddc5fa00" +git-tree-sha1 = "27415f162e6028e81c72b82ef756bf321213b6ec" uuid = "e2ba6199-217a-4e67-a87a-7c52f15ade04" -version = "0.1.9" +version = "0.1.10" [[deps.FileWatching]] uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" @@ -83,10 +83,6 @@ git-tree-sha1 = "31e996f0a15c7b280ba9f76636b3ff9e2ae58c9a" uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" version = "0.21.4" -[[deps.LazyArtifacts]] -deps = ["Artifacts", "Pkg"] -uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" - [[deps.LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" @@ -140,14 +136,9 @@ version = "1.2.0" [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] -git-tree-sha1 = "5a6ab2f64388fd1175effdf73fe5933ef1e0bac0" +git-tree-sha1 = "716e24b21538abc91f6205fd1d8363f39b442851" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.7.0" - -[[deps.Pkg]] -deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] -uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" -version = "1.9.0" +version = "2.7.2" [[deps.PrecompileTools]] deps = ["Preferences"] @@ -200,20 +191,21 @@ deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" version = "1.0.3" -[[deps.Tar]] -deps = ["ArgTools", "SHA"] -uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" -version = "1.10.0" +[[deps.TZJData]] +deps = ["Artifacts"] +git-tree-sha1 = "b32799596731e3d712cdf085b18a26f271ce110c" +uuid = "dc5dba14-91b3-4cab-a142-028a31da12f7" +version = "0.0.1+2023c" [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [[deps.TimeZones]] -deps = ["Dates", "Downloads", "InlineStrings", "LazyArtifacts", "Mocking", "Printf", "RecipesBase", "Scratch", "Unicode"] +deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "RecipesBase", "Scratch", "TZJData", "Unicode"] path = ".." uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" -version = "1.10.0" +version = "1.11.0" [[deps.UUIDs]] deps = ["Random", "SHA"] @@ -231,8 +223,3 @@ version = "1.2.13+0" deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" version = "1.48.0+0" - -[[deps.p7zip_jll]] -deps = ["Artifacts", "Libdl"] -uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" -version = "17.4.0+0" From 325dcd89e856eb6ea8e62ae30035f9f90a73075e Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Mon, 7 Aug 2023 00:35:24 -0500 Subject: [PATCH 17/29] fixup! Corrections to CI tests --- test/ci.jl | 8 ++++---- test/runtests.jl | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/test/ci.jl b/test/ci.jl index c0d007bd..a09a9169 100644 --- a/test/ci.jl +++ b/test/ci.jl @@ -10,15 +10,15 @@ using TimeZones: TZData # Clean out deps directories for a clean re-build TZData.cleanup(TZDATA_VERSION, working_dir) - tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(version)) - compiled_dir = joinpath(working_dir, _compiled_relative_dir(version)) + tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(TZDATA_VERSION)) + compiled_dir = joinpath(working_dir, _compiled_relative_dir(TZDATA_VERSION)) @test !isdir(compiled_dir) - @test !isdir(tz_source_dir + @test !isdir(tz_source_dir) # TODO: Comment incorrect # Using a version we already have avoids triggering a download - TimeZones.build(TZDATA_VERSION, working_dir) + TZData.build(TZDATA_VERSION, working_dir) @test isdir(compiled_dir) @test length(readdir(compiled_dir)) > 0 diff --git a/test/runtests.jl b/test/runtests.jl index 81c9f70e..d95d6522 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -7,7 +7,7 @@ using Test using TimeZones using TimeZones: _scratch_dir using TimeZones.TZData: TZSource, compile, build, tzdata_url, unpack, - _tz_source_relative_dir, _archive_relative_dir + _tz_source_relative_dir, _archive_relative_dir, _compiled_relative_dir using Unicode Mocking.activate() From 0dea22de54ba654e0dfaaef7161a91dbba2281ae Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Mon, 7 Aug 2023 00:35:41 -0500 Subject: [PATCH 18/29] Fix kwargs in TZData.compile --- src/tzdata/compile.jl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tzdata/compile.jl b/src/tzdata/compile.jl index e04e196a..35fb3b7a 100644 --- a/src/tzdata/compile.jl +++ b/src/tzdata/compile.jl @@ -710,7 +710,7 @@ end # TODO: Deprecate? function compile( tz_source_dir::AbstractString=joinpath(_scratch_dir(), _tz_source_relative_dir(tzdata_version())), - dest_dir::AbstractString=joinpath(_scratch_dir(), _compiled_relative_dir(tzdata_version())), + dest_dir::AbstractString=joinpath(_scratch_dir(), _compiled_relative_dir(tzdata_version())); kwargs... ) results = compile(TZSource(readdir(tz_source_dir; join=true)), dest_dir; kwargs...) From 8a8ad50b299dbd43a5da116a8a116188338288f8 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Tue, 8 Aug 2023 23:37:15 -0500 Subject: [PATCH 19/29] Refactor build function --- src/build.jl | 6 +-- src/tzdata/TZData.jl | 1 + src/tzdata/build.jl | 72 +------------------------- src/tzdata/deprecated.jl | 106 +++++++++++++++++++++++++++++++++++++++ test/ci.jl | 58 --------------------- test/runtests.jl | 7 +-- test/tzdata/build.jl | 55 ++++++++++++++++++++ 7 files changed, 167 insertions(+), 138 deletions(-) create mode 100644 src/tzdata/deprecated.jl delete mode 100644 test/ci.jl create mode 100644 test/tzdata/build.jl diff --git a/src/build.jl b/src/build.jl index f810cc5e..84481a59 100644 --- a/src/build.jl +++ b/src/build.jl @@ -11,15 +11,15 @@ Builds the TimeZones package with the specified tzdata `version` and `regions`. This function is *not* thread-safe and meant primarily for experimentation. """ function build(version::AbstractString=tzdata_version(); force::Bool=false) - built = TimeZones.TZData.build(version, returned=:namedtuple) + compiled_dir = TimeZones.TZData.build(version, _scratch_dir()) if Sys.iswindows() TimeZones.WindowsTimeZoneIDs.build(force=force) end # Set the compiled directory to the new location - _COMPILED_DIR[] = built.compiled_dir - _reload_cache(_COMPILED_DIR[]) + _COMPILED_DIR[] = compiled_dir + _reload_cache(compiled_dir) @info "Successfully built TimeZones" end diff --git a/src/tzdata/TZData.jl b/src/tzdata/TZData.jl index faaf8349..293e33a9 100644 --- a/src/tzdata/TZData.jl +++ b/src/tzdata/TZData.jl @@ -29,5 +29,6 @@ include("archive.jl") include("download.jl") include("compile.jl") include("build.jl") +include("deprecated.jl") end diff --git a/src/tzdata/build.jl b/src/tzdata/build.jl index 4dc3ced6..9fa5d55b 100644 --- a/src/tzdata/build.jl +++ b/src/tzdata/build.jl @@ -19,80 +19,10 @@ const CUSTOM_REGIONS = [ const REGIONS = [STANDARD_REGIONS; LEGACY_REGIONS] -function build( - version::AbstractString, - regions::AbstractVector{<:AbstractString}, - tz_source_dir::AbstractString="", - compiled_dir::AbstractString="", -) - # Validate that the version specified is in the Artifact.toml - tzdata_hash = artifact_hash("tzdata$version", ARTIFACT_TOML) - if tzdata_hash === nothing - error("tzdata$version is not present in the Artifacts.toml") - end - - artifact_dir = @artifact_str "tzdata$version" - - # TODO: Deprecate skipping tzdata installation step or use `nothing` instead - if !isempty(tz_source_dir) - @info "Installing $version tzdata region data" - region_paths = vcat( - joinpath.(artifact_dir, intersect!(readdir(artifact_dir), regions)), - joinpath.(CUSTOM_REGION_DIR, CUSTOM_REGIONS), - ) - for path in region_paths - cp(path, joinpath(tz_source_dir, basename(path)), force=true) - end - - # Update the set of regions to compile the regions that existed in the artifact - # directory and the custom regions. There are some subtleties to this logic: - # - # - Will skips compiling non-existent regions that were specified (but only when - # `tz_source_dir` is used) - # - Custom regions are compiled even when not requested when `tz_source_dir` is used - # - Compile ignores extra files stored in the `tz_source_dir` - # - # TODO: In the future it's probably more sensible to get away from this subtle - # behaviour and just compile all files present in the `tz_source_dir`. - regions = basename.(region_paths) - end - - # TODO: Deprecate skipping conversion step or use `nothing` instead - if !isempty(compiled_dir) - @info "Converting tz source files into TimeZone data" - tz_source = TZSource(joinpath.(tz_source_dir, regions)) - compile(tz_source, compiled_dir) - end - - return version -end - -function build(version::AbstractString=tzdata_version(); returned::Symbol=:version) - tz_source_dir = _tz_source_dir(version) - compiled_dir = _compiled_dir(version) - - # Empty directories to avoid having left over files from previous builds. - isdir(tz_source_dir) && rm(tz_source_dir, recursive=true) - isdir(compiled_dir) && rm(compiled_dir, recursive=true) - mkpath(tz_source_dir) - mkpath(compiled_dir) - - version = build(version, REGIONS, tz_source_dir, compiled_dir) - - if returned === :version - return version - elseif returned === :namedtuple - return (; version, tz_source_dir, compiled_dir) - else - throw(ArgumentError("Unhandled return option: $returned")) - end -end - _archive_relative_dir() = "archive" _tz_source_relative_dir(version::AbstractString) = joinpath("tzsource", version) _compiled_relative_dir(version::AbstractString) = joinpath("compiled", "tzjf", "v$(TZJFile.DEFAULT_VERSION)", version) -# Only accepts a real tzdata version (not latest) function build(version::AbstractString, working_dir::AbstractString) tzdata_archive_dir = joinpath(working_dir, _archive_relative_dir()) tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(version)) @@ -119,7 +49,7 @@ function build(version::AbstractString, working_dir::AbstractString) push!(regions, custom_region) end else - regions = readdir(tz_source_dir) + regions = intersect!(readdir(tz_source_dir), REGIONS) end if !isdir(compiled_dir) diff --git a/src/tzdata/deprecated.jl b/src/tzdata/deprecated.jl new file mode 100644 index 00000000..8d6425a3 --- /dev/null +++ b/src/tzdata/deprecated.jl @@ -0,0 +1,106 @@ +# BEGIN TimeZones 1.12 deprecations + +function build( + version::AbstractString, + regions::AbstractVector{<:AbstractString}, + tz_source_dir::AbstractString="", + compiled_dir::AbstractString="", +) + Base.depwarn( + "`$build(version, regions, tz_source_dir, compiled_dir)` is deprecated with no " * + "direct replacement, see `$build(version, working_dir)` as an alternative." + ) + + url = tzdata_url(version) + tzdata_archive_file = joinpath(tempdir(), basename(url)) + if !isfile(tzdata_archive_file) + @info "Downloading tzdata $version archive" + mkpath(archive_dir) + download(url, tzdata_archive_file) + end + + if !isdir(source_dir) + @info "Decompressing tzdata $version region data" + mkpath(source_dir) + + # TODO: Confirm that "utc" was ever included in the tzdata archives + build_regions = intersect!(list(tzdata_archive_file), regions) + unpack(tzdata_archive_file, source_dir, build_regions; verbose=true) + + for custom_region in CUSTOM_REGIONS + cp(joinpath(CUSTOM_REGION_DIR, custom_region), joinpath(source_dir, custom_region)) + push!(build_regions, custom_region) + end + else + build_regions = intersect!(readdir(source_dir), regions) + end + + if !isdir(compiled_dir) + @info "Compiling tzdata $version region data" + mkpath(compiled_dir) + tz_source = TZSource(joinpath.(source_dir, build_regions)) + compile(tz_source, compiled_dir) + end + + return version +end + +function build() + Base.depwarn( + """`$build()` is deprecated, use + ``` + let version = $tzdata_version() + $build(version, tempdir()) + version + end + ``` + instead.""" + ) + + version = tzdata_version() + working_dir = tempdir() + build(version, working_dir) + return version +end + +function build(version::AbstractString; returned::Symbol=:version) + if returned === :version + Base.depwarn( + """`$build(version; returned=:version)` is deprecated, use + ``` + let + $build(version, tempdir()) + version + end + ``` + instead.""" + ) + elseif returned === :namedtuple + Base.depwarn( + """`$build(version; returned=:namedtuple)` is deprecated, use + ``` + let working_dir = tempdir() + compiled_dir = $build(version, working_dir) + tz_source_dir = joinpath(working_dir, $(_tz_source_relative_dir)(version)) + (; version, tz_source_dir, compiled_dir) + end + ``` + instead.""" + ) + else + throw(ArgumentError("Unhandled return option: $returned")) + end + + working_dir = tempdir() + tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(version)) + + compiled_dir = build(version, working_dir) + + if returned === :version + return version + elseif returned === :namedtuple + return (; version, tz_source_dir, compiled_dir) + end +end + +# BEGIN TimeZones 1.12 deprecations diff --git a/test/ci.jl b/test/ci.jl deleted file mode 100644 index a09a9169..00000000 --- a/test/ci.jl +++ /dev/null @@ -1,58 +0,0 @@ -using TimeZones: TZData - -# Note: These tests are only meant to be run in a CI environment as they will modify the -# built time zones in the `compiled_dir()`. This could interfere with concurrently running -# Julia sessions or just leave the end-users system in a inconsistent state. - -@testset "build process" begin - working_dir = _scratch_dir() - - # Clean out deps directories for a clean re-build - TZData.cleanup(TZDATA_VERSION, working_dir) - - tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(TZDATA_VERSION)) - compiled_dir = joinpath(working_dir, _compiled_relative_dir(TZDATA_VERSION)) - - @test !isdir(compiled_dir) - @test !isdir(tz_source_dir) - - # TODO: Comment incorrect - # Using a version we already have avoids triggering a download - TZData.build(TZDATA_VERSION, working_dir) - - @test isdir(compiled_dir) - @test length(readdir(compiled_dir)) > 0 - @test readdir(tz_source_dir) == sort(TZData.REGIONS) - - # Compile tz source files with an extended max_year. An example from the FAQ. - warsaw = TimeZone("Europe/Warsaw") - - @test last(warsaw.transitions).utc_datetime == DateTime(2037, 10, 25, 1) - @test warsaw.cutoff == DateTime(2038, 3, 28, 1) - @test_throws TimeZones.UnhandledTimeError ZonedDateTime(DateTime(2039), warsaw) - - # Note: Using `TZData.compile(max_year=2200)` will end up updating the compiled data for - # `tzdata_version()` instead of what we last built using `TZDATA_VERSION`. - TZData.compile(tz_source_dir, compiled_dir, max_year=2200) - - # TODO: In the future the `TZData.compile` function won't reload the cache. We'll need - # revise the above line to be something like: - # tz_source = TZData.TZSource(joinpath.(tz_source_dir, ["europe", "africa"])) - # TZData.compile(tz_source, compiled_dir, max_year=2200) - # TimeZones._reload_cache(compiled_dir) - - new_warsaw = TimeZone("Europe/Warsaw") - - @test warsaw !== new_warsaw - @test last(new_warsaw.transitions).utc_datetime == DateTime(2200, 10, 26, 1) - @test new_warsaw.cutoff == DateTime(2201, 3, 29, 1) - @test year(ZonedDateTime(2100, new_warsaw)) == 2100 # Test this doesn't throw an exception - - @test_throws TimeZones.UnhandledTimeError ZonedDateTime(2100, warsaw) - - # Using the tz string macro which runs at parse time means that the resulting TimeZone - # will not reflect changes made from compile or new builds during runtime. - @test tz"Africa/Windhoek" != TimeZone("Africa/Windhoek") - @test tz"Africa/Windhoek".cutoff != DateTime(2201, 4, 5) - @test TimeZone("Africa/Windhoek").cutoff == DateTime(2201, 4, 5) -end diff --git a/test/runtests.jl b/test/runtests.jl index d95d6522..277506e1 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -45,6 +45,7 @@ include("helpers.jl") include(joinpath("tzdata", "version.jl")) include(joinpath("tzdata", "download.jl")) include(joinpath("tzdata", "compile.jl")) + include(joinpath("tzdata", "build.jl")) Sys.iswindows() && include(joinpath("winzone", "WindowsTimeZoneIDs.jl")) include("utcoffset.jl") include(joinpath("types", "timezone.jl")) @@ -70,10 +71,4 @@ include("helpers.jl") include("rounding.jl") include("parse.jl") include("plotting.jl") - - # Note: Run the build tests last to ensure that re-compiling the time zones files - # doesn't interfere with other tests. - if lowercase(get(ENV, "CI", "false")) == "true" - include("ci.jl") - end end diff --git a/test/tzdata/build.jl b/test/tzdata/build.jl new file mode 100644 index 00000000..96ffafe1 --- /dev/null +++ b/test/tzdata/build.jl @@ -0,0 +1,55 @@ +using TimeZones: TZData + +@testset "build" begin + # Utilize a temporary directory for the `compiled_dir` (relative to `working_dir`) as + # these tests will modify compiled time zones information. Modifying the default + # `compiled_dir` could interfere with concurrently running Julia sessions or leave the + # user's system in a inconsistent state. + try + mktempdir() do working_dir + # Clean out deps directories for a clean re-build + TZData.cleanup(TZDATA_VERSION, working_dir) + compiled_dir = TZData.build(TZDATA_VERSION, working_dir) + + tz_source_dir = joinpath(working_dir, _tz_source_relative_dir(TZDATA_VERSION)) + + @test isdir(compiled_dir) + @test length(readdir(compiled_dir)) > 0 + @test readdir(tz_source_dir) == sort(TZData.REGIONS) + + # Compile tz source files with an extended max_year. An example from the FAQ. + warsaw = TimeZone("Europe/Warsaw") + + @test last(warsaw.transitions).utc_datetime == DateTime(2037, 10, 25, 1) + @test warsaw.cutoff == DateTime(2038, 3, 28, 1) + @test_throws TimeZones.UnhandledTimeError ZonedDateTime(DateTime(2039), warsaw) + + # Note: Using `TZData.compile(max_year=2200)` will end up updating the compiled data for + # `tzdata_version()` instead of what we last built using `TZDATA_VERSION`. + TZData.compile(tz_source_dir, compiled_dir, max_year=2200) + + # TODO: In the future the `TZData.compile` function won't reload the cache. We'll need + # revise the above line to be something like: + # tz_source = TZData.TZSource(joinpath.(tz_source_dir, ["europe", "africa"])) + # TZData.compile(tz_source, compiled_dir, max_year=2200) + # TimeZones._reload_cache(compiled_dir) + + new_warsaw = TimeZone("Europe/Warsaw") + + @test warsaw !== new_warsaw + @test last(new_warsaw.transitions).utc_datetime == DateTime(2200, 10, 26, 1) + @test new_warsaw.cutoff == DateTime(2201, 3, 29, 1) + @test year(ZonedDateTime(2100, new_warsaw)) == 2100 # Test this doesn't throw an exception + + @test_throws TimeZones.UnhandledTimeError ZonedDateTime(2100, warsaw) + + # Using the tz string macro which runs at parse time means that the resulting TimeZone + # will not reflect changes made from compile or new builds during runtime. + @test tz"Africa/Windhoek" != TimeZone("Africa/Windhoek") + @test tz"Africa/Windhoek".cutoff != DateTime(2201, 4, 5) + @test TimeZone("Africa/Windhoek").cutoff == DateTime(2201, 4, 5) + end + finally + TimeZones._reload_cache(TimeZones._COMPILED_DIR[]) + end +end From efc611ef411745451382eac028eda441cc35ec83 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Wed, 9 Aug 2023 21:59:05 -0500 Subject: [PATCH 20/29] fixup! Refactor build function --- src/tzdata/deprecated.jl | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/tzdata/deprecated.jl b/src/tzdata/deprecated.jl index 8d6425a3..d45557a2 100644 --- a/src/tzdata/deprecated.jl +++ b/src/tzdata/deprecated.jl @@ -8,7 +8,8 @@ function build( ) Base.depwarn( "`$build(version, regions, tz_source_dir, compiled_dir)` is deprecated with no " * - "direct replacement, see `$build(version, working_dir)` as an alternative." + "direct replacement, see `$build(version, working_dir)` as an alternative.", + :build, ) url = tzdata_url(version) @@ -54,7 +55,8 @@ function build() version end ``` - instead.""" + instead.""", + :build ) version = tzdata_version() @@ -73,7 +75,8 @@ function build(version::AbstractString; returned::Symbol=:version) version end ``` - instead.""" + instead.""", + :build, ) elseif returned === :namedtuple Base.depwarn( @@ -85,7 +88,8 @@ function build(version::AbstractString; returned::Symbol=:version) (; version, tz_source_dir, compiled_dir) end ``` - instead.""" + instead.""", + :build ) else throw(ArgumentError("Unhandled return option: $returned")) From 213418e3e962bbba08cad8503216039123ae424a Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Wed, 9 Aug 2023 23:32:01 -0500 Subject: [PATCH 21/29] Use p7zip_jll for unpacking Julia 1.9.2 on Windows was failing to find 7z under `joinpath(Sys.BINDIR, Base.LIBEXECDIR, "7z.exe")`. As Pkg.jl uses the p7zip_jll using this JLL seemed like the best option. I considered using the Tar_jll instead but that JLL isn't supported on Windows. --- Project.toml | 1 + src/tzdata/TZData.jl | 1 + src/tzdata/archive.jl | 97 +++++++++++++++++----------------------- src/tzdata/build.jl | 3 +- src/tzdata/deprecated.jl | 3 +- 5 files changed, 48 insertions(+), 57 deletions(-) diff --git a/Project.toml b/Project.toml index f22d0219..96d26008 100644 --- a/Project.toml +++ b/Project.toml @@ -14,6 +14,7 @@ RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" Scratch = "6c6a2e73-6563-6170-7368-637461726353" TZJData = "dc5dba14-91b3-4cab-a142-028a31da12f7" Unicode = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +p7zip_jll = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" [compat] InlineStrings = "1" diff --git a/src/tzdata/TZData.jl b/src/tzdata/TZData.jl index 293e33a9..46b0453b 100644 --- a/src/tzdata/TZData.jl +++ b/src/tzdata/TZData.jl @@ -4,6 +4,7 @@ using Artifacts: @artifact_str using Dates: Dates, DateTime using Printf using ...TimeZones: TZJFile, _scratch_dir +using p7zip_jll: p7zip_jll # Note: The tz database is made up of two parts: code and data. TimeZones.jl only requires # the "tzdata" archive or more specifically the "tz source" files within the archive diff --git a/src/tzdata/archive.jl b/src/tzdata/archive.jl index f4fb5517..44c6323b 100644 --- a/src/tzdata/archive.jl +++ b/src/tzdata/archive.jl @@ -1,30 +1,44 @@ -const exe7z = if Sys.iswindows() - if isdefined(Base, :LIBEXECDIR) - joinpath(Sys.BINDIR, Base.LIBEXECDIR, "7z.exe") - else - joinpath(Sys.BINDIR, "7z.exe") +const EXE7Z_LOCK = ReentrantLock() +const EXE7Z = Ref{String}() + +function exe7z() + # If the JLL is available, use the wrapper function defined in there + if p7zip_jll.is_available() + return p7zip_jll.p7zip() + end + + lock(EXE7Z_LOCK) do + if !isassigned(EXE7Z) + EXE7Z[] = find7z() + end + return Cmd([EXE7Z[]]) end end +function find7z() + pathsep = @static Sys.iswindows() ? ';' : ':' + path = join((joinpath(Sys.BINDIR, Base.LIBEXECDIR), Sys.BINDIR, ENV["PATH"]), pathsep) + bin = withenv("PATH" => path) do + Sys.which("7z") # Automatically tries ".exe" extension + end + bin !== nothing && return bin + error("7z binary not found") +end + """ unpack(archive, directory, [files]; [verbose=false]) -> Nothing -Unpacks files from a compressed tar `archive` to the specified `directory`. If `files` is -specified only the files given will be extracted. The `verbose` flag can be used to display -additional information to STDOUT. +Unpacks files from a compressed tarball `archive` to the specified `directory`. If +specified, only the `files` listed will be extracted. When `verbose` is set additional +details will be sent to `stdout`. """ function unpack(archive, directory, files=String[]; verbose::Bool=false) - @static if Sys.iswindows() - cmd = pipeline(`$exe7z x $archive -y -so`, `$exe7z x -si -y -ttar -o$directory $files`) - else - cmd = `tar xvf $archive --directory=$directory $files` - end - - if !verbose - cmd = pipeline(cmd, stdout=devnull, stderr=devnull) - end - - run(cmd) + show_output = verbose ? `-bso1` : `-bso0` + run(pipeline( + `$(exe7z()) x $archive -y -so`, + `$(exe7z()) x -y -si -ttar -ba -bd -bb1 $show_output -o$directory $files`, + )) + return nothing end """ @@ -32,47 +46,20 @@ end Determines if the given `path` is an archive. """ -function isarchive(path) - @static if Sys.iswindows() - success(`$exe7z t $path -y`) - else - success(`tar tf $path`) - end +function isarchive(path::AbstractString) + return success(`$(exe7z()) t $path -y`) end """ - list(archive) -> Vector{AbstractString} + list(archive::AbstractString) -> Vector{String} Returns the file names contained in the `archive`. """ -function list(archive) - @static if Sys.iswindows() - files = AbstractString[] - header = "-" ^ 24 - content = false - - cmd = pipeline(`$exe7z x $archive -y -so`, `$exe7z l -si -y -ttar`) - output = readchomp(pipeline(cmd, stderr=devnull)) - for line in split(output, "\r\n") - # Extract the file name from the last column in the 7-zip output table. - # Note: We can just write `line[54:end]` on Julia 0.5 and up (JuliaLang/julia#15624) - len = length(line) - file = len >= 54 ? line[54:len] : "" - - if file == header - if !content - content = true - else - break - end - elseif content - push!(files, file) - end - end - - return files - else - output = readchomp(pipeline(`tar tf $archive`, stderr=devnull)) - return split(output, '\n') +function list(archive::AbstractString) + cmd = pipeline(`$(exe7z()) x $archive -y -so`, `$(exe7z()) l -y -si -ttar -ba`) + files = map(eachline(cmd)) do line + # Extract the file name from the last column in the 7-zip output table. + line[54:end] end + return files end diff --git a/src/tzdata/build.jl b/src/tzdata/build.jl index 9fa5d55b..cfe3a94b 100644 --- a/src/tzdata/build.jl +++ b/src/tzdata/build.jl @@ -38,11 +38,12 @@ function build(version::AbstractString, working_dir::AbstractString) if !isdir(tz_source_dir) @info "Decompressing tzdata $version region data" + isarchive(tzdata_archive_file) || error("Invalid archive: $tzdata_archive_file") mkpath(tz_source_dir) # TODO: Confirm that "utc" was ever included in the tzdata archives regions = intersect!(list(tzdata_archive_file), REGIONS) - unpack(tzdata_archive_file, tz_source_dir, regions; verbose=true) + unpack(tzdata_archive_file, tz_source_dir, regions) for custom_region in CUSTOM_REGIONS cp(joinpath(CUSTOM_REGION_DIR, custom_region), joinpath(tz_source_dir, custom_region)) diff --git a/src/tzdata/deprecated.jl b/src/tzdata/deprecated.jl index d45557a2..a4a0e141 100644 --- a/src/tzdata/deprecated.jl +++ b/src/tzdata/deprecated.jl @@ -22,11 +22,12 @@ function build( if !isdir(source_dir) @info "Decompressing tzdata $version region data" + isarchive(tzdata_archive_file) || error("Invalid archive: $tzdata_archive_file") mkpath(source_dir) # TODO: Confirm that "utc" was ever included in the tzdata archives build_regions = intersect!(list(tzdata_archive_file), regions) - unpack(tzdata_archive_file, source_dir, build_regions; verbose=true) + unpack(tzdata_archive_file, source_dir, build_regions) for custom_region in CUSTOM_REGIONS cp(joinpath(CUSTOM_REGION_DIR, custom_region), joinpath(source_dir, custom_region)) From 48dd160aa4e764e9b1180b8d27b5934dbc24120b Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Fri, 11 Aug 2023 23:21:36 -0500 Subject: [PATCH 22/29] Drop DEFAULT_TZDATA_VERSION --- .github/workflows/CI.yml | 24 ++++++------------------ src/build.jl | 8 +++----- src/deprecated.jl | 2 ++ src/tzdata/TZData.jl | 1 + src/tzdata/version.jl | 9 +-------- test/runtests.jl | 1 + test/tzdata/version.jl | 2 +- 7 files changed, 15 insertions(+), 32 deletions(-) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index b1464b53..432274bd 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -13,6 +13,12 @@ on: concurrency: group: ${{ github.workflow }}-${{ github.ref }}-${{ github.ref != 'refs/heads/master' || github.run_number }} cancel-in-progress: ${{ github.ref != 'refs/heads/master' }} + +# Only download the tzdata version used in TimeZones.jl's tests to avoid unnecessary +# load on IANA's servers. +env: + JULIA_TZ_VERSION: 2016j # Matches tzdata version used in tests + jobs: test: name: Julia ${{ matrix.version }} - ${{ matrix.os }} - ${{ matrix.arch }} @@ -45,22 +51,6 @@ jobs: version: ${{ matrix.version }} arch: ${{ matrix.arch }} - uses: julia-actions/cache@v1 - # Only download the tzdata version used in TimeZones.jl's tests to avoid unnecessary - # load on IANA's servers. However, if the DEFAULT_TZDATA_VERSION constant was - # changed we need to also build the version specified by the constant to ensure it can be - # compiled. - # Note: The `git diff` command has a `--quiet` flag that will suppress output but doesn't - # catch all changes. - # - # https://docs.github.com/en/free-pro-team@latest/actions/reference/workflow-commands-for-github-actions#setting-an-environment-variable - - run: | - git fetch origin +:refs/remotes/origin/HEAD - if git diff --exit-code -G"^const DEFAULT_TZDATA_VERSION" origin/HEAD..HEAD > /dev/null; then - echo "JULIA_TZ_VERSION=$TZDATA_VERSION" >> $GITHUB_ENV - fi - shell: bash - env: - TZDATA_VERSION: 2016j # Matches tzdata version used in tests - uses: julia-actions/julia-buildpkg@latest - uses: julia-actions/julia-runtest@latest - uses: julia-actions/julia-processcoverage@v1 @@ -83,8 +73,6 @@ jobs: git fetch origin +:refs/remotes/origin/HEAD julia --project=benchmark/ -e 'using Pkg; Pkg.instantiate(); Pkg.develop(PackageSpec(path=pwd()))' julia --project=benchmark/ -e 'using PkgBenchmark, TimeZones; export_markdown(stdout, judge(TimeZones, "origin/HEAD", verbose=false))' - env: - TZDATA_VERSION: 2016j # Matches tzdata version used in tests doctest: name: Documentation - DocTests diff --git a/src/build.jl b/src/build.jl index 84481a59..5c0df80f 100644 --- a/src/build.jl +++ b/src/build.jl @@ -1,16 +1,14 @@ -using TimeZones.TZData: DEFAULT_TZDATA_VERSION, tzdata_version - """ - build(version="$DEFAULT_TZDATA_VERSION"; force=false) -> Nothing + build(version::AbstractString; force::Bool=false) -> Nothing Builds the TimeZones package with the specified tzdata `version` and `regions`. The `version` is typically a 4-digit year followed by a lowercase ASCII letter -(e.g. "$DEFAULT_TZDATA_VERSION"). The `force` flag is used to re-download tzdata archives. +(e.g. "$(TZJData.TZDATA_VERSION)"). The `force` flag is used to re-download tzdata archives. !!! warning This function is *not* thread-safe and meant primarily for experimentation. """ -function build(version::AbstractString=tzdata_version(); force::Bool=false) +function build(version::AbstractString; force::Bool=false) compiled_dir = TimeZones.TZData.build(version, _scratch_dir()) if Sys.iswindows() diff --git a/src/deprecated.jl b/src/deprecated.jl index 3817dcb4..be138338 100644 --- a/src/deprecated.jl +++ b/src/deprecated.jl @@ -11,4 +11,6 @@ const TransitionTimeInfo = TZFile.TransitionTimeInfo @deprecate abbreviation TZFile.get_designation false @deprecate read_tzfile(io::IO, name::AbstractString) TZFile.read(io)(name) false +@deprecate build(; force=false) build(TZJData.TZDATA_VERSION; force) + # END TimeZones 1.0 deprecations diff --git a/src/tzdata/TZData.jl b/src/tzdata/TZData.jl index 46b0453b..02737544 100644 --- a/src/tzdata/TZData.jl +++ b/src/tzdata/TZData.jl @@ -4,6 +4,7 @@ using Artifacts: @artifact_str using Dates: Dates, DateTime using Printf using ...TimeZones: TZJFile, _scratch_dir +using TZJData: TZJData using p7zip_jll: p7zip_jll # Note: The tz database is made up of two parts: code and data. TimeZones.jl only requires diff --git a/src/tzdata/version.jl b/src/tzdata/version.jl index 9505821a..849cbaab 100644 --- a/src/tzdata/version.jl +++ b/src/tzdata/version.jl @@ -1,10 +1,3 @@ -# Default tzdata version to use if the environmental variable "JULIA_TZ_VERSION" is not set. -# We want to use a specific version here to ensure that specific revisions of the -# TimeZones.jl package always use the same revision of tzdata. Doing so ensure that we can -# always use older revisions of this package and always reproduce the same results. -const DEFAULT_TZDATA_VERSION = "2023c" # Do not use floating revision "latest" here - - # Note: A tz code or data version consists of a year and letter while a release consists of # a pair of tz code and data versions. In recent releases the tz code and data use the same # version. @@ -95,6 +88,6 @@ function tzdata_version_archive(archive::AbstractString) end function tzdata_version() - version = get(ENV, "JULIA_TZ_VERSION", DEFAULT_TZDATA_VERSION) + version = get(ENV, "JULIA_TZ_VERSION", TZJData.TZDATA_VERSION) return version == "latest" ? tzdata_latest_version() : version end diff --git a/test/runtests.jl b/test/runtests.jl index 277506e1..9773f836 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -8,6 +8,7 @@ using TimeZones using TimeZones: _scratch_dir using TimeZones.TZData: TZSource, compile, build, tzdata_url, unpack, _tz_source_relative_dir, _archive_relative_dir, _compiled_relative_dir +using TZJData: TZJData using Unicode Mocking.activate() diff --git a/test/tzdata/version.jl b/test/tzdata/version.jl index d7d83e27..64198a88 100644 --- a/test/tzdata/version.jl +++ b/test/tzdata/version.jl @@ -58,7 +58,7 @@ end withenv("JULIA_TZ_VERSION" => nothing) do version = tzdata_version() @test version != "latest" - @test version == TimeZones.TZData.DEFAULT_TZDATA_VERSION + @test version == TZJData.TZDATA_VERSION end withenv("JULIA_TZ_VERSION" => TZDATA_VERSION) do From bcee05d3959ce8a43dcc010329674f58b5d56f4b Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Fri, 11 Aug 2023 22:52:05 -0500 Subject: [PATCH 23/29] Drop TZData.ARTIFACT_TOML --- src/tzdata/TZData.jl | 2 -- test/artifacts.jl | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tzdata/TZData.jl b/src/tzdata/TZData.jl index 02737544..b2ef1d7d 100644 --- a/src/tzdata/TZData.jl +++ b/src/tzdata/TZData.jl @@ -11,8 +11,6 @@ using p7zip_jll: p7zip_jll # the "tzdata" archive or more specifically the "tz source" files within the archive # (africa, australasia, ...) -const ARTIFACT_TOML = joinpath(@__DIR__, "..", "..", "Artifacts.toml") - const _LATEST_FILE_PATH = Ref{String}() const _LATEST = Ref{Tuple{AbstractString, DateTime}}() diff --git a/test/artifacts.jl b/test/artifacts.jl index 78283dfc..33e09be1 100644 --- a/test/artifacts.jl +++ b/test/artifacts.jl @@ -7,7 +7,7 @@ for platform in platforms dict = select_downloadable_artifacts( - TimeZones.TZData.ARTIFACT_TOML; + joinpath(@__DIR__, "..", "Artifacts.toml"); platform, include_lazy=true, ) From 32a07e8a41b5ab0e353c0b5a81fe6625d00e3dd2 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Fri, 11 Aug 2023 23:21:26 -0500 Subject: [PATCH 24/29] Update docs/Manifest.toml --- docs/Manifest.toml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/Manifest.toml b/docs/Manifest.toml index 88a4253b..9738f5ac 100644 --- a/docs/Manifest.toml +++ b/docs/Manifest.toml @@ -202,7 +202,7 @@ deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [[deps.TimeZones]] -deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "RecipesBase", "Scratch", "TZJData", "Unicode"] +deps = ["Artifacts", "Dates", "Downloads", "InlineStrings", "Mocking", "Printf", "RecipesBase", "Scratch", "TZJData", "Unicode", "p7zip_jll"] path = ".." uuid = "f269a46b-ccf7-5d73-abea-4c690281aa53" version = "1.11.0" @@ -223,3 +223,8 @@ version = "1.2.13+0" deps = ["Artifacts", "Libdl"] uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" version = "1.48.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+0" From a205237e44c34df224e435a2cee871ad605d79f6 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Fri, 11 Aug 2023 22:56:13 -0500 Subject: [PATCH 25/29] Add LazyArtifacts to benchmark/Project.toml Avoids failure to compare against previous version. Can be removed once the current version is released. --- benchmark/Project.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/benchmark/Project.toml b/benchmark/Project.toml index 6826bc7f..1869f724 100644 --- a/benchmark/Project.toml +++ b/benchmark/Project.toml @@ -1,6 +1,7 @@ [deps] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" +LazyArtifacts = "4af54fe1-eca0-43a8-85a7-787d91b784e3" PkgBenchmark = "32113eaa-f34f-5b0d-bd6c-c81e245fc73d" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TimeZones = "f269a46b-ccf7-5d73-abea-4c690281aa53" From 0b4d44d17202651359605f475ddc49e697a6d357 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Fri, 11 Aug 2023 23:42:48 -0500 Subject: [PATCH 26/29] Create `_reload_cache!` --- src/types/timezone.jl | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/types/timezone.jl b/src/types/timezone.jl index ee1154ec..ce2655ad 100644 --- a/src/types/timezone.jl +++ b/src/types/timezone.jl @@ -2,8 +2,14 @@ # to this structure can result in inconsistent behaviour. const _TZ_CACHE = Dict{String,Tuple{TimeZone,Class}}() -function _reload_cache(compiled_dir) - empty!(_TZ_CACHE) +function _reload_cache(compiled_dir::AbstractString) + _reload_cache!(_TZ_CACHE, compiled_dir) + !isempty(_TZ_CACHE) || error("Cache remains empty after loading") + return nothing +end + +function _reload_cache!(cache::AbstractDict, compiled_dir::AbstractString) + empty!(cache) check = Tuple{String,String}[(compiled_dir, "")] for (dir, partial) in check @@ -16,14 +22,12 @@ function _reload_cache(compiled_dir) if isdir(path) push!(check, (path, name)) else - _TZ_CACHE[name] = open(TZJFile.read, path, "r")(name) + cache[name] = open(TZJFile.read, path, "r")(name) end end end - !isempty(_TZ_CACHE) || error("Cache remains empty after loading") - - return nothing + return cache end """ From aba714a6bf65db2ce8dde36d66a3ddf5f97bf5eb Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Fri, 11 Aug 2023 23:53:23 -0500 Subject: [PATCH 27/29] Keep unused dependency on LazyArtifacts Works around issue with PkgBenchmarks --- Project.toml | 1 + benchmark/Project.toml | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Project.toml b/Project.toml index 96d26008..6fa349dc 100644 --- a/Project.toml +++ b/Project.toml @@ -8,6 +8,7 @@ Artifacts = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" Downloads = "f43a241f-c20a-4ad4-852c-f6b1247861c6" InlineStrings = "842dd82b-1e85-43dc-bf29-5d0ee9dffc48" +LazyArtifacts = "4af54fe1-eca0-43a8-85a7-787d91b784e3" Mocking = "78c3b35d-d492-501b-9361-3d52fe80e533" Printf = "de0858da-6303-5e67-8744-51eddeeeb8d7" RecipesBase = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" diff --git a/benchmark/Project.toml b/benchmark/Project.toml index 1869f724..6826bc7f 100644 --- a/benchmark/Project.toml +++ b/benchmark/Project.toml @@ -1,7 +1,6 @@ [deps] BenchmarkTools = "6e4b80f9-dd63-53aa-95a3-0cdb28fa8baf" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" -LazyArtifacts = "4af54fe1-eca0-43a8-85a7-787d91b784e3" PkgBenchmark = "32113eaa-f34f-5b0d-bd6c-c81e245fc73d" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" TimeZones = "f269a46b-ccf7-5d73-abea-4c690281aa53" From e08c65a5e858586d2914c1fa17d1a9e56bdef154 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Fri, 11 Aug 2023 23:57:11 -0500 Subject: [PATCH 28/29] Remove empty _COMPILED_DIR check --- src/types/timezone.jl | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/types/timezone.jl b/src/types/timezone.jl index ce2655ad..b6f9cba8 100644 --- a/src/types/timezone.jl +++ b/src/types/timezone.jl @@ -74,12 +74,6 @@ function TimeZone(str::AbstractString, mask::Class=Class(:DEFAULT)) tz, class = get(_TZ_CACHE, str) do if occursin(FIXED_TIME_ZONE_REGEX, str) FixedTimeZone(str), Class(:FIXED) - elseif !isdir(_COMPILED_DIR[]) || isempty(readdir(_COMPILED_DIR[])) - # Note: Julia 1.0 supresses the build logs which can hide issues in time zone - # compliation which result in no tzdata time zones being available. - throw(ArgumentError( - "Unable to find time zone \"$str\". Try running `TimeZones.build()`." - )) else throw(ArgumentError("Unknown time zone \"$str\"")) end From ff5b8ab9e6eb826f9291a7a6a47561eea7003472 Mon Sep 17 00:00:00 2001 From: Curtis Vogt Date: Mon, 21 Aug 2023 22:59:41 -0500 Subject: [PATCH 29/29] Add compat for TZJData and p7zip_jll --- Project.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Project.toml b/Project.toml index 6fa349dc..f4a7ddde 100644 --- a/Project.toml +++ b/Project.toml @@ -22,7 +22,9 @@ InlineStrings = "1" Mocking = "0.7" RecipesBase = "0.7, 0.8, 1" Scratch = "1.1.1" +TZJData = "1" julia = "1.6" +p7zip_jll = "17.4" [extras] Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"