diff --git a/lib/hexdocs/queue.ex b/lib/hexdocs/queue.ex index 9d86bdc..7894521 100644 --- a/lib/hexdocs/queue.ex +++ b/lib/hexdocs/queue.ex @@ -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 @@ -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}") diff --git a/test/hexdocs/search_test.exs b/test/hexdocs/search_test.exs index 51c9859..0b784a0 100644 --- a/test/hexdocs/search_test.exs +++ b/test/hexdocs/search_test.exs @@ -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)