git-semaphore 2.1.0 → 2.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.pryrc +9 -3
- data/.rubocop.yml +36 -0
- data/.ruby-version +1 -1
- data/Gemfile +2 -0
- data/LICENSE.txt +1 -1
- data/Rakefile +26 -12
- data/bin/console +4 -9
- data/bin/setup +4 -1
- data/exe/git-semaphore +64 -65
- data/git-semaphore.gemspec +22 -19
- data/lib/git/semaphore.rb +22 -19
- data/lib/git/semaphore/api.rb +29 -27
- data/lib/git/semaphore/api_cache.rb +17 -17
- data/lib/git/semaphore/api_enrich.rb +10 -10
- data/lib/git/semaphore/gemspec.rb +13 -0
- data/lib/git/semaphore/project.rb +187 -174
- data/lib/git/semaphore/version.rb +11 -1
- metadata +19 -46
- data/Guardfile +0 -15
- data/lib/git/semaphore/banner.rb +0 -13
- data/lib/git/semaphore/copyright.rb +0 -6
data/lib/git/semaphore/api.rb
CHANGED
@@ -2,98 +2,98 @@ module Git
|
|
2
2
|
module Semaphore
|
3
3
|
class API
|
4
4
|
|
5
|
-
def self.projects
|
5
|
+
def self.projects(auth_token)
|
6
6
|
get_json projects_uri(auth_token)
|
7
7
|
end
|
8
8
|
|
9
|
-
def self.branches
|
9
|
+
def self.branches(project_hash_id, auth_token)
|
10
10
|
get_json branches_uri(project_hash_id, auth_token)
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.status
|
13
|
+
def self.status(project_hash_id, branch_id, auth_token)
|
14
14
|
get_json status_uri(project_hash_id, branch_id, auth_token)
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.history
|
17
|
+
def self.history(project_hash_id, branch_id, auth_token)
|
18
18
|
get_paginated_response(history_uri(project_hash_id, branch_id, auth_token)) do |previous_page, next_page|
|
19
19
|
previous_page['builds'] += next_page['builds']
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
def self.information
|
23
|
+
def self.information(project_hash_id, branch_id, build_number, auth_token)
|
24
24
|
get_json information_uri(project_hash_id, branch_id, build_number, auth_token)
|
25
25
|
end
|
26
26
|
|
27
|
-
def self.log
|
27
|
+
def self.log(project_hash_id, branch_id, build_number, auth_token)
|
28
28
|
get_json log_uri(project_hash_id, branch_id, build_number, auth_token)
|
29
29
|
end
|
30
30
|
|
31
|
-
def self.rebuild
|
31
|
+
def self.rebuild(project_hash_id, branch_id, auth_token)
|
32
32
|
get_json last_revision_uri(project_hash_id, branch_id, auth_token), :post
|
33
33
|
end
|
34
34
|
|
35
35
|
# private helper functions
|
36
36
|
|
37
|
-
def self.projects_uri
|
37
|
+
def self.projects_uri(auth_token)
|
38
38
|
# https://semaphoreci.com/docs/projects-api.html
|
39
39
|
# GET /api/v1/projects
|
40
|
-
request_uri(auth_token, :
|
40
|
+
request_uri(auth_token, path: File.join('projects'))
|
41
41
|
end
|
42
42
|
|
43
43
|
private_class_method :projects_uri
|
44
44
|
|
45
|
-
def self.branches_uri
|
45
|
+
def self.branches_uri(project_hash_id, auth_token)
|
46
46
|
# https://semaphoreci.com/docs/branches-and-builds-api.html#project_branches
|
47
47
|
# GET /api/v1/projects/:hash_id/branches
|
48
|
-
request_uri(auth_token, :
|
48
|
+
request_uri(auth_token, path: File.join('projects', project_hash_id, 'branches'))
|
49
49
|
end
|
50
50
|
|
51
51
|
private_class_method :branches_uri
|
52
52
|
|
53
|
-
def self.status_uri
|
53
|
+
def self.status_uri(project_hash_id, branch_id, auth_token)
|
54
54
|
# https://semaphoreci.com/docs/branches-and-builds-api.html#branch_status
|
55
55
|
# GET /api/v1/projects/:hash_id/:id/status
|
56
|
-
request_uri(auth_token, :
|
56
|
+
request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id, 'status'))
|
57
57
|
end
|
58
58
|
|
59
59
|
private_class_method :status_uri
|
60
60
|
|
61
|
-
def self.history_uri
|
61
|
+
def self.history_uri(project_hash_id, branch_id, auth_token, page = 1)
|
62
62
|
# https://semaphoreci.com/docs/branches-and-builds-api.html#branch_history
|
63
63
|
# GET /api/v1/projects/:hash_id/:id
|
64
|
-
request_uri(auth_token, :
|
64
|
+
request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id), page: page)
|
65
65
|
end
|
66
66
|
|
67
67
|
private_class_method :history_uri
|
68
68
|
|
69
|
-
def self.information_uri
|
69
|
+
def self.information_uri(project_hash_id, branch_id, build_number, auth_token)
|
70
70
|
# https://semaphoreci.com/docs/branches-and-builds-api.html#build_information
|
71
71
|
# GET /api/v1/projects/:hash_id/:id/builds/:number
|
72
|
-
request_uri(auth_token, :
|
72
|
+
request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id, 'builds', build_number))
|
73
73
|
end
|
74
74
|
|
75
75
|
private_class_method :information_uri
|
76
76
|
|
77
|
-
def self.log_uri
|
77
|
+
def self.log_uri(project_hash_id, branch_id, build_number, auth_token)
|
78
78
|
# https://semaphoreci.com/docs/branches-and-builds-api.html#build_log
|
79
79
|
# GET /api/v1/projects/:hash_id/:id/builds/:number/log
|
80
|
-
request_uri(auth_token, :
|
80
|
+
request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id, 'builds', build_number, 'log'))
|
81
81
|
end
|
82
82
|
|
83
83
|
private_class_method :log_uri
|
84
84
|
|
85
|
-
def self.last_revision_uri
|
85
|
+
def self.last_revision_uri(project_hash_id, branch_id, auth_token)
|
86
86
|
# https://semaphoreci.com/docs/branches-and-builds-api.html#rebuild
|
87
87
|
# POST /api/v1/projects/:project_hash_id/:branch_id/build
|
88
|
-
request_uri(auth_token, :
|
88
|
+
request_uri(auth_token, path: File.join('projects', project_hash_id, branch_id, 'build'))
|
89
89
|
end
|
90
90
|
|
91
91
|
private_class_method :last_revision_uri
|
92
92
|
|
93
93
|
# more private helper functions
|
94
94
|
|
95
|
-
def self.get_response
|
96
|
-
response = ::Net::HTTP.start(uri.host, uri.port, :
|
95
|
+
def self.get_response(uri, action = :get)
|
96
|
+
response = ::Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == 'https'), verify_mode: ::OpenSSL::SSL::VERIFY_NONE) do |net_http|
|
97
97
|
case action
|
98
98
|
when :get
|
99
99
|
net_http.get uri.request_uri
|
@@ -105,7 +105,9 @@ module Git
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def response.json_body
|
108
|
-
|
108
|
+
unless self['content-type'].match?(%r{application/json})
|
109
|
+
raise 'JSON response expected'
|
110
|
+
end
|
109
111
|
JSON.parse(body)
|
110
112
|
end
|
111
113
|
|
@@ -114,7 +116,7 @@ module Git
|
|
114
116
|
|
115
117
|
private_class_method :get_response
|
116
118
|
|
117
|
-
def self.get_paginated_response
|
119
|
+
def self.get_paginated_response(uri, action = :get)
|
118
120
|
response = get_response(uri, action)
|
119
121
|
body = response.json_body
|
120
122
|
loop do
|
@@ -131,7 +133,7 @@ module Git
|
|
131
133
|
|
132
134
|
private_class_method :get_paginated_response
|
133
135
|
|
134
|
-
def self.get_json
|
136
|
+
def self.get_json(uri, action = :get)
|
135
137
|
get_response(uri, action).json_body
|
136
138
|
end
|
137
139
|
|
@@ -141,7 +143,7 @@ module Git
|
|
141
143
|
SEMAPHORE_API_HOST = 'semaphoreci.com'.freeze
|
142
144
|
SEMAPHORE_API_URI = '/api/v1/'.freeze
|
143
145
|
|
144
|
-
def self.request_uri
|
146
|
+
def self.request_uri(auth_token, options = {})
|
145
147
|
page = options.delete(:page) # API pagination
|
146
148
|
options[:host] ||= SEMAPHORE_API_HOST
|
147
149
|
options[:path].prepend SEMAPHORE_API_URI
|
@@ -3,38 +3,38 @@ module Git
|
|
3
3
|
class API
|
4
4
|
class Cache
|
5
5
|
|
6
|
-
def self.projects auth_token
|
7
|
-
@projects ||= Git::Semaphore.from_json_cache(projects_cache) do
|
6
|
+
def self.projects(refresh, auth_token)
|
7
|
+
@projects ||= Git::Semaphore.from_json_cache(projects_cache, refresh) do
|
8
8
|
API::Enrich.projects auth_token
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
def self.branches
|
13
|
-
@branches ||= Git::Semaphore.from_json_cache(branches_cache(project_hash_id)) do
|
12
|
+
def self.branches(project_hash_id, refresh, auth_token)
|
13
|
+
@branches ||= Git::Semaphore.from_json_cache(branches_cache(project_hash_id), refresh) do
|
14
14
|
API.branches project_hash_id, auth_token
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
def self.status
|
19
|
-
@status ||= Git::Semaphore.from_json_cache(status_cache(project_hash_id, branch_id)) do
|
18
|
+
def self.status(project_hash_id, branch_id, refresh, auth_token)
|
19
|
+
@status ||= Git::Semaphore.from_json_cache(status_cache(project_hash_id, branch_id), refresh) do
|
20
20
|
API.status project_hash_id, branch_id, auth_token
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.history
|
25
|
-
@history ||= Git::Semaphore.from_json_cache(history_cache(project_hash_id, branch_id)) do
|
24
|
+
def self.history(project_hash_id, branch_id, refresh, auth_token)
|
25
|
+
@history ||= Git::Semaphore.from_json_cache(history_cache(project_hash_id, branch_id), refresh) do
|
26
26
|
API::Enrich.history project_hash_id, branch_id, auth_token
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.information
|
31
|
-
@information ||= Git::Semaphore.from_json_cache(information_cache(project_hash_id, branch_id, build_number)) do
|
30
|
+
def self.information(project_hash_id, branch_id, build_number, refresh, auth_token)
|
31
|
+
@information ||= Git::Semaphore.from_json_cache(information_cache(project_hash_id, branch_id, build_number), refresh) do
|
32
32
|
API.information project_hash_id, branch_id, build_number, auth_token
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
36
|
-
def self.log
|
37
|
-
@log ||= Git::Semaphore.from_json_cache(log_cache(project_hash_id, branch_id, build_number)) do
|
36
|
+
def self.log(project_hash_id, branch_id, build_number, refresh, auth_token)
|
37
|
+
@log ||= Git::Semaphore.from_json_cache(log_cache(project_hash_id, branch_id, build_number), refresh) do
|
38
38
|
API.log project_hash_id, branch_id, build_number, auth_token
|
39
39
|
end
|
40
40
|
end
|
@@ -47,31 +47,31 @@ module Git
|
|
47
47
|
|
48
48
|
private_class_method :projects_cache
|
49
49
|
|
50
|
-
def self.branches_cache
|
50
|
+
def self.branches_cache(project_hash_id)
|
51
51
|
File.join(Git::Semaphore.cache_dir_for(project_hash_id), 'branches.json')
|
52
52
|
end
|
53
53
|
|
54
54
|
private_class_method :branches_cache
|
55
55
|
|
56
|
-
def self.status_cache
|
56
|
+
def self.status_cache(project_hash_id, branch_id)
|
57
57
|
File.join(Git::Semaphore.cache_dir_for(project_hash_id), "#{branch_id}_status.json")
|
58
58
|
end
|
59
59
|
|
60
60
|
private_class_method :status_cache
|
61
61
|
|
62
|
-
def self.history_cache
|
62
|
+
def self.history_cache(project_hash_id, branch_id)
|
63
63
|
File.join(Git::Semaphore.cache_dir_for(project_hash_id), "#{branch_id}_history.json")
|
64
64
|
end
|
65
65
|
|
66
66
|
private_class_method :history_cache
|
67
67
|
|
68
|
-
def self.information_cache
|
68
|
+
def self.information_cache(project_hash_id, branch_id, build_number)
|
69
69
|
File.join(Git::Semaphore.cache_dir_for(project_hash_id), "#{branch_id}_#{build_number}_information.json")
|
70
70
|
end
|
71
71
|
|
72
72
|
private_class_method :information_cache
|
73
73
|
|
74
|
-
def self.log_cache
|
74
|
+
def self.log_cache(project_hash_id, branch_id, build_number)
|
75
75
|
File.join(Git::Semaphore.cache_dir_for(project_hash_id), "#{branch_id}_#{build_number}_log.json")
|
76
76
|
end
|
77
77
|
|
@@ -3,7 +3,7 @@ module Git
|
|
3
3
|
class API
|
4
4
|
class Enrich
|
5
5
|
|
6
|
-
def self.projects
|
6
|
+
def self.projects(auth_token)
|
7
7
|
API.projects(auth_token).tap do |results|
|
8
8
|
results.each do |project|
|
9
9
|
# full repository name on github.com: 'pvdb/git-semaphore'
|
@@ -14,21 +14,21 @@ module Git
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.history
|
17
|
+
def self.history(project_hash_id, branch_id, auth_token)
|
18
18
|
API.history(project_hash_id, branch_id, auth_token).tap do |results|
|
19
19
|
results['builds'].each do |build|
|
20
20
|
# build['result'] = "passed", "failed", "stopped" or "pending"
|
21
|
-
next unless started_at = build['started_at']
|
22
|
-
next unless finished_at = build['finished_at']
|
23
|
-
started_at =
|
24
|
-
finished_at =
|
21
|
+
next unless (started_at = build['started_at'])
|
22
|
+
next unless (finished_at = build['finished_at'])
|
23
|
+
started_at = Time.parse(started_at)
|
24
|
+
finished_at = Time.parse(finished_at)
|
25
25
|
build['date'] = {
|
26
|
-
:
|
27
|
-
:
|
26
|
+
started_at: started_at.to_date,
|
27
|
+
finished_at: finished_at.to_date,
|
28
28
|
}
|
29
29
|
build['duration'] = {
|
30
|
-
:
|
31
|
-
:
|
30
|
+
seconds: (finished_at - started_at).to_i,
|
31
|
+
minutes: format('%0.2f', (finished_at - started_at) / 60).to_f,
|
32
32
|
}
|
33
33
|
end
|
34
34
|
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module Git
|
2
|
+
module Semaphore
|
3
|
+
PIM = <<~"PIM".freeze
|
4
|
+
|
5
|
+
The only required setting for \033[1mgit semaphore\33[0m is:
|
6
|
+
|
7
|
+
\tgit config --global --add \033[1msemaphore.authtoken\033[0m <your_semaphore_auth_token>
|
8
|
+
|
9
|
+
Thanks for using \033[1mgit semaphore\033[0m ... the ultimate Semaphore utility for git!
|
10
|
+
|
11
|
+
PIM
|
12
|
+
end
|
13
|
+
end
|
@@ -1,176 +1,189 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
config
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
1
|
+
module Git
|
2
|
+
module Semaphore
|
3
|
+
class Project
|
4
|
+
|
5
|
+
def self.env_overrides
|
6
|
+
ENV.to_h.select { |key, _| key.start_with? 'SEMAPHORE_' }
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.from_repo(git_repo)
|
10
|
+
from_config({
|
11
|
+
'SEMAPHORE_PROJECT_NAME' => git_repo.full_name,
|
12
|
+
'SEMAPHORE_BRANCH_NAME' => git_repo.head.name.split('/').last,
|
13
|
+
'SEMAPHORE_COMMIT_SHA' => git_repo.head.target.oid,
|
14
|
+
'SEMAPHORE_BUILD_NUMBER' => nil
|
15
|
+
}.merge(env_overrides))
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.from_config(config)
|
19
|
+
new(
|
20
|
+
config['SEMAPHORE_PROJECT_NAME'],
|
21
|
+
config['SEMAPHORE_BRANCH_NAME'],
|
22
|
+
commit_sha: config['SEMAPHORE_COMMIT_SHA'],
|
23
|
+
build_number: config['SEMAPHORE_BUILD_NUMBER'],
|
24
|
+
)
|
25
|
+
end
|
26
|
+
|
27
|
+
attr_accessor :owner, :name, :full_name
|
28
|
+
|
29
|
+
def initialize(full_name, branch_name = nil, options = {})
|
30
|
+
@auth_token = Git::Semaphore.auth_token
|
31
|
+
@full_name = full_name
|
32
|
+
@owner, @name = full_name&.split('/')
|
33
|
+
@branch_name = branch_name || 'master'
|
34
|
+
@commit_sha = options[:commit_sha]
|
35
|
+
@build_number = options[:build_number]
|
36
|
+
end
|
37
|
+
|
38
|
+
def exist?
|
39
|
+
!project_hash.nil?
|
40
|
+
end
|
41
|
+
|
42
|
+
def settings
|
43
|
+
{
|
44
|
+
auth_token: @auth_token,
|
45
|
+
project_name: @full_name,
|
46
|
+
branch_name: @branch_name,
|
47
|
+
commit_sha: @commit_sha,
|
48
|
+
build_number: @build_number,
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def internals
|
53
|
+
settings.merge(
|
54
|
+
project: {
|
55
|
+
owner: @owner,
|
56
|
+
name: @name,
|
57
|
+
full_name: @full_name,
|
58
|
+
hash_id: project_hash_id,
|
59
|
+
url: project_url,
|
60
|
+
},
|
61
|
+
branch: {
|
62
|
+
name: @branch_name,
|
63
|
+
id: branch_id,
|
64
|
+
url: branch_url,
|
65
|
+
},
|
66
|
+
build: {
|
67
|
+
number: build_number,
|
68
|
+
result: build_result,
|
69
|
+
url: build_url,
|
70
|
+
},
|
71
|
+
)
|
72
|
+
end
|
73
|
+
|
74
|
+
#
|
75
|
+
# build-related queries: default to latest one...
|
76
|
+
#
|
77
|
+
|
78
|
+
def build_number
|
79
|
+
@build_number ||= history['builds'].first['build_number'].to_s
|
80
|
+
end
|
81
|
+
|
82
|
+
def build_result
|
83
|
+
@build_result ||= history['builds'].first['result']
|
84
|
+
end
|
85
|
+
|
86
|
+
#
|
87
|
+
# direct links to semaphore.ci
|
88
|
+
#
|
89
|
+
|
90
|
+
def project_url
|
91
|
+
project_hash['html_url']
|
92
|
+
end
|
93
|
+
|
94
|
+
def branch_url
|
95
|
+
branch_hash = project_hash['branches'].find { |hash|
|
96
|
+
hash['branch_name'] == @branch_name
|
97
|
+
}
|
98
|
+
branch_hash['branch_url']
|
99
|
+
end
|
100
|
+
|
101
|
+
def build_url
|
102
|
+
build_hash = history['builds'].find { |hash|
|
103
|
+
hash['build_number'].to_s == @build_number
|
104
|
+
}
|
105
|
+
build_hash['build_url']
|
106
|
+
end
|
107
|
+
|
108
|
+
#
|
109
|
+
# API related queries
|
110
|
+
#
|
111
|
+
|
112
|
+
def self.all(refresh = false)
|
113
|
+
Git::Semaphore::API::Cache.projects(refresh, Git::Semaphore.auth_token)
|
114
|
+
end
|
115
|
+
|
116
|
+
class << self
|
117
|
+
alias_method :projects, :all
|
118
|
+
end
|
119
|
+
|
120
|
+
def branches(refresh = false)
|
121
|
+
Git::Semaphore::API::Cache.branches(project_hash_id, refresh, @auth_token)
|
122
|
+
end
|
123
|
+
|
124
|
+
def status(refresh = false)
|
125
|
+
Git::Semaphore::API::Cache.status(project_hash_id, branch_id, refresh, @auth_token)
|
126
|
+
end
|
127
|
+
|
128
|
+
def history(refresh = false)
|
129
|
+
Git::Semaphore::API::Cache.history(project_hash_id, branch_id, refresh, @auth_token)
|
130
|
+
end
|
131
|
+
|
132
|
+
def information(refresh = false)
|
133
|
+
Git::Semaphore::API::Cache.information(project_hash_id, branch_id, build_number, refresh, @auth_token)
|
134
|
+
end
|
135
|
+
|
136
|
+
def log(refresh = false)
|
137
|
+
Git::Semaphore::API::Cache.log(project_hash_id, branch_id, build_number, refresh, @auth_token)
|
138
|
+
end
|
139
|
+
|
140
|
+
def rebuild
|
141
|
+
Git::Semaphore::API.rebuild(project_hash_id, branch_id, @auth_token)
|
142
|
+
end
|
143
|
+
|
144
|
+
def browse
|
145
|
+
`open #{branch_url}`
|
146
|
+
{ url: branch_url }
|
147
|
+
end
|
148
|
+
|
149
|
+
private
|
150
|
+
|
151
|
+
def project_hash_for(owner, name)
|
152
|
+
self.class.projects.find { |project_hash|
|
153
|
+
project_hash['owner'] == owner && project_hash['name'] == name
|
154
|
+
}
|
155
|
+
end
|
156
|
+
|
157
|
+
def project_hash
|
158
|
+
project_hash_for(@owner, @name)
|
159
|
+
end
|
160
|
+
|
161
|
+
def project_hash_id_for(owner, name)
|
162
|
+
project_hash_for(owner, name)['hash_id']
|
163
|
+
end
|
164
|
+
|
165
|
+
def project_hash_id
|
166
|
+
project_hash_id_for(@owner, @name)
|
167
|
+
end
|
168
|
+
|
169
|
+
def branch_hash_for(branch_name)
|
170
|
+
branches.find { |branch_hash|
|
171
|
+
branch_hash['name'] == branch_name
|
172
|
+
}
|
173
|
+
end
|
174
|
+
|
175
|
+
def branch_hash
|
176
|
+
branch_hash_for(@branch_name)
|
177
|
+
end
|
178
|
+
|
179
|
+
def branch_id_for(branch_name)
|
180
|
+
branch_hash_for(branch_name)['id'].to_s
|
181
|
+
end
|
182
|
+
|
183
|
+
def branch_id
|
184
|
+
branch_id_for(@branch_name)
|
185
|
+
end
|
186
|
+
|
187
|
+
end
|
128
188
|
end
|
129
|
-
|
130
|
-
def log
|
131
|
-
Git::Semaphore::API::Cache.log(project_hash_id, branch_id, build_number, @auth_token,)
|
132
|
-
end
|
133
|
-
|
134
|
-
def rebuild
|
135
|
-
Git::Semaphore::API.rebuild(project_hash_id, branch_id, @auth_token)
|
136
|
-
end
|
137
|
-
|
138
|
-
private
|
139
|
-
|
140
|
-
def project_hash_for owner, name
|
141
|
-
self.class.projects.find { |project_hash|
|
142
|
-
project_hash['owner'] == owner && project_hash['name'] == name
|
143
|
-
}
|
144
|
-
end
|
145
|
-
|
146
|
-
def project_hash
|
147
|
-
project_hash_for(@owner, @name)
|
148
|
-
end
|
149
|
-
|
150
|
-
def project_hash_id_for owner, name
|
151
|
-
project_hash_for(owner, name)['hash_id']
|
152
|
-
end
|
153
|
-
|
154
|
-
def project_hash_id
|
155
|
-
project_hash_id_for(@owner, @name)
|
156
|
-
end
|
157
|
-
|
158
|
-
def branch_hash_for branch_name
|
159
|
-
branches.find { |branch_hash|
|
160
|
-
branch_hash['name'] == branch_name
|
161
|
-
}
|
162
|
-
end
|
163
|
-
|
164
|
-
def branch_hash
|
165
|
-
branch_hash_for(@branch_name)
|
166
|
-
end
|
167
|
-
|
168
|
-
def branch_id_for branch_name
|
169
|
-
branch_hash_for(branch_name)['id'].to_s
|
170
|
-
end
|
171
|
-
|
172
|
-
def branch_id
|
173
|
-
branch_id_for(@branch_name)
|
174
|
-
end
|
175
|
-
|
176
189
|
end
|