@@ -23,8 +23,6 @@ defmodule Hexdocs.Bucket do
2323 meta: [ { "surrogate-key" , key } ]
2424 ]
2525
26- Logger . info ( "Uploading docs_public_bucket #{ path } " )
27-
2826 case Hexdocs.Store . put ( :docs_public_bucket , path , content , opts ) do
2927 { :ok , 200 , _headers , _body } ->
3028 :ok
@@ -39,10 +37,10 @@ defmodule Hexdocs.Bucket do
3937 purge ( [ key ] )
4038 end
4139
42- def upload ( repository , package , version , all_versions , files ) do
40+ def upload ( repository , package , version , all_versions , dir , files ) do
4341 latest_version? = Hexdocs.Utils . latest_version? ( package , version , all_versions )
4442 upload_type = upload_type ( latest_version? )
45- upload_files = list_upload_files ( repository , package , version , files , upload_type )
43+ upload_files = list_upload_files ( repository , package , version , dir , files , upload_type )
4644 paths = MapSet . new ( upload_files , & elem ( & 1 , 0 ) )
4745
4846 upload_new_files ( upload_files )
@@ -53,7 +51,7 @@ defmodule Hexdocs.Bucket do
5351 { :docs_config , repository , package } ,
5452 @ gcs_put_debounce ,
5553 fn ->
56- docs_config = build_docs_config ( repository , package , version , all_versions , files )
54+ docs_config = build_docs_config ( repository , package , version , all_versions , dir , files )
5755 upload_new_files ( [ docs_config ] )
5856 end
5957 )
@@ -63,17 +61,24 @@ defmodule Hexdocs.Bucket do
6361 end
6462
6563 # For Elixir and Hex we use the docs_config.js included in the tarball
66- defp build_docs_config ( repository , package , _version , _all_versions , files )
64+ defp build_docs_config ( repository , package , _version , _all_versions , dir , files )
6765 when package in @ special_package_names do
6866 path = "docs_config.js"
6967 unversioned_path = repository_path ( repository , Path . join ( [ package , path ] ) )
7068 cdn_key = docs_config_cdn_key ( repository , package )
71- { "docs_config.js" , data } = List . keyfind ( files , "docs_config.js" , 0 )
69+
70+ data =
71+ if "docs_config.js" in files do
72+ File . read! ( Path . join ( dir , "docs_config.js" ) )
73+ else
74+ ""
75+ end
76+
7277 { unversioned_path , cdn_key , data , public? ( repository ) }
7378 end
7479
7580 # TODO: don't include retired versions?
76- defp build_docs_config ( repository , package , version , all_versions , _files ) do
81+ defp build_docs_config ( repository , package , version , all_versions , _dir , _files ) do
7782 versions =
7883 if version in all_versions do
7984 all_versions
@@ -135,22 +140,32 @@ defmodule Hexdocs.Bucket do
135140 cond do
136141 deleting_latest_version? && new_latest_version ->
137142 key = build_key ( repository , package , new_latest_version )
138- body = Hexdocs.Store . get ( :repo_bucket , key )
139-
140- case Hexdocs.Tar . unpack ( body , repository: repository , package: package , version: version ) do
141- { :ok , files } ->
142- upload_files =
143- list_upload_files ( repository , package , new_latest_version , files , :both )
144-
145- paths = MapSet . new ( upload_files , & elem ( & 1 , 0 ) )
146- update_versions = [ version , new_latest_version ]
147-
148- upload_new_files ( upload_files )
149- delete_old_docs ( repository , package , update_versions , paths , :both )
150- purge_hexdocs_cache ( repository , package , update_versions , :both )
151-
152- { :error , reason } ->
153- Logger . error ( "Failed unpack #{ repository } /#{ package } #{ version } : #{ reason } " )
143+ tarball_path = Hexdocs.TmpDir . tmp_file ( "docs-tarball" )
144+
145+ case Hexdocs.Store . get_to_file ( :repo_bucket , key , tarball_path ) do
146+ :ok ->
147+ case Hexdocs.Tar . unpack_to_dir ( { :file , tarball_path } ,
148+ repository: repository ,
149+ package: package ,
150+ version: version
151+ ) do
152+ { :ok , dir , files } ->
153+ upload_files =
154+ list_upload_files ( repository , package , new_latest_version , dir , files , :both )
155+
156+ paths = MapSet . new ( upload_files , & elem ( & 1 , 0 ) )
157+ update_versions = [ version , new_latest_version ]
158+
159+ upload_new_files ( upload_files )
160+ delete_old_docs ( repository , package , update_versions , paths , :both )
161+ purge_hexdocs_cache ( repository , package , update_versions , :both )
162+
163+ { :error , reason } ->
164+ Logger . error ( "Failed unpack #{ repository } /#{ package } #{ version } : #{ reason } " )
165+ end
166+
167+ nil ->
168+ Logger . error ( "Failed to get tarball #{ repository } /#{ package } #{ new_latest_version } " )
154169 end
155170
156171 deleting_latest_version? ->
@@ -171,21 +186,23 @@ defmodule Hexdocs.Bucket do
171186 Path . join ( [ "repos" , repository , "docs" , "#{ package } -#{ version } .tar.gz" ] )
172187 end
173188
174- defp list_upload_files ( repository , package , version , files , upload_type ) do
189+ defp list_upload_files ( repository , package , version , dir , files , upload_type ) do
175190 Enum . flat_map ( files , fn
176- { "docs_config.js" , _data } ->
191+ "docs_config.js" ->
177192 [ ]
178193
179- { path , data } ->
194+ path ->
195+ source = Path . join ( dir , path )
196+
180197 versioned_path =
181198 repository_path ( repository , Path . join ( [ package , to_string ( version ) , path ] ) )
182199
183200 cdn_key = docspage_versioned_cdn_key ( repository , package , version )
184- versioned = { versioned_path , cdn_key , data , public? ( repository ) }
201+ versioned = { versioned_path , cdn_key , { :file , source } , public? ( repository ) }
185202
186203 unversioned_path = repository_path ( repository , Path . join ( [ package , path ] ) )
187204 cdn_key = docspage_unversioned_cdn_key ( repository , package )
188- unversioned = { unversioned_path , cdn_key , data , public? ( repository ) }
205+ unversioned = { unversioned_path , cdn_key , { :file , source } , public? ( repository ) }
189206
190207 case upload_type do
191208 :both -> [ versioned , unversioned ]
@@ -210,8 +227,12 @@ defmodule Hexdocs.Bucket do
210227 { bucket ( public? ) , store_key , data , opts }
211228 end )
212229 |> Task . async_stream (
213- fn { bucket , key , data , opts } ->
214- put ( bucket , key , data , opts )
230+ fn
231+ { bucket , key , { :file , source } , opts } ->
232+ put_file ( bucket , key , source , opts )
233+
234+ { bucket , key , data , opts } ->
235+ put ( bucket , key , data , opts )
215236 end ,
216237 max_concurrency: 10 ,
217238 timeout: 60_000
@@ -239,10 +260,6 @@ defmodule Hexdocs.Bucket do
239260 & delete_key? ( & 1 , paths , repository , package , versions , upload_type )
240261 )
241262
242- Enum . each ( keys_to_delete , fn key ->
243- Logger . info ( "Deleting #{ bucket } #{ key } " )
244- end )
245-
246263 Hexdocs.Store . delete_many ( bucket , keys_to_delete )
247264 end
248265
@@ -332,7 +349,10 @@ defmodule Hexdocs.Bucket do
332349 end
333350
334351 defp put ( bucket , key , data , opts ) do
335- Logger . info ( "Uploading #{ bucket } #{ key } " )
336352 Hexdocs.Store . put! ( bucket , key , data , opts )
337353 end
354+
355+ defp put_file ( bucket , key , source , opts ) do
356+ Hexdocs.Store . put_file! ( bucket , key , source , opts )
357+ end
338358end
0 commit comments