git_reflow 0.7.5 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/Appraisals +2 -2
  4. data/CHANGELOG.md +75 -0
  5. data/Gemfile.lock +34 -35
  6. data/README.rdoc +187 -60
  7. data/circle.yml +9 -9
  8. data/git_reflow.gemspec +8 -8
  9. data/lib/git_reflow/commands/deliver.rb +1 -9
  10. data/lib/git_reflow/commands/refresh.rb +23 -0
  11. data/lib/git_reflow/commands/review.rb +7 -7
  12. data/lib/git_reflow/commands/setup.rb +7 -3
  13. data/lib/git_reflow/commands/start.rb +13 -5
  14. data/lib/git_reflow/git_helpers.rb +22 -23
  15. data/lib/git_reflow/git_server/bit_bucket/pull_request.rb +4 -4
  16. data/lib/git_reflow/git_server/bit_bucket.rb +7 -7
  17. data/lib/git_reflow/git_server/git_hub/pull_request.rb +75 -2
  18. data/lib/git_reflow/git_server/git_hub.rb +17 -8
  19. data/lib/git_reflow/git_server/pull_request.rb +73 -5
  20. data/lib/git_reflow/git_server.rb +3 -3
  21. data/lib/git_reflow/merge_error.rb +9 -0
  22. data/lib/git_reflow/sandbox.rb +4 -16
  23. data/lib/git_reflow/version.rb +1 -1
  24. data/lib/git_reflow.rb +32 -75
  25. data/spec/git_reflow_spec.rb +157 -141
  26. data/spec/lgtm_git_reflow_spec.rb +165 -139
  27. data/spec/lib/git_reflow/git_helpers_spec.rb +19 -63
  28. data/spec/lib/git_reflow/git_server_spec.rb +24 -24
  29. data/spec/lib/git_server/bit_bucket_spec.rb +12 -12
  30. data/spec/lib/git_server/git_hub/pull_request_spec.rb +7 -5
  31. data/spec/lib/git_server/git_hub_spec.rb +34 -34
  32. data/spec/lib/git_server/pull_request_spec.rb +207 -16
  33. data/spec/support/command_line_helpers.rb +14 -9
  34. data/spec/support/github_helpers.rb +21 -21
  35. data/spec/support/rspec_stub_helpers.rb +2 -2
  36. metadata +18 -16
data/lib/git_reflow.rb CHANGED
@@ -14,102 +14,91 @@ require 'git_reflow/git_server/bit_bucket'
14
14
  require 'git_reflow/os_detector'
15
15
  require 'git_reflow/sandbox'
16
16
  require 'git_reflow/git_helpers'
17
+ require 'git_reflow/merge_error'
17
18
 
18
19
  module GitReflow
19
20
  include Sandbox
20
21
  include GitHelpers
21
-
22
22
  extend self
23
23
 
24
+ DEFAULT_EDITOR = "#{ENV['EDITOR']}".freeze || "vi".freeze
25
+
24
26
  def status(destination_branch)
25
27
  pull_request = git_server.find_open_pull_request( :from => current_branch, :to => destination_branch )
26
28
 
27
29
  if pull_request.nil?
28
- puts "\n[notice] No pull request exists for #{current_branch} -> #{destination_branch}"
29
- puts "[notice] Run 'git reflow review #{destination_branch}' to start the review process"
30
+ say "\nNo pull request exists for #{current_branch} -> #{destination_branch}", :notice
31
+ say "Run 'git reflow review #{destination_branch}' to start the review process", :notice
30
32
  else
31
- puts "Here's the status of your review:"
33
+ say "Here's the status of your review:"
32
34
  pull_request.display_pull_request_summary
33
- ask_to_open_in_browser(pull_request.html_url)
34
35
  end
35
36
  end
36
37
 
37
38
  def review(options = {})
38
- options['base'] ||= 'master'
39
+ options[:base] ||= 'master'
39
40
  create_pull_request = true
40
41
 
41
- fetch_destination options['base']
42
+ fetch_destination options[:base]
42
43
 
43
44
  begin
44
45
  push_current_branch
45
46
 
46
- existing_pull_request = git_server.find_open_pull_request( from: current_branch, to: options['base'] )
47
+ existing_pull_request = git_server.find_open_pull_request( from: current_branch, to: options[:base] )
47
48
  if existing_pull_request
48
49
  say "A pull request already exists for these branches:", :notice
49
50
  existing_pull_request.display_pull_request_summary
50
- ask_to_open_in_browser(existing_pull_request.html_url)
51
51
  else
52
- unless options['title'] || options['body']
52
+ unless options[:title] || options[:body]
53
53
  pull_request_msg_file = "#{GitReflow.git_root_dir}/.git/GIT_REFLOW_PR_MSG"
54
- default_editor = "#{ENV['EDITOR']}"
55
-
56
- if default_editor.empty?
57
- default_editor = 'vi'
58
- end
59
54
 
60
55
  File.open(pull_request_msg_file, 'w') do |file|
61
- file.write(options['title'] || GitReflow.current_branch)
56
+ file.write(options[:title] || GitReflow.current_branch)
62
57
  end
63
58
 
64
- GitReflow.run("#{default_editor} #{pull_request_msg_file}", with_system: true)
59
+ GitReflow.run("#{GitReflow.git_editor_comand} #{pull_request_msg_file}", with_system: true)
65
60
 
66
61
  pr_msg = File.read(pull_request_msg_file).split(/[\r\n]|\r\n/).map(&:strip)
67
62
  title = pr_msg.shift
68
63
 
69
64
  File.delete(pull_request_msg_file)
70
65
 
71
- unless pr_msg.empty?
66
+ unless pr_msg.empty?
72
67
  pr_msg.shift if pr_msg.first.empty?
73
68
  end
74
69
 
75
- options['title'] = title
76
- options['body'] = "#{pr_msg.join("\n")}\n"
70
+ options[:title] = title
71
+ options[:body] = "#{pr_msg.join("\n")}\n"
77
72
 
78
- puts "\nReview your PR:\n"
79
- puts "--------\n"
80
- puts "Title:\n#{options['title']}\n\n"
81
- puts "Body:\n#{options['body']}\n"
82
- puts "--------\n"
73
+ say "\nReview your PR:\n"
74
+ say "--------\n"
75
+ say "Title:\n#{options[:title]}\n\n"
76
+ say "Body:\n#{options[:body]}\n"
77
+ say "--------\n"
83
78
 
84
79
  create_pull_request = ask("Submit pull request? (Y)") =~ /y/i
85
80
  end
86
81
 
87
82
  if create_pull_request
88
- pull_request = git_server.create_pull_request(title: options['title'] || options['body'],
89
- body: options['body'],
83
+ pull_request = git_server.create_pull_request(title: options[:title] || options[:body],
84
+ body: options[:body],
90
85
  head: "#{remote_user}:#{current_branch}",
91
- base: options['base'])
86
+ base: options[:base])
92
87
 
93
- puts "Successfully created pull request ##{pull_request.number}: #{pull_request.title}\nPull Request URL: #{pull_request.html_url}\n"
94
- ask_to_open_in_browser(pull_request.html_url)
88
+ say "Successfully created pull request ##{pull_request.number}: #{pull_request.title}\nPull Request URL: #{pull_request.html_url}\n", :success
95
89
  else
96
90
  say "Review aborted. No pull request has been created.", :review_halted
97
91
  end
98
92
  end
99
93
  rescue Github::Error::UnprocessableEntity => e
100
- puts "Github Error: #{e.to_s}"
94
+ say "Github Error: #{e.to_s}", :error
101
95
  rescue StandardError => e
102
- puts "\nError: #{e.inspect}"
96
+ say "\nError: #{e.inspect}", :error
103
97
  end
104
98
  end
105
99
 
106
100
  def deliver(options = {})
107
- feature_branch = current_branch
108
- base_branch = options['base'] || 'master'
109
-
110
- update_current_branch
111
- fetch_destination(base_branch)
112
- update_destination(feature_branch)
101
+ base_branch = options[:base] || 'master'
113
102
 
114
103
  begin
115
104
  existing_pull_request = git_server.find_open_pull_request( :from => current_branch, :to => base_branch )
@@ -118,42 +107,10 @@ module GitReflow
118
107
  say "No pull request exists for #{remote_user}:#{current_branch}\nPlease submit your branch for review first with \`git reflow review\`", :deliver_halted
119
108
  else
120
109
 
121
- commit_message = if "#{existing_pull_request.description}".length > 0
122
- existing_pull_request.description
123
- else
124
- "#{get_first_commit_message}"
125
- end
126
-
127
- if existing_pull_request.good_to_merge?(force: options['skip_lgtm'])
128
- puts "Merging pull request ##{existing_pull_request.number}: '#{existing_pull_request.title}', from '#{existing_pull_request.feature_branch_name}' into '#{existing_pull_request.base_branch_name}'"
129
-
130
- update_destination(base_branch)
131
- merge_feature_branch(feature_branch,
132
- :destination_branch => base_branch,
133
- :pull_request_number => existing_pull_request.number,
134
- :lgtm_authors => existing_pull_request.approvals,
135
- :message => commit_message)
136
- committed = run_command_with_label 'git commit', with_system: true
137
-
138
- if committed
139
- say "Merge complete!", :success
140
-
141
- # check if user always wants to push and cleanup, otherwise ask
142
- always_deploy_and_cleanup = GitReflow::Config.get('reflow.always-deploy-and-cleanup') == "true"
143
- deploy_and_cleanup = always_deploy_and_cleanup || (ask "Would you like to push this branch to your remote repo and cleanup your feature branch? ") =~ /^y/i
144
-
145
- if deploy_and_cleanup
146
- run_command_with_label "git push origin #{base_branch}"
147
- run_command_with_label "git push origin :#{feature_branch}"
148
- run_command_with_label "git branch -D #{feature_branch}"
149
- puts "Nice job buddy."
150
- else
151
- puts "Cleanup halted. Local changes were not pushed to remote repo.".colorize(:red)
152
- puts "To reset and go back to your branch run \`git reset --hard origin/#{base_branch} && git checkout #{feature_branch}\`"
153
- end
154
- else
155
- say "There were problems commiting your feature... please check the errors above and try again.", :error
156
- end
110
+ if existing_pull_request.good_to_merge?(force: options[:skip_lgtm])
111
+ # displays current status and prompts user for confirmation
112
+ self.status base_branch
113
+ existing_pull_request.merge!(options)
157
114
  else
158
115
  say existing_pull_request.rejection_message, :deliver_halted
159
116
  end
@@ -162,7 +119,7 @@ module GitReflow
162
119
  rescue Github::Error::UnprocessableEntity => e
163
120
  errors = JSON.parse(e.response_message[:body])
164
121
  error_messages = errors["errors"].collect {|error| "GitHub Error: #{error["message"].gsub(/^base\s/, '')}" unless error["message"].nil?}.compact.join("\n")
165
- puts "Github Error: #{error_messages}"
122
+ say "Github Error: #{error_messages}", :error
166
123
  end
167
124
  end
168
125