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
29 changes: 14 additions & 15 deletions lib/hexdocs/queue.ex
Original file line number Diff line number Diff line change
Expand Up @@ -167,23 +167,20 @@ defmodule Hexdocs.Queue do
end

defp process_search(key, package, version, body, start) do
case Version.parse(version) do
{:ok, version} ->
case Hexdocs.Tar.unpack(body, package: package, version: version) do
{:ok, files} ->
update_search_index(key, package, version, files)

elapsed = System.os_time(:millisecond) - start
Logger.info("FINISHED INDEXING DOCS #{key} #{elapsed}ms")
version =
case Version.parse(version) do
{:ok, version} -> version
:error when package in @special_package_names -> version
end

{:error, reason} ->
Logger.error("Failed unpack #{package} #{version}: #{reason}")
end
case Hexdocs.Tar.unpack(body, package: package, version: version) do
{:ok, files} ->
update_search_index(key, package, version, files)
elapsed = System.os_time(:millisecond) - start
Logger.info("FINISHED INDEXING DOCS #{key} #{elapsed}ms")

:error when package in @special_package_names ->
# Skip for special packages, it's probably a tag push that's not valid semver
# and we don't need to index those
:ok
{:error, reason} ->
Logger.error("Failed unpack #{package} #{version}: #{reason}")
end
end

Expand Down Expand Up @@ -342,6 +339,8 @@ defmodule Hexdocs.Queue do
defp update_search_index(key, package, version, files) do
case Hexdocs.Search.find_search_items(package, version, files) do
{proglang, items} ->
Logger.info("DELETING SEARCH INDEX #{key}")
Hexdocs.Search.delete(package, version)
Logger.info("UPDATING SEARCH INDEX #{key}")
Hexdocs.Search.index(package, version, proglang, items)
Logger.info("UPDATED SEARCH INDEX #{key}")
Expand Down
30 changes: 30 additions & 0 deletions test/hexdocs/search_test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,36 @@ defmodule Hexdocs.SearchTest do
})
end

test "prunes previous docs before updating search index", %{package: _package} do
package = "elixir"
version = "main"

run_upload(package, version, [
{"index.html", "contents"},
{"dist/search_data-0F918FFD.js",
"""
searchData={"items":[\
{"type":"function","title":"Example.old_test/4","doc":"does old example things","ref":"Example.html#old_test/4"},\
{"type":"module","title":"Example","doc":"example text","ref":"Example.html"}\
],"content_type":"text/markdown","producer":{"name":"ex_doc","version":[48,46,51,52,46,50]}}\
"""}
])

run_upload(package, version, [
{"index.html", "contents"},
{"dist/search_data-0F918FFD.js",
"""
searchData={"items":[\
{"type":"function","title":"Example.new_test/4","doc":"does new example things","ref":"Example.html#new_test/4"},\
{"type":"module","title":"Example","doc":"example text","ref":"Example.html"}\
],"content_type":"text/markdown","producer":{"name":"ex_doc","version":[48,46,51,52,46,50]}}\
"""}
])

assert [%{"document" => %{"title" => "Example.new_test/4"}}] =
typesense_search(%{"q" => "test", "query_by" => "title"})
end

test "logs an info message if search_data is not found", %{package: package} do
original_log_level = Logger.level()
Logger.configure(level: :info)
Expand Down