errbit_gitlab_plugin 0.1.0 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +22 -7
- data/app/views/errbit_gitlab_plugin/issue.md.erb +43 -0
- data/errbit_gitlab_plugin.gemspec +2 -2
- data/lib/errbit_gitlab_plugin.rb +5 -1
- data/lib/errbit_gitlab_plugin/issue_tracker.rb +136 -55
- data/lib/errbit_gitlab_plugin/version.rb +1 -1
- data/{vendor/assets/images → static}/gitlab_create.png +0 -0
- data/{vendor/assets/images → static}/gitlab_goto.png +0 -0
- data/{vendor/assets/images → static}/gitlab_inactive.png +0 -0
- metadata +14 -15
- data/views/gitlab_issues_body.txt.erb +0 -29
- data/views/gitlab_issues_summary.txt.erb +0 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 888f007985de3d983cad03f5d42cc191036ec28c
|
4
|
+
data.tar.gz: 31cfef1b01855ea219de3fe6be90915549be3cbd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c9a85f40914a30284631c75b6aa8acc2a4983d90e446c1511bf0d9e2b5daaa44318d6fd394c18949201d46ed9bf430d1a08446df0794afea2937301e2c1bb709
|
7
|
+
data.tar.gz: 4e1cd3f73c7d63fcd87947c39760efdeded6b2c432b11ead717f5e9351ff8409708ed266189a1c7a376ada3cbc63790a92cc768a1420a03973014a5721b1005e
|
data/README.md
CHANGED
@@ -1,24 +1,39 @@
|
|
1
1
|
# ErrbitGitlabPlugin
|
2
2
|
|
3
|
-
|
3
|
+
This gem adds Gitlab issue tracker support to Errbit.
|
4
|
+
|
5
|
+
Version 1.0 is compatible with Errbit 0.4.
|
6
|
+
|
7
|
+
For (much) older versions of Errbit, try the 0.x gem versions or consider
|
8
|
+
updating your Errbit installation
|
4
9
|
|
5
10
|
## Installation
|
6
11
|
|
7
|
-
|
12
|
+
As described in [Errbit's README](https://github.com/errbit/errbit#plugins-and-integrations),
|
13
|
+
just add the gem to your `UserGemfile`:
|
8
14
|
|
9
|
-
gem 'errbit_gitlab_plugin'
|
15
|
+
echo "gem 'errbit_gitlab_plugin'" > UserGemfile
|
10
16
|
|
11
17
|
And then execute:
|
12
18
|
|
13
19
|
$ bundle
|
14
20
|
|
15
|
-
|
21
|
+
## Usage
|
16
22
|
|
17
|
-
|
23
|
+
Simply add your Gitlab URL, private token and project name to your errbit app.
|
18
24
|
|
19
|
-
|
25
|
+
You can find your private token by clicking on "Account" in your Gitlab profile settings.
|
26
|
+
|
27
|
+
Upon saving the app, the gem will automatically test if your entered
|
28
|
+
credentials are valid and inform you otherwise.
|
29
|
+
|
30
|
+
## Troubleshoot
|
31
|
+
|
32
|
+
> I entered my Gitlab settings and the tracker was saved, but I cannot create issues
|
20
33
|
|
21
|
-
|
34
|
+
The Gitlab API (at least on gitlab.com) does not seem to accept POST requests when using
|
35
|
+
a non-encrypted connection. Therefore, please make sure to use `https://` when
|
36
|
+
using gitlab.com as URL.
|
22
37
|
|
23
38
|
## Contributing
|
24
39
|
|
@@ -0,0 +1,43 @@
|
|
1
|
+
[See this exception on Errbit](<%= app_problem_url problem.app, problem %>)
|
2
|
+
|
3
|
+
<% if notice = problem.notices.first %>
|
4
|
+
# <%= notice.message.lines.map(&:strip).join(' ') %>
|
5
|
+
|
6
|
+
## Summary ##
|
7
|
+
<% if notice.request['url'].present? %>
|
8
|
+
### URL ###
|
9
|
+
<%= notice.request['url'] %>
|
10
|
+
<% end %>
|
11
|
+
### Where ###
|
12
|
+
<%= notice.where %>
|
13
|
+
|
14
|
+
### Occured ###
|
15
|
+
<%= notice.created_at.to_s(:precise) %>
|
16
|
+
|
17
|
+
### Similar ###
|
18
|
+
<%= [notice.problem.notices_count - 1, 1].max %>
|
19
|
+
|
20
|
+
## Params ##
|
21
|
+
```ruby
|
22
|
+
<%= pretty_hash(notice.params).html_safe %>
|
23
|
+
```
|
24
|
+
|
25
|
+
## Session ##
|
26
|
+
```ruby
|
27
|
+
<%= pretty_hash(notice.session).html_safe %>
|
28
|
+
```
|
29
|
+
|
30
|
+
## Backtrace ##
|
31
|
+
```
|
32
|
+
<% notice.backtrace.lines.each do |line| %><%= format '%4d:', line.number %> <%= line.file_relative %> -> **<%= line.method %>**
|
33
|
+
<% end %>
|
34
|
+
```
|
35
|
+
|
36
|
+
<% if notice.env_vars.present? %>
|
37
|
+
## Environment ##
|
38
|
+
| Key | Value |
|
39
|
+
|------------|------------|
|
40
|
+
<% notice.env_vars.each do |key, val| %>| <%= key %> | <%= val %> |
|
41
|
+
<% end %>
|
42
|
+
<% end %>
|
43
|
+
<% end %>
|
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
19
|
spec.require_paths = ["lib"]
|
20
20
|
|
21
|
-
spec.add_runtime_dependency 'errbit_plugin', '~> 0.
|
22
|
-
spec.add_runtime_dependency 'gitlab', '~> 3.
|
21
|
+
spec.add_runtime_dependency 'errbit_plugin', '~> 0.5', '>= 0.5.0'
|
22
|
+
spec.add_runtime_dependency 'gitlab', '~> 3.4', '>= 3.4.0'
|
23
23
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.3'
|
25
25
|
spec.add_development_dependency 'rake', '~> 0'
|
data/lib/errbit_gitlab_plugin.rb
CHANGED
@@ -4,7 +4,11 @@ require 'errbit_gitlab_plugin/rails'
|
|
4
4
|
|
5
5
|
module ErrbitGitlabPlugin
|
6
6
|
def self.root
|
7
|
-
File.expand_path
|
7
|
+
Pathname.new File.expand_path('../..', __FILE__)
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.read_static_file(file)
|
11
|
+
File.read(root.join('static', file))
|
8
12
|
end
|
9
13
|
end
|
10
14
|
|
@@ -4,25 +4,24 @@ module ErrbitGitlabPlugin
|
|
4
4
|
class IssueTracker < ErrbitPlugin::IssueTracker
|
5
5
|
LABEL = 'gitlab'
|
6
6
|
|
7
|
-
NOTE =
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
:
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
]
|
7
|
+
NOTE = "Creating issues may take some time as the actual project ID has to be looked up using the Gitlab API. <br/>
|
8
|
+
If you are using gitlab.com as installation, please make sure to use 'https://', otherwise, their API
|
9
|
+
will not accept some of the our commands."
|
10
|
+
|
11
|
+
FIELDS = {
|
12
|
+
endpoint: {
|
13
|
+
label: 'Gitlab URL',
|
14
|
+
placeholder: 'The URL to your gitlab installation or the public gitlab server, e.g. https://www.gitlab.com'
|
15
|
+
},
|
16
|
+
api_token: {
|
17
|
+
label: 'API Token',
|
18
|
+
placeholder: "Your account's API token (see Profile -> Account)"
|
19
|
+
},
|
20
|
+
path_with_namespace: {
|
21
|
+
label: 'Project name',
|
22
|
+
placeholder: 'E.g. your_username/your_project'
|
23
|
+
}
|
24
|
+
}
|
26
25
|
|
27
26
|
def self.label
|
28
27
|
LABEL
|
@@ -32,66 +31,148 @@ module ErrbitGitlabPlugin
|
|
32
31
|
NOTE
|
33
32
|
end
|
34
33
|
|
34
|
+
#
|
35
|
+
# Form fields that will be presented to the administrator when setting up
|
36
|
+
# or editing the errbit app. The values we collect will be available for use
|
37
|
+
# later when we have an instance of this class.
|
38
|
+
#
|
35
39
|
def self.fields
|
36
40
|
FIELDS
|
37
41
|
end
|
38
42
|
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
43
|
+
#
|
44
|
+
# Icons to be displayed for this issue tracker
|
45
|
+
#
|
46
|
+
def self.icons
|
47
|
+
@icons ||= {
|
48
|
+
create: ['image/png', ErrbitGitlabPlugin.read_static_file('gitlab_create.png')],
|
49
|
+
goto: ['image/png', ErrbitGitlabPlugin.read_static_file('gitlab_goto.png')],
|
50
|
+
inactive: ['image/png', ErrbitGitlabPlugin.read_static_file('gitlab_inactive.png')]
|
51
|
+
}
|
45
52
|
end
|
46
53
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
54
|
+
#
|
55
|
+
# Used to pass an own template to errbit's issue rendering.
|
56
|
+
# The rendered template is then passed to any #create_issue call.
|
57
|
+
#
|
58
|
+
def render_body_args
|
59
|
+
['errbit_gitlab_plugin/issue', :formats => [:md]]
|
53
60
|
end
|
54
61
|
|
62
|
+
#
|
63
|
+
# @return [String] the URL to the given project's issues section
|
64
|
+
#
|
55
65
|
def url
|
56
|
-
|
66
|
+
format '%s/%s/issues', options[:endpoint], options[:path_with_namespace]
|
57
67
|
end
|
58
68
|
|
59
69
|
def configured?
|
60
|
-
|
70
|
+
self.class.fields.keys.all? { |field_name| options[field_name].present? }
|
61
71
|
end
|
62
72
|
|
63
|
-
def comments_allowed
|
73
|
+
def comments_allowed?
|
74
|
+
true
|
75
|
+
end
|
64
76
|
|
77
|
+
# Called to validate user input. Just return a hash of errors if there are any
|
65
78
|
def errors
|
66
|
-
|
67
|
-
|
68
|
-
|
79
|
+
errs = []
|
80
|
+
|
81
|
+
# Make sure that every field is filled out
|
82
|
+
self.class.fields.except(:project_id).each_with_object({}) do |(field_name, field_options), h|
|
83
|
+
if options[field_name].blank?
|
84
|
+
errs << "#{field_options[:label]} must be present"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# We can only perform the other tests if the necessary values are at least present
|
89
|
+
return {:base => errs.to_sentence} unless errs.size.zero?
|
90
|
+
|
91
|
+
# Check if the given endpoint actually exists
|
92
|
+
unless gitlab_endpoint_exists?(options[:endpoint])
|
93
|
+
errs << 'No Gitlab installation was found under the given URL'
|
94
|
+
return {:base => errs.to_sentence}
|
95
|
+
end
|
96
|
+
|
97
|
+
# Check if a user by the given token exists
|
98
|
+
unless gitlab_user_exists?(options[:endpoint], options[:api_token])
|
99
|
+
errs << 'No user with the given API token was found'
|
100
|
+
return {:base => errs.to_sentence}
|
101
|
+
end
|
102
|
+
|
103
|
+
# Check if there is a project with the given name on the server
|
104
|
+
unless gitlab_project_id(options[:endpoint], options[:api_token], options[:path_with_namespace])
|
105
|
+
errs << "A project named '#{options[:path_with_namespace]}' could not be found on the server.
|
106
|
+
Please make sure to enter it exactly as it appears in your address bar in Gitlab (case sensitive)"
|
107
|
+
return {:base => errs.to_sentence}
|
108
|
+
end
|
109
|
+
|
110
|
+
{}
|
111
|
+
end
|
112
|
+
|
113
|
+
def create_issue(title, body, reported_by = nil)
|
114
|
+
ticket = with_gitlab do |g|
|
115
|
+
g.create_issue(gitlab_project_id, title, description: body, labels: 'errbit')
|
69
116
|
end
|
70
|
-
|
117
|
+
|
118
|
+
format('%s/%s', url, ticket.id)
|
71
119
|
end
|
72
120
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
121
|
+
private
|
122
|
+
|
123
|
+
#
|
124
|
+
# Tries to find a project with the given name in the given Gitlab installation
|
125
|
+
# and returns its ID (if any)
|
126
|
+
#
|
127
|
+
def gitlab_project_id(gitlab_url = options[:endpoint], token = options[:api_token], project = options[:path_with_namespace])
|
128
|
+
@project_id ||= with_gitlab(gitlab_url, token) do |g|
|
129
|
+
g.projects.detect { |p| p.path_with_namespace == project }.try(:id)
|
78
130
|
end
|
131
|
+
end
|
79
132
|
|
80
|
-
|
81
|
-
|
82
|
-
|
133
|
+
#
|
134
|
+
# @return [String] a formatted APIv3 URL for the given +gitlab_url+
|
135
|
+
#
|
136
|
+
def gitlab_endpoint(gitlab_url)
|
137
|
+
format '%s/api/v3', gitlab_url
|
138
|
+
end
|
83
139
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
140
|
+
#
|
141
|
+
# Checks whether there is a gitlab installation
|
142
|
+
# at the given +gitlab_url+
|
143
|
+
#
|
144
|
+
def gitlab_endpoint_exists?(gitlab_url)
|
145
|
+
with_gitlab(gitlab_url, 'Iamsecret') do |g|
|
146
|
+
g.user
|
147
|
+
end
|
148
|
+
rescue Gitlab::Error::Unauthorized
|
149
|
+
true
|
150
|
+
rescue Exception
|
151
|
+
false
|
152
|
+
end
|
88
153
|
|
89
|
-
|
154
|
+
#
|
155
|
+
# Checks whether a user with the given +token+ exists
|
156
|
+
# in the gitlab installation located at +gitlab_url+
|
157
|
+
#
|
158
|
+
def gitlab_user_exists?(gitlab_url, private_token)
|
159
|
+
with_gitlab(gitlab_url, private_token) do |g|
|
160
|
+
g.user
|
161
|
+
end
|
162
|
+
|
163
|
+
true
|
164
|
+
rescue Gitlab::Error::Unauthorized
|
165
|
+
false
|
166
|
+
end
|
90
167
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
168
|
+
#
|
169
|
+
# Connects to the gitlab installation at +gitlab_url+
|
170
|
+
# using the given +private_token+ and executes the given block
|
171
|
+
#
|
172
|
+
def with_gitlab(gitlab_url = options[:endpoint], private_token = options[:api_token])
|
173
|
+
yield Gitlab.client(endpoint: gitlab_endpoint(gitlab_url),
|
174
|
+
private_token: private_token,
|
175
|
+
user_agent: 'Errbit User Agent')
|
95
176
|
end
|
96
177
|
end
|
97
178
|
end
|
File without changes
|
File without changes
|
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: errbit_gitlab_plugin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stephen Crosby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-10-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: errbit_plugin
|
@@ -16,40 +16,40 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.5'
|
20
20
|
- - ">="
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 0.
|
22
|
+
version: 0.5.0
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
26
26
|
requirements:
|
27
27
|
- - "~>"
|
28
28
|
- !ruby/object:Gem::Version
|
29
|
-
version: '0.
|
29
|
+
version: '0.5'
|
30
30
|
- - ">="
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 0.
|
32
|
+
version: 0.5.0
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: gitlab
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: 3.
|
39
|
+
version: '3.4'
|
40
40
|
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 3.
|
42
|
+
version: 3.4.0
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: 3.
|
49
|
+
version: '3.4'
|
50
50
|
- - ">="
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: 3.
|
52
|
+
version: 3.4.0
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
54
|
name: bundler
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -91,16 +91,15 @@ files:
|
|
91
91
|
- LICENSE.txt
|
92
92
|
- README.md
|
93
93
|
- Rakefile
|
94
|
+
- app/views/errbit_gitlab_plugin/issue.md.erb
|
94
95
|
- errbit_gitlab_plugin.gemspec
|
95
96
|
- lib/errbit_gitlab_plugin.rb
|
96
97
|
- lib/errbit_gitlab_plugin/issue_tracker.rb
|
97
98
|
- lib/errbit_gitlab_plugin/rails.rb
|
98
99
|
- lib/errbit_gitlab_plugin/version.rb
|
99
|
-
-
|
100
|
-
-
|
101
|
-
-
|
102
|
-
- views/gitlab_issues_body.txt.erb
|
103
|
-
- views/gitlab_issues_summary.txt.erb
|
100
|
+
- static/gitlab_create.png
|
101
|
+
- static/gitlab_goto.png
|
102
|
+
- static/gitlab_inactive.png
|
104
103
|
homepage: https://github.com/brandedcrate/errbit_gitlab_plugin
|
105
104
|
licenses:
|
106
105
|
- MIT
|
@@ -1,29 +0,0 @@
|
|
1
|
-
<% if notice = problem.notices.first %>
|
2
|
-
## Params ##
|
3
|
-
```
|
4
|
-
<%= pretty_hash(notice.params) %>
|
5
|
-
```
|
6
|
-
|
7
|
-
## Session ##
|
8
|
-
```
|
9
|
-
<%= pretty_hash(notice.session) %>
|
10
|
-
```
|
11
|
-
|
12
|
-
## Backtrace ##
|
13
|
-
```
|
14
|
-
<% notice.backtrace_lines.each do |line| %><%= line.number %>: <%= line.file_relative %> -> **<%= line.method %>**
|
15
|
-
<% end %>
|
16
|
-
```
|
17
|
-
|
18
|
-
## Environment ##
|
19
|
-
|
20
|
-
<table>
|
21
|
-
<% for key, val in notice.env_vars %>
|
22
|
-
<tr>
|
23
|
-
<td><%= key %>:</td>
|
24
|
-
<td><%= val %></td>
|
25
|
-
</tr>
|
26
|
-
<% end %>
|
27
|
-
</table>
|
28
|
-
<% end %>
|
29
|
-
|
@@ -1,17 +0,0 @@
|
|
1
|
-
[See this exception on Errbit](<%= problem.url %> "See this exception on Errbit")
|
2
|
-
<% if notice = problem.notices.first %>
|
3
|
-
# <%= notice.message %> #
|
4
|
-
## Summary ##
|
5
|
-
<% if notice.request['url'].present? %>
|
6
|
-
### URL ###
|
7
|
-
[<%= notice.request['url'] %>](<%= notice.request['url'] %>)"
|
8
|
-
<% end %>
|
9
|
-
### Where ###
|
10
|
-
<%= notice.where %>
|
11
|
-
|
12
|
-
### Occured ###
|
13
|
-
<%= notice.created_at.to_s(:micro) %>
|
14
|
-
|
15
|
-
### Similar ###
|
16
|
-
<%= (notice.problem.notices_count - 1).to_s %>
|
17
|
-
<% end %>
|