errbit_gitlab_plugin 0.1.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 %>
|