/
agner.erl
124 lines (94 loc) · 3.69 KB
/
agner.erl
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
%% -*- Mode: Erlang; tab-width: 4 -*-
-module(agner).
-include_lib("agner.hrl").
-export([start/0,stop/0]).
-export([main/1]).
%% API
-export([spec/1, spec/2, spec_url/1, spec_url/2, index/0, fetch/2, fetch/3, versions/1]).
-define(AGNER_BIN,"/usr/local/bin").
-define(AGNER_PREFIX,"/usr/local/agner").
start() ->
case os:getenv("AGNER_BIN") of
false ->
os:putenv("AGNER_BIN",?AGNER_BIN);
[_|_] ->
ignore
end,
case os:getenv("AGNER_PREFIX") of
false ->
os:putenv("AGNER_PREFIX",?AGNER_PREFIX);
[_|_] ->
ignore
end,
case os:getenv("AGNER_EXACT_PREFIX") of
false ->
os:putenv("AGNER_EXACT_PREFIX",filename:join(os:getenv("AGNER_PREFIX"),"packages"));
[_|_] ->
ignore
end,
ensure_crypto_loaded(),
filelib:ensure_dir(os:getenv("AGNER_EXACT_PREFIX") ++ "/"),
inets:start(),
ssl:start(),
inets:start(httpc,[{profile, agner}]),
application:start(gproc),
gproc:start_link(),
application:start(agner).
stop() ->
application:stop(agner),
inets:stop(),
ssl:stop().
main(Args) ->
agner_main:main(Args).
%%%===================================================================
%%% API
%%%===================================================================
-spec spec(agner_package_name()) -> agner_spec() | not_found_error().
-spec spec(agner_package_name(), agner_package_version() | string()) -> agner_spec() | not_found_error().
spec(Name) ->
spec(Name, {flavour, "master"}).
spec(Name, Version) when is_atom(Name) ->
spec(atom_to_list(Name),Version);
spec(Name, Version) when is_list(Version) ->
spec(Name, agner_spec:list_to_version(Name, Version));
spec(Name, Version) ->
agner_server:spec(Name, Version).
-spec spec_url(agner_package_name()) -> url() | not_found_error().
-spec spec_url(agner_package_name(), agner_package_version() | string()) -> url() | not_found_error().
spec_url(Name) ->
spec_url(Name, {flavour, "master"}).
spec_url(Name, Version) when is_atom(Name) ->
spec_url(atom_to_list(Name),Version);
spec_url(Name, Version) when is_list(Version) ->
spec_url(Name, agner_spec:list_to_version(Name, Version));
spec_url(Name, Version) ->
agner_server:spec_url(Name, Version).
-spec index() -> list(agner_package_name()).
index() ->
agner_server:index().
-spec fetch(agner_package_name(), directory()) -> ok | not_found_error().
-spec fetch(agner_package_name(), agner_package_version() | agner_package_version_string(), directory()) -> ok | not_found_error().
fetch(Name, Directory) ->
fetch(Name, {flavour, "master"}, Directory).
fetch(Name, Version, Directory) when is_list(Version) ->
fetch(Name, agner_spec:list_to_version(Name, Version), Directory);
fetch(Name, Version, Directory) ->
agner_server:fetch(Name, Version, Directory).
-spec versions(agner_package_name()) -> list(agner_package_version()).
versions(Name) ->
agner_server:versions(Name).
%%%===================================================================
%%% private
%%%===================================================================
ensure_crypto_loaded() ->
case code:ensure_loaded(crypto) of
{module, crypto} ->
ignore;
{error, _Err} ->
[io:format("~s~n", [Msg])
|| Msg <- ["Your local Erlang installation doesn't include the crypto module",
"Make sure you have erlang-crypto and erlang-dev if on Debian",
" have erlang-crypto and erlang-devel if on Redhat/Fedora",
" sudo port install erlang +ssl if on OS X",
"Or, let kerl (https://github.com/evax/kerl) take care of those for you"]]
end.