txgh-server 3.1.0 → 4.0.0.beta
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 +5 -5
- data/lib/txgh-server.rb +1 -0
- data/lib/txgh-server/application.rb +7 -1
- data/lib/txgh-server/download_handler.rb +1 -1
- data/lib/txgh-server/gitlab_request_auth.rb +13 -0
- data/lib/txgh-server/triggers/handler.rb +18 -1
- data/lib/txgh-server/triggers/pull_handler.rb +1 -10
- data/lib/txgh-server/triggers/push_handler.rb +1 -10
- data/lib/txgh-server/version.rb +1 -1
- data/lib/txgh-server/webhooks.rb +2 -0
- data/lib/txgh-server/webhooks/git.rb +15 -0
- data/lib/txgh-server/webhooks/git/blank_attributes.rb +20 -0
- data/lib/txgh-server/webhooks/git/delete_attributes.rb +54 -0
- data/lib/txgh-server/webhooks/git/delete_handler.rb +45 -0
- data/lib/txgh-server/webhooks/git/ping_handler.rb +21 -0
- data/lib/txgh-server/webhooks/git/push_attributes.rb +79 -0
- data/lib/txgh-server/webhooks/git/push_handler.rb +98 -0
- data/lib/txgh-server/webhooks/git/request_handler.rb +76 -0
- data/lib/txgh-server/webhooks/git/status_updater.rb +15 -0
- data/lib/txgh-server/webhooks/github/blank_attributes.rb +1 -13
- data/lib/txgh-server/webhooks/github/delete_attributes.rb +1 -38
- data/lib/txgh-server/webhooks/github/delete_handler.rb +1 -38
- data/lib/txgh-server/webhooks/github/ping_handler.rb +1 -12
- data/lib/txgh-server/webhooks/github/push_attributes.rb +1 -51
- data/lib/txgh-server/webhooks/github/push_handler.rb +2 -88
- data/lib/txgh-server/webhooks/github/request_handler.rb +2 -47
- data/lib/txgh-server/webhooks/github/status_updater.rb +1 -9
- data/lib/txgh-server/webhooks/gitlab.rb +14 -0
- data/lib/txgh-server/webhooks/gitlab/blank_attributes.rb +8 -0
- data/lib/txgh-server/webhooks/gitlab/delete_attributes.rb +17 -0
- data/lib/txgh-server/webhooks/gitlab/delete_handler.rb +8 -0
- data/lib/txgh-server/webhooks/gitlab/push_attributes.rb +29 -0
- data/lib/txgh-server/webhooks/gitlab/push_handler.rb +13 -0
- data/lib/txgh-server/webhooks/gitlab/request_handler.rb +59 -0
- data/lib/txgh-server/webhooks/gitlab/status_updater.rb +37 -0
- data/lib/txgh-server/webhooks/transifex/request_handler.rb +1 -1
- data/spec/application_spec.rb +11 -11
- data/spec/download_handler_spec.rb +6 -8
- data/spec/github_request_auth_spec.rb +6 -8
- data/spec/gitlab_request_auth_spec.rb +26 -0
- data/spec/helpers/gitlab_payload_builder.rb +132 -0
- data/spec/integration/hooks_spec.rb +1 -1
- data/spec/tgz_stream_response_spec.rb +2 -4
- data/spec/transifex_request_auth_spec.rb +6 -8
- data/spec/webhooks/github/delete_attributes_spec.rb +2 -5
- data/spec/webhooks/github/delete_handler_spec.rb +4 -7
- data/spec/webhooks/github/ping_handler_spec.rb +2 -5
- data/spec/webhooks/github/push_attributes_spec.rb +3 -6
- data/spec/webhooks/github/push_handler_spec.rb +5 -8
- data/spec/webhooks/github/request_handler_spec.rb +8 -10
- data/spec/webhooks/github/status_updater_spec.rb +2 -4
- data/spec/webhooks/gitlab/delete_attributes_spec.rb +27 -0
- data/spec/webhooks/gitlab/delete_handler_spec.rb +34 -0
- data/spec/webhooks/gitlab/push_attributes_spec.rb +64 -0
- data/spec/webhooks/gitlab/push_handler_spec.rb +99 -0
- data/spec/webhooks/gitlab/request_handler_spec.rb +73 -0
- data/spec/webhooks/gitlab/status_updater_spec.rb +66 -0
- data/spec/webhooks/transifex/hook_handler_spec.rb +2 -5
- data/spec/webhooks/transifex/request_handler_spec.rb +3 -5
- data/spec/zip_stream_response_spec.rb +2 -4
- data/txgh-server.gemspec +1 -2
- metadata +35 -10
- data/spec/integration/payloads/github_postbody_l10n.json +0 -136
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
module TxghServer
|
|
4
|
+
module Webhooks
|
|
5
|
+
module Git
|
|
6
|
+
class RequestHandler
|
|
7
|
+
include ResponseHelpers
|
|
8
|
+
|
|
9
|
+
class << self
|
|
10
|
+
def handle_request(request, logger)
|
|
11
|
+
new(request, logger).handle_request
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
attr_reader :request, :logger
|
|
16
|
+
|
|
17
|
+
def initialize(request, logger)
|
|
18
|
+
@request = request
|
|
19
|
+
@logger = logger
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def handle_request
|
|
23
|
+
raise NotImplementedError
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
def attributes
|
|
29
|
+
raise NotImplementedError
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def handle_safely
|
|
33
|
+
if authentic_request?
|
|
34
|
+
yield
|
|
35
|
+
else
|
|
36
|
+
respond_with_error(401, 'Unauthorized')
|
|
37
|
+
end
|
|
38
|
+
rescue => e
|
|
39
|
+
respond_with_error(500, "Internal server error: #{e.message}", e)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def payload
|
|
43
|
+
@payload ||= begin
|
|
44
|
+
if request.params[:payload]
|
|
45
|
+
JSON.parse(request.params[:payload])
|
|
46
|
+
else
|
|
47
|
+
JSON.parse(request.body.read)
|
|
48
|
+
end
|
|
49
|
+
rescue JSON::ParserError
|
|
50
|
+
{}
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def git_repo_name
|
|
55
|
+
raise NotImplementedError
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def config
|
|
59
|
+
@config ||= Txgh::Config::KeyManager.config_from_repo(git_repo_name)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def repo
|
|
63
|
+
config.git_repo
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def project
|
|
67
|
+
config.transifex_project
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def authentic_request?
|
|
71
|
+
raise NotImplementedError
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -1,19 +1,7 @@
|
|
|
1
1
|
module TxghServer
|
|
2
2
|
module Webhooks
|
|
3
3
|
module Github
|
|
4
|
-
class BlankAttributes
|
|
5
|
-
class << self
|
|
6
|
-
def from_webhook_payload(payload)
|
|
7
|
-
new
|
|
8
|
-
end
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def initialize(options = {})
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def to_h
|
|
15
|
-
{}
|
|
16
|
-
end
|
|
4
|
+
class BlankAttributes < TxghServer::Webhooks::Git::BlankAttributes
|
|
17
5
|
end
|
|
18
6
|
end
|
|
19
7
|
end
|
|
@@ -1,53 +1,16 @@
|
|
|
1
1
|
module TxghServer
|
|
2
2
|
module Webhooks
|
|
3
3
|
module Github
|
|
4
|
-
class DeleteAttributes
|
|
5
|
-
ATTRIBUTES = [
|
|
6
|
-
:event, :repo_name, :ref, :ref_type
|
|
7
|
-
]
|
|
8
|
-
|
|
4
|
+
class DeleteAttributes < TxghServer::Webhooks::Git::DeleteAttributes
|
|
9
5
|
class << self
|
|
10
|
-
def from_webhook_payload(payload)
|
|
11
|
-
new(
|
|
12
|
-
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
|
13
|
-
ret[attr] = public_send(attr, payload)
|
|
14
|
-
end
|
|
15
|
-
)
|
|
16
|
-
end
|
|
17
|
-
|
|
18
|
-
def event(payload)
|
|
19
|
-
'delete'
|
|
20
|
-
end
|
|
21
|
-
|
|
22
6
|
def repo_name(payload)
|
|
23
7
|
payload.fetch('repository').fetch('full_name')
|
|
24
8
|
end
|
|
25
9
|
|
|
26
|
-
def ref(payload)
|
|
27
|
-
payload.fetch('ref')
|
|
28
|
-
end
|
|
29
|
-
|
|
30
10
|
def ref_type(payload)
|
|
31
11
|
payload.fetch('ref_type')
|
|
32
12
|
end
|
|
33
13
|
end
|
|
34
|
-
|
|
35
|
-
attr_reader *ATTRIBUTES
|
|
36
|
-
|
|
37
|
-
def initialize(options = {})
|
|
38
|
-
ATTRIBUTES.each do |attr|
|
|
39
|
-
instance_variable_set(
|
|
40
|
-
"@#{attr}", options.fetch(attr) { options.fetch(attr.to_s) }
|
|
41
|
-
)
|
|
42
|
-
end
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
def to_h
|
|
46
|
-
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
|
47
|
-
ret[attr] = public_send(attr)
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
14
|
end
|
|
52
15
|
end
|
|
53
16
|
end
|
|
@@ -1,44 +1,7 @@
|
|
|
1
1
|
module TxghServer
|
|
2
2
|
module Webhooks
|
|
3
3
|
module Github
|
|
4
|
-
class DeleteHandler
|
|
5
|
-
include ResponseHelpers
|
|
6
|
-
|
|
7
|
-
attr_reader :project, :repo, :logger, :attributes
|
|
8
|
-
|
|
9
|
-
def initialize(project, repo, logger, attributes)
|
|
10
|
-
@project = project
|
|
11
|
-
@repo = repo
|
|
12
|
-
@logger = logger
|
|
13
|
-
@attributes = attributes
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
def execute
|
|
17
|
-
perform_delete if should_handle_request?
|
|
18
|
-
respond_with(200, true)
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
private
|
|
22
|
-
|
|
23
|
-
def perform_delete
|
|
24
|
-
deleter.delete_resources
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def deleter
|
|
28
|
-
@deleter ||= Txgh::ResourceDeleter.new(project, repo, branch)
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def should_handle_request?
|
|
32
|
-
# ref_type can be either 'branch' or 'tag' - we only care about branches
|
|
33
|
-
attributes.ref_type == 'branch' &&
|
|
34
|
-
repo.should_process_ref?(branch) &&
|
|
35
|
-
project.auto_delete_resources?
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def branch
|
|
39
|
-
Txgh::Utils.absolute_branch(attributes.ref.sub(/^refs\//, ''))
|
|
40
|
-
end
|
|
41
|
-
|
|
4
|
+
class DeleteHandler < TxghServer::Webhooks::Git::DeleteHandler
|
|
42
5
|
end
|
|
43
6
|
end
|
|
44
7
|
end
|
|
@@ -3,18 +3,7 @@ module TxghServer
|
|
|
3
3
|
module Github
|
|
4
4
|
# Handles github's ping event, which is a test event fired whenever a new
|
|
5
5
|
# webhook is set up.
|
|
6
|
-
class PingHandler
|
|
7
|
-
include ResponseHelpers
|
|
8
|
-
|
|
9
|
-
attr_reader :logger
|
|
10
|
-
|
|
11
|
-
def initialize(logger)
|
|
12
|
-
@logger = logger
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def execute
|
|
16
|
-
respond_with(200, {})
|
|
17
|
-
end
|
|
6
|
+
class PingHandler < TxghServer::Webhooks::Git::PingHandler
|
|
18
7
|
end
|
|
19
8
|
end
|
|
20
9
|
end
|
|
@@ -1,41 +1,12 @@
|
|
|
1
1
|
module TxghServer
|
|
2
2
|
module Webhooks
|
|
3
3
|
module Github
|
|
4
|
-
class PushAttributes
|
|
5
|
-
ATTRIBUTES = [
|
|
6
|
-
:event, :repo_name, :ref, :before, :after,
|
|
7
|
-
:added_files, :modified_files, :author
|
|
8
|
-
]
|
|
9
|
-
|
|
4
|
+
class PushAttributes < TxghServer::Webhooks::Git::PushAttributes
|
|
10
5
|
class << self
|
|
11
|
-
def from_webhook_payload(payload)
|
|
12
|
-
new(
|
|
13
|
-
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
|
14
|
-
ret[attr] = public_send(attr, payload)
|
|
15
|
-
end
|
|
16
|
-
)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def event(payload)
|
|
20
|
-
'push'
|
|
21
|
-
end
|
|
22
|
-
|
|
23
6
|
def repo_name(payload)
|
|
24
7
|
payload.fetch('repository').fetch('full_name')
|
|
25
8
|
end
|
|
26
9
|
|
|
27
|
-
def ref(payload)
|
|
28
|
-
payload.fetch('ref')
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def before(payload)
|
|
32
|
-
payload.fetch('before')
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
def after(payload)
|
|
36
|
-
payload.fetch('after')
|
|
37
|
-
end
|
|
38
|
-
|
|
39
10
|
def added_files(payload)
|
|
40
11
|
extract_files(payload, 'added')
|
|
41
12
|
end
|
|
@@ -57,27 +28,6 @@ module TxghServer
|
|
|
57
28
|
payload.fetch('commits').flat_map { |c| c[state] }.uniq
|
|
58
29
|
end
|
|
59
30
|
end
|
|
60
|
-
|
|
61
|
-
def files
|
|
62
|
-
@files ||= added_files + modified_files
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
attr_reader *ATTRIBUTES
|
|
66
|
-
|
|
67
|
-
def initialize(options = {})
|
|
68
|
-
ATTRIBUTES.each do |attr|
|
|
69
|
-
instance_variable_set(
|
|
70
|
-
"@#{attr}", options.fetch(attr) { options.fetch(attr.to_s) }
|
|
71
|
-
)
|
|
72
|
-
end
|
|
73
|
-
end
|
|
74
|
-
|
|
75
|
-
def to_h
|
|
76
|
-
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
|
77
|
-
ret[attr] = public_send(attr)
|
|
78
|
-
end
|
|
79
|
-
end
|
|
80
|
-
|
|
81
31
|
end
|
|
82
32
|
end
|
|
83
33
|
end
|
|
@@ -1,98 +1,12 @@
|
|
|
1
|
-
require 'set'
|
|
2
|
-
require 'octokit'
|
|
3
|
-
require 'txgh'
|
|
4
|
-
|
|
5
1
|
module TxghServer
|
|
6
2
|
module Webhooks
|
|
7
3
|
module Github
|
|
8
|
-
class PushHandler
|
|
9
|
-
include ResponseHelpers
|
|
10
|
-
|
|
11
|
-
attr_reader :project, :repo, :logger, :attributes
|
|
12
|
-
|
|
13
|
-
def initialize(project, repo, logger, attributes)
|
|
14
|
-
@project = project
|
|
15
|
-
@repo = repo
|
|
16
|
-
@logger = logger
|
|
17
|
-
@attributes = attributes
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def execute
|
|
21
|
-
# Check if the branch in the hook data is the configured branch we want
|
|
22
|
-
logger.info("request github branch: #{branch}")
|
|
23
|
-
logger.info("config github branch: #{repo.github_config_branch}")
|
|
24
|
-
|
|
25
|
-
if should_process?
|
|
26
|
-
logger.info('found branch in github request')
|
|
27
|
-
|
|
28
|
-
pusher.push_resources(added_and_modified_resources) do |tx_resource|
|
|
29
|
-
# block should return categories for the passed-in resource
|
|
30
|
-
{ 'author' => attributes.author }
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
status_updater.update_status
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
respond_with(200, true)
|
|
37
|
-
rescue => e
|
|
38
|
-
status_updater.report_error_and_update_status(e)
|
|
39
|
-
respond_with_error(500, "Internal server error: #{e.message}", e)
|
|
40
|
-
end
|
|
41
|
-
|
|
4
|
+
class PushHandler < TxghServer::Webhooks::Git::PushHandler
|
|
42
5
|
private
|
|
43
6
|
|
|
44
|
-
def pusher
|
|
45
|
-
@pusher ||= Txgh::Pusher.new(project, repo, branch)
|
|
46
|
-
end
|
|
47
|
-
|
|
48
7
|
def status_updater
|
|
49
|
-
@status_updater = StatusUpdater.new(project, repo, branch)
|
|
8
|
+
@status_updater = TxghServer::Webhooks::Github::StatusUpdater.new(project, repo, branch)
|
|
50
9
|
end
|
|
51
|
-
|
|
52
|
-
# finds the resources that were updated in each commit
|
|
53
|
-
def added_and_modified_resources
|
|
54
|
-
@amr ||= attributes.files.each_with_object(Set.new) do |file, ret|
|
|
55
|
-
logger.info("processing added/modified file: #{file}")
|
|
56
|
-
|
|
57
|
-
if tx_resources.include?(file)
|
|
58
|
-
ret << tx_resources[file]
|
|
59
|
-
end
|
|
60
|
-
end
|
|
61
|
-
end
|
|
62
|
-
|
|
63
|
-
# Build an index of known Tx resources, by source file
|
|
64
|
-
def tx_resources
|
|
65
|
-
@tx_resources ||= tx_config.resources.each_with_object({}) do |resource, ret|
|
|
66
|
-
ret[resource.source_file] = if repo.process_all_branches?
|
|
67
|
-
Txgh::TxBranchResource.new(resource, branch) # maybe find instead?
|
|
68
|
-
else
|
|
69
|
-
resource
|
|
70
|
-
end
|
|
71
|
-
end
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def tx_config
|
|
75
|
-
@tx_config ||= Txgh::Config::TxManager.tx_config(project, repo, branch)
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
def branch
|
|
79
|
-
@ref ||= attributes.ref.sub(/^refs\//, '')
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def should_process?
|
|
83
|
-
should_process_branch? && should_process_commit?
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
def should_process_branch?
|
|
87
|
-
repo.should_process_ref?(branch)
|
|
88
|
-
end
|
|
89
|
-
|
|
90
|
-
def should_process_commit?
|
|
91
|
-
# return false if 'after' commit sha is all zeroes (indicates branch
|
|
92
|
-
# has been deleted)
|
|
93
|
-
!((attributes.after || '') =~ /\A0+\z/)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
10
|
end
|
|
97
11
|
end
|
|
98
12
|
end
|
|
@@ -3,22 +3,7 @@ require 'json'
|
|
|
3
3
|
module TxghServer
|
|
4
4
|
module Webhooks
|
|
5
5
|
module Github
|
|
6
|
-
class RequestHandler
|
|
7
|
-
include ResponseHelpers
|
|
8
|
-
|
|
9
|
-
class << self
|
|
10
|
-
def handle_request(request, logger)
|
|
11
|
-
new(request, logger).handle_request
|
|
12
|
-
end
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
attr_reader :request, :logger
|
|
16
|
-
|
|
17
|
-
def initialize(request, logger)
|
|
18
|
-
@request = request
|
|
19
|
-
@logger = logger
|
|
20
|
-
end
|
|
21
|
-
|
|
6
|
+
class RequestHandler < TxghServer::Webhooks::Git::RequestHandler
|
|
22
7
|
def handle_request
|
|
23
8
|
handle_safely do
|
|
24
9
|
case github_event
|
|
@@ -47,44 +32,14 @@ module TxghServer
|
|
|
47
32
|
end
|
|
48
33
|
end
|
|
49
34
|
|
|
50
|
-
def handle_safely
|
|
51
|
-
if authentic_request?
|
|
52
|
-
yield
|
|
53
|
-
else
|
|
54
|
-
respond_with_error(401, 'Unauthorized')
|
|
55
|
-
end
|
|
56
|
-
rescue => e
|
|
57
|
-
respond_with_error(500, "Internal server error: #{e.message}", e)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def payload
|
|
61
|
-
@payload ||= begin
|
|
62
|
-
if request.params[:payload]
|
|
63
|
-
JSON.parse(request.params[:payload])
|
|
64
|
-
else
|
|
65
|
-
JSON.parse(request.body.read)
|
|
66
|
-
end
|
|
67
|
-
rescue JSON::ParserError
|
|
68
|
-
{}
|
|
69
|
-
end
|
|
70
|
-
end
|
|
71
|
-
|
|
72
35
|
def github_event
|
|
73
36
|
request.env['HTTP_X_GITHUB_EVENT']
|
|
74
37
|
end
|
|
75
38
|
|
|
76
|
-
def
|
|
39
|
+
def git_repo_name
|
|
77
40
|
payload.fetch('repository', {})['full_name']
|
|
78
41
|
end
|
|
79
42
|
|
|
80
|
-
def config
|
|
81
|
-
@config ||= Txgh::Config::KeyManager.config_from_repo(github_repo_name)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
def repo
|
|
85
|
-
config.github_repo
|
|
86
|
-
end
|
|
87
|
-
|
|
88
43
|
def project
|
|
89
44
|
config.transifex_project
|
|
90
45
|
end
|