git_helper 3.3.1 → 3.3.6
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 +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
|
|