geet 0.3.7 → 0.3.8

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 (26) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -12
  3. data/geet.gemspec +1 -1
  4. data/lib/geet/github/pr.rb +2 -0
  5. data/lib/geet/gitlab/api_interface.rb +1 -1
  6. data/lib/geet/gitlab/label.rb +10 -0
  7. data/lib/geet/gitlab/{PR.rb → pr.rb} +12 -4
  8. data/lib/geet/helpers/os_helper.rb +1 -1
  9. data/lib/geet/services/merge_pr.rb +6 -0
  10. data/lib/geet/version.rb +1 -1
  11. data/spec/integration/create_label_spec.rb +62 -38
  12. data/spec/integration/create_pr_spec.rb +137 -135
  13. data/spec/integration/merge_pr_spec.rb +57 -31
  14. data/spec/vcr_cassettes/{create_label.yml → github_com/create_label.yml} +0 -0
  15. data/spec/vcr_cassettes/{create_label_upstream.yml → github_com/create_label_upstream.yml} +0 -0
  16. data/spec/vcr_cassettes/{create_label_with_random_color.yml → github_com/create_label_with_random_color.yml} +0 -0
  17. data/spec/vcr_cassettes/{create_pr.yml → github_com/create_pr.yml} +0 -0
  18. data/spec/vcr_cassettes/{create_pr_in_auto_mode_create_upstream.yml → github_com/create_pr_in_auto_mode_create_upstream.yml} +0 -0
  19. data/spec/vcr_cassettes/{create_pr_in_auto_mode_with_push.yml → github_com/create_pr_in_auto_mode_with_push.yml} +0 -0
  20. data/spec/vcr_cassettes/{create_pr_upstream.yml → github_com/create_pr_upstream.yml} +0 -0
  21. data/spec/vcr_cassettes/{create_pr_upstream_without_write_permissions.yml → github_com/create_pr_upstream_without_write_permissions.yml} +0 -0
  22. data/spec/vcr_cassettes/{merge_pr.yml → github_com/merge_pr.yml} +0 -0
  23. data/spec/vcr_cassettes/{merge_pr_with_branch_deletion.yml → github_com/merge_pr_with_branch_deletion.yml} +0 -0
  24. data/spec/vcr_cassettes/gitlab_com/create_label.yml +64 -0
  25. data/spec/vcr_cassettes/gitlab_com/merge_pr.yml +144 -0
  26. metadata +15 -13
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: bd623b15d744959be72ee1fd7438cbae8e8a8de8086f60c71ad6b269f457f975
4
- data.tar.gz: fd84684c150029c3e0028703aa36d6834d9b0909f1872007abf82e6c75753ebf
3
+ metadata.gz: '08771354786ab21808618e54fc0eb487623adf32983f25239cfc14144708488f'
4
+ data.tar.gz: 4559d362a557121d242fa191be9263b9e2e22f987348618ab32c5a3b2ff386c5
5
5
  SHA512:
6
- metadata.gz: 5f7ede545d5ba98c5ab018fe81644bf9e78c64eeecaae39c619c6407fce4ae4080e6c6be152425d4eb33d073b2514c4e6322d7be2a22403465d39c243839a016
7
- data.tar.gz: 12543389e4ccbbbdd185c771acbc90669347b568f0a6d6a39bba8da4263cddd1da738d0397ef0d9991e9536052f10459ff5258752f5c03ad9ada3c36c3ed241b
6
+ metadata.gz: c900f0206f18cc80979128b3800c815b1c9e65bf75587a666ffb145d38aa87cee0204deed51ed915a2bdfe0d6672ca5d55c16e2b7dea547cceddee72beb2cfd8
7
+ data.tar.gz: 5def80bda1f7d663b125cab82ba2a309ac5c60586ae5167208cf6784cdc0672172bf8a72ad2e6b7a7a8bbd6e374c1f1abbfb150a7b6f2dda90c0a84d13d13889
data/README.md CHANGED
@@ -4,32 +4,29 @@
4
4
 
5
5
  Command line interface for performing Git hosting service operations.
6
6
 
7
- This tool is very similar to [Hub](https://github.com/github/hub), but it supports a different set of operations, fully specified via command line.
7
+ This tool is a provider-independent version of [Hub](https://github.com/github/hub) and [Lab](https://github.com/zaquestion/lab).
8
8
 
9
- Please see the [development status](#development-status) section for informations about the current development.
9
+ ## Development status/plan
10
10
 
11
- ## Development status
11
+ The current focus is implementing Gitlab functionalities (0.3.x series).
12
12
 
13
- Geet is (again) under active development. The current focus is implementing Gitlab functionalities.
13
+ Everything is tracked in detail via [issues](https://github.com/saveriomiroddi/geet/issues) and [milestones](https://github.com/saveriomiroddi/geet/milestones).
14
14
 
15
15
  ## Operation/providers support
16
16
 
17
17
  The functionalities currently supported are:
18
18
 
19
- - Github:
20
- - create gist
21
- - create issue
19
+ - Github/Gitlab:
22
20
  - create label
23
- - create PR
24
21
  - list issues
25
22
  - list labels
26
23
  - list milestones
27
24
  - list PRs
25
+ - Github:
26
+ - create gist
27
+ - create issue
28
+ - create PR
28
29
  - merge PR
29
- - Gitlab:
30
- - list issues
31
- - list labels
32
- - list milestones
33
30
 
34
31
  ## Samples
35
32
 
@@ -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 = '2018-07-01'
13
+ s.date = '2018-07-05'
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 (eg. GitHub) operations (eg. PR creation).'
@@ -26,6 +26,8 @@ module Geet
26
26
  new(number, api_interface, title, link)
27
27
  end
28
28
 
29
+ # See https://developer.github.com/v3/pulls/#list-pull-requests
30
+ #
29
31
  def self.list(api_interface, milestone: nil, assignee: nil, head: nil)
30
32
  check_list_params!(milestone, assignee, head)
31
33
 
@@ -89,7 +89,7 @@ module Geet
89
89
  request = http_class.new(uri)
90
90
 
91
91
  request['Private-Token'] = @api_token
92
- request.body = data.to_json if data
92
+ request.body = URI.encode_www_form(data) if data
93
93
 
94
94
  http.request(request)
95
95
  end
@@ -22,6 +22,16 @@ module Geet
22
22
  new(name, color)
23
23
  end
24
24
  end
25
+
26
+ # See https://docs.gitlab.com/ee/api/labels.html#create-a-new-label
27
+ def self.create(name, color, api_interface)
28
+ api_path = "projects/#{api_interface.path_with_namespace(encoded: true)}/labels"
29
+ request_data = { name: name, color: "##{color}" }
30
+
31
+ api_interface.send_request(api_path, data: request_data)
32
+
33
+ new(name, color)
34
+ end
25
35
  end
26
36
  end
27
37
  end
@@ -5,8 +5,9 @@ module Geet
5
5
  class PR
6
6
  attr_reader :number, :title, :link
7
7
 
8
- def initialize(number, title, link)
8
+ def initialize(number, api_interface, title, link)
9
9
  @number = number
10
+ @api_interface = api_interface
10
11
  @title = title
11
12
  @link = link
12
13
  end
@@ -14,13 +15,12 @@ module Geet
14
15
  # See https://docs.gitlab.com/ee/api/merge_requests.html#list-merge-requests
15
16
  #
16
17
  def self.list(api_interface, milestone: nil, assignee: nil, head: nil)
17
- raise ":head parameter currently unsupported!" if head
18
-
19
18
  api_path = "projects/#{api_interface.path_with_namespace(encoded: true)}/merge_requests"
20
19
 
21
20
  request_params = {}
22
21
  request_params[:assignee_id] = assignee.id if assignee
23
22
  request_params[:milestone] = milestone.title if milestone
23
+ request_params[:source_branch] = head if head
24
24
 
25
25
  response = api_interface.send_request(api_path, params: request_params, multipage: true)
26
26
 
@@ -29,9 +29,17 @@ module Geet
29
29
  title = issue_data.fetch('title')
30
30
  link = issue_data.fetch('web_url')
31
31
 
32
- new(number, title, link)
32
+ new(number, api_interface, title, link)
33
33
  end
34
34
  end
35
+
36
+ # See https://docs.gitlab.com/ee/api/merge_requests.html#accept-mr
37
+ #
38
+ def merge
39
+ api_path = "projects/#{@api_interface.path_with_namespace(encoded: true)}/merge_requests/#{number}/merge"
40
+
41
+ @api_interface.send_request(api_path, http_method: :put)
42
+ end
35
43
  end # PR
36
44
  end # Gitlab
37
45
  end # Geet
@@ -44,7 +44,7 @@ module Geet
44
44
  puts stderr_content if stderr_content != '' && !silent_stderr
45
45
 
46
46
  if !wait_thread.value.success?
47
- error_message = stderr_content.lines.first.strip
47
+ error_message = stderr_content.lines.first&.strip || "Error running command #{command.inspect}"
48
48
  raise "Error#{description_message}: #{error_message}"
49
49
  end
50
50
 
@@ -2,6 +2,12 @@
2
2
 
3
3
  module Geet
4
4
  module Services
5
+ # Merges the PR for the current branch.
6
+ #
7
+ # The workflow of this services is oriented to the a commondline usage: the user doesn't need
8
+ # to lookup the merge for the working branch; this comes at the cost of extra operations and
9
+ # constraints, but speeds up the workflow.
10
+ #
5
11
  class MergePr
6
12
  DEFAULT_GIT_CLIENT = Geet::Utils::GitClient.new
7
13
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Geet
4
- VERSION = '0.3.7'
4
+ VERSION = '0.3.8'
5
5
  end
@@ -10,76 +10,100 @@ describe Geet::Services::CreateLabel do
10
10
  let(:repository) { Geet::Git::Repository.new(git_client: git_client) }
11
11
  let(:upstream_repository) { Geet::Git::Repository.new(upstream: true, git_client: git_client) }
12
12
 
13
- context 'with user-specified color' do
14
- it 'should create a label' do
15
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
13
+ context 'with github.com' do
14
+ context 'with user-specified color' do
15
+ it 'should create a label' do
16
+ allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
16
17
 
17
- expected_output = <<~STR
18
- Creating label...
19
- Created with color #c64c64
20
- STR
18
+ expected_output = <<~STR
19
+ Creating label...
20
+ Created with color #c64c64
21
+ STR
21
22
 
22
- actual_output = StringIO.new
23
+ actual_output = StringIO.new
23
24
 
24
- actual_created_label = VCR.use_cassette('create_label') do
25
- described_class.new(repository, out: actual_output).execute('my_label', color: 'c64c64')
25
+ actual_created_label = VCR.use_cassette('github_com/create_label') do
26
+ described_class.new(repository, out: actual_output).execute('my_label', color: 'c64c64')
27
+ end
28
+
29
+ expect(actual_output.string).to eql(expected_output)
30
+
31
+ expect(actual_created_label.name).to eql('my_label')
32
+ expect(actual_created_label.color).to eql('c64c64')
26
33
  end
27
34
 
28
- expect(actual_output.string).to eql(expected_output)
35
+ context 'upstream' do
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')
29
39
 
30
- expect(actual_created_label.name).to eql('my_label')
31
- expect(actual_created_label.color).to eql('c64c64')
40
+ expected_output = <<~STR
41
+ Creating label...
42
+ Created with color #c64c64
43
+ STR
44
+
45
+ actual_output = StringIO.new
46
+
47
+ actual_created_label = VCR.use_cassette('github_com/create_label_upstream') do
48
+ described_class.new(upstream_repository, out: actual_output).execute('my_label', color: 'c64c64')
49
+ end
50
+
51
+ expect(actual_output.string).to eql(expected_output)
52
+
53
+ expect(actual_created_label.name).to eql('my_label')
54
+ expect(actual_created_label.color).to eql('c64c64')
55
+ end
56
+ end
32
57
  end
33
58
 
34
- context 'upstream' do
59
+ context 'with auto-generated color' do
35
60
  it 'should create a label' do
36
61
  allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
37
- allow(git_client).to receive(:remote).with('upstream').and_return('git@github.com:donaldduck-fr/testrepo_gh')
38
62
 
39
- expected_output = <<~STR
63
+ actual_output = StringIO.new
64
+
65
+ service_instance = described_class.new(repository, out: actual_output)
66
+
67
+ expect(service_instance).to receive(:rand).with(2**24).and_return(38911)
68
+
69
+ expected_output_template = <<~STR
40
70
  Creating label...
41
- Created with color #c64c64
71
+ Created with color #0097ff
42
72
  STR
43
73
 
44
- actual_output = StringIO.new
45
-
46
- actual_created_label = VCR.use_cassette('create_label_upstream') do
47
- described_class.new(upstream_repository, out: actual_output).execute('my_label', color: 'c64c64')
74
+ actual_created_label = VCR.use_cassette('github_com/create_label_with_random_color') do
75
+ service_instance.execute('my_label')
48
76
  end
49
77
 
78
+ expected_output = format(expected_output_template, color: actual_created_label.color)
79
+
50
80
  expect(actual_output.string).to eql(expected_output)
51
81
 
52
82
  expect(actual_created_label.name).to eql('my_label')
53
- expect(actual_created_label.color).to eql('c64c64')
83
+ expect(actual_created_label.color).to eql('0097ff')
54
84
  end
55
85
  end
56
- end
86
+ end # context 'with github.com'
57
87
 
58
- context 'with auto-generated color' do
88
+ context 'with gitlab.com' do
59
89
  it 'should create a label' do
60
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
61
-
62
- actual_output = StringIO.new
63
-
64
- service_instance = described_class.new(repository, out: actual_output)
90
+ allow(git_client).to receive(:remote).with('origin').and_return('git@gitlab.com:donaldduck/testproject')
65
91
 
66
- expect(service_instance).to receive(:rand).with(2**24).and_return(38911)
67
-
68
- expected_output_template = <<~STR
92
+ expected_output = <<~STR
69
93
  Creating label...
70
- Created with color #0097ff
94
+ Created with color #123456
71
95
  STR
72
96
 
73
- actual_created_label = VCR.use_cassette('create_label_with_random_color') do
74
- service_instance.execute('my_label')
75
- end
97
+ actual_output = StringIO.new
76
98
 
77
- expected_output = format(expected_output_template, color: actual_created_label.color)
99
+ actual_created_label = VCR.use_cassette('gitlab_com/create_label') do
100
+ described_class.new(repository, out: actual_output).execute('my_label', color: '123456')
101
+ end
78
102
 
79
103
  expect(actual_output.string).to eql(expected_output)
80
104
 
81
105
  expect(actual_created_label.name).to eql('my_label')
82
- expect(actual_created_label.color).to eql('0097ff')
106
+ expect(actual_created_label.color).to eql('123456')
83
107
  end
84
108
  end
85
109
  end
@@ -10,173 +10,175 @@ describe Geet::Services::CreatePr do
10
10
  let(:repository) { Geet::Git::Repository.new(git_client: git_client, warnings: false) }
11
11
  let(:upstream_repository) { Geet::Git::Repository.new(upstream: true, git_client: git_client, warnings: false) }
12
12
 
13
- context 'with labels, reviewers and milestones' do
14
- it 'should create a PR' do
15
- allow(git_client).to receive(:current_branch).and_return('mybranch')
16
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
17
-
18
- expected_output = <<~STR
19
- Finding labels...
20
- Finding milestones...
21
- Finding collaborators...
22
- Creating PR...
23
- Assigning authenticated user...
24
- Adding labels bug, invalid...
25
- Setting milestone 0.0.1...
26
- Requesting review from donald-fr...
27
- PR address: https://github.com/donaldduck/testrepo_f/pull/1
28
- STR
29
-
30
- actual_output = StringIO.new
31
-
32
- actual_created_pr = VCR.use_cassette('create_pr') do
33
- service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
34
- service_instance.execute(
35
- 'Title', 'Description',
36
- labels: 'bug,invalid', milestone: '0.0.1', reviewers: 'donald-fr',
37
- no_open_pr: true, output: actual_output
38
- )
39
- end
13
+ context 'with github.com' do
14
+ context 'with labels, reviewers and milestones' do
15
+ it 'should create a PR' do
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')
18
+
19
+ expected_output = <<~STR
20
+ Finding labels...
21
+ Finding milestones...
22
+ Finding collaborators...
23
+ Creating PR...
24
+ Assigning authenticated user...
25
+ Adding labels bug, invalid...
26
+ Setting milestone 0.0.1...
27
+ Requesting review from donald-fr...
28
+ PR address: https://github.com/donaldduck/testrepo_f/pull/1
29
+ STR
30
+
31
+ actual_output = StringIO.new
32
+
33
+ actual_created_pr = VCR.use_cassette('github_com/create_pr') do
34
+ service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
35
+ service_instance.execute(
36
+ 'Title', 'Description',
37
+ labels: 'bug,invalid', milestone: '0.0.1', reviewers: 'donald-fr',
38
+ no_open_pr: true, output: actual_output
39
+ )
40
+ end
40
41
 
41
- expect(actual_output.string).to eql(expected_output)
42
+ expect(actual_output.string).to eql(expected_output)
42
43
 
43
- expect(actual_created_pr.number).to eql(1)
44
- expect(actual_created_pr.title).to eql('Title')
45
- expect(actual_created_pr.link).to eql('https://github.com/donaldduck/testrepo_f/pull/1')
44
+ expect(actual_created_pr.number).to eql(1)
45
+ expect(actual_created_pr.title).to eql('Title')
46
+ expect(actual_created_pr.link).to eql('https://github.com/donaldduck/testrepo_f/pull/1')
47
+ end
46
48
  end
47
- end
48
49
 
49
- context 'on an upstream repository' do
50
- it 'should create an upstream PR' do
51
- allow(git_client).to receive(:current_branch).and_return('mybranch')
52
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
53
- allow(git_client).to receive(:remote).with('upstream').and_return('git@github.com:donald-fr/testrepo_u')
50
+ context 'on an upstream repository' do
51
+ it 'should create an upstream PR' do
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')
54
55
 
55
- expected_output = <<~STR
56
- Creating PR...
57
- Assigning authenticated user...
58
- PR address: https://github.com/donald-fr/testrepo_u/pull/8
59
- STR
56
+ expected_output = <<~STR
57
+ Creating PR...
58
+ Assigning authenticated user...
59
+ PR address: https://github.com/donald-fr/testrepo_u/pull/8
60
+ STR
60
61
 
61
- actual_output = StringIO.new
62
+ actual_output = StringIO.new
62
63
 
63
- actual_created_pr = VCR.use_cassette('create_pr_upstream') do
64
- service_instance = described_class.new(upstream_repository, out: actual_output, git_client: git_client)
65
- service_instance.execute('Title', 'Description', no_open_pr: true, output: actual_output)
66
- end
64
+ actual_created_pr = VCR.use_cassette('github_com/create_pr_upstream') do
65
+ service_instance = described_class.new(upstream_repository, out: actual_output, git_client: git_client)
66
+ service_instance.execute('Title', 'Description', no_open_pr: true, output: actual_output)
67
+ end
67
68
 
68
- expect(actual_output.string).to eql(expected_output)
69
+ expect(actual_output.string).to eql(expected_output)
69
70
 
70
- expect(actual_created_pr.number).to eql(8)
71
- expect(actual_created_pr.title).to eql('Title')
72
- expect(actual_created_pr.link).to eql('https://github.com/donald-fr/testrepo_u/pull/8')
73
- end
71
+ expect(actual_created_pr.number).to eql(8)
72
+ expect(actual_created_pr.title).to eql('Title')
73
+ expect(actual_created_pr.link).to eql('https://github.com/donald-fr/testrepo_u/pull/8')
74
+ end
74
75
 
75
- # It would be more consistent to have this UT outside of an upstream context, however this use
76
- # case is actually a typical real-world one
77
- #
78
- context 'without write permissions' do
79
- context 'without labels, reviewers and milestones' do
80
- it 'should create a PR' do
81
- allow(git_client).to receive(:current_branch).and_return('mybranch')
82
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
83
- allow(git_client).to receive(:remote).with('upstream').and_return('git@github.com:donald-fr/testrepo_u')
84
-
85
- expected_output = <<~STR
86
- Creating PR...
87
- PR address: https://github.com/donald-fr/testrepo_u/pull/9
88
- STR
89
-
90
- actual_output = StringIO.new
91
-
92
- actual_created_pr = VCR.use_cassette('create_pr_upstream_without_write_permissions') do
93
- service_instance = described_class.new(upstream_repository, out: actual_output, git_client: git_client)
94
- service_instance.execute(
95
- 'Title', 'Description',
96
- labels: '<ignored>',
97
- no_open_pr: true, output: actual_output
98
- )
76
+ # It would be more consistent to have this UT outside of an upstream context, however this use
77
+ # case is actually a typical real-world one
78
+ #
79
+ context 'without write permissions' do
80
+ context 'without labels, reviewers and milestones' do
81
+ it 'should create a PR' do
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')
85
+
86
+ expected_output = <<~STR
87
+ Creating PR...
88
+ PR address: https://github.com/donald-fr/testrepo_u/pull/9
89
+ STR
90
+
91
+ actual_output = StringIO.new
92
+
93
+ actual_created_pr = VCR.use_cassette('github_com/create_pr_upstream_without_write_permissions') do
94
+ service_instance = described_class.new(upstream_repository, out: actual_output, git_client: git_client)
95
+ service_instance.execute(
96
+ 'Title', 'Description',
97
+ labels: '<ignored>',
98
+ no_open_pr: true, output: actual_output
99
+ )
100
+ end
101
+
102
+ expect(actual_output.string).to eql(expected_output)
103
+
104
+ expect(actual_created_pr.number).to eql(9)
105
+ expect(actual_created_pr.title).to eql('Title')
106
+ expect(actual_created_pr.link).to eql('https://github.com/donald-fr/testrepo_u/pull/9')
99
107
  end
100
-
101
- expect(actual_output.string).to eql(expected_output)
102
-
103
- expect(actual_created_pr.number).to eql(9)
104
- expect(actual_created_pr.title).to eql('Title')
105
- expect(actual_created_pr.link).to eql('https://github.com/donald-fr/testrepo_u/pull/9')
106
108
  end
107
109
  end
108
110
  end
109
- end
110
111
 
111
- context 'in automated mode' do
112
- it 'should raise an error when the working tree is dirty' do
113
- allow(git_client).to receive(:working_tree_clean?).and_return(false)
114
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
112
+ context 'in automated mode' do
113
+ it 'should raise an error when the working tree is dirty' do
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
116
 
116
- expected_output = <<~STR
117
- Error! Saved summary to /tmp/last_geet_edited_summary.md
118
- STR
117
+ expected_output = <<~STR
118
+ Error! Saved summary to /tmp/last_geet_edited_summary.md
119
+ STR
119
120
 
120
- actual_output = StringIO.new
121
+ actual_output = StringIO.new
121
122
 
122
- operation = -> do
123
- service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
124
- service_instance.execute('Title', 'Description', output: actual_output, automated_mode: true, no_open_pr: true)
125
- end
123
+ operation = -> do
124
+ service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
125
+ service_instance.execute('Title', 'Description', output: actual_output, automated_mode: true, no_open_pr: true)
126
+ end
126
127
 
127
- expect(operation).to raise_error(RuntimeError, 'The working tree is not clean!')
128
+ expect(operation).to raise_error(RuntimeError, 'The working tree is not clean!')
128
129
 
129
- expect(actual_output.string).to eql(expected_output)
130
- end
130
+ expect(actual_output.string).to eql(expected_output)
131
+ end
131
132
 
132
- it 'should push to the upstream branch' do
133
- allow(git_client).to receive(:working_tree_clean?).and_return(true)
134
- allow(git_client).to receive(:current_branch).and_return('mybranch')
135
- expect(git_client).to receive(:upstream_branch).and_return('mybranch')
136
- expect(git_client).to receive(:push)
133
+ it 'should push to the upstream branch' do
134
+ allow(git_client).to receive(:working_tree_clean?).and_return(true)
135
+ allow(git_client).to receive(:current_branch).and_return('mybranch')
136
+ expect(git_client).to receive(:upstream_branch).and_return('mybranch')
137
+ expect(git_client).to receive(:push)
137
138
 
138
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
139
+ allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
139
140
 
140
- expected_output = <<~STR
141
- Pushing to upstream branch...
142
- Creating PR...
143
- Assigning authenticated user...
144
- PR address: https://github.com/donaldduck/testrepo_f/pull/2
145
- STR
141
+ expected_output = <<~STR
142
+ Pushing to upstream branch...
143
+ Creating PR...
144
+ Assigning authenticated user...
145
+ PR address: https://github.com/donaldduck/testrepo_f/pull/2
146
+ STR
146
147
 
147
- actual_output = StringIO.new
148
+ actual_output = StringIO.new
148
149
 
149
- actual_created_pr = VCR.use_cassette('create_pr_in_auto_mode_with_push') do
150
- service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
151
- service_instance.execute('Title', 'Description', output: actual_output, automated_mode: true, no_open_pr: true)
150
+ actual_created_pr = VCR.use_cassette('github_com/create_pr_in_auto_mode_with_push') do
151
+ service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
152
+ service_instance.execute('Title', 'Description', output: actual_output, automated_mode: true, no_open_pr: true)
153
+ end
154
+
155
+ expect(actual_output.string).to eql(expected_output)
152
156
  end
153
157
 
154
- expect(actual_output.string).to eql(expected_output)
155
- end
158
+ it "should create an upstream branch, when there isn't one (is not tracked)" do
159
+ allow(git_client).to receive(:working_tree_clean?).and_return(true)
160
+ allow(git_client).to receive(:current_branch).and_return('mybranch')
161
+ expect(git_client).to receive(:upstream_branch).and_return(nil)
162
+ expect(git_client).to receive(:push).with(upstream_branch: 'mybranch')
156
163
 
157
- it "should create an upstream branch, when there isn't one (is not tracked)" do
158
- allow(git_client).to receive(:working_tree_clean?).and_return(true)
159
- allow(git_client).to receive(:current_branch).and_return('mybranch')
160
- expect(git_client).to receive(:upstream_branch).and_return(nil)
161
- expect(git_client).to receive(:push).with(upstream_branch: 'mybranch')
164
+ allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
162
165
 
163
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
166
+ expected_output = <<~STR
167
+ Creating upstream branch "mybranch"...
168
+ Creating PR...
169
+ Assigning authenticated user...
170
+ PR address: https://github.com/donaldduck/testrepo_f/pull/4
171
+ STR
164
172
 
165
- expected_output = <<~STR
166
- Creating upstream branch "mybranch"...
167
- Creating PR...
168
- Assigning authenticated user...
169
- PR address: https://github.com/donaldduck/testrepo_f/pull/4
170
- STR
173
+ actual_output = StringIO.new
171
174
 
172
- actual_output = StringIO.new
175
+ actual_created_pr = VCR.use_cassette('github_com/create_pr_in_auto_mode_create_upstream') do
176
+ service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
177
+ service_instance.execute('Title', 'Description', output: actual_output, automated_mode: true, no_open_pr: true)
178
+ end
173
179
 
174
- actual_created_pr = VCR.use_cassette('create_pr_in_auto_mode_create_upstream') do
175
- service_instance = described_class.new(repository, out: actual_output, git_client: git_client)
176
- service_instance.execute('Title', 'Description', output: actual_output, automated_mode: true, no_open_pr: true)
180
+ expect(actual_output.string).to eql(expected_output)
177
181
  end
178
-
179
- expect(actual_output.string).to eql(expected_output)
180
182
  end
181
- end
183
+ end # context 'with github.com'
182
184
  end
@@ -9,48 +9,74 @@ describe Geet::Services::MergePr do
9
9
  let(:git_client) { Geet::Utils::GitClient.new }
10
10
  let(:repository) { Geet::Git::Repository.new(git_client: git_client) }
11
11
 
12
- it 'should merge the PR for the current branch' do
13
- allow(git_client).to receive(:current_branch).and_return('mybranch1')
14
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
12
+ context 'with github.com' do
13
+ it 'should merge the PR for the current branch' do
14
+ allow(git_client).to receive(:current_branch).and_return('mybranch1')
15
+ allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
15
16
 
16
- expected_output = <<~STR
17
- Finding PR with head (mybranch1)...
18
- Merging PR #3...
19
- STR
20
- expected_pr_number = 3
17
+ expected_output = <<~STR
18
+ Finding PR with head (mybranch1)...
19
+ Merging PR #3...
20
+ STR
21
+ expected_pr_number = 3
21
22
 
22
- actual_output = StringIO.new
23
+ actual_output = StringIO.new
23
24
 
24
- service_result = VCR.use_cassette('merge_pr') do
25
- described_class.new(repository, out: actual_output, git_client: git_client).execute
25
+ service_result = VCR.use_cassette('github_com/merge_pr') do
26
+ described_class.new(repository, out: actual_output, git_client: git_client).execute
27
+ end
28
+
29
+ actual_pr_number = service_result.number
30
+
31
+ expect(actual_output.string).to eql(expected_output)
32
+ expect(actual_pr_number).to eql(expected_pr_number)
26
33
  end
27
34
 
28
- actual_pr_number = service_result.number
35
+ it 'should merge the PR for the current branch, with branch deletion' do
36
+ allow(git_client).to receive(:current_branch).and_return('mybranch')
37
+ allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
29
38
 
30
- expect(actual_output.string).to eql(expected_output)
31
- expect(actual_pr_number).to eql(expected_pr_number)
32
- end
39
+ expected_output = <<~STR
40
+ Finding PR with head (mybranch)...
41
+ Merging PR #3...
42
+ Deleting branch mybranch...
43
+ STR
44
+ expected_pr_number = 3
33
45
 
34
- it 'should merge the PR for the current branch, with branch deletion' do
35
- allow(git_client).to receive(:current_branch).and_return('mybranch')
36
- allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo')
46
+ actual_output = StringIO.new
37
47
 
38
- expected_output = <<~STR
39
- Finding PR with head (mybranch)...
40
- Merging PR #3...
41
- Deleting branch mybranch...
42
- STR
43
- expected_pr_number = 3
48
+ service_result = VCR.use_cassette('github_com/merge_pr_with_branch_deletion') do
49
+ described_class.new(repository, out: actual_output, git_client: git_client).execute(delete_branch: true)
50
+ end
44
51
 
45
- actual_output = StringIO.new
52
+ actual_pr_number = service_result.number
46
53
 
47
- service_result = VCR.use_cassette('merge_pr_with_branch_deletion') do
48
- described_class.new(repository, out: actual_output, git_client: git_client).execute(delete_branch: true)
54
+ expect(actual_output.string).to eql(expected_output)
55
+ expect(actual_pr_number).to eql(expected_pr_number)
49
56
  end
57
+ end # context 'with github.com'
58
+
59
+ context 'with gitlab.com' do
60
+ it 'should merge the PR for the current branch' do
61
+ allow(git_client).to receive(:current_branch).and_return('mybranch')
62
+ allow(git_client).to receive(:remote).with('origin').and_return('git@gitlab.com:donaldduck/testproject')
63
+
64
+ expected_output = <<~STR
65
+ Finding PR with head (mybranch)...
66
+ Merging PR #2...
67
+ STR
68
+ expected_pr_number = 2
50
69
 
51
- actual_pr_number = service_result.number
70
+ actual_output = StringIO.new
52
71
 
53
- expect(actual_output.string).to eql(expected_output)
54
- expect(actual_pr_number).to eql(expected_pr_number)
55
- end
72
+ service_result = VCR.use_cassette('gitlab_com/merge_pr') do
73
+ described_class.new(repository, out: actual_output, git_client: git_client).execute
74
+ end
75
+
76
+ actual_pr_number = service_result.number
77
+
78
+ expect(actual_output.string).to eql(expected_output)
79
+ expect(actual_pr_number).to eql(expected_pr_number)
80
+ end
81
+ end # context 'with gitlab.com'
56
82
  end
@@ -0,0 +1,64 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/labels
6
+ body:
7
+ encoding: US-ASCII
8
+ string: name=my_label&color=%23123456
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ Host:
17
+ - gitlab.com
18
+ Private-Token:
19
+ - "<GITLAB_CREDENTIALS>"
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: Created
24
+ headers:
25
+ Server:
26
+ - nginx
27
+ Date:
28
+ - Tue, 03 Jul 2018 16:44:14 GMT
29
+ Content-Type:
30
+ - application/json
31
+ Content-Length:
32
+ - '180'
33
+ Cache-Control:
34
+ - max-age=0, private, must-revalidate
35
+ Etag:
36
+ - W/"9ccd74bc7bedefbbc67c4783b163c8fc"
37
+ Vary:
38
+ - Origin
39
+ X-Content-Type-Options:
40
+ - nosniff
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ X-Request-Id:
44
+ - fb041fb4-a96d-4230-9eac-514d9db1a9f0
45
+ X-Runtime:
46
+ - '0.253058'
47
+ Strict-Transport-Security:
48
+ - max-age=31536000
49
+ Ratelimit-Limit:
50
+ - '600'
51
+ Ratelimit-Observed:
52
+ - '2'
53
+ Ratelimit-Remaining:
54
+ - '598'
55
+ Ratelimit-Reset:
56
+ - '1530636314'
57
+ Ratelimit-Resettime:
58
+ - Wed, 03 Jul 2018 16:45:14 GMT
59
+ body:
60
+ encoding: UTF-8
61
+ string: '{"id":1234565,"name":"my_label","color":"#123456","description":null,"open_issues_count":0,"closed_issues_count":0,"open_merge_requests_count":0,"priority":null,"subscribed":false}'
62
+ http_version:
63
+ recorded_at: Tue, 03 Jul 2018 16:44:15 GMT
64
+ recorded_with: VCR 3.0.3
@@ -0,0 +1,144 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/merge_requests?source_branch=mybranch
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept-Encoding:
11
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
12
+ Accept:
13
+ - "*/*"
14
+ User-Agent:
15
+ - Ruby
16
+ Host:
17
+ - gitlab.com
18
+ Private-Token:
19
+ - "<GITLAB_CREDENTIALS>"
20
+ response:
21
+ status:
22
+ code: 200
23
+ message: OK
24
+ headers:
25
+ Server:
26
+ - nginx
27
+ Date:
28
+ - Thu, 05 Jul 2018 10:26:02 GMT
29
+ Content-Type:
30
+ - application/json
31
+ Content-Length:
32
+ - '1115'
33
+ Cache-Control:
34
+ - max-age=0, private, must-revalidate
35
+ Etag:
36
+ - W/"e988027264fe5cf0c30640e4212fea0c"
37
+ Link:
38
+ - <https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/merge_requests?id=donaldduck%2Ftestproject&order_by=created_at&page=1&per_page=20&sort=desc&source_branch=mybranch&state=all>;
39
+ rel="first", <https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/merge_requests?id=donaldduck%2Ftestproject&order_by=created_at&page=1&per_page=20&sort=desc&source_branch=mybranch&state=all>;
40
+ rel="last"
41
+ Vary:
42
+ - Origin
43
+ X-Content-Type-Options:
44
+ - nosniff
45
+ X-Frame-Options:
46
+ - SAMEORIGIN
47
+ X-Next-Page:
48
+ - ''
49
+ X-Page:
50
+ - '1'
51
+ X-Per-Page:
52
+ - '20'
53
+ X-Prev-Page:
54
+ - ''
55
+ X-Request-Id:
56
+ - 11dea779-d74a-449f-baad-57b1a54e52f5
57
+ X-Runtime:
58
+ - '0.128214'
59
+ X-Total:
60
+ - '1'
61
+ X-Total-Pages:
62
+ - '1'
63
+ Strict-Transport-Security:
64
+ - max-age=31536000
65
+ Ratelimit-Limit:
66
+ - '600'
67
+ Ratelimit-Observed:
68
+ - '1'
69
+ Ratelimit-Remaining:
70
+ - '599'
71
+ Ratelimit-Reset:
72
+ - '1530786422'
73
+ Ratelimit-Resettime:
74
+ - Fri, 05 Jul 2018 10:27:02 GMT
75
+ body:
76
+ encoding: UTF-8
77
+ string: '[{"id":12345600,"iid":2,"project_id":1234569,"title":"Test PR","description":"","state":"opened","created_at":"2018-07-05T10:25:10.670Z","updated_at":"2018-07-05T10:25:10.670Z","target_branch":"master","source_branch":"mybranch","upvotes":0,"downvotes":0,"author":{"id":1234561,"name":"Donald
78
+ Duck","username":"donaldduck","state":"active","avatar_url":"https://secure.gravatar.com/avatar/0123456789abcdef05ea2797cb94a5b0?s=80\u0026d=identicon","web_url":"https://gitlab.com/donaldduck"},"assignee":null,"source_project_id":1234569,"target_project_id":1234569,"labels":[],"work_in_progress":false,"milestone":null,"merge_when_pipeline_succeeds":false,"merge_status":"can_be_merged","sha":"8c5971f670b5915c8a1c11448b36ed65ddbf4e33","merge_commit_sha":null,"user_notes_count":0,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":false,"web_url":"https://gitlab.com/donaldduck/testproject/merge_requests/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"approvals_before_merge":null}]'
79
+ http_version:
80
+ recorded_at: Thu, 05 Jul 2018 10:26:02 GMT
81
+ - request:
82
+ method: put
83
+ uri: https://gitlab.com/api/v4/projects/donaldduck%2Ftestproject/merge_requests/2/merge
84
+ body:
85
+ encoding: UTF-8
86
+ string: ''
87
+ headers:
88
+ Accept-Encoding:
89
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
90
+ Accept:
91
+ - "*/*"
92
+ User-Agent:
93
+ - Ruby
94
+ Host:
95
+ - gitlab.com
96
+ Private-Token:
97
+ - "<GITLAB_CREDENTIALS>"
98
+ response:
99
+ status:
100
+ code: 200
101
+ message: OK
102
+ headers:
103
+ Server:
104
+ - nginx
105
+ Date:
106
+ - Thu, 05 Jul 2018 10:26:04 GMT
107
+ Content-Type:
108
+ - application/json
109
+ Content-Length:
110
+ - '1805'
111
+ Cache-Control:
112
+ - max-age=0, private, must-revalidate
113
+ Etag:
114
+ - W/"6c6d3084301470b5561b5106f5ce1da1"
115
+ Vary:
116
+ - Origin
117
+ X-Content-Type-Options:
118
+ - nosniff
119
+ X-Frame-Options:
120
+ - SAMEORIGIN
121
+ X-Request-Id:
122
+ - 998cef6c-2c57-4e0a-8513-f187b555a43b
123
+ X-Runtime:
124
+ - '1.395083'
125
+ Strict-Transport-Security:
126
+ - max-age=31536000
127
+ Ratelimit-Limit:
128
+ - '600'
129
+ Ratelimit-Observed:
130
+ - '2'
131
+ Ratelimit-Remaining:
132
+ - '598'
133
+ Ratelimit-Reset:
134
+ - '1530786424'
135
+ Ratelimit-Resettime:
136
+ - Fri, 05 Jul 2018 10:27:04 GMT
137
+ body:
138
+ encoding: UTF-8
139
+ string: '{"id":12345600,"iid":2,"project_id":1234569,"title":"Test PR","description":"","state":"merged","created_at":"2018-07-05T10:25:10.670Z","updated_at":"2018-07-05T10:26:03.813Z","target_branch":"master","source_branch":"mybranch","upvotes":0,"downvotes":0,"author":{"id":1234561,"name":"Donald
140
+ Duck","username":"donaldduck","state":"active","avatar_url":"https://secure.gravatar.com/avatar/0123456789abcdef05ea2797cb94a5b0?s=80\u0026d=identicon","web_url":"https://gitlab.com/donaldduck"},"assignee":null,"source_project_id":1234569,"target_project_id":1234569,"labels":[],"work_in_progress":false,"milestone":null,"merge_when_pipeline_succeeds":false,"merge_status":"can_be_merged","sha":"8c5971f670b5915c8a1c11448b36ed65ddbf4e33","merge_commit_sha":"8f98cc2323509d78326184b0b961c3e182165983","user_notes_count":0,"discussion_locked":null,"should_remove_source_branch":null,"force_remove_source_branch":false,"web_url":"https://gitlab.com/donaldduck/testproject/merge_requests/2","time_stats":{"time_estimate":0,"total_time_spent":0,"human_time_estimate":null,"human_total_time_spent":null},"squash":false,"subscribed":true,"changes_count":"1","merged_by":{"id":1234561,"name":"Donald
141
+ Duck","username":"donaldduck","state":"active","avatar_url":"https://secure.gravatar.com/avatar/0123456789abcdef05ea2797cb94a5b0?s=80\u0026d=identicon","web_url":"https://gitlab.com/donaldduck"},"merged_at":"2018-07-05T10:26:03.863Z","closed_by":null,"closed_at":null,"latest_build_started_at":null,"latest_build_finished_at":null,"first_deployed_to_production_at":null,"pipeline":null,"diff_refs":{"base_sha":"f2fd3bd4f6acfc2256a3163b19c54dbbdd138709","head_sha":"8c5971f670b5915c8a1c11448b36ed65ddbf4e33","start_sha":"f2fd3bd4f6acfc2256a3163b19c54dbbdd138709"},"approvals_before_merge":null}'
142
+ http_version:
143
+ recorded_at: Thu, 05 Jul 2018 10:26:04 GMT
144
+ recorded_with: VCR 3.0.3
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.3.7
4
+ version: 0.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Saverio Miroddi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-01 00:00:00.000000000 Z
11
+ date: 2018-07-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: simple_scripting
@@ -87,11 +87,11 @@ files:
87
87
  - lib/geet/github/milestone.rb
88
88
  - lib/geet/github/pr.rb
89
89
  - lib/geet/github/user.rb
90
- - lib/geet/gitlab/PR.rb
91
90
  - lib/geet/gitlab/api_interface.rb
92
91
  - lib/geet/gitlab/issue.rb
93
92
  - lib/geet/gitlab/label.rb
94
93
  - lib/geet/gitlab/milestone.rb
94
+ - lib/geet/gitlab/pr.rb
95
95
  - lib/geet/gitlab/user.rb
96
96
  - lib/geet/helpers/json_helper.rb
97
97
  - lib/geet/helpers/os_helper.rb
@@ -129,29 +129,31 @@ files:
129
129
  - spec/vcr_cassettes/create_gist_public.yml
130
130
  - spec/vcr_cassettes/create_issue.yml
131
131
  - spec/vcr_cassettes/create_issue_upstream.yml
132
- - spec/vcr_cassettes/create_label.yml
133
- - spec/vcr_cassettes/create_label_upstream.yml
134
- - spec/vcr_cassettes/create_label_with_random_color.yml
135
- - spec/vcr_cassettes/create_pr.yml
136
- - spec/vcr_cassettes/create_pr_in_auto_mode_create_upstream.yml
137
- - spec/vcr_cassettes/create_pr_in_auto_mode_with_push.yml
138
- - spec/vcr_cassettes/create_pr_upstream.yml
139
- - spec/vcr_cassettes/create_pr_upstream_without_write_permissions.yml
132
+ - spec/vcr_cassettes/github_com/create_label.yml
133
+ - spec/vcr_cassettes/github_com/create_label_upstream.yml
134
+ - spec/vcr_cassettes/github_com/create_label_with_random_color.yml
135
+ - spec/vcr_cassettes/github_com/create_pr.yml
136
+ - spec/vcr_cassettes/github_com/create_pr_in_auto_mode_create_upstream.yml
137
+ - spec/vcr_cassettes/github_com/create_pr_in_auto_mode_with_push.yml
138
+ - spec/vcr_cassettes/github_com/create_pr_upstream.yml
139
+ - spec/vcr_cassettes/github_com/create_pr_upstream_without_write_permissions.yml
140
140
  - spec/vcr_cassettes/github_com/list_issues.yml
141
141
  - spec/vcr_cassettes/github_com/list_issues_upstream.yml
142
142
  - spec/vcr_cassettes/github_com/list_issues_with_assignee.yml
143
143
  - spec/vcr_cassettes/github_com/list_labels.yml
144
144
  - spec/vcr_cassettes/github_com/list_labels_upstream.yml
145
145
  - spec/vcr_cassettes/github_com/list_milestones.yml
146
+ - spec/vcr_cassettes/github_com/merge_pr.yml
147
+ - spec/vcr_cassettes/github_com/merge_pr_with_branch_deletion.yml
148
+ - spec/vcr_cassettes/gitlab_com/create_label.yml
146
149
  - spec/vcr_cassettes/gitlab_com/list_issues.yml
147
150
  - spec/vcr_cassettes/gitlab_com/list_issues_with_assignee.yml
148
151
  - spec/vcr_cassettes/gitlab_com/list_labels.yml
149
152
  - spec/vcr_cassettes/gitlab_com/list_milestones.yml
153
+ - spec/vcr_cassettes/gitlab_com/merge_pr.yml
150
154
  - spec/vcr_cassettes/list_milestones_upstream.yml
151
155
  - spec/vcr_cassettes/list_prs.yml
152
156
  - spec/vcr_cassettes/list_prs_upstream.yml
153
- - spec/vcr_cassettes/merge_pr.yml
154
- - spec/vcr_cassettes/merge_pr_with_branch_deletion.yml
155
157
  homepage: https://github.com/saveriomiroddi/geet
156
158
  licenses:
157
159
  - GPL-3.0