vx-service_connector 0.0.11 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/lib/vx/service_connector.rb +0 -2
- data/lib/vx/service_connector/gitlab_v6.rb +37 -1
- data/lib/vx/service_connector/gitlab_v6/deploy_keys.rb +24 -1
- data/lib/vx/service_connector/gitlab_v6/files.rb +13 -3
- data/lib/vx/service_connector/gitlab_v6/hooks.rb +40 -4
- data/lib/vx/service_connector/gitlab_v6/notices.rb +6 -1
- data/lib/vx/service_connector/gitlab_v6/payload.rb +74 -10
- data/lib/vx/service_connector/gitlab_v6/repos.rb +72 -1
- data/lib/vx/service_connector/gitlab_v6/session.rb +49 -1
- data/lib/vx/service_connector/version.rb +1 -1
- data/spec/fixtures/gitlab_v6/payload/merge_request.json +1 -1
- data/spec/fixtures/gitlab_v6/payload/merged_merge_request.json +20 -0
- data/spec/lib/gitlab_payload_spec.rb +1 -1
- data/spec/lib/gitlab_spec.rb +1 -1
- data/spec/lib/gitlab_v6_payload_spec.rb +11 -3
- data/spec/lib/service_connector_spec.rb +0 -5
- data/vx-service_connector.gemspec +1 -1
- metadata +9 -27
- data/lib/vx/service_connector/gitlab_v5.rb +0 -47
- data/lib/vx/service_connector/gitlab_v5/deploy_keys.rb +0 -30
- data/lib/vx/service_connector/gitlab_v5/files.rb +0 -20
- data/lib/vx/service_connector/gitlab_v5/hooks.rb +0 -45
- data/lib/vx/service_connector/gitlab_v5/notices.rb +0 -13
- data/lib/vx/service_connector/gitlab_v5/payload.rb +0 -120
- data/lib/vx/service_connector/gitlab_v5/repos.rb +0 -73
- data/lib/vx/service_connector/gitlab_v5/session.rb +0 -58
- data/spec/fixtures/gitlab_v5/commits.json +0 -18
- data/spec/fixtures/gitlab_v5/deploy_keys.json +0 -14
- data/spec/fixtures/gitlab_v5/hooks.json +0 -1
- data/spec/fixtures/gitlab_v5/payload/push.json +0 -32
- data/spec/fixtures/gitlab_v5/projects.json +0 -1
- data/spec/fixtures/gitlab_v5/user_keys.json +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e49f704ce930150ed69a07365ec5e4552969ec58
|
4
|
+
data.tar.gz: 63afb325c1a43622b21ee026e5aa757c0bb135db
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bf0888344d76a2bdfbcce6798eeeece39bbc4602345cc4887dc839efd2ae111fb6f8582f5394e9d9fee08e5219095216589b4468fb0a74ea5333f044429047c4
|
7
|
+
data.tar.gz: 68777e3db8fc6538e6a84e46b24571e289fc065db1f2e9a78353c2d5c3a4fc504669a307fe51351bf4f56596f54e7b0f6f9e150b13ce99a43a078c0735a46ede
|
data/.travis.yml
CHANGED
data/lib/vx/service_connector.rb
CHANGED
@@ -1,6 +1,42 @@
|
|
1
1
|
module Vx
|
2
2
|
module ServiceConnector
|
3
|
-
|
3
|
+
GitlabV6 = Struct.new(:endpoint, :private_token) do
|
4
|
+
|
5
|
+
include ServiceConnector::Base
|
6
|
+
|
7
|
+
def repos
|
8
|
+
@repos ||= self.class::Repos.new(session).to_a
|
9
|
+
end
|
10
|
+
|
11
|
+
def organizations
|
12
|
+
[]
|
13
|
+
end
|
14
|
+
|
15
|
+
def hooks(repo)
|
16
|
+
self.class::Hooks.new(session, repo)
|
17
|
+
end
|
18
|
+
|
19
|
+
def deploy_keys(repo)
|
20
|
+
self.class::DeployKeys.new(session, repo)
|
21
|
+
end
|
22
|
+
|
23
|
+
def notices(repo)
|
24
|
+
self.class::Notices.new(session, repo)
|
25
|
+
end
|
26
|
+
|
27
|
+
def files(repo)
|
28
|
+
self.class::Files.new(session, repo)
|
29
|
+
end
|
30
|
+
|
31
|
+
def payload(repo, params)
|
32
|
+
self.class::Payload.new(session, repo, params).build
|
33
|
+
end
|
34
|
+
|
35
|
+
private
|
36
|
+
|
37
|
+
def create_session
|
38
|
+
self.class::Session.new(endpoint, private_token)
|
39
|
+
end
|
4
40
|
end
|
5
41
|
end
|
6
42
|
end
|
@@ -1,6 +1,29 @@
|
|
1
1
|
module Vx
|
2
2
|
module ServiceConnector
|
3
|
-
class GitlabV6
|
3
|
+
class GitlabV6
|
4
|
+
DeployKeys = Struct.new(:session, :repo) do
|
5
|
+
|
6
|
+
def all
|
7
|
+
begin
|
8
|
+
session.get "/projects/#{repo.id}/keys"
|
9
|
+
rescue RequestError
|
10
|
+
[]
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def create(key_name, public_key)
|
15
|
+
session.post "/projects/#{repo.id}/keys", title: key_name, key: public_key
|
16
|
+
end
|
17
|
+
|
18
|
+
def destroy(key_name)
|
19
|
+
all.select do |key|
|
20
|
+
key.title == key_name
|
21
|
+
end.map do |key|
|
22
|
+
session.delete "/projects/#{repo.id}/keys/#{key.id}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
4
27
|
end
|
5
28
|
end
|
6
29
|
end
|
@@ -1,8 +1,18 @@
|
|
1
|
-
require 'base64'
|
2
|
-
|
3
1
|
module Vx
|
4
2
|
module ServiceConnector
|
5
|
-
class GitlabV6
|
3
|
+
class GitlabV6
|
4
|
+
Files = Struct.new(:session, :repo) do
|
5
|
+
|
6
|
+
def get(sha, path)
|
7
|
+
begin
|
8
|
+
session.get("/projects/#{repo.id}/repository/commits/#{sha}/blob", filepath: path)
|
9
|
+
rescue RequestError => e
|
10
|
+
$stderr.puts "ERROR: #{e.inspect}"
|
11
|
+
nil
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
6
16
|
end
|
7
17
|
end
|
8
18
|
end
|
@@ -1,10 +1,46 @@
|
|
1
1
|
module Vx
|
2
2
|
module ServiceConnector
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
|
4
|
+
class GitlabV6
|
5
|
+
|
6
|
+
Hooks = Struct.new(:session, :repo) do
|
7
|
+
|
8
|
+
def all
|
9
|
+
begin
|
10
|
+
session.get hooks_url
|
11
|
+
rescue RequestError
|
12
|
+
[]
|
13
|
+
end
|
7
14
|
end
|
15
|
+
|
16
|
+
def create(url, token)
|
17
|
+
session.post(
|
18
|
+
hooks_url,
|
19
|
+
url: url,
|
20
|
+
push_events: true,
|
21
|
+
merge_requests_events: true
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def destroy(url_mask)
|
26
|
+
all.select do |hook|
|
27
|
+
hook.url =~ /#{Regexp.escape url_mask}/
|
28
|
+
end.map do |hook|
|
29
|
+
session.delete hook_url(hook.id)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def hooks_url
|
36
|
+
"/projects/#{repo.id}/hooks"
|
37
|
+
end
|
38
|
+
|
39
|
+
def hook_url(id)
|
40
|
+
"#{hooks_url}/#{id}"
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
8
44
|
end
|
9
45
|
end
|
10
46
|
end
|
@@ -1,8 +1,63 @@
|
|
1
1
|
module Vx
|
2
2
|
module ServiceConnector
|
3
|
-
class GitlabV6
|
3
|
+
class GitlabV6
|
4
|
+
|
5
|
+
Payload = Struct.new(:session, :repo, :params) do
|
6
|
+
|
7
|
+
def build
|
8
|
+
ServiceConnector::Model::Payload.new(
|
9
|
+
!!ignore?,
|
10
|
+
!!pull_request?,
|
11
|
+
pull_request_number,
|
12
|
+
branch,
|
13
|
+
branch_label,
|
14
|
+
sha,
|
15
|
+
message,
|
16
|
+
author,
|
17
|
+
author_email,
|
18
|
+
web_url
|
19
|
+
)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def message
|
25
|
+
commit_for_payload["title"]
|
26
|
+
end
|
4
27
|
|
5
|
-
|
28
|
+
def author
|
29
|
+
commit_for_payload["author_name"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def author_email
|
33
|
+
commit_for_payload["author_email"]
|
34
|
+
end
|
35
|
+
|
36
|
+
def branch_label
|
37
|
+
branch
|
38
|
+
end
|
39
|
+
|
40
|
+
def foreign_pull_request?
|
41
|
+
pull_request_base_repo_id != pull_request_head_repo_id
|
42
|
+
end
|
43
|
+
|
44
|
+
def ignore?
|
45
|
+
if pull_request?
|
46
|
+
closed_pull_request? || !foreign_pull_request?
|
47
|
+
else
|
48
|
+
sha == '0000000000000000000000000000000000000000' || tag?
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def key?(name)
|
53
|
+
params.key? name
|
54
|
+
end
|
55
|
+
|
56
|
+
def [](val)
|
57
|
+
params[val]
|
58
|
+
end
|
59
|
+
|
60
|
+
#=== V6
|
6
61
|
|
7
62
|
def pull_request?
|
8
63
|
self["object_kind"] == "merge_request"
|
@@ -25,13 +80,13 @@ module Vx
|
|
25
80
|
end
|
26
81
|
|
27
82
|
def web_url
|
28
|
-
|
83
|
+
case
|
84
|
+
when pull_request?
|
29
85
|
base_url = project_details["web_url"]
|
30
86
|
id = pull_request["iid"]
|
31
|
-
|
32
87
|
"#{base_url}/merge_requests/#{id}"
|
33
|
-
|
34
|
-
|
88
|
+
when self["repository"] && self["repository"]["homepage"]
|
89
|
+
u = self["repository"]["homepage"]
|
35
90
|
"#{u}/commit/#{sha}"
|
36
91
|
end
|
37
92
|
end
|
@@ -62,7 +117,7 @@ module Vx
|
|
62
117
|
|
63
118
|
def project_details
|
64
119
|
@project_details ||= begin
|
65
|
-
|
120
|
+
session.get("/projects/#{repo.id}")
|
66
121
|
rescue RequestError => e
|
67
122
|
$stderr.puts "ERROR: #{e.inspect}"
|
68
123
|
nil
|
@@ -71,8 +126,12 @@ module Vx
|
|
71
126
|
|
72
127
|
def commit_sha_for_pull_request
|
73
128
|
@commit_sha ||= begin
|
74
|
-
|
75
|
-
|
129
|
+
if not ignore?
|
130
|
+
branch_details = session.get("/projects/#{repo.id}/repository/branches/#{branch}")
|
131
|
+
branch_details["commit"]["id"]
|
132
|
+
else
|
133
|
+
nil
|
134
|
+
end
|
76
135
|
rescue RequestError => e
|
77
136
|
$stderr.puts "ERROR: #{e.inspect}"
|
78
137
|
nil
|
@@ -90,7 +149,11 @@ module Vx
|
|
90
149
|
def commit_for_payload
|
91
150
|
@commit_for_payload ||=
|
92
151
|
begin
|
93
|
-
|
152
|
+
if not ignore?
|
153
|
+
session.get(commit_uri(repo.id, sha))
|
154
|
+
else
|
155
|
+
{}
|
156
|
+
end
|
94
157
|
rescue RequestError => e
|
95
158
|
$stderr.puts "ERROR: #{e.inspect}"
|
96
159
|
{}
|
@@ -100,6 +163,7 @@ module Vx
|
|
100
163
|
def commit_uri(repo_id, sha)
|
101
164
|
"/projects/#{repo_id}/repository/commits/#{sha}"
|
102
165
|
end
|
166
|
+
end
|
103
167
|
end
|
104
168
|
end
|
105
169
|
end
|
@@ -1,6 +1,77 @@
|
|
1
1
|
module Vx
|
2
2
|
module ServiceConnector
|
3
|
-
class GitlabV6
|
3
|
+
class GitlabV6
|
4
|
+
Repos = Struct.new(:session) do
|
5
|
+
|
6
|
+
def to_a
|
7
|
+
begin
|
8
|
+
session.get("/projects", per_page: 30).map do |proj|
|
9
|
+
proj_to_model proj
|
10
|
+
end
|
11
|
+
rescue RequestError
|
12
|
+
[]
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def proj_to_model(repo)
|
19
|
+
Model::Repo.new(
|
20
|
+
repo.id,
|
21
|
+
compute_name_with_namespace(repo),
|
22
|
+
compute_is_private(repo),
|
23
|
+
compute_ssh_url(repo),
|
24
|
+
compute_web_url(repo),
|
25
|
+
repo.description
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def compute_name_with_namespace(repo)
|
30
|
+
if repo.path_with_namespace
|
31
|
+
# for version 5.x
|
32
|
+
repo.path_with_namespace
|
33
|
+
else
|
34
|
+
# for version 4.x
|
35
|
+
hn = session.uri.hostname.to_s.split(".")[-2]
|
36
|
+
hm ||= session.uri.hostname
|
37
|
+
[hn, repo.name.downcase].join("/").downcase
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def compute_ssh_url(repo)
|
42
|
+
if repo.ssh_url
|
43
|
+
# for version 6.x
|
44
|
+
repo.ssh_url
|
45
|
+
else
|
46
|
+
# for version 5.x or 4.x
|
47
|
+
name = repo.path_with_namespace || repo.name
|
48
|
+
"git@#{session.uri.hostname}:#{name.downcase}.git"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def compute_web_url(repo)
|
53
|
+
if repo.web_url
|
54
|
+
# for version 6.x
|
55
|
+
repo.web_url
|
56
|
+
else
|
57
|
+
# for version 5.x or 4.x
|
58
|
+
name = repo.path_with_namespace || repo.name
|
59
|
+
"#{session.uri.scheme}://#{session.uri.hostname}:#{session.uri.port}/#{name.downcase}"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def compute_is_private(repo)
|
64
|
+
case
|
65
|
+
# for version before 6.x
|
66
|
+
when repo.private != nil
|
67
|
+
repo.private
|
68
|
+
# for version 6.x
|
69
|
+
when repo.public != nil
|
70
|
+
!repo.public
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
4
75
|
end
|
5
76
|
end
|
6
77
|
end
|
@@ -3,7 +3,55 @@ require 'uri'
|
|
3
3
|
|
4
4
|
module Vx
|
5
5
|
module ServiceConnector
|
6
|
-
class GitlabV6
|
6
|
+
class GitlabV6
|
7
|
+
Session = Struct.new(:endpoint, :private_token) do
|
8
|
+
|
9
|
+
def get(url, options = {})
|
10
|
+
res = agent.call :get, request_url(url), nil, query: options
|
11
|
+
response! res
|
12
|
+
end
|
13
|
+
|
14
|
+
def post(url, options = {})
|
15
|
+
res = agent.call :post, request_url(url), options, nil
|
16
|
+
response! res
|
17
|
+
end
|
18
|
+
|
19
|
+
def delete(url, options = {})
|
20
|
+
res = agent.call :delete, request_url(url), nil, query: options
|
21
|
+
response! res
|
22
|
+
end
|
23
|
+
|
24
|
+
def uri
|
25
|
+
@uri ||= URI(endpoint)
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def response!(res)
|
31
|
+
if (200..204).include?(res.status)
|
32
|
+
res.data
|
33
|
+
else
|
34
|
+
raise RequestError, res.data.inspect
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def request_url(url)
|
39
|
+
"/api/v3/#{url}"
|
40
|
+
end
|
41
|
+
|
42
|
+
def api_endpoint
|
43
|
+
"#{endpoint}/api/v3"
|
44
|
+
end
|
45
|
+
|
46
|
+
def agent
|
47
|
+
@agent ||= Sawyer::Agent.new(api_endpoint) do |http|
|
48
|
+
http.headers['content-type'] = 'application/json'
|
49
|
+
http.headers['accept'] = 'application/json'
|
50
|
+
http.headers['PRIVATE-TOKEN'] = private_token
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
7
55
|
end
|
8
56
|
end
|
9
57
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
{
|
2
|
+
"object_kind": "merge_request",
|
3
|
+
"object_attributes": {
|
4
|
+
"id": 5,
|
5
|
+
"target_branch": "master",
|
6
|
+
"source_branch": "some-branch-name",
|
7
|
+
"source_project_id": 2,
|
8
|
+
"author_id": 1,
|
9
|
+
"assignee_id": 1,
|
10
|
+
"title": "Uiu",
|
11
|
+
"created_at": "2014-04-03T10:04:12.153Z",
|
12
|
+
"updated_at": "2014-04-03T10:04:18.012Z",
|
13
|
+
"milestone_id": null,
|
14
|
+
"state": "merged",
|
15
|
+
"merge_status": "can_be_merged",
|
16
|
+
"target_project_id": 2,
|
17
|
+
"iid": 5,
|
18
|
+
"description": "some desc..."
|
19
|
+
}
|
20
|
+
}
|
data/spec/lib/gitlab_spec.rb
CHANGED
@@ -28,7 +28,7 @@ describe Vx::ServiceConnector::GitlabV6::Payload do
|
|
28
28
|
its(:author) { should eq 'Dmitriy Zaporozhets' }
|
29
29
|
its(:author_email) { should eq 'dzaporozhets@sphereconsultinginc.com' }
|
30
30
|
its(:web_url) { should eq "http://localhost/example/sqerp/merge_requests/5" }
|
31
|
-
its(:ignore?) { should
|
31
|
+
its(:ignore?) { should be_false }
|
32
32
|
end
|
33
33
|
|
34
34
|
context "push tag" do
|
@@ -46,8 +46,16 @@ describe Vx::ServiceConnector::GitlabV6::Payload do
|
|
46
46
|
let(:content) { read_json_fixture("gitlab_v6/payload/closed_merge_request") }
|
47
47
|
|
48
48
|
before do
|
49
|
-
|
50
|
-
|
49
|
+
mock_project 1
|
50
|
+
end
|
51
|
+
|
52
|
+
its(:ignore?) { should be_true }
|
53
|
+
end
|
54
|
+
|
55
|
+
context "merged pull request" do
|
56
|
+
let(:content) { read_json_fixture("gitlab_v6/payload/merged_merge_request") }
|
57
|
+
|
58
|
+
before do
|
51
59
|
mock_project 1
|
52
60
|
end
|
53
61
|
|
@@ -10,11 +10,6 @@ describe Vx::ServiceConnector do
|
|
10
10
|
it { should be_include("Github") }
|
11
11
|
end
|
12
12
|
|
13
|
-
context ":gitlab_v5" do
|
14
|
-
let(:name) { :gitlab_v5 }
|
15
|
-
it { should be_include("GitlabV5") }
|
16
|
-
end
|
17
|
-
|
18
13
|
context ":gitlab_v6" do
|
19
14
|
let(:name) { :gitlab_v6 }
|
20
15
|
it { should be_include("GitlabV6") }
|
@@ -24,6 +24,6 @@ Gem::Specification.new do |spec|
|
|
24
24
|
|
25
25
|
spec.add_development_dependency "bundler", "~> 1.3"
|
26
26
|
spec.add_development_dependency "rake"
|
27
|
-
spec.add_development_dependency "rspec"
|
27
|
+
spec.add_development_dependency "rspec", '2.14.0'
|
28
28
|
spec.add_development_dependency "webmock"
|
29
29
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vx-service_connector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dmitry Galinsky
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: octokit
|
@@ -84,16 +84,16 @@ dependencies:
|
|
84
84
|
name: rspec
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - '
|
87
|
+
- - '='
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 2.14.0
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - '
|
94
|
+
- - '='
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 2.14.0
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: webmock
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,14 +132,6 @@ files:
|
|
132
132
|
- lib/vx/service_connector/github/notices.rb
|
133
133
|
- lib/vx/service_connector/github/payload.rb
|
134
134
|
- lib/vx/service_connector/github/repos.rb
|
135
|
-
- lib/vx/service_connector/gitlab_v5.rb
|
136
|
-
- lib/vx/service_connector/gitlab_v5/deploy_keys.rb
|
137
|
-
- lib/vx/service_connector/gitlab_v5/files.rb
|
138
|
-
- lib/vx/service_connector/gitlab_v5/hooks.rb
|
139
|
-
- lib/vx/service_connector/gitlab_v5/notices.rb
|
140
|
-
- lib/vx/service_connector/gitlab_v5/payload.rb
|
141
|
-
- lib/vx/service_connector/gitlab_v5/repos.rb
|
142
|
-
- lib/vx/service_connector/gitlab_v5/session.rb
|
143
135
|
- lib/vx/service_connector/gitlab_v6.rb
|
144
136
|
- lib/vx/service_connector/gitlab_v6/deploy_keys.rb
|
145
137
|
- lib/vx/service_connector/gitlab_v6/files.rb
|
@@ -165,12 +157,6 @@ files:
|
|
165
157
|
- spec/fixtures/github/payload/push.json
|
166
158
|
- spec/fixtures/github/payload/push_tag.json
|
167
159
|
- spec/fixtures/github/user_repos.json
|
168
|
-
- spec/fixtures/gitlab_v5/commits.json
|
169
|
-
- spec/fixtures/gitlab_v5/deploy_keys.json
|
170
|
-
- spec/fixtures/gitlab_v5/hooks.json
|
171
|
-
- spec/fixtures/gitlab_v5/payload/push.json
|
172
|
-
- spec/fixtures/gitlab_v5/projects.json
|
173
|
-
- spec/fixtures/gitlab_v5/user_keys.json
|
174
160
|
- spec/fixtures/gitlab_v6/branch.json
|
175
161
|
- spec/fixtures/gitlab_v6/commit.json
|
176
162
|
- spec/fixtures/gitlab_v6/commits.json
|
@@ -178,6 +164,7 @@ files:
|
|
178
164
|
- spec/fixtures/gitlab_v6/hooks.json
|
179
165
|
- spec/fixtures/gitlab_v6/payload/closed_merge_request.json
|
180
166
|
- spec/fixtures/gitlab_v6/payload/merge_request.json
|
167
|
+
- spec/fixtures/gitlab_v6/payload/merged_merge_request.json
|
181
168
|
- spec/fixtures/gitlab_v6/payload/push.json
|
182
169
|
- spec/fixtures/gitlab_v6/payload/push_tag.json
|
183
170
|
- spec/fixtures/gitlab_v6/project.json
|
@@ -219,7 +206,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
219
206
|
version: '0'
|
220
207
|
requirements: []
|
221
208
|
rubyforge_project:
|
222
|
-
rubygems_version: 2.
|
209
|
+
rubygems_version: 2.2.2
|
223
210
|
signing_key:
|
224
211
|
specification_version: 4
|
225
212
|
summary: vx-service_connector
|
@@ -238,12 +225,6 @@ test_files:
|
|
238
225
|
- spec/fixtures/github/payload/push.json
|
239
226
|
- spec/fixtures/github/payload/push_tag.json
|
240
227
|
- spec/fixtures/github/user_repos.json
|
241
|
-
- spec/fixtures/gitlab_v5/commits.json
|
242
|
-
- spec/fixtures/gitlab_v5/deploy_keys.json
|
243
|
-
- spec/fixtures/gitlab_v5/hooks.json
|
244
|
-
- spec/fixtures/gitlab_v5/payload/push.json
|
245
|
-
- spec/fixtures/gitlab_v5/projects.json
|
246
|
-
- spec/fixtures/gitlab_v5/user_keys.json
|
247
228
|
- spec/fixtures/gitlab_v6/branch.json
|
248
229
|
- spec/fixtures/gitlab_v6/commit.json
|
249
230
|
- spec/fixtures/gitlab_v6/commits.json
|
@@ -251,6 +232,7 @@ test_files:
|
|
251
232
|
- spec/fixtures/gitlab_v6/hooks.json
|
252
233
|
- spec/fixtures/gitlab_v6/payload/closed_merge_request.json
|
253
234
|
- spec/fixtures/gitlab_v6/payload/merge_request.json
|
235
|
+
- spec/fixtures/gitlab_v6/payload/merged_merge_request.json
|
254
236
|
- spec/fixtures/gitlab_v6/payload/push.json
|
255
237
|
- spec/fixtures/gitlab_v6/payload/push_tag.json
|
256
238
|
- spec/fixtures/gitlab_v6/project.json
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Vx
|
2
|
-
module ServiceConnector
|
3
|
-
GitlabV5 = Struct.new(:endpoint, :private_token) do
|
4
|
-
|
5
|
-
include ServiceConnector::Base
|
6
|
-
|
7
|
-
def repos
|
8
|
-
@repos ||= self.class::Repos.new(session).to_a
|
9
|
-
end
|
10
|
-
|
11
|
-
def organizations
|
12
|
-
[]
|
13
|
-
end
|
14
|
-
|
15
|
-
def hooks(repo)
|
16
|
-
self.class::Hooks.new(session, repo)
|
17
|
-
end
|
18
|
-
|
19
|
-
def deploy_keys(repo)
|
20
|
-
self.class::DeployKeys.new(session, repo)
|
21
|
-
end
|
22
|
-
|
23
|
-
def notices(repo)
|
24
|
-
self.class::Notices.new(session, repo)
|
25
|
-
end
|
26
|
-
|
27
|
-
def files(repo)
|
28
|
-
self.class::Files.new(session, repo)
|
29
|
-
end
|
30
|
-
|
31
|
-
def payload(repo, params)
|
32
|
-
self.class::Payload.new(session, repo, params).build
|
33
|
-
end
|
34
|
-
|
35
|
-
private
|
36
|
-
|
37
|
-
def create_session
|
38
|
-
self.class::Session.new(endpoint, private_token)
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
Dir[File.expand_path("../gitlab_v5/*.rb", __FILE__)].each do |f|
|
46
|
-
require f
|
47
|
-
end
|
@@ -1,30 +0,0 @@
|
|
1
|
-
module Vx
|
2
|
-
module ServiceConnector
|
3
|
-
class GitlabV5
|
4
|
-
DeployKeys = Struct.new(:session, :repo) do
|
5
|
-
|
6
|
-
def all
|
7
|
-
begin
|
8
|
-
session.get "/projects/#{repo.id}/keys"
|
9
|
-
rescue RequestError
|
10
|
-
[]
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def create(key_name, public_key)
|
15
|
-
session.post "/projects/#{repo.id}/keys", title: key_name, key: public_key
|
16
|
-
end
|
17
|
-
|
18
|
-
def destroy(key_name)
|
19
|
-
all.select do |key|
|
20
|
-
key.title == key_name
|
21
|
-
end.map do |key|
|
22
|
-
session.delete "/projects/#{repo.id}/keys/#{key.id}"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'base64'
|
2
|
-
|
3
|
-
module Vx
|
4
|
-
module ServiceConnector
|
5
|
-
class GitlabV5
|
6
|
-
Files = Struct.new(:session, :repo) do
|
7
|
-
|
8
|
-
def get(sha, path)
|
9
|
-
begin
|
10
|
-
session.get("/projects/#{repo.id}/repository/commits/#{sha}/blob", filepath: path)
|
11
|
-
rescue RequestError => e
|
12
|
-
$stderr.puts "ERROR: #{e.inspect}"
|
13
|
-
nil
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
@@ -1,45 +0,0 @@
|
|
1
|
-
module Vx
|
2
|
-
module ServiceConnector
|
3
|
-
class GitlabV5
|
4
|
-
Hooks = Struct.new(:session, :repo) do
|
5
|
-
|
6
|
-
def all
|
7
|
-
begin
|
8
|
-
session.get hooks_url
|
9
|
-
rescue RequestError
|
10
|
-
[]
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
def create(url, token)
|
15
|
-
session.post(
|
16
|
-
hooks_url,
|
17
|
-
url: url,
|
18
|
-
push_events: true,
|
19
|
-
merge_requests_events: true
|
20
|
-
)
|
21
|
-
end
|
22
|
-
|
23
|
-
def destroy(url_mask)
|
24
|
-
all.select do |hook|
|
25
|
-
hook.url =~ /#{Regexp.escape url_mask}/
|
26
|
-
end.map do |hook|
|
27
|
-
session.delete hook_url(hook.id)
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
|
33
|
-
def hooks_url
|
34
|
-
"/projects/#{repo.id}/hooks"
|
35
|
-
end
|
36
|
-
|
37
|
-
def hook_url(id)
|
38
|
-
"#{hooks_url}?hook_id=#{id}"
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
@@ -1,120 +0,0 @@
|
|
1
|
-
module Vx
|
2
|
-
module ServiceConnector
|
3
|
-
class GitlabV5
|
4
|
-
Payload = Struct.new(:session, :repo, :params) do
|
5
|
-
|
6
|
-
def build
|
7
|
-
ServiceConnector::Model::Payload.new(
|
8
|
-
!!ignore?,
|
9
|
-
!!pull_request?,
|
10
|
-
pull_request_number,
|
11
|
-
branch,
|
12
|
-
branch_label,
|
13
|
-
sha,
|
14
|
-
message,
|
15
|
-
author,
|
16
|
-
author_email,
|
17
|
-
web_url
|
18
|
-
)
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def message
|
24
|
-
commit_for_payload["title"]
|
25
|
-
end
|
26
|
-
|
27
|
-
def author
|
28
|
-
commit_for_payload["author_name"]
|
29
|
-
end
|
30
|
-
|
31
|
-
def author_email
|
32
|
-
commit_for_payload["author_email"]
|
33
|
-
end
|
34
|
-
|
35
|
-
def pull_request?
|
36
|
-
false
|
37
|
-
end
|
38
|
-
|
39
|
-
def tag?
|
40
|
-
false
|
41
|
-
end
|
42
|
-
|
43
|
-
def pull_request_number
|
44
|
-
nil
|
45
|
-
end
|
46
|
-
|
47
|
-
def sha
|
48
|
-
self["after"]
|
49
|
-
end
|
50
|
-
|
51
|
-
def branch
|
52
|
-
self["ref"].to_s.split("refs/heads/").last
|
53
|
-
end
|
54
|
-
|
55
|
-
def branch_label
|
56
|
-
branch
|
57
|
-
end
|
58
|
-
|
59
|
-
def web_url
|
60
|
-
if u = self["repository"] && self["repository"]["homepage"]
|
61
|
-
"#{u}/commit/#{sha}"
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def pull_request_head_repo_id
|
66
|
-
nil
|
67
|
-
end
|
68
|
-
|
69
|
-
def pull_request_base_repo_id
|
70
|
-
nil
|
71
|
-
end
|
72
|
-
|
73
|
-
def closed_pull_request?
|
74
|
-
false
|
75
|
-
end
|
76
|
-
|
77
|
-
def foreign_pull_request?
|
78
|
-
pull_request_base_repo_id != pull_request_head_repo_id
|
79
|
-
end
|
80
|
-
|
81
|
-
def ignore?
|
82
|
-
if pull_request?
|
83
|
-
closed_pull_request? || !foreign_pull_request?
|
84
|
-
else
|
85
|
-
sha == '0000000000000000000000000000000000000000' || tag?
|
86
|
-
end
|
87
|
-
end
|
88
|
-
|
89
|
-
def pull_request
|
90
|
-
{}
|
91
|
-
end
|
92
|
-
|
93
|
-
def key?(name)
|
94
|
-
params.key? name
|
95
|
-
end
|
96
|
-
|
97
|
-
def [](val)
|
98
|
-
params[val]
|
99
|
-
end
|
100
|
-
|
101
|
-
def commit_for_payload
|
102
|
-
@commit_for_payload ||=
|
103
|
-
begin
|
104
|
-
commits = session.get(commit_uri(repo.id, sha))
|
105
|
-
commits.first || {}
|
106
|
-
rescue RequestError => e
|
107
|
-
$stderr.puts "ERROR: #{e.inspect}"
|
108
|
-
{}
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def commit_uri(repo_id, sha)
|
113
|
-
"/projects/#{repo_id}/repository/commits?ref_name=#{sha}"
|
114
|
-
end
|
115
|
-
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
@@ -1,73 +0,0 @@
|
|
1
|
-
module Vx
|
2
|
-
module ServiceConnector
|
3
|
-
class GitlabV5
|
4
|
-
Repos = Struct.new(:session) do
|
5
|
-
|
6
|
-
def to_a
|
7
|
-
session.get("/projects", per_page: 30).map do |proj|
|
8
|
-
proj_to_model proj
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
|
-
private
|
13
|
-
|
14
|
-
def proj_to_model(repo)
|
15
|
-
Model::Repo.new(
|
16
|
-
repo.id,
|
17
|
-
compute_name_with_namespace(repo),
|
18
|
-
compute_is_private(repo),
|
19
|
-
compute_ssh_url(repo),
|
20
|
-
compute_web_url(repo),
|
21
|
-
repo.description
|
22
|
-
)
|
23
|
-
end
|
24
|
-
|
25
|
-
def compute_name_with_namespace(repo)
|
26
|
-
if repo.path_with_namespace
|
27
|
-
# for version 5.x
|
28
|
-
repo.path_with_namespace
|
29
|
-
else
|
30
|
-
# for version 4.x
|
31
|
-
hn = session.uri.hostname.to_s.split(".")[-2]
|
32
|
-
hm ||= session.uri.hostname
|
33
|
-
[hn, repo.name.downcase].join("/").downcase
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def compute_ssh_url(repo)
|
38
|
-
if repo.ssh_url
|
39
|
-
# for version 6.x
|
40
|
-
repo.ssh_url
|
41
|
-
else
|
42
|
-
# for version 5.x or 4.x
|
43
|
-
name = repo.path_with_namespace || repo.name
|
44
|
-
"git@#{session.uri.hostname}:#{name.downcase}.git"
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def compute_web_url(repo)
|
49
|
-
if repo.web_url
|
50
|
-
# for version 6.x
|
51
|
-
repo.web_url
|
52
|
-
else
|
53
|
-
# for version 5.x or 4.x
|
54
|
-
name = repo.path_with_namespace || repo.name
|
55
|
-
"#{session.uri.scheme}://#{session.uri.hostname}:#{session.uri.port}/#{name.downcase}"
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def compute_is_private(repo)
|
60
|
-
case
|
61
|
-
# for version before 6.x
|
62
|
-
when repo.private != nil
|
63
|
-
repo.private
|
64
|
-
# for version 6.x
|
65
|
-
when repo.public != nil
|
66
|
-
!repo.public
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
end
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'sawyer'
|
2
|
-
require 'uri'
|
3
|
-
|
4
|
-
module Vx
|
5
|
-
module ServiceConnector
|
6
|
-
class GitlabV5
|
7
|
-
|
8
|
-
Session = Struct.new(:endpoint, :private_token) do
|
9
|
-
|
10
|
-
def get(url, options = {})
|
11
|
-
res = agent.call :get, request_url(url), nil, query: options
|
12
|
-
response! res
|
13
|
-
end
|
14
|
-
|
15
|
-
def post(url, options = {})
|
16
|
-
res = agent.call :post, request_url(url), options, nil
|
17
|
-
response! res
|
18
|
-
end
|
19
|
-
|
20
|
-
def delete(url, options = {})
|
21
|
-
res = agent.call :delete, request_url(url), nil, query: options
|
22
|
-
response! res
|
23
|
-
end
|
24
|
-
|
25
|
-
def uri
|
26
|
-
@uri ||= URI(endpoint)
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def response!(res)
|
32
|
-
if (200..204).include?(res.status)
|
33
|
-
res.data
|
34
|
-
else
|
35
|
-
raise RequestError, res.data
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def request_url(url)
|
40
|
-
"/api/v3/#{url}"
|
41
|
-
end
|
42
|
-
|
43
|
-
def api_endpoint
|
44
|
-
"#{endpoint}/api/v3"
|
45
|
-
end
|
46
|
-
|
47
|
-
def agent
|
48
|
-
@agent ||= Sawyer::Agent.new(api_endpoint) do |http|
|
49
|
-
http.headers['content-type'] = 'application/json'
|
50
|
-
http.headers['accept'] = 'application/json'
|
51
|
-
http.headers['PRIVATE-TOKEN'] = private_token
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
@@ -1,18 +0,0 @@
|
|
1
|
-
[
|
2
|
-
{
|
3
|
-
"id": "ed899a2f4b50b4370feeea94676502b42383c746",
|
4
|
-
"short_id": "ed899a2f4b5",
|
5
|
-
"title": "Replace sanitize with escape once",
|
6
|
-
"author_name": "Dmitriy Zaporozhets",
|
7
|
-
"author_email": "dzaporozhets@sphereconsultinginc.com",
|
8
|
-
"created_at": "2012-09-20T11:50:22+03:00"
|
9
|
-
},
|
10
|
-
{
|
11
|
-
"id": "6104942438c14ec7bd21c6cd5bd995272b3faff6",
|
12
|
-
"short_id": "6104942438c",
|
13
|
-
"title": "Sanitize for network graph",
|
14
|
-
"author_name": "randx",
|
15
|
-
"author_email": "dmitriy.zaporozhets@gmail.com",
|
16
|
-
"created_at": "2012-09-20T09:06:12+03:00"
|
17
|
-
}
|
18
|
-
]
|
@@ -1,14 +0,0 @@
|
|
1
|
-
[
|
2
|
-
{
|
3
|
-
"id": 1,
|
4
|
-
"title" : "Public key",
|
5
|
-
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
|
6
|
-
"created_at":"2013-10-02T10:12:29Z"
|
7
|
-
},
|
8
|
-
{
|
9
|
-
"id": 3,
|
10
|
-
"title" : "me@example.com",
|
11
|
-
"key": "ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAiPWx6WM4lhHNedGfBpPJNPpZ7yKu+dnn1SJejgt4 596k6YjzGGphH2TUxwKzxcKDKKezwkpfnxPkSMkuEspGRt/aZZ9wa++Oi7Qkr8prgHc4 soW6NUlfDzpvZK2H5E7eQaSeP3SAwGmQKUFHCddNaP0L+hM7zhFNzjFvpaMgJw0=",
|
12
|
-
"created_at":"2013-10-02T11:12:29Z"
|
13
|
-
}
|
14
|
-
]
|
@@ -1 +0,0 @@
|
|
1
|
-
[{"id":57,"url":"http://example.com/hook","created_at":"2014-01-28T14:04:22Z"}]
|
@@ -1,32 +0,0 @@
|
|
1
|
-
{
|
2
|
-
"before": "0000000000000000000000000000000000000000",
|
3
|
-
"after": "decc3915e29d7ae1786bb981b2ea3702afae592a",
|
4
|
-
"ref": "refs/heads/testing",
|
5
|
-
"user_id": 13,
|
6
|
-
"user_name": "Dmitry",
|
7
|
-
"repository": {
|
8
|
-
"name": "event_generator",
|
9
|
-
"url": "git@git.dev.gorod-skidok.com:serverist2/event_generator.git",
|
10
|
-
"description": null,
|
11
|
-
"homepage": "http://git.dev.gorod-skidok.com/serverist2/event_generator"
|
12
|
-
},
|
13
|
-
"commits": null,
|
14
|
-
"total_commits_count": 0,
|
15
|
-
"_service": "gitlab",
|
16
|
-
"token": "cb170b9c-8274-43e6-80c8-f1a744ac43b4",
|
17
|
-
"repo_callback": {
|
18
|
-
"before": "0000000000000000000000000000000000000000",
|
19
|
-
"after": "decc3915e29d7ae1786bb981b2ea3702afae592a",
|
20
|
-
"ref": "refs/heads/testing",
|
21
|
-
"user_id": 13,
|
22
|
-
"user_name": "Dmitry",
|
23
|
-
"repository": {
|
24
|
-
"name": "event_generator",
|
25
|
-
"url": "git@git.dev.gorod-skidok.com:serverist2/event_generator.git",
|
26
|
-
"description": null,
|
27
|
-
"homepage": "http://git.dev.gorod-skidok.com/serverist2/event_generator"
|
28
|
-
},
|
29
|
-
"commits": null,
|
30
|
-
"total_commits_count": 0
|
31
|
-
}
|
32
|
-
}
|
@@ -1 +0,0 @@
|
|
1
|
-
[{"id":9,"name":"SQERP","description":null,"default_branch":"master","owner":{"id":14,"username":null,"email":"me@example.com","name":"MyName","blocked":true,"created_at":"2012-06-21T07:47:41Z"},"private":true,"issues_enabled":true,"merge_requests_enabled":true,"wall_enabled":true,"wiki_enabled":true,"created_at":"2012-06-21T08:02:09Z","namespace":null}]
|
@@ -1 +0,0 @@
|
|
1
|
-
[{"id":589,"title":"me@example.com for full/name","key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDXnM3fhBisPY223C7poY7J7qsMPHHc1aJ4+rwUqzdGHANNWoP8tCUXXnhWvhy8fxEqImDUWdYMNLQI42MJ8RB7naQjvWJqBU/JUvXRznrGcldPjmdIpb25Jod29wQDmPEYC31S1HoEEgmqVeG1V+ypxeqm8XEy1USjsY/Cbx0cbGUOa560GRV89/8KB4GHzN8R82OUxIzUJotIGIcAvNhYwR+skrsI2/QnDMqty2O5SQU52bgzlotCfSQbeujOT9DU3uP9YeRUcY/Xouqx19Q5TSPNk8rkh5uIHNKQ9LipJlfVU9G+YI0r5oMRlvqEXyR2gUEUwwhzafp8JQ4O/YJ7 me@example.com","created_at":"2013-10-24T12:41:18Z"}]
|