git-process-lib 2.0.4 → 3.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG.md +16 -1
- data/Gemfile +15 -15
- data/Gemfile.lock +59 -44
- data/LICENSE +1 -1
- data/{README.md → README.adoc} +101 -93
- data/git-new-fb.gemspec +7 -7
- data/git-process-lib.gemspec +12 -15
- data/git-process.gemspec +10 -10
- data/git-pull-req.gemspec +7 -7
- data/git-sync.gemspec +7 -7
- data/git-to-master.gemspec +7 -7
- data/lib/git-process/git_branch.rb +41 -2
- data/lib/git-process/git_branches.rb +1 -1
- data/lib/git-process/git_config.rb +16 -6
- data/lib/git-process/git_lib.rb +305 -92
- data/lib/git-process/git_logger.rb +17 -22
- data/lib/git-process/git_process.rb +13 -6
- data/lib/git-process/git_remote.rb +34 -6
- data/lib/git-process/github_configuration.rb +156 -47
- data/lib/git-process/github_pull_request.rb +64 -10
- data/lib/git-process/pull_request.rb +5 -5
- data/lib/git-process/version.rb +2 -2
- data/local-build.rb +6 -2
- data/spec/changed_file_helper_spec.rb +1 -1
- data/spec/git_branch_spec.rb +35 -0
- data/spec/git_lib_spec.rb +32 -9
- data/spec/git_process_spec.rb +34 -26
- data/spec/git_remote_spec.rb +2 -2
- data/spec/github_configuration_spec.rb +67 -16
- data/spec/github_pull_request_spec.rb +18 -17
- data/spec/github_test_helper.rb +59 -5
- data/spec/new_fb_spec.rb +14 -14
- data/spec/pull_request_helper.rb +2 -2
- data/spec/pull_request_spec.rb +13 -11
- data/spec/rebase_to_master_spec.rb +10 -10
- data/spec/sync_spec.rb +20 -3
- metadata +114 -155
@@ -33,8 +33,14 @@ module GitProc
|
|
33
33
|
end
|
34
34
|
@logger.level = log_level.nil? ? GitLogger::WARN : log_level
|
35
35
|
@logger.datetime_format = '%Y-%m-%d %H:%M:%S'
|
36
|
-
@logger.formatter = proc do |
|
37
|
-
|
36
|
+
@logger.formatter = proc do |severity, datetime, progname, msg|
|
37
|
+
if progname.nil?
|
38
|
+
m = "#{msg}\n"
|
39
|
+
else
|
40
|
+
m = "#{progname} => #{msg}\n"
|
41
|
+
end
|
42
|
+
|
43
|
+
@logger.debug? ? "[#{'%-5.5s' % severity}] #{datetime} - #{m}" : m
|
38
44
|
end
|
39
45
|
end
|
40
46
|
|
@@ -45,38 +51,27 @@ module GitProc
|
|
45
51
|
|
46
52
|
|
47
53
|
def debug(msg = nil, &block)
|
48
|
-
|
49
|
-
@logger.debug(&block)
|
50
|
-
else
|
51
|
-
@logger.debug(msg)
|
52
|
-
end
|
54
|
+
@logger.debug(msg, &block)
|
53
55
|
end
|
54
56
|
|
55
57
|
|
56
58
|
def info(msg = nil, &block)
|
57
|
-
|
58
|
-
@logger.info(&block)
|
59
|
-
else
|
60
|
-
@logger.info(msg)
|
61
|
-
end
|
59
|
+
@logger.info(msg, &block)
|
62
60
|
end
|
63
61
|
|
64
62
|
|
65
63
|
def warn(msg = nil, &block)
|
66
|
-
|
67
|
-
@logger.send(:warn, &block)
|
68
|
-
else
|
69
|
-
@logger.send(:warn, msg)
|
70
|
-
end
|
64
|
+
@logger.warn(msg, &block)
|
71
65
|
end
|
72
66
|
|
73
67
|
|
74
68
|
def error(msg = nil, &block)
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
69
|
+
@logger.error(msg, &block)
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
def fatal(msg = nil, &block)
|
74
|
+
@logger.fatal(msg, &block)
|
80
75
|
end
|
81
76
|
|
82
77
|
end
|
@@ -107,13 +107,20 @@ module GitProc
|
|
107
107
|
end
|
108
108
|
|
109
109
|
|
110
|
+
# noinspection RubyLocalVariableNamingConvention
|
110
111
|
def should_remove_master?
|
111
|
-
|
112
|
-
gitlib.
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
112
|
+
has_a_remote = gitlib.has_a_remote?
|
113
|
+
my_branches = gitlib.branches
|
114
|
+
includes_master_branch = my_branches.include?(config.master_branch)
|
115
|
+
current_branch_is_not_master = my_branches.current.name != config.master_branch
|
116
|
+
do_not_keep_integration_branch = !keep_local_integration_branch?
|
117
|
+
integration_branch_contains_all_of_master = my_branches[config.integration_branch].contains_all_of(config.master_branch)
|
118
|
+
|
119
|
+
return (has_a_remote and
|
120
|
+
includes_master_branch and
|
121
|
+
current_branch_is_not_master and
|
122
|
+
do_not_keep_integration_branch and
|
123
|
+
integration_branch_contains_all_of_master)
|
117
124
|
end
|
118
125
|
|
119
126
|
|
@@ -12,9 +12,6 @@
|
|
12
12
|
|
13
13
|
require 'git-process/git_config'
|
14
14
|
require 'addressable/uri'
|
15
|
-
#require 'git-process/git_branches'
|
16
|
-
#require 'git-process/git_status'
|
17
|
-
#require 'git-process/git_process_error'
|
18
15
|
|
19
16
|
|
20
17
|
class String
|
@@ -61,7 +58,7 @@ module GitProc
|
|
61
58
|
|
62
59
|
|
63
60
|
# @deprecated
|
64
|
-
#
|
61
|
+
# @todo Remove
|
65
62
|
def server_name
|
66
63
|
@server_name ||= self.remote_name
|
67
64
|
end
|
@@ -77,6 +74,13 @@ module GitProc
|
|
77
74
|
end
|
78
75
|
|
79
76
|
|
77
|
+
#
|
78
|
+
# The name of the repository
|
79
|
+
#
|
80
|
+
# @example
|
81
|
+
# repo_name #=> "jdigger/git-process"
|
82
|
+
#
|
83
|
+
# @return [String] the name of the repository
|
80
84
|
def repo_name
|
81
85
|
unless @repo_name
|
82
86
|
url = config["remote.#{name}.url"]
|
@@ -88,7 +92,14 @@ module GitProc
|
|
88
92
|
end
|
89
93
|
|
90
94
|
|
91
|
-
|
95
|
+
#
|
96
|
+
# Returns the "remote name" to use. By convention the most common name is "origin".
|
97
|
+
#
|
98
|
+
# If the Git configuration "gitProcess.remoteName" is set, that will always be used. Otherwise this
|
99
|
+
# simple returns the first name it finds in the list of remotes.
|
100
|
+
#
|
101
|
+
# @return [String, nil] the remote name, or nil if there are none defined
|
102
|
+
def remote_name
|
92
103
|
unless @remote_name
|
93
104
|
@remote_name = config['gitProcess.remoteName']
|
94
105
|
if @remote_name.nil? or @remote_name.empty?
|
@@ -97,7 +108,7 @@ module GitProc
|
|
97
108
|
@remote_name = nil
|
98
109
|
else
|
99
110
|
@remote_name = remotes[0]
|
100
|
-
raise
|
111
|
+
raise "remote name is not a String: #{@remote_name.inspect}" unless @remote_name.is_a? String
|
101
112
|
end
|
102
113
|
end
|
103
114
|
logger.debug { "Using remote name of '#{@remote_name}'" }
|
@@ -106,11 +117,25 @@ module GitProc
|
|
106
117
|
end
|
107
118
|
|
108
119
|
|
120
|
+
alias :name :remote_name
|
121
|
+
|
122
|
+
|
123
|
+
#
|
124
|
+
# Takes {#remote_name} and combines it with {GitConfig#master_branch}.
|
125
|
+
#
|
126
|
+
# @example
|
127
|
+
# master_branch_name #=> origin/master
|
128
|
+
#
|
129
|
+
# @return [String] the complete remote name of the integration branch
|
130
|
+
#
|
109
131
|
def master_branch_name
|
110
132
|
"#{self.name}/#{config.master_branch}"
|
111
133
|
end
|
112
134
|
|
113
135
|
|
136
|
+
alias :remote_integration_branch_name :master_branch_name
|
137
|
+
|
138
|
+
|
114
139
|
def remote_names
|
115
140
|
remote_str = config.gitlib.command(:remote, [:show])
|
116
141
|
if remote_str.nil? or remote_str.empty?
|
@@ -136,6 +161,8 @@ module GitProc
|
|
136
161
|
# @raise [URI::InvalidURIError] the retrieved URL does not have a schema
|
137
162
|
# @raise [GitHubService::NoRemoteRepository] if could not figure out a host for the retrieved URL
|
138
163
|
# @raise [::ArgumentError] if a server name is not provided
|
164
|
+
#
|
165
|
+
# @todo use the netrc gem
|
139
166
|
def expanded_url(server_name = 'origin', raw_url = nil, opts = {})
|
140
167
|
if raw_url.nil?
|
141
168
|
raise ArgumentError.new('Need server_name') unless server_name
|
@@ -185,6 +212,7 @@ module GitProc
|
|
185
212
|
alias :add :add_remote
|
186
213
|
|
187
214
|
|
215
|
+
# @todo use the netrc gem
|
188
216
|
#noinspection RubyClassMethodNamingConvention
|
189
217
|
def self.hostname_and_user_from_ssh_config(host_alias, config_file)
|
190
218
|
if File.exists?(config_file)
|
@@ -10,31 +10,34 @@
|
|
10
10
|
# See the License for the specific language governing permissions and
|
11
11
|
# limitations under the License.
|
12
12
|
|
13
|
-
require '
|
13
|
+
require File.dirname(__FILE__) + '/git_lib'
|
14
|
+
require File.dirname(__FILE__) + '/git_logger'
|
14
15
|
require 'highline/import'
|
15
16
|
require 'octokit'
|
17
|
+
require 'octokit/default'
|
16
18
|
require 'uri'
|
19
|
+
require 'faraday'
|
20
|
+
require 'faraday/response/logger'
|
17
21
|
|
18
22
|
|
19
|
-
#
|
20
|
-
# Provides methods related to GitHub configuration
|
21
|
-
#
|
22
23
|
module GitHubService
|
23
24
|
|
25
|
+
#
|
26
|
+
# Provides methods related to GitHub configuration
|
27
|
+
#
|
24
28
|
class Configuration
|
25
29
|
|
26
|
-
attr_reader :git_config
|
27
|
-
|
28
|
-
|
29
30
|
#
|
30
31
|
# @param [GitProc::GitConfig] git_config
|
31
32
|
# @param [Hash] opts
|
32
|
-
# @option opts [String] :remote_name (#remote_name) The "remote" name to use (e.g., 'origin')
|
33
|
+
# @option opts [String] :remote_name (Configuration#remote_name) The "remote" name to use (e.g., 'origin')
|
33
34
|
# @option opts [String] :user the username to authenticate with
|
34
|
-
# @option opts [String] :password (#password) the password to authenticate with
|
35
|
+
# @option opts [String] :password (Configuration#password) the password to authenticate with
|
35
36
|
#
|
36
37
|
# @return [String] the OAuth token
|
37
38
|
#
|
39
|
+
# @todo pass in {GitLib} instead of {GitConfig}
|
40
|
+
#
|
38
41
|
def initialize(git_config, opts = {})
|
39
42
|
@git_config = git_config
|
40
43
|
@user = opts[:user]
|
@@ -43,7 +46,15 @@ module GitHubService
|
|
43
46
|
end
|
44
47
|
|
45
48
|
|
46
|
-
# @return [
|
49
|
+
# @return [GitProc::GitConfig]
|
50
|
+
def git_config
|
51
|
+
@git_config
|
52
|
+
end
|
53
|
+
|
54
|
+
|
55
|
+
# @return [String] the "remote name" (e.g., origin) for GitHub
|
56
|
+
#
|
57
|
+
# @see GitProc::GitRemote#remote_name
|
47
58
|
def remote_name
|
48
59
|
unless @remote_name
|
49
60
|
@remote_name = gitlib.remote.name
|
@@ -53,21 +64,21 @@ module GitHubService
|
|
53
64
|
end
|
54
65
|
|
55
66
|
|
56
|
-
# @return [String]
|
67
|
+
# @return [String] the user name for GitHub
|
57
68
|
def user
|
58
69
|
@user ||= Configuration.ask_for_user(gitlib)
|
59
70
|
end
|
60
71
|
|
61
72
|
|
62
|
-
# @return [String]
|
73
|
+
# @return [String] the password for GitHub
|
63
74
|
def password
|
64
75
|
@password ||= Configuration.ask_for_password
|
65
76
|
end
|
66
77
|
|
67
78
|
|
68
|
-
# @return [Octokit::Client]
|
79
|
+
# @return [Octokit::Client] the client for communicating with GitHub using {Configuration#user} and {Configuration#auth_token}
|
69
80
|
def client
|
70
|
-
create_client
|
81
|
+
@client ||= create_client
|
71
82
|
end
|
72
83
|
|
73
84
|
|
@@ -77,33 +88,26 @@ module GitHubService
|
|
77
88
|
end
|
78
89
|
|
79
90
|
|
80
|
-
# @return [Octokit::Client]
|
81
|
-
def create_client(opts = {})
|
82
|
-
logger.debug { "Creating GitHub client for user #{user} using token '#{auth_token}'" }
|
83
|
-
|
84
|
-
base_url = opts[:base_url] || base_github_api_url_for_remote
|
85
|
-
|
86
|
-
configure_octokit(:base_url => base_url)
|
87
|
-
|
88
|
-
Octokit::Client.new(:login => user, :oauth_token => auth_token)
|
89
|
-
end
|
90
|
-
|
91
|
-
|
92
91
|
#
|
93
92
|
# Configures Octokit to use the appropriate URLs for GitHub server.
|
94
93
|
#
|
95
|
-
# @
|
96
|
-
# @option opts [String] :base_url The base URL to use for the GitHub server
|
94
|
+
# @option opts [String] :base_url The base URL to use for the GitHub server; defaults to {#base_github_api_url_for_remote}
|
97
95
|
#
|
98
96
|
# @return [void]
|
99
97
|
#
|
98
|
+
# @todo remove opts and pass in base_url directly
|
99
|
+
#
|
100
100
|
def configure_octokit(opts = {})
|
101
101
|
base_url = opts[:base_url] || base_github_api_url_for_remote
|
102
102
|
Octokit.configure do |c|
|
103
103
|
c.api_endpoint = api_endpoint(base_url)
|
104
104
|
c.web_endpoint = web_endpoint(base_url)
|
105
|
-
|
106
|
-
|
105
|
+
end
|
106
|
+
if logger.level < ::GitProc::GitLogger::INFO
|
107
|
+
Octokit.middleware = Faraday::RackBuilder.new do |builder|
|
108
|
+
builder.response :logger, logger
|
109
|
+
builder.use Octokit::Response::RaiseError
|
110
|
+
builder.adapter Faraday.default_adapter
|
107
111
|
end
|
108
112
|
end
|
109
113
|
end
|
@@ -124,7 +128,7 @@ module GitHubService
|
|
124
128
|
if /github.com/ !~ base_url
|
125
129
|
"#{base_url}/api/v3"
|
126
130
|
else
|
127
|
-
Octokit::
|
131
|
+
Octokit::Default::API_ENDPOINT
|
128
132
|
end
|
129
133
|
end
|
130
134
|
|
@@ -144,7 +148,7 @@ module GitHubService
|
|
144
148
|
if /github.com/ !~ base_url
|
145
149
|
base_url
|
146
150
|
else
|
147
|
-
Octokit::
|
151
|
+
Octokit::Default::WEB_ENDPOINT
|
148
152
|
end
|
149
153
|
end
|
150
154
|
|
@@ -167,17 +171,24 @@ module GitHubService
|
|
167
171
|
# @param url [String] the URL to translate
|
168
172
|
# @return [String] the base GitHub API URL
|
169
173
|
#
|
174
|
+
# @example
|
175
|
+
# url_to_base_github_api_url('git@github.com:jdigger/git-process.git') #=> 'https://api.github.com'
|
176
|
+
#
|
177
|
+
# url_to_base_github_api_url('http://ghe.myco.com/jdigger/git-process.git') #=> 'http://ghe.myco.com'
|
178
|
+
#
|
179
|
+
# @todo use Octokit's improved ability to determine this
|
180
|
+
#
|
170
181
|
def self.url_to_base_github_api_url(url)
|
171
182
|
uri = URI.parse(url)
|
172
183
|
host = uri.host
|
173
184
|
|
174
185
|
if /github.com$/ =~ host
|
175
|
-
'https://api.github.com'
|
186
|
+
return 'https://api.github.com'
|
176
187
|
else
|
177
188
|
scheme = uri.scheme
|
178
189
|
scheme = 'https' unless scheme.start_with?('http')
|
179
190
|
host = 'unknown-host' unless host
|
180
|
-
"#{scheme}://#{host}"
|
191
|
+
return "#{scheme}://#{host}"
|
181
192
|
end
|
182
193
|
end
|
183
194
|
|
@@ -192,11 +203,14 @@ module GitHubService
|
|
192
203
|
# @option opts [String] :user the username to authenticate with
|
193
204
|
# @option opts [String] :password (#password) the password to authenticate with
|
194
205
|
#
|
206
|
+
# @return [Octokit::Client] the Octokit client for communicating with GitHub
|
207
|
+
#
|
195
208
|
def create_pw_client(opts = {})
|
196
209
|
usr = opts[:user] || user()
|
197
210
|
pw = opts[:password] || password()
|
211
|
+
remote = opts[:remote_name] || self.remote_name
|
198
212
|
|
199
|
-
logger.
|
213
|
+
logger.info("Authorizing #{usr} to work with #{remote}.")
|
200
214
|
|
201
215
|
configure_octokit(opts)
|
202
216
|
|
@@ -224,34 +238,72 @@ module GitHubService
|
|
224
238
|
#
|
225
239
|
# Connects to GitHub to get an OAuth token.
|
226
240
|
#
|
227
|
-
# @param [Hash] opts
|
228
241
|
# @option opts [String] :base_url The base URL to use for the GitHub server
|
229
|
-
# @option opts [String] :remote_name (#remote_name) The "remote" name to use (e.g., 'origin')
|
242
|
+
# @option opts [String] :remote_name (Configuration#remote_name) The "remote" name to use (e.g., 'origin')
|
230
243
|
# @option opts [String] :user the username to authenticate with
|
231
244
|
# @option opts [String] :password (#password) the password to authenticate with
|
245
|
+
# @option opts [String] :two_factor (#password) the password to authenticate with
|
232
246
|
#
|
233
247
|
# @return [String] the OAuth token
|
234
248
|
#
|
249
|
+
# noinspection RubyStringKeysInHashInspection
|
235
250
|
def create_authorization(opts = {})
|
236
|
-
|
237
|
-
|
238
|
-
|
251
|
+
client = opts[:client] || create_pw_client(opts)
|
252
|
+
|
253
|
+
return create_authorization_token(client, opts[:two_factor])
|
254
|
+
end
|
255
|
+
|
239
256
|
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
257
|
+
def create_authorization_token(client, two_factor)
|
258
|
+
begin
|
259
|
+
# noinspection RubyStringKeysInHashInspection
|
260
|
+
headers = two_factor ? {'X-GitHub-OTP' => two_factor} : nil
|
261
|
+
auth = client.create_authorization(
|
262
|
+
:scopes => %w(repo user gist),
|
263
|
+
:note => 'Git-Process',
|
264
|
+
:note_url => 'http://jdigger.github.com/git-process',
|
265
|
+
:headers => headers
|
266
|
+
)
|
267
|
+
rescue Octokit::OneTimePasswordRequired
|
268
|
+
return create_2f_authorization(client)
|
269
|
+
rescue Octokit::UnprocessableEntity => exp
|
270
|
+
return unprocessable_authorization(exp)
|
271
|
+
end
|
244
272
|
|
245
|
-
config_auth_token = auth[
|
273
|
+
config_auth_token = auth[:token]
|
246
274
|
|
247
275
|
# remember it for next time
|
248
276
|
gitlib.config['gitProcess.github.authToken'] = config_auth_token
|
249
277
|
|
250
|
-
config_auth_token
|
278
|
+
return config_auth_token
|
251
279
|
end
|
252
280
|
|
253
281
|
|
254
|
-
#
|
282
|
+
#
|
283
|
+
# Connects to GitHub to get an OAuth token.
|
284
|
+
#
|
285
|
+
# @option opts [String] :base_url The base URL to use for the GitHub server
|
286
|
+
# @option opts [String] :remote_name (Configuration#remote_name) The "remote" name to use (e.g., 'origin')
|
287
|
+
# @option opts [String] :user the username to authenticate with
|
288
|
+
# @option opts [String] :password (#password) the password to authenticate with
|
289
|
+
# @option opts [String] :two_factor (#password) the password to authenticate with
|
290
|
+
#
|
291
|
+
# @return [String] the OAuth token
|
292
|
+
#
|
293
|
+
# noinspection RubyStringKeysInHashInspection
|
294
|
+
def create_2f_authorization(client)
|
295
|
+
two_factor = Configuration.ask_for_two_factor
|
296
|
+
|
297
|
+
create_authorization_token(client, two_factor)
|
298
|
+
end
|
299
|
+
|
300
|
+
|
301
|
+
def two_factor_auth(authorization_count, opts)
|
302
|
+
return create_authorization(opts.merge(:two_factor => two_factor, :authorization_count => authorization_count + 1))
|
303
|
+
end
|
304
|
+
|
305
|
+
|
306
|
+
# @return [String, nil] the OAuth token, or nil if not found
|
255
307
|
def get_config_auth_token
|
256
308
|
c_auth_token = gitlib.config['gitProcess.github.authToken']
|
257
309
|
(c_auth_token.nil? or c_auth_token.empty?) ? nil : c_auth_token
|
@@ -266,6 +318,24 @@ module GitHubService
|
|
266
318
|
private
|
267
319
|
|
268
320
|
|
321
|
+
#
|
322
|
+
# Create a client for communicating with GitHub using {Configuration#user} and {Configuration#auth_token}
|
323
|
+
#
|
324
|
+
# @return [Octokit::Client]
|
325
|
+
#
|
326
|
+
# @todo have the params passed in explicitly instead of via opts
|
327
|
+
#
|
328
|
+
def create_client(opts = {})
|
329
|
+
logger.debug { "Creating GitHub client for user #{user} using token '#{auth_token}'" }
|
330
|
+
|
331
|
+
base_url = opts[:base_url] || base_github_api_url_for_remote
|
332
|
+
|
333
|
+
configure_octokit(:base_url => base_url)
|
334
|
+
|
335
|
+
Octokit::Client.new(:access_token => auth_token)
|
336
|
+
end
|
337
|
+
|
338
|
+
|
269
339
|
def self.ask_for_user(gitlib)
|
270
340
|
user = gitlib.config['github.user']
|
271
341
|
if user.nil? or user.empty?
|
@@ -285,6 +355,42 @@ module GitHubService
|
|
285
355
|
end
|
286
356
|
end
|
287
357
|
|
358
|
+
|
359
|
+
def self.ask_for_two_factor
|
360
|
+
ask("Your <%= color('GitHub', [:bold, :blue]) %> two-factor code: ") do |q|
|
361
|
+
q.validate = /^\w\w+$/
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
|
366
|
+
# @todo implement https://github.com/jdigger/git-process/issues/142
|
367
|
+
def ask_about_resetting_authorization
|
368
|
+
raise TokenAlreadyExists.new("The token already exists. Please check your OAuth settings for your account.")
|
369
|
+
end
|
370
|
+
|
371
|
+
|
372
|
+
#
|
373
|
+
# Tries to more gracefully handle the token already existing. See
|
374
|
+
#
|
375
|
+
# @return [String] the OAuth token
|
376
|
+
#
|
377
|
+
# @raise [TokenAlreadyExists] the token already exists
|
378
|
+
# @raise [Octokit::UnprocessableEntity] there was another problem
|
379
|
+
def unprocessable_authorization(exp)
|
380
|
+
errors = exp.errors
|
381
|
+
if not (errors.nil? or errors.empty?)
|
382
|
+
error_hash = errors[0]
|
383
|
+
if error_hash[:resource] == 'OauthAccess'
|
384
|
+
# error_hash[:code]
|
385
|
+
return ask_about_resetting_authorization
|
386
|
+
else
|
387
|
+
raise exp
|
388
|
+
end
|
389
|
+
else
|
390
|
+
raise exp
|
391
|
+
end
|
392
|
+
end
|
393
|
+
|
288
394
|
end
|
289
395
|
|
290
396
|
|
@@ -295,4 +401,7 @@ module GitHubService
|
|
295
401
|
class NoRemoteRepository < Error
|
296
402
|
end
|
297
403
|
|
404
|
+
class TokenAlreadyExists < Error
|
405
|
+
end
|
406
|
+
|
298
407
|
end
|