git_helper 3.3.1 → 3.3.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +32 -9
- data/Guardfile +3 -1
- data/README.md +4 -4
- data/Rakefile +2 -0
- data/bin/git-helper +18 -13
- data/lib/git_helper.rb +6 -2
- data/lib/git_helper/change_remote.rb +15 -6
- data/lib/git_helper/checkout_default.rb +2 -0
- data/lib/git_helper/clean_branches.rb +2 -0
- data/lib/git_helper/code_request.rb +33 -19
- data/lib/git_helper/empty_commit.rb +2 -0
- data/lib/git_helper/forget_local_commits.rb +2 -0
- data/lib/git_helper/git_config_reader.rb +3 -5
- data/lib/git_helper/gitlab_client.rb +2 -0
- data/lib/git_helper/local_code.rb +18 -8
- data/lib/git_helper/merge_request.rb +90 -70
- data/lib/git_helper/new_branch.rb +3 -1
- data/lib/git_helper/octokit_client.rb +2 -0
- data/lib/git_helper/pull_request.rb +97 -66
- data/lib/git_helper/setup.rb +52 -32
- data/lib/git_helper/version.rb +3 -1
- data/spec/git_helper/change_remote_spec.rb +24 -24
- data/spec/git_helper/checkout_default_spec.rb +2 -0
- data/spec/git_helper/clean_branches_spec.rb +2 -0
- data/spec/git_helper/code_request_spec.rb +30 -28
- data/spec/git_helper/empty_commit_spec.rb +2 -0
- data/spec/git_helper/forget_local_commits_spec.rb +2 -0
- data/spec/git_helper/git_config_reader_spec.rb +4 -2
- data/spec/git_helper/gitlab_client_spec.rb +2 -0
- data/spec/git_helper/local_code_spec.rb +2 -0
- data/spec/git_helper/merge_request_spec.rb +24 -23
- data/spec/git_helper/new_branch_spec.rb +10 -8
- data/spec/git_helper/octokit_client_spec.rb +2 -0
- data/spec/git_helper/pull_request_spec.rb +20 -18
- data/spec/git_helper/setup_spec.rb +34 -26
- data/spec/spec_helper.rb +4 -1
- metadata +34 -9
- data/lib/git_helper/highline_cli.rb +0 -33
- data/spec/git_helper/highline_cli_spec.rb +0 -51
data/lib/git_helper/setup.rb
CHANGED
@@ -1,77 +1,95 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module GitHelper
|
2
4
|
class Setup
|
3
5
|
def execute
|
6
|
+
execute_config_file
|
7
|
+
execute_plugins
|
8
|
+
end
|
9
|
+
|
10
|
+
# rubocop:disable Style/ConditionalAssignment
|
11
|
+
private def execute_config_file
|
4
12
|
if config_file_exists?
|
5
|
-
answer = highline.ask_yes_no(
|
6
|
-
|
13
|
+
answer = highline.ask_yes_no(
|
14
|
+
"It looks like the #{config_file} file already exists. Do you wish to replace it? (y/n)",
|
15
|
+
{ required: true }
|
16
|
+
)
|
7
17
|
else
|
8
18
|
answer = true
|
9
19
|
end
|
10
20
|
|
11
21
|
create_or_update_config_file if answer
|
22
|
+
end
|
23
|
+
# rubocop:enable Style/ConditionalAssignment
|
12
24
|
|
25
|
+
private def execute_plugins
|
13
26
|
answer = highline.ask_yes_no(
|
14
|
-
|
15
|
-
|
27
|
+
'Do you wish to set up the Git Helper plugins? (y/n) (This process will ' \
|
28
|
+
'attempt to use your GitHub personal access token to authenticate)',
|
29
|
+
{ required: true }
|
16
30
|
)
|
17
31
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
32
|
+
return unless answer
|
33
|
+
|
34
|
+
create_or_update_plugin_files
|
35
|
+
puts "\nNow add this line to your ~/.bash_profile:\n" \
|
36
|
+
' export PATH=/path/to/computer/home/.git_helper/plugins:$PATH'
|
37
|
+
puts "\nDone!"
|
23
38
|
end
|
24
39
|
|
25
40
|
private def create_or_update_config_file
|
26
41
|
contents = generate_file_contents
|
27
|
-
puts "
|
42
|
+
puts "Creating or updating your #{config_file} file..."
|
28
43
|
File.open(config_file, 'w') { |file| file.puts contents }
|
29
44
|
puts "\nDone!\n\n"
|
30
45
|
end
|
31
46
|
|
32
47
|
private def config_file_exists?
|
33
|
-
File.
|
48
|
+
File.exist?(config_file)
|
34
49
|
end
|
35
50
|
|
51
|
+
# rubocop:disable Metrics/MethodLength
|
36
52
|
private def generate_file_contents
|
37
|
-
file_contents = ''
|
53
|
+
file_contents = ''.dup
|
38
54
|
|
39
|
-
if highline.ask_yes_no(
|
55
|
+
if highline.ask_yes_no('Do you wish to set up GitHub credentials? (y/n)', { required: true })
|
40
56
|
file_contents << ":github_user: #{ask_question('GitHub username?')}\n"
|
41
|
-
file_contents <<
|
42
|
-
"#{ask_question(
|
43
|
-
|
57
|
+
file_contents << ':github_token: ' \
|
58
|
+
"#{ask_question(
|
59
|
+
'GitHub personal access token? (Navigate to https://github.com/settings/tokens ' \
|
60
|
+
'to create a new personal access token)',
|
61
|
+
secret: true
|
62
|
+
)}\n"
|
44
63
|
end
|
45
64
|
|
46
|
-
if highline.ask_yes_no(
|
65
|
+
if highline.ask_yes_no('Do you wish to set up GitLab credentials? (y/n)', { required: true })
|
47
66
|
file_contents << ":gitlab_user: #{ask_question('GitLab username?')}\n"
|
48
|
-
file_contents <<
|
49
|
-
"#{ask_question(
|
50
|
-
|
67
|
+
file_contents << ':gitlab_token: ' \
|
68
|
+
"#{ask_question(
|
69
|
+
'GitLab personal access token? (Navigate to https://gitlab.com/-/profile/personal_access_tokens' \
|
70
|
+
' to create a new personal access token)',
|
71
|
+
secret: true
|
72
|
+
)}\n"
|
51
73
|
end
|
52
74
|
|
53
75
|
file_contents.strip
|
54
76
|
end
|
77
|
+
# rubocop:enable Metrics/MethodLength
|
55
78
|
|
56
|
-
private def ask_question(prompt)
|
57
|
-
|
58
|
-
|
59
|
-
if answer.empty?
|
60
|
-
puts "\nThis question is required."
|
61
|
-
ask_question(prompt)
|
62
|
-
else
|
63
|
-
answer
|
64
|
-
end
|
79
|
+
private def ask_question(prompt, secret: false)
|
80
|
+
highline.ask(prompt, { required: true, secret: secret })
|
65
81
|
end
|
66
82
|
|
83
|
+
# rubocop:disable Metrics/MethodLength
|
84
|
+
# rubocop:disable Metrics/AbcSize
|
67
85
|
private def create_or_update_plugin_files
|
68
|
-
plugins_dir = "#{Dir.pwd.scan(/\
|
86
|
+
plugins_dir = "#{Dir.pwd.scan(%r{\A/\w*/\w*/}).first}.git_helper/plugins"
|
69
87
|
plugins_url = 'https://api.github.com/repos/emmahsax/git_helper/contents/plugins'
|
70
88
|
header = 'Accept: application/vnd.github.v3.raw'
|
71
89
|
token = git_config_reader.github_token
|
72
90
|
user = git_config_reader.github_user
|
73
91
|
|
74
|
-
Dir.mkdir(plugins_dir) unless File.
|
92
|
+
Dir.mkdir(plugins_dir) unless File.exist?(plugins_dir)
|
75
93
|
|
76
94
|
all_plugins = JSON.parse(`curl -s -u #{user}:#{token} -H "#{header}" -L "#{plugins_url}"`)
|
77
95
|
|
@@ -80,6 +98,8 @@ module GitHelper
|
|
80
98
|
File.open("#{plugins_dir}/#{plugin['name']}", 'w') { |file| file.puts plugin_content }
|
81
99
|
end
|
82
100
|
end
|
101
|
+
# rubocop:enable Metrics/MethodLength
|
102
|
+
# rubocop:enable Metrics/AbcSize
|
83
103
|
|
84
104
|
private def config_file
|
85
105
|
git_config_reader.git_config_file_path
|
@@ -90,7 +110,7 @@ module GitHelper
|
|
90
110
|
end
|
91
111
|
|
92
112
|
private def highline
|
93
|
-
@highline ||=
|
113
|
+
@highline ||= HighlineWrapper.new
|
94
114
|
end
|
95
115
|
end
|
96
116
|
end
|
data/lib/git_helper/version.rb
CHANGED
@@ -1,30 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'git_helper'
|
3
5
|
|
4
6
|
describe GitHelper::ChangeRemote do
|
5
7
|
let(:remote1) { "git@github.com:#{old_owner}/#{project}.git" }
|
6
8
|
let(:project) { Faker::Lorem.word }
|
7
|
-
let(:
|
9
|
+
let(:highline_wrapper) { double(:highline_wrapper, ask_yes_no: true) }
|
8
10
|
let(:old_owner) { Faker::Internet.username }
|
9
11
|
let(:new_owner) { Faker::Internet.username }
|
10
|
-
let(:directory_entries) { [
|
12
|
+
let(:directory_entries) { ['.', '..', project, Faker::Lorem.word, Faker::Lorem.word] }
|
11
13
|
|
12
14
|
let(:local_code) do
|
13
15
|
double(:local_code,
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
)
|
16
|
+
remotes: [remote1],
|
17
|
+
remote_name: Faker::Lorem.word,
|
18
|
+
ssh_remote?: true,
|
19
|
+
https_remote?: false,
|
20
|
+
remote_project: project,
|
21
|
+
remote_source: 'github.com',
|
22
|
+
change_remote: true)
|
22
23
|
end
|
23
24
|
|
24
25
|
subject { GitHelper::ChangeRemote.new(old_owner, new_owner) }
|
25
26
|
|
26
27
|
before do
|
27
|
-
allow(
|
28
|
+
allow(HighlineWrapper).to receive(:new).and_return(highline_wrapper)
|
28
29
|
allow(GitHelper::LocalCode).to receive(:new).and_return(local_code)
|
29
30
|
allow(subject).to receive(:puts)
|
30
31
|
end
|
@@ -73,7 +74,7 @@ describe GitHelper::ChangeRemote do
|
|
73
74
|
end
|
74
75
|
|
75
76
|
context 'when the user says not to process the directory' do
|
76
|
-
let(:
|
77
|
+
let(:highline_wrapper) { double(:highline_wrapper, ask_yes_no: false) }
|
77
78
|
|
78
79
|
it 'should not call to process the directory' do
|
79
80
|
expect(subject).not_to receive(:process_git_repository)
|
@@ -138,14 +139,13 @@ describe GitHelper::ChangeRemote do
|
|
138
139
|
context 'https remote' do
|
139
140
|
let(:local_code) do
|
140
141
|
double(:local_code,
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
)
|
142
|
+
remotes: [remote1],
|
143
|
+
remote_name: Faker::Lorem.word,
|
144
|
+
ssh_remote?: false,
|
145
|
+
https_remote?: false,
|
146
|
+
remote_project: project,
|
147
|
+
remote_source: 'github.com',
|
148
|
+
change_remote: true)
|
149
149
|
end
|
150
150
|
|
151
151
|
it 'should ask if the remote is SSH' do
|
@@ -167,10 +167,10 @@ describe GitHelper::ChangeRemote do
|
|
167
167
|
end
|
168
168
|
end
|
169
169
|
|
170
|
-
describe '#
|
171
|
-
it 'should create a new
|
172
|
-
expect(
|
173
|
-
subject.send(:
|
170
|
+
describe '#highline' do
|
171
|
+
it 'should create a new highline_wrapper instance' do
|
172
|
+
expect(HighlineWrapper).to receive(:new)
|
173
|
+
subject.send(:highline)
|
174
174
|
end
|
175
175
|
end
|
176
176
|
end
|
@@ -1,8 +1,10 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'git_helper'
|
3
5
|
|
4
6
|
describe GitHelper::CodeRequest do
|
5
|
-
let(:
|
7
|
+
let(:highline_wrapper) { double(:highline_wrapper) }
|
6
8
|
let(:local_code) { double(:local_code, project_name: Faker::Lorem.word, branch: Faker::Lorem.word) }
|
7
9
|
let(:process_project) { double(:process_project, create: :created, merge: :merged) }
|
8
10
|
let(:base_branch) { Faker::Lorem.word }
|
@@ -12,7 +14,7 @@ describe GitHelper::CodeRequest do
|
|
12
14
|
|
13
15
|
before do
|
14
16
|
allow(GitHelper::LocalCode).to receive(:new).and_return(local_code)
|
15
|
-
allow(
|
17
|
+
allow(HighlineWrapper).to receive(:new).and_return(highline_wrapper)
|
16
18
|
allow(subject).to receive(:puts)
|
17
19
|
end
|
18
20
|
|
@@ -101,19 +103,19 @@ describe GitHelper::CodeRequest do
|
|
101
103
|
|
102
104
|
describe '#ask_for_clarification' do
|
103
105
|
it 'should ask the CLI' do
|
104
|
-
expect(
|
106
|
+
expect(highline_wrapper).to receive(:ask).and_return('github')
|
105
107
|
subject.send(:ask_for_clarification)
|
106
108
|
end
|
107
109
|
|
108
110
|
context 'when response is github' do
|
109
111
|
it 'should return github_pull_request' do
|
110
|
-
allow(
|
112
|
+
allow(highline_wrapper).to receive(:ask).and_return('github')
|
111
113
|
expect(subject).to receive(:github_pull_request)
|
112
114
|
subject.send(:ask_for_clarification)
|
113
115
|
end
|
114
116
|
|
115
117
|
it 'should return github_pull_request' do
|
116
|
-
allow(
|
118
|
+
allow(highline_wrapper).to receive(:ask).and_return('Github')
|
117
119
|
expect(subject).to receive(:github_pull_request)
|
118
120
|
subject.send(:ask_for_clarification)
|
119
121
|
end
|
@@ -121,13 +123,13 @@ describe GitHelper::CodeRequest do
|
|
121
123
|
|
122
124
|
context 'when response is gitlab' do
|
123
125
|
it 'should return gitlab_merge_request' do
|
124
|
-
allow(
|
126
|
+
allow(highline_wrapper).to receive(:ask).and_return('gitlab')
|
125
127
|
expect(subject).to receive(:gitlab_merge_request)
|
126
128
|
subject.send(:ask_for_clarification)
|
127
129
|
end
|
128
130
|
|
129
131
|
it 'should return gitlab_merge_request' do
|
130
|
-
allow(
|
132
|
+
allow(highline_wrapper).to receive(:ask).and_return('Gitlab')
|
131
133
|
expect(subject).to receive(:gitlab_merge_request)
|
132
134
|
subject.send(:ask_for_clarification)
|
133
135
|
end
|
@@ -136,7 +138,7 @@ describe GitHelper::CodeRequest do
|
|
136
138
|
# Unfortunately this test sometimes fails... just rerun the tests if it does
|
137
139
|
context 'when response is neither' do
|
138
140
|
it 'should raise an error' do
|
139
|
-
allow(
|
141
|
+
allow(highline_wrapper).to receive(:ask).and_return(Faker::Lorem.word)
|
140
142
|
expect(subject).to receive(:exit)
|
141
143
|
subject.send(:ask_for_clarification)
|
142
144
|
end
|
@@ -174,23 +176,23 @@ describe GitHelper::CodeRequest do
|
|
174
176
|
describe '#base_branch' do
|
175
177
|
it 'should call the default branch' do
|
176
178
|
expect(subject).to receive(:default_branch)
|
177
|
-
allow(
|
178
|
-
allow(
|
179
|
+
allow(highline_wrapper).to receive(:ask_yes_no).at_least(:once)
|
180
|
+
allow(highline_wrapper).to receive(:ask).at_least(:once).and_return(base_branch)
|
179
181
|
subject.send(:base_branch)
|
180
182
|
end
|
181
183
|
|
182
184
|
it 'should ask the CLI to ask the user' do
|
183
185
|
allow(subject).to receive(:default_branch)
|
184
|
-
expect(
|
185
|
-
allow(
|
186
|
+
expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once)
|
187
|
+
allow(highline_wrapper).to receive(:ask).at_least(:once).and_return(base_branch)
|
186
188
|
subject.send(:base_branch)
|
187
189
|
end
|
188
190
|
|
189
191
|
context 'if the user says no' do
|
190
192
|
it 'definitely asks for the users base branch' do
|
191
193
|
allow(subject).to receive(:default_branch)
|
192
|
-
expect(
|
193
|
-
expect(
|
194
|
+
expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once).and_return(false)
|
195
|
+
expect(highline_wrapper).to receive(:ask).at_least(:once).and_return(base_branch)
|
194
196
|
subject.send(:base_branch)
|
195
197
|
end
|
196
198
|
end
|
@@ -198,8 +200,8 @@ describe GitHelper::CodeRequest do
|
|
198
200
|
context 'if the user says yes' do
|
199
201
|
it 'does not ask for the users base branch' do
|
200
202
|
allow(subject).to receive(:default_branch)
|
201
|
-
expect(
|
202
|
-
expect(
|
203
|
+
expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once).and_return(true)
|
204
|
+
expect(highline_wrapper).not_to receive(:base_branch)
|
203
205
|
subject.send(:base_branch)
|
204
206
|
end
|
205
207
|
end
|
@@ -216,23 +218,23 @@ describe GitHelper::CodeRequest do
|
|
216
218
|
describe '#new_code_request_title' do
|
217
219
|
it 'should call autogenerated title method' do
|
218
220
|
expect(subject).to receive(:autogenerated_title)
|
219
|
-
allow(
|
220
|
-
allow(
|
221
|
+
allow(highline_wrapper).to receive(:ask_yes_no).at_least(:once)
|
222
|
+
allow(highline_wrapper).to receive(:ask).at_least(:once).and_return(title)
|
221
223
|
subject.send(:new_code_request_title)
|
222
224
|
end
|
223
225
|
|
224
226
|
it 'should ask the CLI to ask the user' do
|
225
227
|
allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
|
226
|
-
expect(
|
227
|
-
allow(
|
228
|
+
expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once)
|
229
|
+
allow(highline_wrapper).to receive(:ask).at_least(:once).and_return(title)
|
228
230
|
subject.send(:new_code_request_title)
|
229
231
|
end
|
230
232
|
|
231
233
|
context 'if the user says no' do
|
232
234
|
it 'definitely asks for the users title' do
|
233
235
|
allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
|
234
|
-
expect(
|
235
|
-
expect(
|
236
|
+
expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once).and_return(false)
|
237
|
+
expect(highline_wrapper).to receive(:ask).at_least(:once).and_return(title)
|
236
238
|
subject.send(:new_code_request_title)
|
237
239
|
end
|
238
240
|
end
|
@@ -240,8 +242,8 @@ describe GitHelper::CodeRequest do
|
|
240
242
|
context 'if the user says yes to original title' do
|
241
243
|
it 'does not ask for the users chosen title' do
|
242
244
|
allow(subject).to receive(:autogenerated_title).and_return(Faker::Lorem.sentence)
|
243
|
-
expect(
|
244
|
-
expect(
|
245
|
+
expect(highline_wrapper).to receive(:ask_yes_no).at_least(:once).and_return(true)
|
246
|
+
expect(highline_wrapper).not_to receive(:ask)
|
245
247
|
subject.send(:new_code_request_title)
|
246
248
|
end
|
247
249
|
end
|
@@ -254,10 +256,10 @@ describe GitHelper::CodeRequest do
|
|
254
256
|
end
|
255
257
|
end
|
256
258
|
|
257
|
-
describe '#
|
258
|
-
it 'should
|
259
|
-
expect(
|
260
|
-
subject.send(:
|
259
|
+
describe '#highline' do
|
260
|
+
it 'should create a highline_wrapper client' do
|
261
|
+
expect(HighlineWrapper).to receive(:new).and_return(highline_wrapper)
|
262
|
+
subject.send(:highline)
|
261
263
|
end
|
262
264
|
end
|
263
265
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'spec_helper'
|
2
4
|
require 'git_helper'
|
3
5
|
|
@@ -7,14 +9,14 @@ describe GitHelper::GitConfigReader do
|
|
7
9
|
let(:gitlab_user) { Faker::Internet.username }
|
8
10
|
let(:gitlab_token) { Faker::Internet.password(max_length: 10) }
|
9
11
|
|
10
|
-
let(:config_file)
|
12
|
+
let(:config_file) do
|
11
13
|
{
|
12
14
|
github_user: github_user,
|
13
15
|
github_token: github_token,
|
14
16
|
gitlab_user: gitlab_user,
|
15
17
|
gitlab_token: gitlab_token
|
16
18
|
}
|
17
|
-
|
19
|
+
end
|
18
20
|
|
19
21
|
subject { GitHelper::GitConfigReader.new }
|
20
22
|
|