octo_merge 0.4.0 → 0.5.0

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 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