octo_merge 0.4.0 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +17 -0
- data/TODO.md +11 -0
- data/exe/octo-merge +1 -1
- data/lib/{octo_merge/git.rb → git.rb} +0 -1
- data/lib/octo_merge/interactive_pull_requests.rb +12 -4
- data/lib/octo_merge/strategy/base.rb +38 -0
- data/lib/octo_merge/strategy/merge_with_rebase.rb +20 -0
- data/lib/octo_merge/strategy/merge_with_rebase_and_message.rb +89 -0
- data/lib/octo_merge/strategy/merge_without_rebase.rb +17 -0
- data/lib/octo_merge/strategy/rebase.rb +20 -0
- data/lib/octo_merge/strategy.rb +11 -0
- data/lib/octo_merge/version.rb +1 -1
- data/lib/octo_merge.rb +3 -6
- data/octo_merge.gemspec +1 -0
- metadata +24 -7
- data/lib/octo_merge/abstract_merge.rb +0 -32
- data/lib/octo_merge/merge_with_rebase.rb +0 -22
- data/lib/octo_merge/merge_with_rebase_and_message.rb +0 -87
- data/lib/octo_merge/merge_without_rebase.rb +0 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f99ec38437701d28091542a65cf259e028b5f82
|
4
|
+
data.tar.gz: bbbc0e41c04fefde9a480b918ed0dda0633ab1f0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5958a05ec2db085d9294c0c347dc2c74c9c878351b94e288cb714134aee4c86b751b6d7a4120df805a26963d8afa77e3c4ac8e2a5917d1bff0b8f69c00dd050
|
7
|
+
data.tar.gz: ef24a2c90b7683514e1c29e43bb3e37c81e8d4b8cc175cc362b6fe07a951f61e942bc74655a249185c45ac7d540e67a0de4466b8b8204f06ef03a853d04bacfc
|
data/README.md
CHANGED
@@ -74,6 +74,23 @@ pull_requests.each do |pull_request|
|
|
74
74
|
end
|
75
75
|
```
|
76
76
|
|
77
|
+
### Rebase
|
78
|
+
|
79
|
+
```ruby
|
80
|
+
git.checkout(master)
|
81
|
+
git.fetch(upstream)
|
82
|
+
git.reset_hard("#{upstream}/#{master}")
|
83
|
+
|
84
|
+
pull_requests.each do |pull_request|
|
85
|
+
git.remote_add("#{pull_request.remote} #{pull_request.remote_url}")
|
86
|
+
git.fetch(pull_request.remote)
|
87
|
+
git.checkout(pull_request.branch)
|
88
|
+
git.rebase(master)
|
89
|
+
git.checkout(master)
|
90
|
+
git.rebase("#{pull_request.branch}")
|
91
|
+
end
|
92
|
+
```
|
93
|
+
|
77
94
|
## Development
|
78
95
|
|
79
96
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/TODO.md
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
# TODO
|
2
|
+
|
3
|
+
Before we release `v1.0.0` the following tasks needs to be done:
|
4
|
+
|
5
|
+
* [ ] Move logic from `exe/octo-merge` into a testable class
|
6
|
+
* [ ] Add specs for `InteractivePullRequests`
|
7
|
+
* [ ] Create a setup task
|
8
|
+
* [ ] Complete docs (`README.md`)
|
9
|
+
* [ ] Try to get rid of external dependencies (`octokit`, `inquirer`)
|
10
|
+
* [ ] Decide on gem name (`octo_merge` VS `octo-merge`)
|
11
|
+
* [ ] Use GitHubs `secret` pull requests branches instead of adding new remotes
|
data/exe/octo-merge
CHANGED
@@ -77,7 +77,7 @@ end
|
|
77
77
|
|
78
78
|
options[:dir] = File.expand_path(options[:dir])
|
79
79
|
|
80
|
-
options[:strategy] = Object.const_get("OctoMerge::#{options[:strategy]}")
|
80
|
+
options[:strategy] = Object.const_get("OctoMerge::Strategy::#{options[:strategy]}")
|
81
81
|
|
82
82
|
options[:pull_requests] = OctoMerge::InteractivePullRequests.get(options) if options[:interactive]
|
83
83
|
options[:pull_requests] = options[:pull_requests].to_s.split(",")
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'inquirer'
|
2
|
+
|
1
3
|
module OctoMerge
|
2
4
|
# TODO: Write specs
|
3
5
|
class InteractivePullRequests
|
@@ -11,10 +13,16 @@ module OctoMerge
|
|
11
13
|
end
|
12
14
|
|
13
15
|
def pull_requests
|
14
|
-
|
15
|
-
|
16
|
+
prs = list.all
|
17
|
+
|
18
|
+
formatted_prs = prs.map do |pull_request|
|
19
|
+
format_pull_request(pull_request)
|
20
|
+
end
|
21
|
+
|
22
|
+
system("clear")
|
23
|
+
idx = Ask.checkbox "Select the pull requests you want to merge", formatted_prs
|
16
24
|
|
17
|
-
|
25
|
+
idx.zip(prs).select { |e| e[0] }.map { |e| e[1][:number] }.join(",")
|
18
26
|
end
|
19
27
|
|
20
28
|
private
|
@@ -35,7 +43,7 @@ module OctoMerge
|
|
35
43
|
end
|
36
44
|
|
37
45
|
def format_pull_request(pull_request)
|
38
|
-
"
|
46
|
+
"#{pull_request.number}: \"#{pull_request.title}\" by @#{pull_request.user.login}"
|
39
47
|
end
|
40
48
|
|
41
49
|
def list
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# == Links
|
2
|
+
#
|
3
|
+
# * https://www.atlassian.com/git/tutorials/merging-vs-rebasing/workflow-walkthrough
|
4
|
+
# * https://www.atlassian.com/git/articles/git-team-workflows-merge-or-rebase/
|
5
|
+
module OctoMerge
|
6
|
+
module Strategy
|
7
|
+
class Base
|
8
|
+
attr_reader :working_directory, :pull_requests
|
9
|
+
|
10
|
+
def initialize(working_directory:, pull_requests:)
|
11
|
+
@working_directory = working_directory
|
12
|
+
@pull_requests = pull_requests
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.run(*args)
|
16
|
+
new(*args).tap { |strategy| strategy.run }
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
fail NotImplementedError
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def git
|
26
|
+
@git ||= Git.new(working_directory)
|
27
|
+
end
|
28
|
+
|
29
|
+
def upstream
|
30
|
+
:upstream
|
31
|
+
end
|
32
|
+
|
33
|
+
def master
|
34
|
+
:master
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module OctoMerge
|
2
|
+
module Strategy
|
3
|
+
class MergeWithRebase < Base
|
4
|
+
def run
|
5
|
+
git.checkout(master)
|
6
|
+
git.fetch(upstream)
|
7
|
+
git.reset_hard("#{upstream}/#{master}")
|
8
|
+
|
9
|
+
pull_requests.each do |pull_request|
|
10
|
+
git.remote_add("#{pull_request.remote} #{pull_request.remote_url}")
|
11
|
+
git.fetch(pull_request.remote)
|
12
|
+
git.checkout(pull_request.branch)
|
13
|
+
git.rebase(master)
|
14
|
+
git.checkout(master)
|
15
|
+
git.merge_no_ff(pull_request.branch)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
module OctoMerge
|
4
|
+
module Strategy
|
5
|
+
class MergeWithRebaseAndMessage < Base
|
6
|
+
def run
|
7
|
+
git.checkout(master)
|
8
|
+
git.fetch(upstream)
|
9
|
+
git.reset_hard("#{upstream}/#{master}")
|
10
|
+
|
11
|
+
pull_requests.each do |pull_request|
|
12
|
+
git.remote_add("#{pull_request.remote} #{pull_request.remote_url}")
|
13
|
+
git.fetch(pull_request.remote)
|
14
|
+
git.checkout(pull_request.branch)
|
15
|
+
git.rebase(master)
|
16
|
+
git.checkout(master)
|
17
|
+
git.merge_no_ff(pull_request.branch)
|
18
|
+
|
19
|
+
add_merge_message(pull_request)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
# TODO: Can we add a custom message to a merge commit in an easier way?
|
26
|
+
#
|
27
|
+
# Note: It's hard to add a multiline message with `merge --message`.
|
28
|
+
#
|
29
|
+
# The `--file` options does not work for `git --merge` so we abuse
|
30
|
+
# `git commit --amend` to apply this message to the merge commit.
|
31
|
+
def add_merge_message(pull_request)
|
32
|
+
MergeMessageFile.path_for(pull_request) do |path|
|
33
|
+
git.commit("--amend --file=#{path}")
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
class MergeMessageFile
|
38
|
+
def initialize(pull_request)
|
39
|
+
@pull_request = pull_request
|
40
|
+
file.write(body)
|
41
|
+
file.close
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.path_for(pull_request)
|
45
|
+
new(pull_request).tap do |file|
|
46
|
+
yield(file.path)
|
47
|
+
file.delete
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def path
|
52
|
+
file.path
|
53
|
+
end
|
54
|
+
|
55
|
+
def delete
|
56
|
+
file.unlink
|
57
|
+
end
|
58
|
+
|
59
|
+
private
|
60
|
+
|
61
|
+
attr_reader :pull_request
|
62
|
+
|
63
|
+
def file
|
64
|
+
@file ||= Tempfile.new('merge_commit_message')
|
65
|
+
end
|
66
|
+
|
67
|
+
def body
|
68
|
+
sanitize <<-BODY
|
69
|
+
Merge branch '#{pull_request.branch}'
|
70
|
+
|
71
|
+
Resolves and closes: #{pull_request.url}
|
72
|
+
|
73
|
+
= #{pull_request.title}
|
74
|
+
|
75
|
+
#{pull_request.body}
|
76
|
+
BODY
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
def sanitize(body)
|
81
|
+
# Replace leading "#" and replace with "="
|
82
|
+
body.gsub(/^#+/) { |s| "=" * s.length }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
private_constant :MergeMessageFile
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module OctoMerge
|
2
|
+
module Strategy
|
3
|
+
class MergeWithoutRebase < Base
|
4
|
+
def run
|
5
|
+
git.checkout(master)
|
6
|
+
git.fetch(upstream)
|
7
|
+
git.reset_hard("#{upstream}/#{master}")
|
8
|
+
|
9
|
+
pull_requests.each do |pull_request|
|
10
|
+
git.remote_add("#{pull_request.remote} #{pull_request.remote_url}")
|
11
|
+
git.fetch(pull_request.remote)
|
12
|
+
git.merge_no_ff("#{pull_request.remote}/#{pull_request.branch}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module OctoMerge
|
2
|
+
module Strategy
|
3
|
+
class Rebase < Base
|
4
|
+
def run
|
5
|
+
git.checkout(master)
|
6
|
+
git.fetch(upstream)
|
7
|
+
git.reset_hard("#{upstream}/#{master}")
|
8
|
+
|
9
|
+
pull_requests.each do |pull_request|
|
10
|
+
git.remote_add("#{pull_request.remote} #{pull_request.remote_url}")
|
11
|
+
git.fetch(pull_request.remote)
|
12
|
+
git.checkout(pull_request.branch)
|
13
|
+
git.rebase(master)
|
14
|
+
git.checkout(master)
|
15
|
+
git.rebase("#{pull_request.branch}")
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
require "octo_merge/strategy/base"
|
2
|
+
|
3
|
+
require "octo_merge/strategy/merge_with_rebase"
|
4
|
+
require "octo_merge/strategy/merge_with_rebase_and_message"
|
5
|
+
require "octo_merge/strategy/merge_without_rebase"
|
6
|
+
require "octo_merge/strategy/rebase"
|
7
|
+
|
8
|
+
module OctoMerge
|
9
|
+
module Strategy
|
10
|
+
end
|
11
|
+
end
|
data/lib/octo_merge/version.rb
CHANGED
data/lib/octo_merge.rb
CHANGED
@@ -1,17 +1,14 @@
|
|
1
1
|
require "octo_merge/version"
|
2
2
|
|
3
|
+
require "git"
|
4
|
+
|
3
5
|
require "octo_merge/configuration"
|
4
6
|
require "octo_merge/context"
|
5
7
|
require "octo_merge/execute"
|
6
|
-
require "octo_merge/git"
|
7
8
|
require "octo_merge/interactive_pull_requests"
|
8
9
|
require "octo_merge/list_pull_requests"
|
9
10
|
require "octo_merge/pull_request"
|
10
|
-
|
11
|
-
require "octo_merge/abstract_merge"
|
12
|
-
require "octo_merge/merge_with_rebase"
|
13
|
-
require "octo_merge/merge_with_rebase_and_message"
|
14
|
-
require "octo_merge/merge_without_rebase"
|
11
|
+
require "octo_merge/strategy"
|
15
12
|
|
16
13
|
module OctoMerge
|
17
14
|
class << self
|
data/octo_merge.gemspec
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: octo_merge
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Patrick Helm
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: octokit
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: inquirer
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.2.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.2.1
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: bundler
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -125,21 +139,24 @@ files:
|
|
125
139
|
- LICENSE.txt
|
126
140
|
- README.md
|
127
141
|
- Rakefile
|
142
|
+
- TODO.md
|
128
143
|
- bin/console
|
129
144
|
- bin/setup
|
130
145
|
- exe/octo-merge
|
146
|
+
- lib/git.rb
|
131
147
|
- lib/octo_merge.rb
|
132
|
-
- lib/octo_merge/abstract_merge.rb
|
133
148
|
- lib/octo_merge/configuration.rb
|
134
149
|
- lib/octo_merge/context.rb
|
135
150
|
- lib/octo_merge/execute.rb
|
136
|
-
- lib/octo_merge/git.rb
|
137
151
|
- lib/octo_merge/interactive_pull_requests.rb
|
138
152
|
- lib/octo_merge/list_pull_requests.rb
|
139
|
-
- lib/octo_merge/merge_with_rebase.rb
|
140
|
-
- lib/octo_merge/merge_with_rebase_and_message.rb
|
141
|
-
- lib/octo_merge/merge_without_rebase.rb
|
142
153
|
- lib/octo_merge/pull_request.rb
|
154
|
+
- lib/octo_merge/strategy.rb
|
155
|
+
- lib/octo_merge/strategy/base.rb
|
156
|
+
- lib/octo_merge/strategy/merge_with_rebase.rb
|
157
|
+
- lib/octo_merge/strategy/merge_with_rebase_and_message.rb
|
158
|
+
- lib/octo_merge/strategy/merge_without_rebase.rb
|
159
|
+
- lib/octo_merge/strategy/rebase.rb
|
143
160
|
- lib/octo_merge/version.rb
|
144
161
|
- octo_merge.gemspec
|
145
162
|
homepage: https://github.com/Deradon/octo_merge
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module OctoMerge
|
2
|
-
class AbstractMerge
|
3
|
-
attr_reader :working_directory, :pull_requests
|
4
|
-
|
5
|
-
def initialize(working_directory:, pull_requests:)
|
6
|
-
@working_directory = working_directory
|
7
|
-
@pull_requests = pull_requests
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.run(*args)
|
11
|
-
new(*args).tap { |merge| merge.run }
|
12
|
-
end
|
13
|
-
|
14
|
-
def run
|
15
|
-
fail "NotImplementedYet"
|
16
|
-
end
|
17
|
-
|
18
|
-
private
|
19
|
-
|
20
|
-
def git
|
21
|
-
@git ||= Git.new(working_directory)
|
22
|
-
end
|
23
|
-
|
24
|
-
def upstream
|
25
|
-
:upstream
|
26
|
-
end
|
27
|
-
|
28
|
-
def master
|
29
|
-
:master
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# == Links
|
2
|
-
#
|
3
|
-
# * https://www.atlassian.com/git/tutorials/merging-vs-rebasing/workflow-walkthrough
|
4
|
-
# * https://www.atlassian.com/git/articles/git-team-workflows-merge-or-rebase/
|
5
|
-
module OctoMerge
|
6
|
-
class MergeWithRebase < AbstractMerge
|
7
|
-
def run
|
8
|
-
git.checkout(master)
|
9
|
-
git.fetch(upstream)
|
10
|
-
git.reset_hard("#{upstream}/#{master}")
|
11
|
-
|
12
|
-
pull_requests.each do |pull_request|
|
13
|
-
git.remote_add("#{pull_request.remote} #{pull_request.remote_url}")
|
14
|
-
git.fetch(pull_request.remote)
|
15
|
-
git.checkout(pull_request.branch)
|
16
|
-
git.rebase(master)
|
17
|
-
git.checkout(master)
|
18
|
-
git.merge_no_ff(pull_request.branch)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
@@ -1,87 +0,0 @@
|
|
1
|
-
require 'tempfile'
|
2
|
-
|
3
|
-
module OctoMerge
|
4
|
-
class MergeWithRebaseAndMessage < AbstractMerge
|
5
|
-
def run
|
6
|
-
git.checkout(master)
|
7
|
-
git.fetch(upstream)
|
8
|
-
git.reset_hard("#{upstream}/#{master}")
|
9
|
-
|
10
|
-
pull_requests.each do |pull_request|
|
11
|
-
git.remote_add("#{pull_request.remote} #{pull_request.remote_url}")
|
12
|
-
git.fetch(pull_request.remote)
|
13
|
-
git.checkout(pull_request.branch)
|
14
|
-
git.rebase(master)
|
15
|
-
git.checkout(master)
|
16
|
-
git.merge_no_ff(pull_request.branch)
|
17
|
-
|
18
|
-
add_merge_message(pull_request)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
# TODO: Can we add a custom message to a merge commit in an easier way?
|
25
|
-
#
|
26
|
-
# Note: It's hard to add a multiline message with `merge --message`.
|
27
|
-
#
|
28
|
-
# The `--file` options does not work for `git --merge` so we abuse
|
29
|
-
# `git commit --amend` to apply this message to the merge commit.
|
30
|
-
def add_merge_message(pull_request)
|
31
|
-
MergeMessageFile.path_for(pull_request) do |path|
|
32
|
-
git.commit("--amend --file=#{path}")
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
class MergeMessageFile
|
37
|
-
def initialize(pull_request)
|
38
|
-
@pull_request = pull_request
|
39
|
-
file.write(body)
|
40
|
-
file.close
|
41
|
-
end
|
42
|
-
|
43
|
-
def self.path_for(pull_request)
|
44
|
-
new(pull_request).tap do |file|
|
45
|
-
yield(file.path)
|
46
|
-
file.delete
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def path
|
51
|
-
file.path
|
52
|
-
end
|
53
|
-
|
54
|
-
def delete
|
55
|
-
file.unlink
|
56
|
-
end
|
57
|
-
|
58
|
-
private
|
59
|
-
|
60
|
-
attr_reader :pull_request
|
61
|
-
|
62
|
-
def file
|
63
|
-
@file ||= Tempfile.new('merge_commit_message')
|
64
|
-
end
|
65
|
-
|
66
|
-
def body
|
67
|
-
sanitize <<-BODY
|
68
|
-
Merge branch '#{pull_request.branch}'
|
69
|
-
|
70
|
-
Resolves and closes: #{pull_request.url}
|
71
|
-
|
72
|
-
= #{pull_request.title}
|
73
|
-
|
74
|
-
#{pull_request.body}
|
75
|
-
BODY
|
76
|
-
|
77
|
-
end
|
78
|
-
|
79
|
-
def sanitize(body)
|
80
|
-
# Replace leading "#" and replace with "="
|
81
|
-
body.gsub(/^#+/) { |s| "=" * s.length }
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
private_constant :MergeMessageFile
|
86
|
-
end
|
87
|
-
end
|
@@ -1,15 +0,0 @@
|
|
1
|
-
module OctoMerge
|
2
|
-
class MergeWithoutRebase < AbstractMerge
|
3
|
-
def run
|
4
|
-
git.checkout(master)
|
5
|
-
git.fetch(upstream)
|
6
|
-
git.reset_hard("#{upstream}/#{master}")
|
7
|
-
|
8
|
-
pull_requests.each do |pull_request|
|
9
|
-
git.remote_add("#{pull_request.remote} #{pull_request.remote_url}")
|
10
|
-
git.fetch(pull_request.remote)
|
11
|
-
git.merge_no_ff("#{pull_request.remote}/#{pull_request.branch}")
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|