Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 33 additions & 10 deletions lib/hexdocs/bucket.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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
)
Expand All @@ -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]))
Expand All @@ -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
Expand All @@ -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 =
Expand Down
30 changes: 20 additions & 10 deletions lib/hexdocs/queue.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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,
Expand All @@ -176,6 +176,7 @@ defmodule Hexdocs.Queue do
package,
version,
all_versions,
retired_versions,
dir,
files
)
Expand Down Expand Up @@ -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)

Expand Down Expand Up @@ -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

Expand Down
65 changes: 46 additions & 19 deletions test/hexdocs/bucket_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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")
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -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"
Expand All @@ -127,15 +127,33 @@ 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"

version = "2.0.0"
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"
Expand All @@ -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"
Expand Down
5 changes: 3 additions & 2 deletions test/hexdocs/queue_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -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}
]
Expand Down Expand Up @@ -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
}
]

Expand Down
Loading