redmine_github_hook 2.2.0 → 2.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Gemfile +1 -1
- data/Rakefile +2 -2
- data/app/controllers/github_hook_controller.rb +1 -1
- data/app/services/github_hook/null_logger.rb +3 -0
- data/app/services/github_hook/updater.rb +57 -35
- data/config/routes.rb +2 -2
- data/init.rb +6 -6
- data/lib/redmine_github_hook/version.rb +1 -1
- data/redmine_github_hook.gemspec +2 -2
- data/test/functional/github_hook_controller_test.rb +13 -11
- data/test/test_helper.rb +1 -1
- data/test/unit/github_hook/message_logger_test.rb +3 -3
- data/test/unit/github_hook/updater_test.rb +57 -27
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e557b9c48ee315b46a409c913a296b78ad7667832b77e2f377c3f2f969f4b4e0
|
4
|
+
data.tar.gz: 1906894bae718bd12f182ffc30410a84839be42b150a706f21c312d4b98c4ec5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b876106487d0e71584dd3f430e859b77ad9bfcc1155b8eb67612fb8865f1b0f9c411d45300d1772a6db337b2b98362b77a60f416ec4ecd8af38fa86a3304938e
|
7
|
+
data.tar.gz: 516cf70b6d902b863b3f7646ed69613250bd3c1d9736ddcc4afe7b947ad1ebb05dc0601e10d62b10ec4916a04d34626f48491b0c9d947f6b35600f3ab69213b1
|
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module GithubHook
|
2
2
|
class Updater
|
3
|
-
GIT_BIN = Redmine::Configuration[
|
3
|
+
GIT_BIN = Redmine::Configuration["scm_git_command"] || "git"
|
4
4
|
|
5
5
|
attr_writer :logger
|
6
6
|
|
@@ -23,7 +23,7 @@ module GithubHook
|
|
23
23
|
repository.fetch_changesets
|
24
24
|
tr2 = Time.now
|
25
25
|
|
26
|
-
logger.info { " GithubHook: Redmine repository updated: #{repository.identifier} (Git: #{time_diff_milli(tg1,tg2)}ms, Redmine: #{time_diff_milli(tr1,tr2)}ms)" }
|
26
|
+
logger.info { " GithubHook: Redmine repository updated: #{repository.identifier} (Git: #{time_diff_milli(tg1, tg2)}ms, Redmine: #{time_diff_milli(tr1, tr2)}ms)" }
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -40,7 +40,7 @@ module GithubHook
|
|
40
40
|
logger.debug { " GithubHook: Executing command: '#{command}'" }
|
41
41
|
|
42
42
|
# Get a path to a temp file
|
43
|
-
logfile = Tempfile.new(
|
43
|
+
logfile = Tempfile.new("github_hook_exec")
|
44
44
|
logfile.close
|
45
45
|
|
46
46
|
full_command = "#{command} > #{logfile.path} 2>&1"
|
@@ -54,9 +54,9 @@ module GithubHook
|
|
54
54
|
|
55
55
|
output_from_command = File.readlines(logfile.path)
|
56
56
|
if success
|
57
|
-
logger.debug { " GithubHook: Command output: #{output_from_command.inspect}"}
|
57
|
+
logger.debug { " GithubHook: Command output: #{output_from_command.inspect}" }
|
58
58
|
else
|
59
|
-
logger.error { " GithubHook: Command '#{command}' didn't exit properly. Full output: #{output_from_command.inspect}"}
|
59
|
+
logger.error { " GithubHook: Command '#{command}' didn't exit properly. Full output: #{output_from_command.inspect}" }
|
60
60
|
end
|
61
61
|
|
62
62
|
return success
|
@@ -64,62 +64,82 @@ module GithubHook
|
|
64
64
|
logfile.unlink if logfile && logfile.respond_to?(:unlink)
|
65
65
|
end
|
66
66
|
|
67
|
-
# Finds the Redmine project in the database based on the given project
|
67
|
+
# Finds the Redmine project in the database based on the given project
|
68
|
+
# identifier
|
68
69
|
def find_project
|
69
70
|
identifier = get_identifier
|
70
71
|
project = Project.find_by_identifier(identifier.downcase)
|
71
|
-
|
72
|
-
|
72
|
+
fail(
|
73
|
+
ActiveRecord::RecordNotFound,
|
74
|
+
"No project found with identifier '#{identifier}'"
|
75
|
+
) if project.nil?
|
76
|
+
project
|
73
77
|
end
|
74
78
|
|
75
79
|
# Returns the Redmine Repository object we are trying to update
|
76
80
|
def find_repositories
|
77
81
|
project = find_project
|
78
|
-
repositories = project
|
79
|
-
repo.is_a?(Repository::Git)
|
80
|
-
end
|
82
|
+
repositories = git_repositories(project)
|
81
83
|
|
82
|
-
if
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
# if a specific repository id is passed in url parameter "repository_id", then try to find it in
|
87
|
-
# the list of current project repositories and use only this and not all to pull changes from
|
88
|
-
# (issue #54)
|
89
|
-
if params.has_key?(:repository_id)
|
84
|
+
# if a specific repository id is passed in url parameter "repository_id",
|
85
|
+
# then try to find it in the list of current project repositories and use
|
86
|
+
# only this and not all to pull changes from (issue #54)
|
87
|
+
if params.key?(:repository_id)
|
90
88
|
param_repo = repositories.select do |repo|
|
91
89
|
repo.identifier == params[:repository_id]
|
92
90
|
end
|
93
91
|
|
94
|
-
if param_repo.nil?
|
95
|
-
logger.info {
|
92
|
+
if param_repo.nil? || param_repo.length == 0
|
93
|
+
logger.info {
|
94
|
+
"GithubHook: The repository '#{params[:repository_id]}' isn't " \
|
95
|
+
"in the list of projects repos. Updating all repos instead."
|
96
|
+
}
|
96
97
|
|
97
98
|
else
|
98
99
|
repositories = param_repo
|
99
100
|
end
|
100
101
|
end
|
101
102
|
|
102
|
-
|
103
|
+
repositories
|
103
104
|
end
|
104
105
|
|
105
|
-
# Gets the project identifier from the querystring parameters and if that's
|
106
|
-
# the Github repository name is the same as the project
|
106
|
+
# Gets the project identifier from the querystring parameters and if that's
|
107
|
+
# not supplied, assume the Github repository name is the same as the project
|
108
|
+
# identifier.
|
107
109
|
def get_identifier
|
108
110
|
identifier = get_project_name
|
109
|
-
|
110
|
-
|
111
|
+
fail(
|
112
|
+
ActiveRecord::RecordNotFound,
|
113
|
+
"Project identifier not specified"
|
114
|
+
) if identifier.nil?
|
115
|
+
identifier.to_s
|
111
116
|
end
|
112
117
|
|
113
|
-
# Attempts to find the project name. It first looks in the params, then in
|
114
|
-
# payload if params[:project_id] isn't given.
|
118
|
+
# Attempts to find the project name. It first looks in the params, then in
|
119
|
+
# the payload if params[:project_id] isn't given.
|
115
120
|
def get_project_name
|
116
|
-
params[:project_id]
|
121
|
+
project_id = params[:project_id]
|
122
|
+
name_from_repository = payload.fetch("repository", {}).fetch("name", nil)
|
123
|
+
project_id || name_from_repository
|
117
124
|
end
|
118
125
|
|
119
126
|
def git_command(command)
|
120
127
|
GIT_BIN + " #{command}"
|
121
128
|
end
|
122
129
|
|
130
|
+
def git_repositories(project)
|
131
|
+
repositories = project.repositories.select do |repo|
|
132
|
+
repo.is_a?(Repository::Git)
|
133
|
+
end
|
134
|
+
if repositories.empty?
|
135
|
+
fail(
|
136
|
+
TypeError,
|
137
|
+
"Project '#{project}' ('#{project.identifier}') has no repository"
|
138
|
+
)
|
139
|
+
end
|
140
|
+
repositories || []
|
141
|
+
end
|
142
|
+
|
123
143
|
def logger
|
124
144
|
@logger || NullLogger.new
|
125
145
|
end
|
@@ -134,12 +154,14 @@ module GithubHook
|
|
134
154
|
|
135
155
|
# Fetches updates from the remote repository
|
136
156
|
def update_repository(repository)
|
137
|
-
command = git_command(
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
157
|
+
command = git_command("fetch origin")
|
158
|
+
fetch = exec(command, repository.url)
|
159
|
+
return nil unless fetch
|
160
|
+
|
161
|
+
command = git_command(
|
162
|
+
"fetch --prune origin \"+refs/heads/*:refs/heads/*\""
|
163
|
+
)
|
164
|
+
exec(command, repository.url)
|
142
165
|
end
|
143
|
-
|
144
166
|
end
|
145
167
|
end
|
data/config/routes.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
1
|
RedmineApp::Application.routes.draw do
|
2
|
-
match
|
3
|
-
match
|
2
|
+
match "github_hook" => 'github_hook#index', :via => [:post]
|
3
|
+
match "github_hook" => 'github_hook#welcome', :via => [:get]
|
4
4
|
end
|
data/init.rb
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "redmine"
|
2
2
|
|
3
3
|
Redmine::Plugin.register :redmine_github_hook do
|
4
|
-
name
|
5
|
-
author
|
6
|
-
description
|
7
|
-
url
|
8
|
-
author_url
|
4
|
+
name "Redmine Github Hook plugin"
|
5
|
+
author "Jakob Skjerning"
|
6
|
+
description "This plugin allows your Redmine installation to receive Github post-receive notifications"
|
7
|
+
url "https://github.com/koppen/redmine_github_hook"
|
8
|
+
author_url "http://mentalized.net"
|
9
9
|
version RedmineGithubHook::VERSION
|
10
10
|
end
|
data/redmine_github_hook.gemspec
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# coding: utf-8
|
2
|
-
lib = File.expand_path(
|
2
|
+
lib = File.expand_path("../lib", __FILE__)
|
3
3
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
-
require
|
4
|
+
require "redmine_github_hook/version"
|
5
5
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "redmine_github_hook"
|
@@ -1,7 +1,7 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "minitest"
|
4
|
+
require "mocha"
|
5
5
|
|
6
6
|
class GithubHookControllerTest < ActionController::TestCase
|
7
7
|
def json
|
@@ -65,7 +65,7 @@ class GithubHookControllerTest < ActionController::TestCase
|
|
65
65
|
end
|
66
66
|
|
67
67
|
def setup
|
68
|
-
Project.stubs(:find_by_identifier).with(
|
68
|
+
Project.stubs(:find_by_identifier).with("github").returns(project)
|
69
69
|
|
70
70
|
# Make sure we don't run actual commands in test
|
71
71
|
GithubHook::Updater.any_instance.expects(:system).never
|
@@ -76,21 +76,24 @@ class GithubHookControllerTest < ActionController::TestCase
|
|
76
76
|
post :index, :payload => json
|
77
77
|
end
|
78
78
|
|
79
|
-
def
|
79
|
+
def test_should_render_response_from_github_hook_when_done
|
80
80
|
GithubHook::Updater.any_instance.expects(:update_repository).returns(true)
|
81
81
|
do_post
|
82
82
|
assert_response :success
|
83
|
-
|
83
|
+
assert_match "GithubHook: Redmine repository updated", @response.body
|
84
84
|
end
|
85
85
|
|
86
86
|
def test_should_render_error_message
|
87
|
-
GithubHook::Updater
|
87
|
+
GithubHook::Updater
|
88
|
+
.any_instance
|
89
|
+
.expects(:update_repository)
|
90
|
+
.raises(ActiveRecord::RecordNotFound.new("Repository not found"))
|
88
91
|
do_post
|
89
92
|
assert_response :not_found
|
90
93
|
assert_equal({
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
+
"title" => "ActiveRecord::RecordNotFound",
|
95
|
+
"message" => "Repository not found"
|
96
|
+
}, JSON.parse(@response.body))
|
94
97
|
end
|
95
98
|
|
96
99
|
def test_should_not_require_login
|
@@ -115,5 +118,4 @@ class GithubHookControllerTest < ActionController::TestCase
|
|
115
118
|
get :index
|
116
119
|
assert_response :success
|
117
120
|
end
|
118
|
-
|
119
121
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,2 +1,2 @@
|
|
1
1
|
# Load the normal Rails helper from the Redmine host app
|
2
|
-
require File.expand_path(File.dirname(__FILE__) +
|
2
|
+
require File.expand_path(File.dirname(__FILE__) + "/../../../test/test_helper")
|
@@ -1,9 +1,9 @@
|
|
1
1
|
# require 'test_helper'
|
2
|
-
require "
|
2
|
+
require "minitest/autorun"
|
3
3
|
require_relative "../../../app/services/github_hook/message_logger"
|
4
4
|
|
5
|
-
class MessageLoggerTest < Test
|
6
|
-
setup
|
5
|
+
class MessageLoggerTest < Minitest::Test
|
6
|
+
def setup
|
7
7
|
@logger = GithubHook::MessageLogger.new
|
8
8
|
end
|
9
9
|
|
@@ -1,10 +1,9 @@
|
|
1
|
-
require
|
1
|
+
require "test_helper"
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
|
6
|
-
class GithubHookUpdaterTest < Test::Unit::TestCase
|
3
|
+
require "minitest/autorun"
|
4
|
+
require "mocha"
|
7
5
|
|
6
|
+
class GithubHookUpdaterTest < Minitest::Test
|
8
7
|
def project
|
9
8
|
return @project if @project
|
10
9
|
|
@@ -21,10 +20,21 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
21
20
|
@repository
|
22
21
|
end
|
23
22
|
|
23
|
+
# rubocop:disable Metrics/LineLength
|
24
24
|
def payload
|
25
25
|
# Ruby hash with the parsed data from the JSON payload
|
26
|
-
{
|
27
|
-
|
26
|
+
{
|
27
|
+
"before" => "5aef35982fb2d34e9d9d4502f6ede1072793222d",
|
28
|
+
"repository" => {"url" => "http://github.com/defunkt/github", "name" => "github", "description" => "You're lookin' at it.", "watchers" => 5, "forks" => 2, "private" => 1, "owner" => {"email" => "chris@ozmm.org", "name" => "defunkt"}},
|
29
|
+
"commits" => [
|
30
|
+
{"id" => "41a212ee83ca127e3c8cf465891ab7216a705f59", "url" => "http://github.com/defunkt/github/commit/41a212ee83ca127e3c8cf465891ab7216a705f59", "author" => {"email" => "chris@ozmm.org", "name" => "Chris Wanstrath"}, "message" => "okay i give in", "timestamp" => "2008-02-15T14:57:17-08:00", "added" => ["filepath.rb"]},
|
31
|
+
{"id" => "de8251ff97ee194a289832576287d6f8ad74e3d0", "url" => "http://github.com/defunkt/github/commit/de8251ff97ee194a289832576287d6f8ad74e3d0", "author" => {"email" => "chris@ozmm.org", "name" => "Chris Wanstrath"}, "message" => "update pricing a tad", "timestamp" => "2008-02-15T14:36:34-08:00"}
|
32
|
+
],
|
33
|
+
"after" => "de8251ff97ee194a289832576287d6f8ad74e3d0",
|
34
|
+
"ref" => "refs/heads/master"
|
35
|
+
}
|
36
|
+
end
|
37
|
+
# rubocop:enable Metrics/LineLength
|
28
38
|
|
29
39
|
def build_updater(payload, options = {})
|
30
40
|
updater = GithubHook::Updater.new(payload, options)
|
@@ -38,7 +48,7 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
38
48
|
end
|
39
49
|
|
40
50
|
def setup
|
41
|
-
Project.stubs(:find_by_identifier).with(
|
51
|
+
Project.stubs(:find_by_identifier).with("github").returns(project)
|
42
52
|
|
43
53
|
# Make sure we don't run actual commands in test
|
44
54
|
GithubHook::Updater.any_instance.expects(:system).never
|
@@ -50,7 +60,7 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
50
60
|
end
|
51
61
|
|
52
62
|
def test_uses_repository_name_as_project_identifier
|
53
|
-
Project.expects(:find_by_identifier).with(
|
63
|
+
Project.expects(:find_by_identifier).with("github").returns(project)
|
54
64
|
updater.call
|
55
65
|
end
|
56
66
|
|
@@ -60,20 +70,40 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
60
70
|
end
|
61
71
|
|
62
72
|
def test_resets_repository_when_fetch_origin_succeeds
|
63
|
-
updater
|
64
|
-
|
73
|
+
updater
|
74
|
+
.expects(:exec)
|
75
|
+
.with("git fetch origin", repository.url)
|
76
|
+
.returns(true)
|
77
|
+
updater
|
78
|
+
.expects(:exec)
|
79
|
+
.with(
|
80
|
+
"git fetch --prune origin \"+refs/heads/*:refs/heads/*\"",
|
81
|
+
repository.url
|
82
|
+
)
|
65
83
|
updater.call
|
66
84
|
end
|
67
85
|
|
68
86
|
def test_resets_repository_when_fetch_origin_fails
|
69
|
-
updater
|
70
|
-
|
87
|
+
updater
|
88
|
+
.expects(:exec)
|
89
|
+
.with("git fetch origin", repository.url)
|
90
|
+
.returns(false)
|
91
|
+
updater
|
92
|
+
.expects(:exec)
|
93
|
+
.with("git reset --soft refs\/remotes\/origin\/master", repository.url)
|
94
|
+
.never
|
71
95
|
updater.call
|
72
96
|
end
|
73
97
|
|
74
98
|
def test_uses_project_identifier_from_request
|
75
|
-
Project.expects(:find_by_identifier).with(
|
76
|
-
updater = build_updater(payload,
|
99
|
+
Project.expects(:find_by_identifier).with("redmine").returns(project)
|
100
|
+
updater = build_updater(payload, :project_id => "redmine")
|
101
|
+
updater.call
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_uses_project_identifier_from_request_as_numeric
|
105
|
+
Project.expects(:find_by_identifier).with("42").returns(project)
|
106
|
+
updater = build_updater(payload, :project_id => 42)
|
77
107
|
updater.call
|
78
108
|
end
|
79
109
|
|
@@ -92,7 +122,7 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
92
122
|
another_repository.expects(:fetch_changesets).never
|
93
123
|
project.repositories << another_repository
|
94
124
|
|
95
|
-
updater = build_updater(payload,
|
125
|
+
updater = build_updater(payload, :repository_id => "redmine")
|
96
126
|
updater.expects(:exec).with("git fetch origin", repository.url)
|
97
127
|
updater.call
|
98
128
|
end
|
@@ -102,7 +132,7 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
102
132
|
another_repository.expects(:fetch_changesets).returns(true)
|
103
133
|
project.repositories << another_repository
|
104
134
|
|
105
|
-
updater = build_updater(payload,
|
135
|
+
updater = build_updater(payload, :repository_id => "redmine or something")
|
106
136
|
updater.expects(:exec).with("git fetch origin", repository.url)
|
107
137
|
updater.call
|
108
138
|
end
|
@@ -116,23 +146,23 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
116
146
|
|
117
147
|
def test_raises_record_not_found_if_project_identifier_not_given
|
118
148
|
assert_raises ActiveRecord::RecordNotFound do
|
119
|
-
updater = build_updater(payload.merge(
|
149
|
+
updater = build_updater(payload.merge("repository" => {}))
|
120
150
|
updater.call
|
121
151
|
end
|
122
152
|
end
|
123
153
|
|
124
154
|
def test_raises_record_not_found_if_project_not_found
|
125
155
|
assert_raises ActiveRecord::RecordNotFound do
|
126
|
-
Project.expects(:find_by_identifier).with(
|
127
|
-
updater = build_updater(payload,
|
156
|
+
Project.expects(:find_by_identifier).with("foobar").returns(nil)
|
157
|
+
updater = build_updater(payload, :project_id => "foobar")
|
128
158
|
updater.call
|
129
159
|
end
|
130
160
|
end
|
131
161
|
|
132
162
|
def test_downcases_identifier
|
133
163
|
# Redmine project identifiers are always downcase
|
134
|
-
Project.expects(:find_by_identifier).with(
|
135
|
-
updater = build_updater(payload,
|
164
|
+
Project.expects(:find_by_identifier).with("redmine").returns(project)
|
165
|
+
updater = build_updater(payload, :project_id => "ReDmInE")
|
136
166
|
updater.call
|
137
167
|
end
|
138
168
|
|
@@ -144,19 +174,19 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
144
174
|
|
145
175
|
def test_raises_type_error_if_project_has_no_repository
|
146
176
|
assert_raises TypeError do
|
147
|
-
project = mock(
|
177
|
+
project = mock("project", :to_s => "My Project", :identifier => "github")
|
148
178
|
project.expects(:repositories).returns([])
|
149
|
-
Project.expects(:find_by_identifier).with(
|
179
|
+
Project.expects(:find_by_identifier).with("github").returns(project)
|
150
180
|
updater.call
|
151
181
|
end
|
152
182
|
end
|
153
183
|
|
154
184
|
def test_raises_type_error_if_repository_is_not_git
|
155
185
|
assert_raises TypeError do
|
156
|
-
project = mock(
|
186
|
+
project = mock("project", :to_s => "My Project", :identifier => "github")
|
157
187
|
repository = Repository::Subversion.new
|
158
188
|
project.expects(:repositories).at_least(1).returns([repository])
|
159
|
-
Project.expects(:find_by_identifier).with(
|
189
|
+
Project.expects(:find_by_identifier).with("github").returns(project)
|
160
190
|
updater.call
|
161
191
|
end
|
162
192
|
end
|
@@ -165,7 +195,7 @@ class GithubHookUpdaterTest < Test::Unit::TestCase
|
|
165
195
|
updater = GithubHook::Updater.new(payload)
|
166
196
|
updater.stubs(:exec).returns(true)
|
167
197
|
|
168
|
-
logger = stub(
|
198
|
+
logger = stub("Logger")
|
169
199
|
logger.expects(:info).at_least_once
|
170
200
|
updater.logger = logger
|
171
201
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: redmine_github_hook
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.2.
|
4
|
+
version: 2.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jakob Skjerning
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-11-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -85,7 +85,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
85
|
version: '0'
|
86
86
|
requirements: []
|
87
87
|
rubyforge_project:
|
88
|
-
rubygems_version: 2.
|
88
|
+
rubygems_version: 2.7.6
|
89
89
|
signing_key:
|
90
90
|
specification_version: 4
|
91
91
|
summary: Allow your Redmine installation to be notified when changes have been pushed
|