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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: adea7dbf2172dd7c03e8a0339a7daace935e22cd
4
- data.tar.gz: df5af4c44bb7c6f60ced0bcf0705e4dbb38ca9b3
3
+ metadata.gz: 5f99ec38437701d28091542a65cf259e028b5f82
4
+ data.tar.gz: bbbc0e41c04fefde9a480b918ed0dda0633ab1f0
5
5
  SHA512:
6
- metadata.gz: e8a5c1510c9f5448f86f3abdea95c0ab7694a5b1a180be542ff73c946c0142499b36522142ca87a5d347ac34736cb12aafac28d0a9a758cce8a1a45d57b8884d
7
- data.tar.gz: 1ab92d833992e832187d4fcc4dc1d578b1f6fc777dfa53991a5d052779c848f7c3ecc7aa0a0ba0fe1df05c0909cbe336997b7ef51d3e113eab96169d3744e7b4
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(",")
@@ -24,7 +24,6 @@ class Git
24
24
  git :remote_add, "remote add"
25
25
  git :reset_hard, "reset --hard"
26
26
 
27
-
28
27
  private
29
28
 
30
29
  def git(cmd)
@@ -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
- display_pull_requests
15
- display_input_message
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
- gets.strip
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
- "* #{pull_request.number}:\t\"#{pull_request.title}\" by @#{pull_request.user.login}"
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
@@ -1,3 +1,3 @@
1
1
  module OctoMerge
2
- VERSION = "0.4.0"
2
+ VERSION = "0.5.0"
3
3
  end
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
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
30
30
  spec.require_paths = ["lib"]
31
31
 
32
32
  spec.add_dependency "octokit", "~> 4.0"
33
+ spec.add_dependency "inquirer", "~> 0.2.1"
33
34
 
34
35
  spec.add_development_dependency "bundler", "~> 1.11"
35
36
  spec.add_development_dependency "pry"
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.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-06 00:00:00.000000000 Z
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