git-semaphore 2.1.0 → 2.2.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 +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
|