-
Notifications
You must be signed in to change notification settings - Fork 22
/
agner_github.erl
102 lines (85 loc) · 2.47 KB
/
agner_github.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
-module(agner_github, [Account]).
-behaviour(agner_index).
-include_lib("agner.hrl").
-include_lib("agner_index.hrl").
-export([repositories/0,
repository/1,
tags/1,
branches/1,
spec/2
]).
repositories() ->
case request("https://github.com/api/v2/json/repos/show/" ++ Account) of
{error, _Reason} = Error ->
Error;
{struct, Object} ->
Repositories = proplists:get_value(<<"repositories">>, Object),
lists:all(fun (invalid) ->
false;
(_) ->
true
end,
lists:map(fun ({struct, RepObject}) ->
repo_name(proplists:get_value(<<"name">>, RepObject))
end, Repositories))
end.
repository(Name) ->
case request("https://github.com/api/v2/json/repos/show/" ++ Account ++ "/" ++ Name ++ ".agner") of
{error, _Reason} = Error ->
Error;
{struct, Object} ->
{struct, Repo} = proplists:get_value(<<"repository">>, Object),
Repo
end.
tags(Name) ->
case request("http://github.com/api/v2/json/repos/show/" ++ Account ++ "/" ++ Name ++ ".agner/tags") of
{struct, Object} ->
{struct, Tags} = proplists:get_value(<<"tags">>, Object),
lists:map(fun({Tag, SHA1}) ->
{binary_to_list(Tag),
binary_to_list(SHA1)}
end, Tags)
end.
branches(Name) ->
case request("http://github.com/api/v2/json/repos/show/" ++ Account ++ "/" ++ Name ++ ".agner/branches") of
{error, _Reason} = Error ->
Error;
{struct, Object} ->
{struct, Branches} = proplists:get_value(<<"branches">>, Object),
lists:map(fun({Branch, SHA1}) ->
{binary_to_list(Branch),
binary_to_list(SHA1)}
end, Branches)
end.
spec(Name, SHA1) ->
case request("http://github.com/api/v2/json/blob/show/" ++ Account ++ "/" ++ Name ++ ".agner/" ++ SHA1 ++ "/agner.config") of
{error, _Reason} = Error ->
Error;
{struct, Object} ->
{struct, Blob} = proplists:get_value(<<"blob">>, Object),
binary_to_list(proplists:get_value(<<"data">>, Blob))
end.
%%%
request(URL) ->
parse_response(httpc_request(URL)).
httpc_request(URL) ->
httpc_request_1(URL,[]).
httpc_request_1(URL, Opts) ->
httpc:request(get,{URL,
[]},
[{timeout, 60000}],
Opts,
agner).
parse_response({ok, {{"HTTP/1.1",200,_},_Headers,Body}}) ->
mochijson2:decode(Body);
parse_response({ok, {{"HTTP/1.1",404,_},_Headers,_Body}}) ->
{error, not_found}.
%%%
repo_name(B) when is_binary(B) ->
S = binary_to_list(B),
case string:tokens(S,".") of
[Name,"agner"] ->
Name;
_ ->
invalid
end.