geet 0.4.1 → 0.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 277ed0b36c021a28cc688fd768955c5639d0658885f60ff45f2a70c179a1e507
4
- data.tar.gz: f181e99e34416ebf216d4fb603fd213217a9d188060d38ac2e9770e02aa5befb
3
+ metadata.gz: 9eaf080841cb2553b6ab9efc64d9c50ff128bcb4955f183cc4a1a5932b687898
4
+ data.tar.gz: 7132c22bd53d293a352c7e87e30d81da99643948fe94d1dfd816557de930b2c2
5
5
  SHA512:
6
- metadata.gz: 1b5a73ec3c4ffb45daf21dba976f1c6330b0c4a4f2ee0ea3065674710026745834287586dc897b7ec3a1a645e1ed7a3d60f7ca580a46b5f47dc2ed25b6031ee7
7
- data.tar.gz: 0a4b834f9fcba3502c6f6408511001ab35fc08c5a5c4987b9c51ad5a4a16708ff714a7f47d993cdcd1decf0cf57dad75f4147deab2ac65363cad8cb6f37ee605
6
+ metadata.gz: 81479273b4e67be68a8af7546925eff70612ea4fe5fdeb1d48b906038ebe5d61aefbfddaf895cc249d32f8b7cb2ac08ee1e186438f752473e9cb635ada3c9772
7
+ data.tar.gz: e0d743736aefcba61d2b1d6cbff2fff949241378791246218bae10dbf410f1fe0ca0e48e1c1b462aa18d7e59061c12b3bdd216ef161a39f64cc533f56c7bb06b
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
@@ -88,21 +89,24 @@ class GeetLauncher
88
89
  private
89
90
 
90
91
  def edit_pr_summary(base: nil)
91
- base ||= 'master'
92
-
93
92
  # Tricky. It would be best to have Git logic exlusively inside the services,
94
93
  # but at the same time, the summary editing should be out.
95
94
  git = Utils::GitClient.new
96
- pr_commits = git.cherry(base)
95
+ pr_commits = git.cherry(base: base)
97
96
 
98
- if pr_commits.size == 1
99
- prepopulated_summary = git.show_description('HEAD')
100
- cancel_pr_help = "In order to cancel the PR creation, delete the description above.\n"
97
+ summary =
98
+ if pr_commits.size == 1
99
+ prepopulated_summary = git.show_description('HEAD')
100
+ cancel_pr_help = "In order to cancel the PR creation, delete the description above.\n"
101
101
 
102
- Commandline::Editor.new.edit_content(content: prepopulated_summary, help: SUMMARY_TEMPLATE + cancel_pr_help)
103
- else
104
- Commandline::Editor.new.edit_content(help: SUMMARY_TEMPLATE)
105
- end
102
+ Commandline::Editor.new.edit_content(content: prepopulated_summary, help: SUMMARY_TEMPLATE + cancel_pr_help)
103
+ else
104
+ Commandline::Editor.new.edit_content(help: SUMMARY_TEMPLATE)
105
+ end
106
+
107
+ IO.write(SUMMARY_BACKUP, summary)
108
+
109
+ summary
106
110
  end
107
111
 
108
112
  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 = '2021-07-09'
13
+ s.date = '2022-01-04'
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'
@@ -96,6 +96,7 @@ module Geet
96
96
  ]
97
97
 
98
98
  PR_OPEN_OPTIONS = [
99
+ ['-u', '--upstream', 'List on the upstream repository'],
99
100
  long_help: 'Open in the browser the PR for the current branch'
100
101
  ]
101
102
 
@@ -22,6 +22,9 @@ module Geet
22
22
 
23
23
  # See https://developer.github.com/v3/issues/#list-issues-for-a-repository
24
24
  #
25
+ # This works both for Issues and PRs, however, when the `/pulls` API (path) is used, additional
26
+ # information is provided (e.g. `head`).
27
+ #
25
28
  def self.list(api_interface, milestone: nil, assignee: nil, &type_filter)
26
29
  api_path = 'issues'
27
30
 
@@ -32,14 +32,34 @@ module Geet
32
32
 
33
33
  if head
34
34
  api_path = 'pulls'
35
- request_params = { head: "#{owner}:#{head}" }
36
35
 
37
- response = api_interface.send_request(api_path, params: request_params, multipage: true)
36
+ # Technically, the upstream approach could be used for both, but it's actually good to have
37
+ # both of them as reference.
38
+ #
39
+ # For upstream pulls, the owner is the authenticated user, otherwise, the repository owner.
40
+ #
41
+ response = if api_interface.upstream?
42
+ unfiltered_response = api_interface.send_request(api_path, multipage: true)
43
+
44
+ # VERY weird. From the docs, it's not clear if the user/org is required in the `head` parameter,
45
+ # but:
46
+ #
47
+ # - if it isn't included (eg. `anything`), the parameter is ignored
48
+ # - if it's included (eg. `saveriomiroddi:local_branch_name`), an empty resultset is returned.
49
+ #
50
+ # For this reason, we can't use that param, and have to filter manually.
51
+ #
52
+ unfiltered_response.select { |pr_data| pr_data.fetch('head').fetch('label') == "#{owner}:#{head}" }
53
+ else
54
+ request_params = { head: "#{owner}:#{head}" }
55
+
56
+ api_interface.send_request(api_path, params: request_params, multipage: true)
57
+ end
38
58
 
39
- response.map do |issue_data|
40
- number = issue_data.fetch('number')
41
- title = issue_data.fetch('title')
42
- link = issue_data.fetch('html_url')
59
+ response.map do |pr_data|
60
+ number = pr_data.fetch('number')
61
+ title = pr_data.fetch('title')
62
+ link = pr_data.fetch('html_url')
43
63
 
44
64
  new(number, api_interface, title, link)
45
65
  end
@@ -9,17 +9,19 @@ module Geet
9
9
  # Helper for services common workflow, for example, find the merge head.
10
10
  #
11
11
  module ServicesWorkflowHelper
12
- # Requires: @git_client
13
- #
14
- def find_merge_head
15
- [@git_client.owner, @git_client.current_branch]
16
- end
17
-
18
12
  # Expect to find only one.
19
13
  #
20
14
  # Requires: @out, @repository.
21
15
  #
22
- def checked_find_branch_pr(owner, head)
16
+ def checked_find_branch_pr
17
+ owner = if @repository.upstream?
18
+ @repository.authenticated_user.username
19
+ else
20
+ @git_client.owner
21
+ end
22
+
23
+ head = @git_client.current_branch
24
+
23
25
  @out.puts "Finding PR with head (#{owner}:#{head})..."
24
26
 
25
27
  prs = @repository.prs(owner: owner, head: head)
@@ -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
@@ -20,8 +20,7 @@ module Geet
20
20
  end
21
21
 
22
22
  def execute(comment, no_open_pr: nil)
23
- merge_owner, merge_head = find_merge_head
24
- pr = checked_find_branch_pr(merge_owner, merge_head)
23
+ pr = checked_find_branch_pr
25
24
  pr.comment(comment)
26
25
  open_file_with_default_application(pr.link) unless no_open_pr
27
26
  pr
@@ -46,9 +46,6 @@ module Geet
46
46
  end
47
47
 
48
48
  issue
49
- rescue => error
50
- save_summary(title, description) if title
51
- raise
52
49
  end
53
50
 
54
51
  private
@@ -37,7 +37,7 @@ module Geet
37
37
  selected_labels, selected_milestone, selected_reviewers = find_and_select_attributes(labels, milestone, reviewers)
38
38
  end
39
39
 
40
- sync_with_upstream_branch if automated_mode
40
+ sync_with_remote_branch if automated_mode
41
41
 
42
42
  pr = create_pr(title, description, base: base, draft: draft)
43
43
 
@@ -52,9 +52,6 @@ module Geet
52
52
  end
53
53
 
54
54
  pr
55
- rescue => error
56
- save_summary(title, description) if title
57
- raise
58
55
  end
59
56
 
60
57
  private
@@ -81,17 +78,17 @@ module Geet
81
78
  selection_manager.select_attributes
82
79
  end
83
80
 
84
- def sync_with_upstream_branch
85
- if @git_client.upstream_branch
86
- @out.puts "Pushing to upstream branch..."
81
+ def sync_with_remote_branch
82
+ if @git_client.remote_branch
83
+ @out.puts "Pushing to remote branch..."
87
84
 
88
85
  @git_client.push
89
86
  else
90
- upstream_branch = @git_client.current_branch
87
+ remote_branch = @git_client.current_branch
91
88
 
92
- @out.puts "Creating upstream branch #{upstream_branch.inspect}..."
89
+ @out.puts "Creating remote branch #{remote_branch.inspect}..."
93
90
 
94
- @git_client.push(upstream_branch: upstream_branch)
91
+ @git_client.push(remote_branch: remote_branch)
95
92
  end
96
93
  end
97
94
 
@@ -23,8 +23,9 @@ module Geet
23
23
  end
24
24
 
25
25
  def execute(delete_branch: false)
26
- merge_owner, merge_head = find_merge_head
27
- pr = checked_find_branch_pr(merge_owner, merge_head)
26
+ @git_client.push
27
+
28
+ pr = checked_find_branch_pr
28
29
 
29
30
  merge_pr(pr)
30
31
 
@@ -36,7 +37,7 @@ module Geet
36
37
 
37
38
  fetch_repository
38
39
 
39
- if upstream_branch_gone?
40
+ if @git_client.remote_branch_gone?
40
41
  pr_branch = @git_client.current_branch
41
42
  main_branch = @git_client.main_branch
42
43
 
@@ -72,10 +73,6 @@ module Geet
72
73
  @git_client.fetch
73
74
  end
74
75
 
75
- def upstream_branch_gone?
76
- @git_client.upstream_branch_gone?
77
- end
78
-
79
76
  def checkout_branch(branch)
80
77
  @out.puts "Checking out #{branch}..."
81
78
 
@@ -19,9 +19,8 @@ module Geet
19
19
  @git_client = git_client
20
20
  end
21
21
 
22
- def execute(delete_branch: false)
23
- merge_owner, merge_head = find_merge_head
24
- pr = checked_find_branch_pr(merge_owner, merge_head)
22
+ def execute(delete_branch: false, **)
23
+ pr = checked_find_branch_pr
25
24
  open_file_with_default_application(pr.link)
26
25
  pr
27
26
  end
@@ -4,6 +4,8 @@ module Geet
4
4
  module Shared
5
5
  module Selection
6
6
  MANUAL_LIST_SELECTION_FLAG = '-'.freeze
7
+ # Don't select anything; return the null value.
8
+ SKIP_LIST_SELECTION_FLAG = ''.freeze
7
9
 
8
10
  SELECTION_SINGLE = :single
9
11
  SELECTION_MULTIPLE = :multiple
@@ -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
- if pattern == MANUAL_LIST_SELECTION_FLAG
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
- if pattern == MANUAL_LIST_SELECTION_FLAG
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
@@ -34,7 +34,7 @@ module Geet
34
34
  \Z
35
35
  }x
36
36
 
37
- UPSTREAM_BRANCH_REGEX = %r{\A[^/]+/([^/]+)\Z}
37
+ REMOTE_BRANCH_REGEX = %r{\A[^/]+/(.+)\Z}
38
38
 
39
39
  MAIN_BRANCH_CONFIG_ENTRY = 'custom.development-branch'
40
40
 
@@ -48,11 +48,13 @@ module Geet
48
48
  # BRANCH/TREE APIS
49
49
  ##########################################################################
50
50
 
51
- # Return the commit shas between HEAD and `limit`, excluding the already applied commits
51
+ # Return the commit SHAs between HEAD and `base`, excluding the already applied commits
52
52
  # (which start with `-`)
53
53
  #
54
- def cherry(limit)
55
- raw_commits = execute_git_command("cherry #{limit.shellescape}")
54
+ def cherry(base: nil)
55
+ base ||= main_branch
56
+
57
+ raw_commits = execute_git_command("cherry #{base.shellescape}")
56
58
 
57
59
  raw_commits.split("\n").grep(/^\+/).map { |line| line[3..-1] }
58
60
  end
@@ -65,25 +67,23 @@ module Geet
65
67
  branch
66
68
  end
67
69
 
68
- # Not to be confused with `upstream` repository!
69
- #
70
70
  # This API doesn't reveal if the remote branch is gone.
71
71
  #
72
- # return: nil, if the upstream branch is not configured.
72
+ # return: nil, if the remote branch is not configured.
73
73
  #
74
- def upstream_branch
74
+ def remote_branch
75
75
  head_symbolic_ref = execute_git_command("symbolic-ref -q HEAD")
76
76
 
77
- raw_upstream_branch = execute_git_command("for-each-ref --format='%(upstream:short)' #{head_symbolic_ref.shellescape}").strip
77
+ raw_remote_branch = execute_git_command("for-each-ref --format='%(upstream:short)' #{head_symbolic_ref.shellescape}").strip
78
78
 
79
- if raw_upstream_branch != ''
80
- raw_upstream_branch[UPSTREAM_BRANCH_REGEX, 1] || raise("Unexpected upstream format: #{raw_upstream_branch}")
79
+ if raw_remote_branch != ''
80
+ raw_remote_branch[REMOTE_BRANCH_REGEX, 1] || raise("Unexpected remote branch format: #{raw_remote_branch}")
81
81
  else
82
82
  nil
83
83
  end
84
84
  end
85
85
 
86
- # TODO: May be merged with :upstream_branch, although it would require designing how a gone
86
+ # TODO: May be merged with :remote_branch, although it would require designing how a gone
87
87
  # remote branch is expressed.
88
88
  #
89
89
  # Sample command output:
@@ -91,7 +91,7 @@ module Geet
91
91
  # ## add_milestone_closing...origin/add_milestone_closing [gone]
92
92
  # M spec/integration/merge_pr_spec.rb
93
93
  #
94
- def upstream_branch_gone?
94
+ def remote_branch_gone?
95
95
  git_command = "status -b --porcelain"
96
96
  status_output = execute_git_command(git_command)
97
97
 
@@ -216,12 +216,12 @@ module Geet
216
216
  execute_git_command("rebase")
217
217
  end
218
218
 
219
- # upstream_branch: create an upstream branch.
219
+ # remote_branch: create an upstream branch.
220
220
  #
221
- def push(upstream_branch: nil)
222
- upstream_branch_option = "-u #{ORIGIN_NAME} #{upstream_branch.shellescape}" if upstream_branch
221
+ def push(remote_branch: nil, force: false)
222
+ remote_branch_option = "-u #{ORIGIN_NAME} #{remote_branch.shellescape}" if remote_branch
223
223
 
224
- execute_git_command("push #{upstream_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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Geet
4
- VERSION = '0.4.1'
4
+ VERSION = '0.5.0'
5
5
  end
@@ -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,21 +125,20 @@ 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
- it 'should push to the upstream branch' do
131
+ it 'should push to the remote branch' do
137
132
  allow(git_client).to receive(:working_tree_clean?).and_return(true)
138
133
  allow(git_client).to receive(:current_branch).and_return('mybranch')
139
134
  allow(git_client).to receive(:main_branch).and_return('master')
140
- expect(git_client).to receive(:upstream_branch).and_return('mybranch')
135
+ expect(git_client).to receive(:remote_branch).and_return('mybranch')
141
136
  expect(git_client).to receive(:push)
142
137
 
143
138
  allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
144
139
 
145
140
  expected_output = <<~STR
146
- Pushing to upstream branch...
141
+ Pushing to remote branch...
147
142
  Creating PR...
148
143
  Assigning authenticated user...
149
144
  PR address: https://github.com/donaldduck/testrepo_f/pull/2
@@ -159,17 +154,17 @@ describe Geet::Services::CreatePr do
159
154
  expect(actual_output.string).to eql(expected_output)
160
155
  end
161
156
 
162
- it "should create an upstream branch, when there isn't one (is not tracked)" do
157
+ it "should create a remote branch, when there isn't one (is not tracked)" do
163
158
  allow(git_client).to receive(:working_tree_clean?).and_return(true)
164
159
  allow(git_client).to receive(:current_branch).and_return('mybranch')
165
160
  allow(git_client).to receive(:main_branch).and_return('master')
166
- expect(git_client).to receive(:upstream_branch).and_return(nil)
167
- expect(git_client).to receive(:push).with(upstream_branch: 'mybranch')
161
+ expect(git_client).to receive(:remote_branch).and_return(nil)
162
+ expect(git_client).to receive(:push).with(remote_branch: 'mybranch')
168
163
 
169
164
  allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
170
165
 
171
166
  expected_output = <<~STR
172
- Creating upstream branch "mybranch"...
167
+ Creating remote branch "mybranch"...
173
168
  Creating PR...
174
169
  Assigning authenticated user...
175
170
  PR address: https://github.com/donaldduck/testrepo_f/pull/4
@@ -7,7 +7,7 @@ require_relative '../../lib/geet/services/merge_pr'
7
7
 
8
8
  # Currently disabled: it requires updates following the addition of the automatic removal of the local
9
9
  # branch.
10
- # Specifically, `GitClient#upstream_branch_gone?` needs to be handled, since it returns the current
10
+ # Specifically, `GitClient#remote_branch_gone?` needs to be handled, since it returns the current
11
11
  # branch, while it's supposed to return
12
12
  #
13
13
  describe Geet::Services::MergePr do
@@ -19,7 +19,7 @@ describe Geet::Services::MergePr do
19
19
 
20
20
  before :each do
21
21
  expect(git_client).to receive(:fetch)
22
- expect(git_client).to receive(:upstream_branch_gone?).and_return(true)
22
+ expect(git_client).to receive(:remote_branch_gone?).and_return(true)
23
23
  expect(git_client).to receive(:checkout).with(main_branch)
24
24
  expect(git_client).to receive(:rebase)
25
25
  expect(git_client).to receive(:delete_branch).with('mybranch')
@@ -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' do
32
- allow(git_client).to receive(:current_branch).and_return(branch)
33
- allow(git_client).to receive(:main_branch).and_return(main_branch)
34
- allow(git_client).to receive(:remote).with(no_args).and_return("git@github.com:#{owner}/#{repository_name}")
35
-
36
- expected_pr_number = 1
37
- expected_output = <<~STR
38
- Finding PR with head (#{owner}:#{branch})...
39
- Merging PR ##{expected_pr_number}...
40
- Fetching repository...
41
- Checking out #{main_branch}...
42
- Rebasing...
43
- Deleting local branch mybranch...
44
- STR
45
-
46
- actual_output = StringIO.new
47
-
48
- service_result = VCR.use_cassette('github_com/merge_pr') do
49
- described_class.new(repository, out: actual_output, git_client: git_client).execute
50
- end
51
-
52
- actual_pr_number = service_result.number
53
-
54
- expect(actual_output.string).to eql(expected_output)
55
- expect(actual_pr_number).to eql(expected_pr_number)
56
- end
57
-
58
- it 'should merge the PR for the current branch, with branch deletion' do
59
- allow(git_client).to receive(:current_branch).and_return(branch)
60
- allow(git_client).to receive(:main_branch).and_return(main_branch)
61
- allow(git_client).to receive(:remote).with(no_args).and_return("git@github.com:#{owner}/#{repository_name}")
62
-
63
- expected_pr_number = 2
64
- expected_output = <<~STR
65
- Finding PR with head (#{owner}:#{branch})...
66
- Merging PR ##{expected_pr_number}...
67
- Deleting remote branch #{branch}...
68
- Fetching repository...
69
- Checking out #{main_branch}...
70
- Rebasing...
71
- Deleting local branch mybranch...
72
- STR
73
-
74
- actual_output = StringIO.new
75
-
76
- service_result = VCR.use_cassette('github_com/merge_pr_with_branch_deletion') do
77
- described_class.new(repository, out: actual_output, git_client: git_client).execute(delete_branch: true)
78
- end
79
-
80
- actual_pr_number = service_result.number
81
-
82
- expect(actual_output.string).to eql(expected_output)
83
- expect(actual_pr_number).to eql(expected_pr_number)
84
- end
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' do
91
- allow(git_client).to receive(:current_branch).and_return(branch)
92
- allow(git_client).to receive(:main_branch).and_return(main_branch)
93
- allow(git_client).to receive(:remote).with(no_args).and_return("git@gitlab.com:#{owner}/#{repository_name}")
94
-
95
- expected_pr_number = 4
96
- expected_output = <<~STR
97
- Finding PR with head (#{owner}:#{branch})...
98
- Merging PR ##{expected_pr_number}...
99
- Fetching repository...
100
- Checking out #{main_branch}...
101
- Rebasing...
102
- Deleting local branch mybranch...
103
- STR
104
-
105
- actual_output = StringIO.new
106
-
107
- service_result = VCR.use_cassette('gitlab_com/merge_pr') do
108
- described_class.new(repository, out: actual_output, git_client: git_client).execute
109
- end
110
-
111
- actual_pr_number = service_result.number
112
-
113
- expect(actual_output.string).to eql(expected_output)
114
- expect(actual_pr_number).to eql(expected_pr_number)
115
- end
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.1
4
+ version: 0.5.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: 2021-07-09 00:00:00.000000000 Z
11
+ date: 2022-01-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simple_scripting
@@ -190,7 +190,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
190
  - !ruby/object:Gem::Version
191
191
  version: '0'
192
192
  requirements: []
193
- rubygems_version: 3.1.4
193
+ rubygems_version: 3.1.6
194
194
  signing_key:
195
195
  specification_version: 4
196
196
  summary: Commandline interface for performing SCM host operations, eg. create a PR