geet 0.3.7 → 0.3.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +9 -12
- data/geet.gemspec +1 -1
- data/lib/geet/github/pr.rb +2 -0
- data/lib/geet/gitlab/api_interface.rb +1 -1
- data/lib/geet/gitlab/label.rb +10 -0
- data/lib/geet/gitlab/{PR.rb → pr.rb} +12 -4
- data/lib/geet/helpers/os_helper.rb +1 -1
- data/lib/geet/services/merge_pr.rb +6 -0
- data/lib/geet/version.rb +1 -1
- data/spec/integration/create_label_spec.rb +62 -38
- data/spec/integration/create_pr_spec.rb +137 -135
- data/spec/integration/merge_pr_spec.rb +57 -31
- data/spec/vcr_cassettes/{create_label.yml → github_com/create_label.yml} +0 -0
- data/spec/vcr_cassettes/{create_label_upstream.yml → github_com/create_label_upstream.yml} +0 -0
- data/spec/vcr_cassettes/{create_label_with_random_color.yml → github_com/create_label_with_random_color.yml} +0 -0
- data/spec/vcr_cassettes/{create_pr.yml → github_com/create_pr.yml} +0 -0
- data/spec/vcr_cassettes/{create_pr_in_auto_mode_create_upstream.yml → github_com/create_pr_in_auto_mode_create_upstream.yml} +0 -0
- data/spec/vcr_cassettes/{create_pr_in_auto_mode_with_push.yml → github_com/create_pr_in_auto_mode_with_push.yml} +0 -0
- data/spec/vcr_cassettes/{create_pr_upstream.yml → github_com/create_pr_upstream.yml} +0 -0
- data/spec/vcr_cassettes/{create_pr_upstream_without_write_permissions.yml → github_com/create_pr_upstream_without_write_permissions.yml} +0 -0
- data/spec/vcr_cassettes/{merge_pr.yml → github_com/merge_pr.yml} +0 -0
- data/spec/vcr_cassettes/{merge_pr_with_branch_deletion.yml → github_com/merge_pr_with_branch_deletion.yml} +0 -0
- data/spec/vcr_cassettes/gitlab_com/create_label.yml +64 -0
- data/spec/vcr_cassettes/gitlab_com/merge_pr.yml +144 -0
- metadata +15 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '08771354786ab21808618e54fc0eb487623adf32983f25239cfc14144708488f'
|
4
|
+
data.tar.gz: 4559d362a557121d242fa191be9263b9e2e22f987348618ab32c5a3b2ff386c5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
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
|
-
|
9
|
+
## Development status/plan
|
10
10
|
|
11
|
-
|
11
|
+
The current focus is implementing Gitlab functionalities (0.3.x series).
|
12
12
|
|
13
|
-
|
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
|
|
data/geet.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |s|
|
|
10
10
|
s.platform = Gem::Platform::RUBY
|
11
11
|
s.required_ruby_version = '>= 2.3.0'
|
12
12
|
s.authors = ['Saverio Miroddi']
|
13
|
-
s.date = '2018-07-
|
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).'
|
data/lib/geet/github/pr.rb
CHANGED
@@ -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
|
|
data/lib/geet/gitlab/label.rb
CHANGED
@@ -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.
|
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
|
|
data/lib/geet/version.rb
CHANGED
@@ -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
|
14
|
-
|
15
|
-
|
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
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
18
|
+
expected_output = <<~STR
|
19
|
+
Creating label...
|
20
|
+
Created with color #c64c64
|
21
|
+
STR
|
21
22
|
|
22
|
-
|
23
|
+
actual_output = StringIO.new
|
23
24
|
|
24
|
-
|
25
|
-
|
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
|
-
|
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
|
-
|
31
|
-
|
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 '
|
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
|
-
|
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 #
|
71
|
+
Created with color #0097ff
|
42
72
|
STR
|
43
73
|
|
44
|
-
|
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('
|
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
|
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@
|
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
|
-
|
67
|
-
|
68
|
-
expected_output_template = <<~STR
|
92
|
+
expected_output = <<~STR
|
69
93
|
Creating label...
|
70
|
-
Created with color #
|
94
|
+
Created with color #123456
|
71
95
|
STR
|
72
96
|
|
73
|
-
|
74
|
-
service_instance.execute('my_label')
|
75
|
-
end
|
97
|
+
actual_output = StringIO.new
|
76
98
|
|
77
|
-
|
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('
|
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
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
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
|
-
|
42
|
+
expect(actual_output.string).to eql(expected_output)
|
42
43
|
|
43
|
-
|
44
|
-
|
45
|
-
|
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
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
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
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
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
|
-
|
62
|
+
actual_output = StringIO.new
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
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
|
-
|
69
|
+
expect(actual_output.string).to eql(expected_output)
|
69
70
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
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
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
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
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
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
|
-
|
117
|
-
|
118
|
-
|
117
|
+
expected_output = <<~STR
|
118
|
+
Error! Saved summary to /tmp/last_geet_edited_summary.md
|
119
|
+
STR
|
119
120
|
|
120
|
-
|
121
|
+
actual_output = StringIO.new
|
121
122
|
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
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
|
-
|
128
|
+
expect(operation).to raise_error(RuntimeError, 'The working tree is not clean!')
|
128
129
|
|
129
|
-
|
130
|
-
|
130
|
+
expect(actual_output.string).to eql(expected_output)
|
131
|
+
end
|
131
132
|
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
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
|
-
|
139
|
+
allow(git_client).to receive(:remote).with('origin').and_return('git@github.com:donaldduck/testrepo_f')
|
139
140
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
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
|
-
|
148
|
+
actual_output = StringIO.new
|
148
149
|
|
149
|
-
|
150
|
-
|
151
|
-
|
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
|
-
|
155
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
17
|
+
expected_output = <<~STR
|
18
|
+
Finding PR with head (mybranch1)...
|
19
|
+
Merging PR #3...
|
20
|
+
STR
|
21
|
+
expected_pr_number = 3
|
21
22
|
|
22
|
-
|
23
|
+
actual_output = StringIO.new
|
23
24
|
|
24
|
-
|
25
|
-
|
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
|
-
|
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
|
-
|
31
|
-
|
32
|
-
|
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
|
-
|
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
|
-
|
39
|
-
|
40
|
-
|
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
|
-
|
52
|
+
actual_pr_number = service_result.number
|
46
53
|
|
47
|
-
|
48
|
-
|
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
|
-
|
70
|
+
actual_output = StringIO.new
|
52
71
|
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -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.
|
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-
|
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
|