geet 0.3.13 → 0.3.18

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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.travis.yml +8 -0
  4. data/README.md +5 -8
  5. data/bin/geet +26 -7
  6. data/extra/anonymize_vcr_data +58 -0
  7. data/geet.gemspec +1 -1
  8. data/lib/geet/commandline/commands.rb +5 -0
  9. data/lib/geet/commandline/configuration.rb +31 -0
  10. data/lib/geet/git/repository.rb +19 -1
  11. data/lib/geet/github/abstract_issue.rb +9 -0
  12. data/lib/geet/github/api_interface.rb +2 -0
  13. data/lib/geet/github/branch.rb +1 -1
  14. data/lib/geet/github/issue.rb +1 -1
  15. data/lib/geet/github/label.rb +2 -2
  16. data/lib/geet/github/milestone.rb +29 -2
  17. data/lib/geet/github/remote_repository.rb +37 -0
  18. data/lib/geet/github/user.rb +2 -2
  19. data/lib/geet/gitlab/api_interface.rb +2 -0
  20. data/lib/geet/gitlab/label.rb +2 -2
  21. data/lib/geet/gitlab/milestone.rb +1 -1
  22. data/lib/geet/gitlab/user.rb +1 -1
  23. data/lib/geet/services/add_upstream_repo.rb +37 -0
  24. data/lib/geet/services/close_milestones.rb +46 -0
  25. data/lib/geet/services/comment_pr.rb +31 -0
  26. data/lib/geet/services/create_issue.rb +5 -3
  27. data/lib/geet/services/create_milestone.rb +24 -0
  28. data/lib/geet/services/create_pr.rb +5 -3
  29. data/lib/geet/services/list_issues.rb +4 -1
  30. data/lib/geet/services/merge_pr.rb +55 -4
  31. data/lib/geet/services/open_repo.rb +50 -0
  32. data/lib/geet/shared/branches.rb +9 -0
  33. data/lib/geet/shared/selection.rb +3 -0
  34. data/lib/geet/utils/attributes_selection_manager.rb +12 -3
  35. data/lib/geet/utils/git_client.rb +101 -28
  36. data/lib/geet/version.rb +1 -1
  37. data/spec/integration/comment_pr_spec.rb +44 -0
  38. data/spec/integration/create_issue_spec.rb +4 -4
  39. data/spec/integration/create_label_spec.rb +5 -5
  40. data/spec/integration/create_milestone_spec.rb +34 -0
  41. data/spec/integration/create_pr_spec.rb +8 -8
  42. data/spec/integration/list_issues_spec.rb +6 -6
  43. data/spec/integration/list_labels_spec.rb +4 -4
  44. data/spec/integration/list_milestones_spec.rb +4 -4
  45. data/spec/integration/list_prs_spec.rb +3 -3
  46. data/spec/integration/merge_pr_spec.rb +29 -4
  47. data/spec/integration/open_pr_spec.rb +1 -1
  48. data/spec/integration/open_repo_spec.rb +46 -0
  49. data/spec/vcr_cassettes/create_gist_private.yml +1 -1
  50. data/spec/vcr_cassettes/create_gist_public.yml +1 -1
  51. data/spec/vcr_cassettes/create_issue.yml +13 -13
  52. data/spec/vcr_cassettes/create_issue_upstream.yml +2 -2
  53. data/spec/vcr_cassettes/github_com/comment_pr.yml +161 -0
  54. data/spec/vcr_cassettes/github_com/create_label.yml +1 -1
  55. data/spec/vcr_cassettes/github_com/create_label_upstream.yml +1 -1
  56. data/spec/vcr_cassettes/github_com/create_label_with_random_color.yml +1 -1
  57. data/spec/vcr_cassettes/github_com/create_milestone.yml +82 -0
  58. data/spec/vcr_cassettes/github_com/create_pr.yml +16 -16
  59. data/spec/vcr_cassettes/github_com/create_pr_in_auto_mode_create_upstream.yml +7 -7
  60. data/spec/vcr_cassettes/github_com/create_pr_in_auto_mode_with_push.yml +7 -7
  61. data/spec/vcr_cassettes/github_com/create_pr_upstream.yml +8 -8
  62. data/spec/vcr_cassettes/github_com/create_pr_upstream_without_write_permissions.yml +3 -3
  63. data/spec/vcr_cassettes/github_com/list_issues.yml +5 -5
  64. data/spec/vcr_cassettes/github_com/list_issues_upstream.yml +6 -6
  65. data/spec/vcr_cassettes/github_com/list_issues_with_assignee.yml +4 -4
  66. data/spec/vcr_cassettes/github_com/list_labels.yml +1 -1
  67. data/spec/vcr_cassettes/github_com/list_labels_upstream.yml +1 -1
  68. data/spec/vcr_cassettes/github_com/list_milestones.yml +50 -50
  69. data/spec/vcr_cassettes/github_com/merge_pr.yml +2 -2
  70. data/spec/vcr_cassettes/github_com/merge_pr_with_branch_deletion.yml +2 -2
  71. data/spec/vcr_cassettes/github_com/open_pr.yml +2 -2
  72. data/spec/vcr_cassettes/gitlab_com/create_label.yml +1 -1
  73. data/spec/vcr_cassettes/gitlab_com/list_issues.yml +4 -4
  74. data/spec/vcr_cassettes/gitlab_com/list_issues_with_assignee.yml +8 -8
  75. data/spec/vcr_cassettes/gitlab_com/list_labels.yml +1 -1
  76. data/spec/vcr_cassettes/gitlab_com/list_milestones.yml +9 -9
  77. data/spec/vcr_cassettes/gitlab_com/merge_pr.yml +5 -5
  78. data/spec/vcr_cassettes/list_milestones_upstream.yml +21 -21
  79. data/spec/vcr_cassettes/list_prs.yml +10 -10
  80. data/spec/vcr_cassettes/list_prs_upstream.yml +10 -10
  81. metadata +16 -4
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Geet
4
+ module Shared
5
+ module Branches
6
+ MAIN_BRANCH = 'master'
7
+ end
8
+ end
9
+ end
@@ -4,6 +4,9 @@ module Geet
4
4
  module Shared
5
5
  module Selection
6
6
  MANUAL_LIST_SELECTION_FLAG = '-'.freeze
7
+
8
+ SELECTION_SINGLE = :single
9
+ SELECTION_MULTIPLE = :multiple
7
10
  end
8
11
  end
9
12
  end
@@ -30,8 +30,10 @@ module Geet
30
30
  @selections_data = []
31
31
  end
32
32
 
33
+ # selection_type: SELECTION_SINGLE or SELECTION_MULTIPLE
34
+ #
33
35
  def add_attribute(repository_call, description, pattern, selection_type, name_method: nil, &pre_selection_hook)
34
- raise "Unrecognized selection type #{selection_type.inspect}" if ![:single, :multiple].include?(selection_type)
36
+ raise "Unrecognized selection type #{selection_type.inspect}" if ![SELECTION_SINGLE, SELECTION_MULTIPLE].include?(selection_type)
35
37
 
36
38
  finder_thread = find_attribute_entries(repository_call)
37
39
 
@@ -47,9 +49,9 @@ module Geet
47
49
  entries = pre_selection_hook.(entries) if pre_selection_hook
48
50
 
49
51
  case selection_type
50
- when :single
52
+ when SELECTION_SINGLE
51
53
  select_entry(description, entries, pattern, name_method)
52
- when :multiple
54
+ when SELECTION_MULTIPLE
53
55
  select_entries(description, entries, pattern, name_method)
54
56
  end
55
57
  end
@@ -86,6 +88,13 @@ module Geet
86
88
  # select_entries('reviewer', all_collaborators, 'donaldduck', nil)
87
89
  #
88
90
  def select_entries(entry_type, entries, pattern, name_method)
91
+ # Support both formats Array and String.
92
+ # It seems that at some point, SimpleScripting started splitting arrays automatically, so until
93
+ # the code is adjusted accordingly, this accommodates both the CLI and the test suite.
94
+ # Tracked here: https://github.com/saveriomiroddi/geet/issues/171.
95
+ #
96
+ pattern = pattern.join(',') if pattern.is_a?(Array)
97
+
89
98
  if pattern == MANUAL_LIST_SELECTION_FLAG
90
99
  Geet::Utils::ManualListSelection.new.select_entries(entry_type, entries, name_method: name_method)
91
100
  else
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'English'
3
4
  require 'shellwords'
4
5
  require_relative '../helpers/os_helper'
5
6
 
@@ -10,15 +11,25 @@ module Geet
10
11
  class GitClient
11
12
  include Geet::Helpers::OsHelper
12
13
 
13
- ORIGIN_NAME = 'origin'
14
14
  UPSTREAM_NAME = 'upstream'
15
15
 
16
- # For simplicity, we match any character except the ones the separators.
17
- REMOTE_ORIGIN_REGEX = %r{
16
+ # Simplified, but good enough, pattern.
17
+ #
18
+ # Relevant matches:
19
+ #
20
+ # 1: protocol + suffix
21
+ # 2: domain
22
+ # 3: domain<>path separator
23
+ # 4: path (repo, project)
24
+ # 5: suffix
25
+ #
26
+ REMOTE_URL_REGEX = %r{
18
27
  \A
19
- (?:https://(.+?)/|git@(.+?):)
20
- ([^/]+/.*?)
21
- (?:\.git)?
28
+ (https://|git@)
29
+ (.+?)
30
+ ([/:])
31
+ (.+/.+?)
32
+ (\.git)?
22
33
  \Z
23
34
  }x
24
35
 
@@ -38,13 +49,13 @@ module Geet
38
49
  # (which start with `-`)
39
50
  #
40
51
  def cherry(limit)
41
- raw_commits = execute_command("git #{gitdir_option} cherry #{limit.shellescape}")
52
+ raw_commits = execute_git_command("cherry #{limit.shellescape}")
42
53
 
43
54
  raw_commits.split("\n").grep(/^\+/).map { |line| line[3..-1] }
44
55
  end
45
56
 
46
57
  def current_branch
47
- branch = execute_command("git #{gitdir_option} rev-parse --abbrev-ref HEAD")
58
+ branch = execute_git_command("rev-parse --abbrev-ref HEAD")
48
59
 
49
60
  raise "Couldn't find current branch" if branch == 'HEAD'
50
61
 
@@ -53,12 +64,14 @@ module Geet
53
64
 
54
65
  # Not to be confused with `upstream` repository!
55
66
  #
67
+ # This API doesn't reveal if the remote branch is gone.
68
+ #
56
69
  # return: nil, if the upstream branch is not configured.
57
70
  #
58
71
  def upstream_branch
59
- head_symbolic_ref = execute_command("git #{gitdir_option} symbolic-ref -q HEAD")
72
+ head_symbolic_ref = execute_git_command("symbolic-ref -q HEAD")
60
73
 
61
- raw_upstream_branch = execute_command("git #{gitdir_option} for-each-ref --format='%(upstream:short)' #{head_symbolic_ref.shellescape}").strip
74
+ raw_upstream_branch = execute_git_command("for-each-ref --format='%(upstream:short)' #{head_symbolic_ref.shellescape}").strip
62
75
 
63
76
  if raw_upstream_branch != ''
64
77
  raw_upstream_branch[UPSTREAM_BRANCH_REGEX, 1] || raise("Unexpected upstream format: #{raw_upstream_branch}")
@@ -67,8 +80,30 @@ module Geet
67
80
  end
68
81
  end
69
82
 
83
+ # TODO: May be merged with :upstream_branch, although it would require designing how a gone
84
+ # remote branch is expressed.
85
+ #
86
+ # Sample command output:
87
+ #
88
+ # ## add_milestone_closing...origin/add_milestone_closing [gone]
89
+ # M spec/integration/merge_pr_spec.rb
90
+ #
91
+ def upstream_branch_gone?
92
+ git_command = "status -b --porcelain"
93
+ status_output = execute_git_command(git_command)
94
+
95
+ # Simplified branch naming pattern. The exact one (see https://stackoverflow.com/a/3651867)
96
+ # is not worth implementing.
97
+ #
98
+ if status_output =~ %r(^## .+\.\.\..+?( \[gone\])?$)
99
+ !!$LAST_MATCH_INFO[1]
100
+ else
101
+ raise "Unexpected git command #{git_command.inspect} output: #{status_output}"
102
+ end
103
+ end
104
+
70
105
  def working_tree_clean?
71
- git_message = execute_command("git #{gitdir_option} status")
106
+ git_message = execute_git_command("status")
72
107
 
73
108
  !!(git_message =~ CLEAN_TREE_MESSAGE_REGEX)
74
109
  end
@@ -80,19 +115,26 @@ module Geet
80
115
  # Show the description ("<subject>\n\n<body>") for the given git object.
81
116
  #
82
117
  def show_description(object)
83
- execute_command("git #{gitdir_option} show --quiet --format='%s\n\n%b' #{object.shellescape}")
118
+ execute_git_command("show --quiet --format='%s\n\n%b' #{object.shellescape}")
84
119
  end
85
120
 
86
121
  ##########################################################################
87
- # REPOSITORY/REMOTE APIS
122
+ # REPOSITORY/REMOTE QUERYING APIS
88
123
  ##########################################################################
89
124
 
125
+ # Return the components of the remote, according to REMOTE_URL_REGEX; doesn't include the full
126
+ # match.
127
+ #
128
+ def remote_components(name: nil)
129
+ remote.match(REMOTE_URL_REGEX)[1..]
130
+ end
131
+
90
132
  # Example: `donaldduck/geet`
91
133
  #
92
134
  def path(upstream: false)
93
- remote_name = upstream ? UPSTREAM_NAME : ORIGIN_NAME
135
+ remote_name_option = upstream ? {name: UPSTREAM_NAME} : {}
94
136
 
95
- remote(remote_name)[REMOTE_ORIGIN_REGEX, 3]
137
+ remote(**remote_name_option)[REMOTE_URL_REGEX, 4]
96
138
  end
97
139
 
98
140
  def owner
@@ -101,12 +143,10 @@ module Geet
101
143
 
102
144
  def provider_domain
103
145
  # We assume that it's not possible to have origin and upstream on different providers.
104
- #
105
- remote_url = remote(ORIGIN_NAME)
106
146
 
107
- domain = remote_url[REMOTE_ORIGIN_REGEX, 1] || remote_url[REMOTE_ORIGIN_REGEX, 2]
147
+ domain = remote()[REMOTE_URL_REGEX, 2]
108
148
 
109
- raise "Can't identify domain in the provider domain string: #{domain}" if domain !~ /(.*)\.\w+/
149
+ raise "Can't identify domain in the provider domain string: #{domain}" if domain !~ /\w+\.\w+/
110
150
 
111
151
  domain
112
152
  end
@@ -116,12 +156,15 @@ module Geet
116
156
  #
117
157
  # The result is in the format `git@github.com:donaldduck/geet.git`
118
158
  #
119
- def remote(name)
120
- remote_url = execute_command("git #{gitdir_option} ls-remote --get-url #{name}")
159
+ # options
160
+ # :name: remote name; if unspecified, the default remote is used.
161
+ #
162
+ def remote(name: nil)
163
+ remote_url = execute_git_command("ls-remote --get-url #{name}")
121
164
 
122
- if remote_url == name
165
+ if !remote_defined?(name)
123
166
  raise "Remote #{name.inspect} not found!"
124
- elsif remote_url !~ REMOTE_ORIGIN_REGEX
167
+ elsif remote_url !~ REMOTE_URL_REGEX
125
168
  raise "Unexpected remote reference format: #{remote_url.inspect}"
126
169
  end
127
170
 
@@ -132,9 +175,10 @@ module Geet
132
175
  # purposes, any any action that needs to work with the remote, uses #remote.
133
176
  #
134
177
  def remote_defined?(name)
135
- remote_url = execute_command("git #{gitdir_option} ls-remote --get-url #{name}")
178
+ remote_url = execute_git_command("ls-remote --get-url #{name}")
136
179
 
137
- # If the remote is not define, `git ls-remote` will return the passed value.
180
+ # If the remote is not defined, `git ls-remote` will return the passed value.
181
+ #
138
182
  remote_url != name
139
183
  end
140
184
 
@@ -142,12 +186,36 @@ module Geet
142
186
  # OPERATION APIS
143
187
  ##########################################################################
144
188
 
189
+ def checkout(branch)
190
+ execute_git_command("checkout #{branch.shellescape}")
191
+ end
192
+
193
+ # Unforced deletion.
194
+ #
195
+ def delete_branch(branch)
196
+ execute_git_command("branch --delete #{branch.shellescape}")
197
+ end
198
+
199
+ def rebase
200
+ execute_git_command("rebase")
201
+ end
202
+
145
203
  # upstream_branch: create an upstream branch.
146
204
  #
147
205
  def push(upstream_branch: nil)
148
206
  upstream_branch_option = "-u origin #{upstream_branch.shellescape}" if upstream_branch
149
207
 
150
- execute_command("git #{gitdir_option} push #{upstream_branch_option}")
208
+ execute_git_command("push #{upstream_branch_option}")
209
+ end
210
+
211
+ # Performs pruning.
212
+ #
213
+ def fetch
214
+ execute_git_command("fetch --prune")
215
+ end
216
+
217
+ def add_remote(name, url)
218
+ execute_git_command("remote add #{name.shellescape} #{url}")
151
219
  end
152
220
 
153
221
  ##########################################################################
@@ -156,8 +224,13 @@ module Geet
156
224
 
157
225
  private
158
226
 
159
- def gitdir_option
160
- "-C #{@location.shellescape}" if @location
227
+ # If executing a git command without calling this API, don't forget to split `gitdir_option`
228
+ # and use it!
229
+ #
230
+ def execute_git_command(command)
231
+ gitdir_option = "-C #{@location.shellescape}" if @location
232
+
233
+ execute_command("git #{gitdir_option} #{command}")
161
234
  end
162
235
  end
163
236
  end
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.3.13'
4
+ VERSION = '0.3.18'
5
5
  end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ require_relative '../../lib/geet/git/repository'
6
+ require_relative '../../lib/geet/services/comment_pr'
7
+
8
+ describe Geet::Services::CommentPr do
9
+ let(:git_client) { Geet::Utils::GitClient.new }
10
+ let(:repository) { Geet::Git::Repository.new(git_client: git_client) }
11
+ let(:owner) { 'donaldduck' }
12
+ let(:branch) { 'mybranch' }
13
+ let(:comment) { 'this is a programmatically added comment' }
14
+
15
+ context 'with github.com' do
16
+ let(:repository_name) { 'testrepo_upstream' }
17
+
18
+ it 'should add a comment to the PR for the current branch' do
19
+ allow(git_client).to receive(:current_branch).and_return(branch)
20
+ allow(git_client).to receive(:remote).with(no_args).and_return("git@github.com:#{owner}/#{repository_name}")
21
+
22
+ expected_pr_number = 3
23
+ expected_output = <<~STR
24
+ Finding PR with head (#{owner}:#{branch})...
25
+ STR
26
+
27
+ actual_output = StringIO.new
28
+ service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
29
+
30
+ expect(service_instance).to receive(:open_file_with_default_application).with("https://github.com/#{owner}/#{repository_name}/pull/#{expected_pr_number}") do
31
+ # do nothing; just don't open the browser
32
+ end
33
+
34
+ service_result = VCR.use_cassette('github_com/comment_pr') do
35
+ service_instance.execute(comment)
36
+ end
37
+
38
+ actual_pr_number = service_result.number
39
+
40
+ expect(actual_output.string).to eql(expected_output)
41
+ expect(actual_pr_number).to eql(expected_pr_number)
42
+ end
43
+ end # context 'with github.com'
44
+ end
@@ -12,7 +12,7 @@ describe Geet::Services::CreateIssue do
12
12
 
13
13
  context 'with labels, assignees and milestones' do
14
14
  it 'should create an issue' do
15
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
15
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
16
16
 
17
17
  expected_output = <<~STR
18
18
  Finding labels...
@@ -47,8 +47,8 @@ describe Geet::Services::CreateIssue do
47
47
  context 'without labels, assignees and milestones' do
48
48
  it 'should create an upstream issue' do
49
49
  allow(git_client).to receive(:current_branch).and_return('mybranch')
50
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
51
- allow(git_client).to receive(:remote).with('upstream').and_return('git@github.com:momcorp/therepo')
50
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo')
51
+ allow(git_client).to receive(:remote).with(name: 'upstream').and_return('git@github.com:momcorp/therepo')
52
52
 
53
53
  expected_output = <<~STR
54
54
  Creating the issue...
@@ -59,7 +59,7 @@ describe Geet::Services::CreateIssue do
59
59
 
60
60
  actual_created_issue = VCR.use_cassette('create_issue_upstream') do
61
61
  create_options = { no_open_issue: true, out: actual_output }
62
- described_class.new(upstream_repository, out: actual_output).execute('Title', 'Description', create_options)
62
+ described_class.new(upstream_repository, out: actual_output).execute('Title', 'Description', **create_options)
63
63
  end
64
64
 
65
65
  expect(actual_output.string).to eql(expected_output)
@@ -13,7 +13,7 @@ describe Geet::Services::CreateLabel do
13
13
  context 'with github.com' do
14
14
  context 'with user-specified color' do
15
15
  it 'should create a label' do
16
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
16
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo')
17
17
 
18
18
  expected_output = <<~STR
19
19
  Creating label...
@@ -34,8 +34,8 @@ describe Geet::Services::CreateLabel do
34
34
 
35
35
  context 'upstream' do
36
36
  it 'should create a label' do
37
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
38
- allow(git_client).to receive(:remote).with('upstream').and_return('git@github.com:donaldduck-fr/testrepo_gh')
37
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo')
38
+ allow(git_client).to receive(:remote).with(name: 'upstream').and_return('git@github.com:donaldduck-fr/testrepo_gh')
39
39
 
40
40
  expected_output = <<~STR
41
41
  Creating label...
@@ -58,7 +58,7 @@ describe Geet::Services::CreateLabel do
58
58
 
59
59
  context 'with auto-generated color' do
60
60
  it 'should create a label' do
61
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
61
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo')
62
62
 
63
63
  actual_output = StringIO.new
64
64
 
@@ -87,7 +87,7 @@ describe Geet::Services::CreateLabel do
87
87
 
88
88
  context 'with gitlab.com' do
89
89
  it 'should create a label' do
90
- allow(git_client).to receive(:remote).with('origin').and_return('git@gitlab.com:donaldduck/testproject')
90
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@gitlab.com:donaldduck/testproject')
91
91
 
92
92
  expected_output = <<~STR
93
93
  Creating label...
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ require_relative '../../lib/geet/git/repository'
6
+ require_relative '../../lib/geet/services/create_milestone'
7
+
8
+ describe Geet::Services::CreateMilestone do
9
+ let(:git_client) { Geet::Utils::GitClient.new }
10
+ let(:repository) { Geet::Git::Repository.new(git_client: git_client) }
11
+ let(:upstream_repository) { Geet::Git::Repository.new(upstream: true, git_client: git_client) }
12
+
13
+ context 'with github.com' do
14
+ it 'should create a milestone' do
15
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_upstream')
16
+
17
+ expected_output = <<~STR
18
+ Creating milestone...
19
+ STR
20
+
21
+ actual_output = StringIO.new
22
+
23
+ actual_created_label = VCR.use_cassette('github_com/create_milestone') do
24
+ described_class.new(repository, out: actual_output).execute('my_milestone')
25
+ end
26
+
27
+ expect(actual_output.string).to eql(expected_output)
28
+
29
+ expect(actual_created_label.number).to eql(6)
30
+ expect(actual_created_label.title).to eql('my_milestone')
31
+ expect(actual_created_label.due_on).to be(nil)
32
+ end
33
+ end # context 'with github.com'
34
+ end # describe Geet::Services::CreateLabel
@@ -14,7 +14,7 @@ describe Geet::Services::CreatePr do
14
14
  context 'with labels, reviewers and milestones' do
15
15
  it 'should create a PR' do
16
16
  allow(git_client).to receive(:current_branch).and_return('mybranch')
17
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
17
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
18
18
 
19
19
  expected_output = <<~STR
20
20
  Finding labels...
@@ -50,8 +50,8 @@ describe Geet::Services::CreatePr do
50
50
  context 'on an upstream repository' do
51
51
  it 'should create an upstream PR' do
52
52
  allow(git_client).to receive(:current_branch).and_return('mybranch')
53
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
54
- allow(git_client).to receive(:remote).with('upstream').and_return('git@github.com:donald-fr/testrepo_u')
53
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
54
+ allow(git_client).to receive(:remote).with(name: 'upstream').and_return('git@github.com:donald-fr/testrepo_u')
55
55
 
56
56
  expected_output = <<~STR
57
57
  Creating PR...
@@ -80,8 +80,8 @@ describe Geet::Services::CreatePr do
80
80
  context 'without labels, reviewers and milestones' do
81
81
  it 'should create a PR' do
82
82
  allow(git_client).to receive(:current_branch).and_return('mybranch')
83
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
84
- allow(git_client).to receive(:remote).with('upstream').and_return('git@github.com:donald-fr/testrepo_u')
83
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
84
+ allow(git_client).to receive(:remote).with(name: 'upstream').and_return('git@github.com:donald-fr/testrepo_u')
85
85
 
86
86
  expected_output = <<~STR
87
87
  Creating PR...
@@ -112,7 +112,7 @@ describe Geet::Services::CreatePr do
112
112
  context 'in automated mode' do
113
113
  it 'should raise an error when the working tree is dirty' do
114
114
  allow(git_client).to receive(:working_tree_clean?).and_return(false)
115
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
115
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
116
116
 
117
117
  expected_output = <<~STR
118
118
  Error! Saved summary to /tmp/last_geet_edited_summary.md
@@ -136,7 +136,7 @@ describe Geet::Services::CreatePr do
136
136
  expect(git_client).to receive(:upstream_branch).and_return('mybranch')
137
137
  expect(git_client).to receive(:push)
138
138
 
139
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
139
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
140
140
 
141
141
  expected_output = <<~STR
142
142
  Pushing to upstream branch...
@@ -161,7 +161,7 @@ describe Geet::Services::CreatePr do
161
161
  expect(git_client).to receive(:upstream_branch).and_return(nil)
162
162
  expect(git_client).to receive(:push).with(upstream_branch: 'mybranch')
163
163
 
164
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
164
+ allow(git_client).to receive(:remote).with(no_args).and_return('git@github.com:donaldduck/testrepo_f')
165
165
 
166
166
  expected_output = <<~STR
167
167
  Creating upstream branch "mybranch"...