diff --git a/lib/hexdocs/bucket.ex b/lib/hexdocs/bucket.ex index 63b9d7b..03da4c9 100644 --- a/lib/hexdocs/bucket.ex +++ b/lib/hexdocs/bucket.ex @@ -37,7 +37,7 @@ defmodule Hexdocs.Bucket do purge([key]) end - def upload(repository, package, version, all_versions, dir, files) do + def upload(repository, package, version, all_versions, retired_versions, dir, files) do latest_version? = Hexdocs.Utils.latest_version?(package, version, all_versions) upload_type = upload_type(latest_version?) upload_files = list_upload_files(repository, package, version, dir, files, upload_type) @@ -51,7 +51,17 @@ defmodule Hexdocs.Bucket do {:docs_config, repository, package}, @gcs_put_debounce, fn -> - docs_config = build_docs_config(repository, package, version, all_versions, dir, files) + docs_config = + build_docs_config( + repository, + package, + version, + all_versions, + retired_versions, + dir, + files + ) + upload_new_files([docs_config]) end ) @@ -61,7 +71,15 @@ defmodule Hexdocs.Bucket do end # For Elixir and Hex we use the docs_config.js included in the tarball - defp build_docs_config(repository, package, _version, _all_versions, dir, files) + defp build_docs_config( + repository, + package, + _version, + _all_versions, + _retired_versions, + dir, + files + ) when package in @special_package_names do path = "docs_config.js" unversioned_path = repository_path(repository, Path.join([package, path])) @@ -77,8 +95,15 @@ defmodule Hexdocs.Bucket do {unversioned_path, cdn_key, data, public?(repository)} end - # TODO: don't include retired versions? - defp build_docs_config(repository, package, version, all_versions, _dir, _files) do + defp build_docs_config( + repository, + package, + version, + all_versions, + retired_versions, + _dir, + _files + ) do versions = if version in all_versions do all_versions @@ -95,11 +120,9 @@ defmodule Hexdocs.Bucket do url: Hexdocs.Utils.hexdocs_url(repository, "/#{package}/#{version}") } - if latest_version == version do - Map.put(map, :latest, true) - else - map - end + map = if latest_version == version, do: Map.put(map, :latest, true), else: map + map = if version in retired_versions, do: Map.put(map, :retired, true), else: map + map end search = diff --git a/lib/hexdocs/queue.ex b/lib/hexdocs/queue.ex index ac65d06..f9a101c 100644 --- a/lib/hexdocs/queue.ex +++ b/lib/hexdocs/queue.ex @@ -143,7 +143,7 @@ defmodule Hexdocs.Queue do end defp process_upload(key, repository, package, version, input, start) do - {version, all_versions} = + {version, all_versions, retired_versions} = if package in @special_package_names do version = case Version.parse(version) do @@ -156,11 +156,11 @@ defmodule Hexdocs.Queue do end all_versions = Hexdocs.SourceRepo.versions!(Map.fetch!(@special_packages, package)) - {version, all_versions} + {version, all_versions, MapSet.new()} else version = Version.parse!(version) - all_versions = all_versions(repository, package) - {version, all_versions} + {all_versions, retired_versions} = all_versions(repository, package) + {version, all_versions, retired_versions} end case Hexdocs.Tar.unpack_to_dir(input, @@ -176,6 +176,7 @@ defmodule Hexdocs.Queue do package, version, all_versions, + retired_versions, dir, files ) @@ -262,7 +263,7 @@ defmodule Hexdocs.Queue do }) version = Version.parse!(version) - all_versions = all_versions(repository, package) + {all_versions, _retired_versions} = all_versions(repository, package) Hexdocs.Bucket.delete(repository, package, version, all_versions) update_index_sitemap(repository, key) @@ -314,12 +315,21 @@ defmodule Hexdocs.Queue do defp all_versions(repository, package) do if package = Hexdocs.Hexpm.get_package(repository, package) do - package["releases"] - |> Enum.filter(& &1["has_docs"]) - |> Enum.map(&Version.parse!(&1["version"])) - |> Enum.sort(&(Version.compare(&1, &2) == :gt)) + releases = Enum.filter(package["releases"], & &1["has_docs"]) + + versions = + releases + |> Enum.map(&Version.parse!(&1["version"])) + |> Enum.sort(&(Version.compare(&1, &2) == :gt)) + + retired_versions = + releases + |> Enum.filter(& &1["retirement"]) + |> MapSet.new(&Version.parse!(&1["version"])) + + {versions, retired_versions} else - [] + {[], MapSet.new()} end end diff --git a/test/hexdocs/bucket_test.exs b/test/hexdocs/bucket_test.exs index 6f371f3..fb345e7 100644 --- a/test/hexdocs/bucket_test.exs +++ b/test/hexdocs/bucket_test.exs @@ -7,7 +7,7 @@ defmodule Hexdocs.BucketTest do test "upload", %{test: test} do version = Version.parse!("0.0.1") {dir, files} = create_files([{"index.html", "0.0.1"}]) - Bucket.upload("buckettest", "#{test}", version, [], dir, files) + Bucket.upload("buckettest", "#{test}", version, [], MapSet.new(), dir, files) assert Store.get(@bucket, "buckettest/#{test}/0.0.1/index.html") == "0.0.1" assert Store.get(@bucket, "buckettest/#{test}/index.html") == "0.0.1" @@ -19,8 +19,8 @@ defmodule Hexdocs.BucketTest do {dir1, files1} = create_files([{"index.html", "0.0.1"}]) {dir2, files2} = create_files([{"index.html", "0.0.2"}]) - Bucket.upload("buckettest", "#{test}", first, [], dir1, files1) - Bucket.upload("buckettest", "#{test}", second, [first], dir2, files2) + Bucket.upload("buckettest", "#{test}", first, [], MapSet.new(), dir1, files1) + Bucket.upload("buckettest", "#{test}", second, [first], MapSet.new(), dir2, files2) assert Store.get(@bucket, "buckettest/#{test}/0.0.1/index.html") == "0.0.1" assert Store.get(@bucket, "buckettest/#{test}/0.0.2/index.html") == "0.0.2" @@ -33,8 +33,8 @@ defmodule Hexdocs.BucketTest do {dir1, files1} = create_files([{"index.html", "0.0.2"}]) {dir2, files2} = create_files([{"index.html", "0.0.1"}]) - Bucket.upload("buckettest", "#{test}", second, [], dir1, files1) - Bucket.upload("buckettest", "#{test}", first, [second], dir2, files2) + Bucket.upload("buckettest", "#{test}", second, [], MapSet.new(), dir1, files1) + Bucket.upload("buckettest", "#{test}", first, [second], MapSet.new(), dir2, files2) assert Store.get(@bucket, "buckettest/#{test}/0.0.1/index.html") == "0.0.1" assert Store.get(@bucket, "buckettest/#{test}/0.0.2/index.html") == "0.0.2" @@ -45,10 +45,10 @@ defmodule Hexdocs.BucketTest do version = Version.parse!("0.0.1") {dir1, files1} = create_files([{"index.html", "0.0.1"}, {"remove.html", "remove"}]) - Bucket.upload("buckettest", "#{test}", version, [], dir1, files1) + Bucket.upload("buckettest", "#{test}", version, [], MapSet.new(), dir1, files1) {dir2, files2} = create_files([{"index.html", "updated"}]) - Bucket.upload("buckettest", "#{test}", version, [], dir2, files2) + Bucket.upload("buckettest", "#{test}", version, [], MapSet.new(), dir2, files2) assert Store.get(@bucket, "buckettest/#{test}/0.0.1/index.html") == "updated" assert Store.get(@bucket, "buckettest/#{test}/index.html") == "updated" @@ -62,10 +62,10 @@ defmodule Hexdocs.BucketTest do prefix_name = String.slice(test, -1000, String.length(test) - 1) {dir1, files1} = create_files([{"file2", ""}]) - Bucket.upload("buckettest", "#{test}", version, [], dir1, files1) + Bucket.upload("buckettest", "#{test}", version, [], MapSet.new(), dir1, files1) {dir2, files2} = create_files([{"file1", ""}]) - Bucket.upload("buckettest", "#{prefix_name}", version, [], dir2, files2) + Bucket.upload("buckettest", "#{prefix_name}", version, [], MapSet.new(), dir2, files2) assert Store.get(@bucket, "buckettest/#{prefix_name}/file1") assert Store.get(@bucket, "buckettest/#{prefix_name}/#{version}/file1") @@ -78,10 +78,10 @@ defmodule Hexdocs.BucketTest do second = Version.parse!("1.0.0-beta") {dir1, files1} = create_files([{"index.html", "0.5.0"}, {"dont_remove.html", "dont remove"}]) - Bucket.upload("buckettest", "#{test}", first, [], dir1, files1) + Bucket.upload("buckettest", "#{test}", first, [], MapSet.new(), dir1, files1) {dir2, files2} = create_files([{"index.html", "1.0.0-beta"}]) - Bucket.upload("buckettest", "#{test}", second, [first], dir2, files2) + Bucket.upload("buckettest", "#{test}", second, [first], MapSet.new(), dir2, files2) assert Store.get(@bucket, "buckettest/#{test}/0.5.0/index.html") == "0.5.0" assert Store.get(@bucket, "buckettest/#{test}/0.5.0/dont_remove.html") == "dont remove" @@ -98,9 +98,9 @@ defmodule Hexdocs.BucketTest do {dir1, files1} = create_files([{"index.html", "0.1.0"}]) {dir2, files2} = create_files([{"index.html", "1.0.0-beta"}]) {dir3, files3} = create_files([{"index.html", "0.2.0"}]) - Bucket.upload("buckettest", "#{test}", first, [], dir1, files1) - Bucket.upload("buckettest", "#{test}", second, [first], dir2, files2) - Bucket.upload("buckettest", "#{test}", third, [first, second], dir3, files3) + Bucket.upload("buckettest", "#{test}", first, [], MapSet.new(), dir1, files1) + Bucket.upload("buckettest", "#{test}", second, [first], MapSet.new(), dir2, files2) + Bucket.upload("buckettest", "#{test}", third, [first, second], MapSet.new(), dir3, files3) assert Store.get(@bucket, "buckettest/#{test}/0.1.0/index.html") == "0.1.0" assert Store.get(@bucket, "buckettest/#{test}/1.0.0-beta/index.html") == "1.0.0-beta" @@ -114,8 +114,8 @@ defmodule Hexdocs.BucketTest do {dir1, files1} = create_files([{"index.html", "1.0.0-beta"}]) {dir2, files2} = create_files([{"index.html", "2.0.0-beta"}]) - Bucket.upload("buckettest", "#{test}", first, [], dir1, files1) - Bucket.upload("buckettest", "#{test}", second, [first], dir2, files2) + Bucket.upload("buckettest", "#{test}", first, [], MapSet.new(), dir1, files1) + Bucket.upload("buckettest", "#{test}", second, [first], MapSet.new(), dir2, files2) assert Store.get(@bucket, "buckettest/#{test}/1.0.0-beta/index.html") == "1.0.0-beta" assert Store.get(@bucket, "buckettest/#{test}/2.0.0-beta/index.html") == "2.0.0-beta" @@ -127,7 +127,16 @@ defmodule Hexdocs.BucketTest do all_versions = [] {dir, files} = create_files([{"index.html", version}]) - Bucket.upload("buckettest", "#{test}", Version.parse!(version), all_versions, dir, files) + + Bucket.upload( + "buckettest", + "#{test}", + Version.parse!(version), + all_versions, + MapSet.new(), + dir, + files + ) assert Store.get(@bucket, "buckettest/#{test}/docs_config.js") =~ "1.0.0" @@ -135,7 +144,16 @@ defmodule Hexdocs.BucketTest do all_versions = [Version.parse!("1.0.0")] {dir, files} = create_files([{"index.html", version}]) - Bucket.upload("buckettest", "#{test}", Version.parse!(version), all_versions, dir, files) + + Bucket.upload( + "buckettest", + "#{test}", + Version.parse!(version), + all_versions, + MapSet.new(), + dir, + files + ) assert Store.get(@bucket, "buckettest/#{test}/docs_config.js") =~ "1.0.0" assert Store.get(@bucket, "buckettest/#{test}/docs_config.js") =~ "2.0.0" @@ -144,7 +162,16 @@ defmodule Hexdocs.BucketTest do all_versions = [Version.parse!("1.0.0"), Version.parse!("2.0.0")] {dir, files} = create_files([{"index.html", version}]) - Bucket.upload("buckettest", "#{test}", Version.parse!(version), all_versions, dir, files) + + Bucket.upload( + "buckettest", + "#{test}", + Version.parse!(version), + all_versions, + MapSet.new(), + dir, + files + ) assert Store.get(@bucket, "buckettest/#{test}/docs_config.js") =~ "1.0.0" assert Store.get(@bucket, "buckettest/#{test}/docs_config.js") =~ "1.1.0" diff --git a/test/hexdocs/queue_test.exs b/test/hexdocs/queue_test.exs index ac6903c..47beeef 100644 --- a/test/hexdocs/queue_test.exs +++ b/test/hexdocs/queue_test.exs @@ -239,7 +239,7 @@ defmodule Hexdocs.QueueTest do %{ "releases" => [ - %{"version" => "1.0.0", "has_docs" => true}, + %{"version" => "1.0.0", "has_docs" => true, "retirement" => %{"reason" => "renamed"}}, %{"version" => "2.0.0", "has_docs" => false}, %{"version" => "3.0.0", "has_docs" => true} ] @@ -276,7 +276,8 @@ defmodule Hexdocs.QueueTest do }, %{ "url" => "http://localhost/#{URI.encode(Atom.to_string(test))}/1.0.0", - "version" => "v1.0.0" + "version" => "v1.0.0", + "retired" => true } ]