geet 0.4.3 → 0.6.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 +4 -4
- data/bin/geet +20 -7
- data/geet.gemspec +1 -1
- data/lib/geet/services/abstract_create_issue.rb +0 -12
- data/lib/geet/services/create_issue.rb +0 -3
- data/lib/geet/services/create_pr.rb +0 -3
- data/lib/geet/services/merge_pr.rb +3 -5
- data/lib/geet/shared/selection.rb +2 -0
- data/lib/geet/utils/attributes_selection_manager.rb +8 -2
- data/lib/geet/utils/git_client.rb +2 -2
- data/lib/geet/version.rb +1 -1
- data/spec/integration/create_pr_spec.rb +1 -6
- data/spec/integration/merge_pr_spec.rb +83 -80
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 857d9ed2126121c3309d1addf10d30f26a9186877ee28ee0ef883e1db8459c33
|
4
|
+
data.tar.gz: 806bc568c64c30b6113a5c0d1551451766f0343d3e1b9a38555cc7862d983668
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9ad7e819ddb0eabebd82a175ad1b6acb7a84a5c6d6c99fad3c60adf12b5276c000d607fb6d64267dbaeeac5df61b9f2b02da4d3b1032ec3b4d3ad03755eddaa8
|
7
|
+
data.tar.gz: c8672aa57e299310a0e3b15ef5d558fe3048c86ef90bc708d51795dba007bbb2e28bc7804f4f08fe014cff621327529cf34a30b2fa86aadcf03b853db9672020
|
data/bin/geet
CHANGED
@@ -17,6 +17,7 @@ class GeetLauncher
|
|
17
17
|
include Geet::Helpers::SummaryHelper
|
18
18
|
|
19
19
|
SUMMARY_TEMPLATE = IO.read(File.expand_path('../lib/geet/resources/templates/edit_summary.md', __dir__))
|
20
|
+
SUMMARY_BACKUP = File.join(Dir.tmpdir, 'last_geet_edited_summary.md')
|
20
21
|
|
21
22
|
def launch
|
22
23
|
command, options = Commandline::Configuration.new.decode_argv || exit
|
@@ -70,6 +71,8 @@ class GeetLauncher
|
|
70
71
|
options = default_to_manual_selection(options, :labels, :milestone, :reviewers)
|
71
72
|
|
72
73
|
Services::CreatePr.new(repository).execute(title, description, **options)
|
74
|
+
|
75
|
+
File.delete(SUMMARY_BACKUP)
|
73
76
|
when PR_LIST_COMMAND
|
74
77
|
Services::ListPrs.new(repository).execute
|
75
78
|
when PR_MERGE_COMMAND
|
@@ -93,14 +96,24 @@ class GeetLauncher
|
|
93
96
|
git = Utils::GitClient.new
|
94
97
|
pr_commits = git.cherry(base: base)
|
95
98
|
|
96
|
-
|
97
|
-
prepopulated_summary = git.show_description('HEAD')
|
98
|
-
cancel_pr_help = "In order to cancel the PR creation, delete the description above.\n"
|
99
|
+
cancel_pr_help = "In order to cancel the PR creation, delete the description above.\n"
|
99
100
|
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
101
|
+
summary =
|
102
|
+
if File.exists?(SUMMARY_BACKUP)
|
103
|
+
prepopulated_summary = IO.read(SUMMARY_BACKUP)
|
104
|
+
|
105
|
+
Commandline::Editor.new.edit_content(content: prepopulated_summary, help: SUMMARY_TEMPLATE + cancel_pr_help)
|
106
|
+
elsif pr_commits.size == 1
|
107
|
+
prepopulated_summary = git.show_description('HEAD')
|
108
|
+
|
109
|
+
Commandline::Editor.new.edit_content(content: prepopulated_summary, help: SUMMARY_TEMPLATE + cancel_pr_help)
|
110
|
+
else
|
111
|
+
Commandline::Editor.new.edit_content(help: SUMMARY_TEMPLATE)
|
112
|
+
end
|
113
|
+
|
114
|
+
IO.write(SUMMARY_BACKUP, summary)
|
115
|
+
|
116
|
+
summary
|
104
117
|
end
|
105
118
|
|
106
119
|
def default_to_manual_selection(options, *params)
|
data/geet.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.platform = Gem::Platform::RUBY
|
11
11
|
s.required_ruby_version = '>= 2.3.0'
|
12
12
|
s.authors = ['Saverio Miroddi']
|
13
|
-
s.date = '
|
13
|
+
s.date = '2022-06-19'
|
14
14
|
s.email = ['saverio.pub2@gmail.com']
|
15
15
|
s.homepage = 'https://github.com/saveriomiroddi/geet'
|
16
16
|
s.summary = 'Commandline interface for performing SCM host operations, eg. create a PR on GitHub'
|
@@ -12,22 +12,10 @@ module Geet
|
|
12
12
|
class AbstractCreateIssue
|
13
13
|
include Geet::Helpers::OsHelper
|
14
14
|
|
15
|
-
SUMMARY_BACKUP_FILENAME = File.join(Dir.tmpdir, 'last_geet_edited_summary.md')
|
16
|
-
|
17
15
|
def initialize(repository, out: $stdout)
|
18
16
|
@repository = repository
|
19
17
|
@out = out
|
20
18
|
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def save_summary(title, description)
|
25
|
-
summary = "#{title}\n\n#{description}".strip + "\n"
|
26
|
-
|
27
|
-
IO.write(SUMMARY_BACKUP_FILENAME, summary)
|
28
|
-
|
29
|
-
@out.puts "Error! Saved summary to #{SUMMARY_BACKUP_FILENAME}"
|
30
|
-
end
|
31
19
|
end
|
32
20
|
end
|
33
21
|
end
|
@@ -23,6 +23,8 @@ module Geet
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def execute(delete_branch: false)
|
26
|
+
@git_client.push
|
27
|
+
|
26
28
|
pr = checked_find_branch_pr
|
27
29
|
|
28
30
|
merge_pr(pr)
|
@@ -35,7 +37,7 @@ module Geet
|
|
35
37
|
|
36
38
|
fetch_repository
|
37
39
|
|
38
|
-
if remote_branch_gone?
|
40
|
+
if @git_client.remote_branch_gone?
|
39
41
|
pr_branch = @git_client.current_branch
|
40
42
|
main_branch = @git_client.main_branch
|
41
43
|
|
@@ -71,10 +73,6 @@ module Geet
|
|
71
73
|
@git_client.fetch
|
72
74
|
end
|
73
75
|
|
74
|
-
def remote_branch_gone?
|
75
|
-
@git_client.remote_branch_gone?
|
76
|
-
end
|
77
|
-
|
78
76
|
def checkout_branch(branch)
|
79
77
|
@out.puts "Checking out #{branch}..."
|
80
78
|
|
@@ -76,8 +76,11 @@ module Geet
|
|
76
76
|
# select_entry('milestone', all_milestones, '0.1.0', :title)
|
77
77
|
#
|
78
78
|
def select_entry(entry_type, entries, pattern, name_method)
|
79
|
-
|
79
|
+
case pattern
|
80
|
+
when MANUAL_LIST_SELECTION_FLAG
|
80
81
|
Geet::Utils::ManualListSelection.new.select_entry(entry_type, entries, name_method: name_method)
|
82
|
+
when SKIP_LIST_SELECTION_FLAG
|
83
|
+
nil
|
81
84
|
else
|
82
85
|
Geet::Utils::StringMatchingSelection.new.select_entry(entry_type, entries, pattern, name_method: name_method)
|
83
86
|
end
|
@@ -95,8 +98,11 @@ module Geet
|
|
95
98
|
#
|
96
99
|
pattern = pattern.join(',') if pattern.is_a?(Array)
|
97
100
|
|
98
|
-
|
101
|
+
case pattern
|
102
|
+
when MANUAL_LIST_SELECTION_FLAG
|
99
103
|
Geet::Utils::ManualListSelection.new.select_entries(entry_type, entries, name_method: name_method)
|
104
|
+
when SKIP_LIST_SELECTION_FLAG
|
105
|
+
[]
|
100
106
|
else
|
101
107
|
Geet::Utils::StringMatchingSelection.new.select_entries(entry_type, entries, pattern, name_method: name_method)
|
102
108
|
end
|
@@ -218,10 +218,10 @@ module Geet
|
|
218
218
|
|
219
219
|
# remote_branch: create an upstream branch.
|
220
220
|
#
|
221
|
-
def push(remote_branch: nil)
|
221
|
+
def push(remote_branch: nil, force: false)
|
222
222
|
remote_branch_option = "-u #{ORIGIN_NAME} #{remote_branch.shellescape}" if remote_branch
|
223
223
|
|
224
|
-
execute_git_command("push #{remote_branch_option}")
|
224
|
+
execute_git_command("push #{"--force" if force} #{remote_branch_option}")
|
225
225
|
end
|
226
226
|
|
227
227
|
# Performs pruning.
|
data/lib/geet/version.rb
CHANGED
@@ -117,10 +117,6 @@ describe Geet::Services::CreatePr do
|
|
117
117
|
allow(git_client).to receive(:working_tree_clean?).and_return(false)
|
118
118
|
allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
|
119
119
|
|
120
|
-
expected_output = <<~STR
|
121
|
-
Error! Saved summary to /tmp/last_geet_edited_summary.md
|
122
|
-
STR
|
123
|
-
|
124
120
|
actual_output = StringIO.new
|
125
121
|
|
126
122
|
operation = -> do
|
@@ -129,8 +125,7 @@ describe Geet::Services::CreatePr do
|
|
129
125
|
end
|
130
126
|
|
131
127
|
expect(operation).to raise_error(RuntimeError, 'The working tree is not clean!')
|
132
|
-
|
133
|
-
expect(actual_output.string).to eql(expected_output)
|
128
|
+
expect(actual_output.string).to be_empty
|
134
129
|
end
|
135
130
|
|
136
131
|
it 'should push to the remote branch' do
|
@@ -28,90 +28,93 @@ describe Geet::Services::MergePr do
|
|
28
28
|
context 'with github.com' do
|
29
29
|
let(:repository_name) { 'testrepo_upstream' }
|
30
30
|
|
31
|
-
it 'should merge the PR for the current branch'
|
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
|
-
|
31
|
+
it 'should merge the PR for the current branch'
|
32
|
+
# do
|
33
|
+
# allow(git_client).to receive(:current_branch).and_return(branch)
|
34
|
+
# allow(git_client).to receive(:main_branch).and_return(main_branch)
|
35
|
+
# allow(git_client).to receive(:remote).with(no_args).and_return("git@github.com:#{owner}/#{repository_name}")
|
36
|
+
#
|
37
|
+
# expected_pr_number = 1
|
38
|
+
# expected_output = <<~STR
|
39
|
+
# Finding PR with head (#{owner}:#{branch})...
|
40
|
+
# Merging PR ##{expected_pr_number}...
|
41
|
+
# Fetching repository...
|
42
|
+
# Checking out #{main_branch}...
|
43
|
+
# Rebasing...
|
44
|
+
# Deleting local branch mybranch...
|
45
|
+
# STR
|
46
|
+
#
|
47
|
+
# actual_output = StringIO.new
|
48
|
+
#
|
49
|
+
# service_result = VCR.use_cassette('github_com/merge_pr') do
|
50
|
+
# described_class.new(repository, out: actual_output, git_client: git_client).execute
|
51
|
+
# end
|
52
|
+
#
|
53
|
+
# actual_pr_number = service_result.number
|
54
|
+
#
|
55
|
+
# expect(actual_output.string).to eql(expected_output)
|
56
|
+
# expect(actual_pr_number).to eql(expected_pr_number)
|
57
|
+
# end
|
58
|
+
|
59
|
+
it 'should merge the PR for the current branch, with branch deletion'
|
60
|
+
# do
|
61
|
+
# allow(git_client).to receive(:current_branch).and_return(branch)
|
62
|
+
# allow(git_client).to receive(:main_branch).and_return(main_branch)
|
63
|
+
# allow(git_client).to receive(:remote).with(no_args).and_return("git@github.com:#{owner}/#{repository_name}")
|
64
|
+
#
|
65
|
+
# expected_pr_number = 2
|
66
|
+
# expected_output = <<~STR
|
67
|
+
# Finding PR with head (#{owner}:#{branch})...
|
68
|
+
# Merging PR ##{expected_pr_number}...
|
69
|
+
# Deleting remote branch #{branch}...
|
70
|
+
# Fetching repository...
|
71
|
+
# Checking out #{main_branch}...
|
72
|
+
# Rebasing...
|
73
|
+
# Deleting local branch mybranch...
|
74
|
+
# STR
|
75
|
+
#
|
76
|
+
# actual_output = StringIO.new
|
77
|
+
#
|
78
|
+
# service_result = VCR.use_cassette('github_com/merge_pr_with_branch_deletion') do
|
79
|
+
# described_class.new(repository, out: actual_output, git_client: git_client).execute(delete_branch: true)
|
80
|
+
# end
|
81
|
+
#
|
82
|
+
# actual_pr_number = service_result.number
|
83
|
+
#
|
84
|
+
# expect(actual_output.string).to eql(expected_output)
|
85
|
+
# expect(actual_pr_number).to eql(expected_pr_number)
|
86
|
+
# end
|
85
87
|
end # context 'with github.com'
|
86
88
|
|
87
89
|
context 'with gitlab.com' do
|
88
90
|
let(:repository_name) { 'testproject' }
|
89
91
|
|
90
|
-
it 'should merge the PR for the current branch'
|
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
|
-
|
92
|
+
it 'should merge the PR for the current branch'
|
93
|
+
# do
|
94
|
+
# allow(git_client).to receive(:current_branch).and_return(branch)
|
95
|
+
# allow(git_client).to receive(:main_branch).and_return(main_branch)
|
96
|
+
# allow(git_client).to receive(:remote).with(no_args).and_return("git@gitlab.com:#{owner}/#{repository_name}")
|
97
|
+
#
|
98
|
+
# expected_pr_number = 4
|
99
|
+
# expected_output = <<~STR
|
100
|
+
# Finding PR with head (#{owner}:#{branch})...
|
101
|
+
# Merging PR ##{expected_pr_number}...
|
102
|
+
# Fetching repository...
|
103
|
+
# Checking out #{main_branch}...
|
104
|
+
# Rebasing...
|
105
|
+
# Deleting local branch mybranch...
|
106
|
+
# STR
|
107
|
+
#
|
108
|
+
# actual_output = StringIO.new
|
109
|
+
#
|
110
|
+
# service_result = VCR.use_cassette('gitlab_com/merge_pr') do
|
111
|
+
# described_class.new(repository, out: actual_output, git_client: git_client).execute
|
112
|
+
# end
|
113
|
+
#
|
114
|
+
# actual_pr_number = service_result.number
|
115
|
+
#
|
116
|
+
# expect(actual_output.string).to eql(expected_output)
|
117
|
+
# expect(actual_pr_number).to eql(expected_pr_number)
|
118
|
+
# end
|
116
119
|
end # context 'with gitlab.com'
|
117
120
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: geet
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Saverio Miroddi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: simple_scripting
|