File: dev.ex

package info (click to toggle)
erlang-hex 2.0.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,204 kB
  • sloc: erlang: 2,950; sh: 203; makefile: 10
file content (68 lines) | stat: -rw-r--r-- 2,239 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
if Mix.env() == :dev do
  defmodule Hex.Dev do
    @moduledoc false

    @ets_name __MODULE__
    @registry_filename "cache.ets"
    @repo "hexpm"
    @ets_version 3

    def extract_registry(packages, new_path) do
      {:ok, original_ets} = :ets.file2tab(String.to_charlist(ets_path()))
      new_ets = :ets.new(@ets_name, [])

      try do
        :ets.insert(new_ets, {:version, @ets_version})
        copy(original_ets, new_ets, :last_update)

        Enum.each(packages, fn package ->
          copy_package(original_ets, new_ets, package)
        end)

        :ok = :ets.tab2file(new_ets, String.to_charlist(new_path))
      after
        :ets.delete(original_ets)
        :ets.delete(new_ets)
      end
    end

    defp copy_package(original_ets, new_ets, package) do
      unless :ets.member(new_ets, {:versions, @repo, package}) do
        copy(original_ets, new_ets, {:versions, @repo, package})
        copy(original_ets, new_ets, {:registry_etag, @repo, package})
        copy(original_ets, new_ets, {:timestamp, @repo, package})

        case :ets.lookup(original_ets, {:versions, @repo, package}) do
          [{_, versions}] ->
            IO.puts("COPYING #{package}")

            Enum.each(versions, fn version ->
              copy(original_ets, new_ets, {:deps, @repo, package, version})
              copy(original_ets, new_ets, {:inner_checksum, @repo, package, version})
              copy(original_ets, new_ets, {:outer_checksum, @repo, package, version})
              copy(original_ets, new_ets, {:retired, @repo, package, version})
              copy(original_ets, new_ets, {:timestamp, @repo, package, version})

              [{_, dep_tuples}] = :ets.lookup(original_ets, {:deps, @repo, package, version})

              Enum.each(dep_tuples, fn {@repo, dependency, _app, _requirement, _optional} ->
                copy_package(original_ets, new_ets, dependency)
              end)
            end)

          [] ->
            :ok
        end
      end
    end

    defp copy(original_ets, new_ets, key) do
      tuples = :ets.lookup(original_ets, key)
      :ets.insert(new_ets, tuples)
    end

    defp ets_path() do
      Path.join(Hex.State.fetch!(:cache_home), @registry_filename)
    end
  end
end