octo-merge 0.7.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.travis.yml +8 -0
- data/CODE_OF_CONDUCT.md +49 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +129 -0
- data/Rakefile +6 -0
- data/TODO.md +11 -0
- data/bin/console +14 -0
- data/bin/octo-merge +9 -0
- data/bin/setup +8 -0
- data/exe/octo-merge +8 -0
- data/lib/git.rb +61 -0
- data/lib/octo_merge.rb +44 -0
- data/lib/octo_merge/cli.rb +53 -0
- data/lib/octo_merge/cli/parser.rb +102 -0
- data/lib/octo_merge/configuration.rb +5 -0
- data/lib/octo_merge/context.rb +21 -0
- data/lib/octo_merge/execute.rb +21 -0
- data/lib/octo_merge/interactive_pull_requests.rb +47 -0
- data/lib/octo_merge/list_pull_requests.rb +20 -0
- data/lib/octo_merge/options.rb +108 -0
- data/lib/octo_merge/pull_request.rb +54 -0
- data/lib/octo_merge/setup.rb +74 -0
- data/lib/octo_merge/strategy.rb +11 -0
- data/lib/octo_merge/strategy/base.rb +53 -0
- data/lib/octo_merge/strategy/merge_with_rebase.rb +29 -0
- data/lib/octo_merge/strategy/merge_with_rebase_and_message.rb +90 -0
- data/lib/octo_merge/strategy/merge_without_rebase.rb +24 -0
- data/lib/octo_merge/strategy/rebase.rb +21 -0
- data/lib/octo_merge/version.rb +3 -0
- data/octo_merge.gemspec +34 -0
- metadata +205 -0
@@ -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
|
@@ -0,0 +1,53 @@
|
|
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
|
+
# Fetch the read-only branch for the corresponding pull request and
|
30
|
+
# create a local branch to rebase the current master on.
|
31
|
+
#
|
32
|
+
# Read more: [Checking out pull requests locally](https://help.github.com/articles/checking-out-pull-requests-locally/)
|
33
|
+
def fetch(pull_request)
|
34
|
+
git.fetch "#{upstream} #{pull_request.number_branch}/head:#{pull_request.number_branch} --force"
|
35
|
+
end
|
36
|
+
|
37
|
+
def fetch_master
|
38
|
+
git.checkout(master)
|
39
|
+
git.fetch(upstream)
|
40
|
+
git.reset_hard("#{upstream}/#{master}")
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
def upstream
|
45
|
+
:upstream
|
46
|
+
end
|
47
|
+
|
48
|
+
def master
|
49
|
+
:master
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module OctoMerge
|
2
|
+
module Strategy
|
3
|
+
class MergeWithRebase < Base
|
4
|
+
def run
|
5
|
+
fetch_master
|
6
|
+
|
7
|
+
pull_requests.each do |pull_request|
|
8
|
+
fetch(pull_request)
|
9
|
+
|
10
|
+
git.checkout(pull_request.number_branch)
|
11
|
+
git.rebase(master)
|
12
|
+
|
13
|
+
git.checkout(master)
|
14
|
+
merge(pull_request)
|
15
|
+
|
16
|
+
git.delete_branch(pull_request.number_branch)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def merge(pull_request)
|
23
|
+
message = "Merge branch '#{pull_request.remote_branch}'"
|
24
|
+
|
25
|
+
git.merge_no_ff("-m \"#{message}\" #{pull_request.number_branch}")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
3
|
+
module OctoMerge
|
4
|
+
module Strategy
|
5
|
+
class MergeWithRebaseAndMessage < Base
|
6
|
+
def run
|
7
|
+
fetch_master
|
8
|
+
|
9
|
+
pull_requests.each do |pull_request|
|
10
|
+
fetch(pull_request)
|
11
|
+
|
12
|
+
git.checkout(pull_request.number_branch)
|
13
|
+
git.rebase(master)
|
14
|
+
|
15
|
+
git.checkout(master)
|
16
|
+
git.merge_no_ff(pull_request.number_branch)
|
17
|
+
|
18
|
+
add_merge_message(pull_request)
|
19
|
+
|
20
|
+
git.delete_branch(pull_request.number_branch)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
# TODO: Can we add a custom message to a merge commit in an easier way?
|
27
|
+
#
|
28
|
+
# Note: It's hard to add a multiline message with `merge --message`.
|
29
|
+
#
|
30
|
+
# The `--file` options does not work for `git --merge` so we abuse
|
31
|
+
# `git commit --amend` to apply this message to the merge commit.
|
32
|
+
def add_merge_message(pull_request)
|
33
|
+
MergeMessageFile.path_for(pull_request) do |path|
|
34
|
+
git.commit("--amend --file=#{path}")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class MergeMessageFile
|
39
|
+
def initialize(pull_request)
|
40
|
+
@pull_request = pull_request
|
41
|
+
file.write(body)
|
42
|
+
file.close
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.path_for(pull_request)
|
46
|
+
new(pull_request).tap do |file|
|
47
|
+
yield(file.path)
|
48
|
+
file.delete
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def path
|
53
|
+
file.path
|
54
|
+
end
|
55
|
+
|
56
|
+
def delete
|
57
|
+
file.unlink
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
|
62
|
+
attr_reader :pull_request
|
63
|
+
|
64
|
+
def file
|
65
|
+
@file ||= Tempfile.new('merge_commit_message')
|
66
|
+
end
|
67
|
+
|
68
|
+
def body
|
69
|
+
sanitize <<-BODY
|
70
|
+
Merge branch '#{pull_request.remote_branch}'
|
71
|
+
|
72
|
+
Resolves and closes: #{pull_request.url}
|
73
|
+
|
74
|
+
= #{pull_request.title}
|
75
|
+
|
76
|
+
#{pull_request.body}
|
77
|
+
BODY
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
def sanitize(body)
|
82
|
+
# Replace leading "#" and replace with "="
|
83
|
+
body.gsub(/^#+/) { |s| "=" * s.length }
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
private_constant :MergeMessageFile
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module OctoMerge
|
2
|
+
module Strategy
|
3
|
+
class MergeWithoutRebase < Base
|
4
|
+
def run
|
5
|
+
fetch_master
|
6
|
+
|
7
|
+
pull_requests.each do |pull_request|
|
8
|
+
fetch(pull_request)
|
9
|
+
merge(pull_request)
|
10
|
+
|
11
|
+
git.delete_branch(pull_request.number_branch)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def merge(pull_request)
|
18
|
+
message = "Merge remote branch '#{pull_request.remote}/#{pull_request.remote_branch}'"
|
19
|
+
|
20
|
+
git.merge_no_ff("-m \"#{message}\" #{pull_request.number_branch}")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module OctoMerge
|
2
|
+
module Strategy
|
3
|
+
class Rebase < Base
|
4
|
+
def run
|
5
|
+
fetch_master
|
6
|
+
|
7
|
+
pull_requests.each do |pull_request|
|
8
|
+
fetch(pull_request)
|
9
|
+
|
10
|
+
git.checkout(pull_request.number_branch)
|
11
|
+
git.rebase(master)
|
12
|
+
|
13
|
+
git.checkout(master)
|
14
|
+
git.rebase("#{pull_request.number_branch}")
|
15
|
+
|
16
|
+
git.delete_branch(pull_request.number_branch)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/octo_merge.gemspec
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'octo_merge/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "octo-merge"
|
8
|
+
spec.version = OctoMerge::VERSION
|
9
|
+
spec.authors = ["Patrick Helm"]
|
10
|
+
spec.email = ["me@patrick-helm.de"]
|
11
|
+
|
12
|
+
spec.summary = %q{Merge GitHub pull requests.}
|
13
|
+
spec.description = %q{
|
14
|
+
octo_merge is a simple command line tool to merge GitHub pull requests using different strategies
|
15
|
+
}
|
16
|
+
spec.homepage = "https://github.com/Deradon/octo-merge"
|
17
|
+
spec.license = "MIT"
|
18
|
+
|
19
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
20
|
+
spec.bindir = "exe"
|
21
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
22
|
+
spec.require_paths = ["lib"]
|
23
|
+
|
24
|
+
spec.add_dependency "octokit", "~> 4.0"
|
25
|
+
spec.add_dependency "inquirer", "~> 0.2.1"
|
26
|
+
|
27
|
+
spec.add_development_dependency "bundler", "~> 1.11"
|
28
|
+
spec.add_development_dependency "pry"
|
29
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
30
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
31
|
+
spec.add_development_dependency "rspec-its"
|
32
|
+
spec.add_development_dependency "simplecov"
|
33
|
+
spec.add_development_dependency "webmock"
|
34
|
+
end
|
metadata
ADDED
@@ -0,0 +1,205 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: octo-merge
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.7.0.rc1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Patrick Helm
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-10-25 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: octokit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '4.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
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
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: bundler
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.11'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.11'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rspec
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '3.0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '3.0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec-its
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: simplecov
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - ">="
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - ">="
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: webmock
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ">="
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ">="
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '0'
|
139
|
+
description: "\n octo_merge is a simple command line tool to merge GitHub pull requests
|
140
|
+
using different strategies\n "
|
141
|
+
email:
|
142
|
+
- me@patrick-helm.de
|
143
|
+
executables:
|
144
|
+
- octo-merge
|
145
|
+
extensions: []
|
146
|
+
extra_rdoc_files: []
|
147
|
+
files:
|
148
|
+
- ".gitignore"
|
149
|
+
- ".rspec"
|
150
|
+
- ".travis.yml"
|
151
|
+
- CODE_OF_CONDUCT.md
|
152
|
+
- Gemfile
|
153
|
+
- LICENSE.txt
|
154
|
+
- README.md
|
155
|
+
- Rakefile
|
156
|
+
- TODO.md
|
157
|
+
- bin/console
|
158
|
+
- bin/octo-merge
|
159
|
+
- bin/setup
|
160
|
+
- exe/octo-merge
|
161
|
+
- lib/git.rb
|
162
|
+
- lib/octo_merge.rb
|
163
|
+
- lib/octo_merge/cli.rb
|
164
|
+
- lib/octo_merge/cli/parser.rb
|
165
|
+
- lib/octo_merge/configuration.rb
|
166
|
+
- lib/octo_merge/context.rb
|
167
|
+
- lib/octo_merge/execute.rb
|
168
|
+
- lib/octo_merge/interactive_pull_requests.rb
|
169
|
+
- lib/octo_merge/list_pull_requests.rb
|
170
|
+
- lib/octo_merge/options.rb
|
171
|
+
- lib/octo_merge/pull_request.rb
|
172
|
+
- lib/octo_merge/setup.rb
|
173
|
+
- lib/octo_merge/strategy.rb
|
174
|
+
- lib/octo_merge/strategy/base.rb
|
175
|
+
- lib/octo_merge/strategy/merge_with_rebase.rb
|
176
|
+
- lib/octo_merge/strategy/merge_with_rebase_and_message.rb
|
177
|
+
- lib/octo_merge/strategy/merge_without_rebase.rb
|
178
|
+
- lib/octo_merge/strategy/rebase.rb
|
179
|
+
- lib/octo_merge/version.rb
|
180
|
+
- octo_merge.gemspec
|
181
|
+
homepage: https://github.com/Deradon/octo-merge
|
182
|
+
licenses:
|
183
|
+
- MIT
|
184
|
+
metadata: {}
|
185
|
+
post_install_message:
|
186
|
+
rdoc_options: []
|
187
|
+
require_paths:
|
188
|
+
- lib
|
189
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
190
|
+
requirements:
|
191
|
+
- - ">="
|
192
|
+
- !ruby/object:Gem::Version
|
193
|
+
version: '0'
|
194
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
195
|
+
requirements:
|
196
|
+
- - ">"
|
197
|
+
- !ruby/object:Gem::Version
|
198
|
+
version: 1.3.1
|
199
|
+
requirements: []
|
200
|
+
rubyforge_project:
|
201
|
+
rubygems_version: 2.5.1
|
202
|
+
signing_key:
|
203
|
+
specification_version: 4
|
204
|
+
summary: Merge GitHub pull requests.
|
205
|
+
test_files: []
|