txgh-server 3.1.0 → 4.0.0.beta
Sign up to get free protection for your applications and to get access to all the features.
- 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
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 624a1efbe56943dcd522f2f2c9bc580cc5669e3098a14df6f9d55df17fe878d9
|
4
|
+
data.tar.gz: e017f94f32be4224734a781c1b292c4bbde84543ed52ff12f3eda220071cff7f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f577c8c66c7492acd7754cc4f320559fa4397d5bcc190ae822c36042d4c16f37e7a696e7e1ab1e72af52dfeb159e50efbac4857aa220097fff33b1d7fdcb8a2
|
7
|
+
data.tar.gz: 4e4123765f6c42a35b57e8de274c106c571bf9255ec5e254db32c0c349afcde73024d31009cf6ab8a307abc14af0cae27027d931f3be62bbad4702d96ec44776
|
data/lib/txgh-server.rb
CHANGED
@@ -4,6 +4,7 @@ module TxghServer
|
|
4
4
|
autoload :Application, 'txgh-server/application'
|
5
5
|
autoload :DownloadHandler, 'txgh-server/download_handler'
|
6
6
|
autoload :GithubRequestAuth, 'txgh-server/github_request_auth'
|
7
|
+
autoload :GitlabRequestAuth, 'txgh-server/gitlab_request_auth'
|
7
8
|
autoload :Response, 'txgh-server/response'
|
8
9
|
autoload :ResponseHelpers, 'txgh-server/response_helpers'
|
9
10
|
autoload :StreamResponse, 'txgh-server/stream_response'
|
@@ -48,7 +48,7 @@ module TxghServer
|
|
48
48
|
|
49
49
|
begin
|
50
50
|
tx_config = Txgh::Config::TxManager.tx_config(
|
51
|
-
config.transifex_project, config.
|
51
|
+
config.transifex_project, config.git_repo, branch
|
52
52
|
)
|
53
53
|
|
54
54
|
data = tx_config.to_h
|
@@ -95,6 +95,12 @@ module TxghServer
|
|
95
95
|
Github::RequestHandler.handle_request(request, settings.logger)
|
96
96
|
)
|
97
97
|
end
|
98
|
+
|
99
|
+
post '/gitlab' do
|
100
|
+
respond_with(
|
101
|
+
TxghServer::Webhooks::Gitlab::RequestHandler.handle_request(request, settings.logger)
|
102
|
+
)
|
103
|
+
end
|
98
104
|
end
|
99
105
|
|
100
106
|
class TriggerEndpoints < Sinatra::Base
|
@@ -9,7 +9,7 @@ module TxghServer
|
|
9
9
|
def handle_request(request, logger = nil)
|
10
10
|
handle_safely do
|
11
11
|
config = config_from(request)
|
12
|
-
project, repo = [config.transifex_project, config.
|
12
|
+
project, repo = [config.transifex_project, config.git_repo]
|
13
13
|
params = params_from(request)
|
14
14
|
handler = new(project, repo, params, logger)
|
15
15
|
handler.execute
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module TxghServer
|
2
|
+
class GitlabRequestAuth
|
3
|
+
RACK_HEADER = 'HTTP_X_GITLAB_TOKEN'
|
4
|
+
GITLAB_HEADER = 'X-Gitlab-Token'
|
5
|
+
|
6
|
+
class << self
|
7
|
+
def authentic_request?(request, secret)
|
8
|
+
request_token = request.env[RACK_HEADER]
|
9
|
+
request_token == secret
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -27,7 +27,7 @@ module TxghServer
|
|
27
27
|
def handler_for(config, request, logger)
|
28
28
|
new(
|
29
29
|
project: config.transifex_project,
|
30
|
-
repo: config.
|
30
|
+
repo: config.git_repo,
|
31
31
|
branch: request.params.fetch('branch'),
|
32
32
|
resource_slug: request.params.fetch('resource_slug'),
|
33
33
|
logger: logger
|
@@ -45,6 +45,23 @@ module TxghServer
|
|
45
45
|
@logger = options[:logger]
|
46
46
|
end
|
47
47
|
|
48
|
+
private
|
49
|
+
|
50
|
+
def update_github_status
|
51
|
+
Txgh::GithubStatus.update(project, repo, branch)
|
52
|
+
rescue Octokit::UnprocessableEntity
|
53
|
+
# raised because we've tried to create too many statuses for the commit
|
54
|
+
rescue Txgh::TransifexNotFoundError
|
55
|
+
# raised if transifex resource can't be found
|
56
|
+
end
|
57
|
+
|
58
|
+
def update_gitlab_status
|
59
|
+
Txgh::GitlabStatus.update(project, repo, branch)
|
60
|
+
rescue ::Gitlab::Error::Unprocessable
|
61
|
+
# raised because we've tried to create too many statuses for the commit
|
62
|
+
rescue Txgh::TransifexNotFoundError
|
63
|
+
# raised if transifex resource can't be found
|
64
|
+
end
|
48
65
|
end
|
49
66
|
end
|
50
67
|
end
|
@@ -7,24 +7,15 @@ module TxghServer
|
|
7
7
|
|
8
8
|
def execute
|
9
9
|
puller.pull_slug(resource_slug)
|
10
|
-
update_github_status
|
10
|
+
repo.is_a?(Txgh::GithubRepo) ? update_github_status : update_gitlab_status
|
11
11
|
respond_with(200, true)
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def update_github_status
|
17
|
-
Txgh::GithubStatus.update(project, repo, branch)
|
18
|
-
rescue Octokit::UnprocessableEntity
|
19
|
-
# raised because we've tried to create too many statuses for the commit
|
20
|
-
rescue Txgh::TransifexNotFoundError
|
21
|
-
# raised if transifex resource can't be found
|
22
|
-
end
|
23
|
-
|
24
16
|
def puller
|
25
17
|
@puller ||= Txgh::Puller.new(project, repo, branch)
|
26
18
|
end
|
27
|
-
|
28
19
|
end
|
29
20
|
end
|
30
21
|
end
|
@@ -7,24 +7,15 @@ module TxghServer
|
|
7
7
|
|
8
8
|
def execute
|
9
9
|
pusher.push_slug(resource_slug)
|
10
|
-
update_github_status
|
10
|
+
repo.is_a?(Txgh::GithubRepo) ? update_github_status : update_gitlab_status
|
11
11
|
respond_with(200, true)
|
12
12
|
end
|
13
13
|
|
14
14
|
private
|
15
15
|
|
16
|
-
def update_github_status
|
17
|
-
Txgh::GithubStatus.update(project, repo, branch)
|
18
|
-
rescue Octokit::UnprocessableEntity
|
19
|
-
# raised because we've tried to create too many statuses for the commit
|
20
|
-
rescue Txgh::TransifexNotFoundError
|
21
|
-
# raised if transifex resource can't be found
|
22
|
-
end
|
23
|
-
|
24
16
|
def pusher
|
25
17
|
@pusher ||= Txgh::Pusher.new(project, repo, branch)
|
26
18
|
end
|
27
|
-
|
28
19
|
end
|
29
20
|
end
|
30
21
|
end
|
data/lib/txgh-server/version.rb
CHANGED
data/lib/txgh-server/webhooks.rb
CHANGED
@@ -0,0 +1,15 @@
|
|
1
|
+
module TxghServer
|
2
|
+
module Webhooks
|
3
|
+
module Git
|
4
|
+
autoload :BlankAttributes, 'txgh-server/webhooks/git/blank_attributes'
|
5
|
+
autoload :DeleteAttributes, 'txgh-server/webhooks/git/delete_attributes'
|
6
|
+
autoload :DeleteHandler, 'txgh-server/webhooks/git/delete_handler'
|
7
|
+
autoload :Handler, 'txgh-server/webhooks/git/handler'
|
8
|
+
autoload :PingHandler, 'txgh-server/webhooks/git/ping_handler'
|
9
|
+
autoload :PushHandler, 'txgh-server/webhooks/git/push_handler'
|
10
|
+
autoload :PushAttributes, 'txgh-server/webhooks/git/push_attributes'
|
11
|
+
autoload :RequestHandler, 'txgh-server/webhooks/git/request_handler'
|
12
|
+
autoload :StatusUpdater, 'txgh-server/webhooks/git/status_updater'
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
module TxghServer
|
2
|
+
module Webhooks
|
3
|
+
module Git
|
4
|
+
class DeleteAttributes
|
5
|
+
ATTRIBUTES = [
|
6
|
+
:event, :repo_name, :ref, :ref_type
|
7
|
+
]
|
8
|
+
|
9
|
+
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
|
+
def repo_name(payload)
|
23
|
+
raise NotImplementedError
|
24
|
+
end
|
25
|
+
|
26
|
+
def ref(payload)
|
27
|
+
payload.fetch('ref')
|
28
|
+
end
|
29
|
+
|
30
|
+
def ref_type(payload)
|
31
|
+
raise NotImplementedError
|
32
|
+
end
|
33
|
+
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
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module TxghServer
|
2
|
+
module Webhooks
|
3
|
+
module Git
|
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
|
+
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module TxghServer
|
2
|
+
module Webhooks
|
3
|
+
module Git
|
4
|
+
# Handles github's ping event, which is a test event fired whenever a new
|
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
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module TxghServer
|
2
|
+
module Webhooks
|
3
|
+
module Git
|
4
|
+
class PushAttributes
|
5
|
+
ATTRIBUTES = [
|
6
|
+
:event, :repo_name, :ref, :before, :after,
|
7
|
+
:added_files, :modified_files, :author
|
8
|
+
]
|
9
|
+
|
10
|
+
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
|
+
def repo_name(payload)
|
24
|
+
raise NotImplementedError
|
25
|
+
end
|
26
|
+
|
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
|
+
def added_files(payload)
|
40
|
+
raise NotImplementedError
|
41
|
+
end
|
42
|
+
|
43
|
+
def modified_files(payload)
|
44
|
+
extract_files(payload, 'modified')
|
45
|
+
end
|
46
|
+
|
47
|
+
def author(payload)
|
48
|
+
raise NotImplementedError
|
49
|
+
end
|
50
|
+
|
51
|
+
def extract_files(payload, state)
|
52
|
+
raise NotImplementedError
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def files
|
57
|
+
@files ||= added_files + modified_files
|
58
|
+
end
|
59
|
+
|
60
|
+
attr_reader *ATTRIBUTES
|
61
|
+
|
62
|
+
def initialize(options = {})
|
63
|
+
ATTRIBUTES.each do |attr|
|
64
|
+
instance_variable_set(
|
65
|
+
"@#{attr}", options.fetch(attr) { options.fetch(attr.to_s) }
|
66
|
+
)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_h
|
71
|
+
ATTRIBUTES.each_with_object({}) do |attr, ret|
|
72
|
+
ret[attr] = public_send(attr)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
require 'set'
|
2
|
+
require 'txgh'
|
3
|
+
|
4
|
+
module TxghServer
|
5
|
+
module Webhooks
|
6
|
+
module Git
|
7
|
+
class PushHandler
|
8
|
+
include ResponseHelpers
|
9
|
+
|
10
|
+
attr_reader :project, :repo, :logger, :attributes
|
11
|
+
|
12
|
+
def initialize(project, repo, logger, attributes)
|
13
|
+
@project = project
|
14
|
+
@repo = repo
|
15
|
+
@logger = logger
|
16
|
+
@attributes = attributes
|
17
|
+
end
|
18
|
+
|
19
|
+
def execute
|
20
|
+
# Check if the branch in the hook data is the configured branch we want
|
21
|
+
logger.info("request git branch: #{branch}")
|
22
|
+
logger.info("config git branch: #{repo.git_config_branch}")
|
23
|
+
|
24
|
+
if should_process?
|
25
|
+
logger.info('found branch in git request')
|
26
|
+
|
27
|
+
pusher.push_resources(added_and_modified_resources) do |tx_resource|
|
28
|
+
# block should return categories for the passed-in resource
|
29
|
+
{ 'author' => attributes.author }
|
30
|
+
end
|
31
|
+
|
32
|
+
status_updater.update_status
|
33
|
+
end
|
34
|
+
|
35
|
+
respond_with(200, true)
|
36
|
+
rescue => e
|
37
|
+
status_updater.report_error_and_update_status(e)
|
38
|
+
respond_with_error(500, "Internal server error: #{e.message}", e)
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def pusher
|
44
|
+
@pusher ||= Txgh::Pusher.new(project, repo, branch)
|
45
|
+
end
|
46
|
+
|
47
|
+
def status_updater
|
48
|
+
raise NotImplementedError
|
49
|
+
end
|
50
|
+
|
51
|
+
# finds the resources that were updated in each commit
|
52
|
+
def added_and_modified_resources
|
53
|
+
@amr ||= attributes.files.each_with_object(Set.new) do |file, ret|
|
54
|
+
logger.info("processing added/modified file: #{file}")
|
55
|
+
|
56
|
+
if tx_resources.include?(file)
|
57
|
+
ret << tx_resources[file]
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# Build an index of known Tx resources, by source file
|
63
|
+
def tx_resources
|
64
|
+
@tx_resources ||= tx_config.resources.each_with_object({}) do |resource, ret|
|
65
|
+
ret[resource.source_file] = if repo.process_all_branches?
|
66
|
+
Txgh::TxBranchResource.new(resource, branch) # maybe find instead?
|
67
|
+
else
|
68
|
+
resource
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
def tx_config
|
74
|
+
@tx_config ||= Txgh::Config::TxManager.tx_config(project, repo, branch)
|
75
|
+
end
|
76
|
+
|
77
|
+
def branch
|
78
|
+
@ref ||= attributes.ref.sub(/^refs\//, '')
|
79
|
+
end
|
80
|
+
|
81
|
+
def should_process?
|
82
|
+
should_process_branch? && should_process_commit?
|
83
|
+
end
|
84
|
+
|
85
|
+
def should_process_branch?
|
86
|
+
repo.should_process_ref?(branch)
|
87
|
+
end
|
88
|
+
|
89
|
+
def should_process_commit?
|
90
|
+
# return false if 'after' commit sha is all zeroes (indicates branch
|
91
|
+
# has been deleted)
|
92
|
+
!((attributes.after || '') =~ /\A0+\z/)
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|