geet 0.3.7 → 0.3.8

Sign up to get free protection for your applications and to get access to all the features.
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