git_reflow 0.8.3 → 0.8.4
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 +4 -4
- data/CHANGELOG.md +16 -1
- data/Gemfile.lock +6 -5
- data/git_reflow.gemspec +4 -0
- data/lib/git_reflow/commands/deliver.rb +1 -6
- data/lib/git_reflow/commands/refresh.rb +2 -5
- data/lib/git_reflow/commands/review.rb +2 -10
- data/lib/git_reflow/commands/setup.rb +1 -23
- data/lib/git_reflow/commands/stage.rb +1 -23
- data/lib/git_reflow/commands/start.rb +3 -8
- data/lib/git_reflow/commands/status.rb +1 -2
- data/lib/git_reflow/config.rb +1 -1
- data/lib/git_reflow/git_server/git_hub/pull_request.rb +3 -3
- data/lib/git_reflow/rspec/command_line_helpers.rb +5 -0
- data/lib/git_reflow/version.rb +1 -1
- data/lib/git_reflow/workflow.rb +54 -0
- data/lib/git_reflow/workflows/core.rb +240 -0
- data/lib/git_reflow.rb +18 -117
- data/spec/lib/git_reflow/workflow_spec.rb +56 -0
- data/spec/lib/git_reflow/workflows/core_spec.rb +665 -0
- data/spec/lib/git_reflow_spec.rb +17 -526
- metadata +28 -4
- data/spec/lgtm_git_reflow_spec.rb +0 -522
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 34e27773b70add5bd01632ee991dda30f839404e
|
4
|
+
data.tar.gz: 499009182bc3266f823a20fb82149c595d1d5f6f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 15bd0fdd708a8f75caff0dbcb68330b5958de09fc763b50e48b264070508844ac63f2b006b33130b326ce365fa674bb1db18f9dafaf5a77f4acfa74812bb69aa
|
7
|
+
data.tar.gz: 1efb8f91ea481b608320f0284717f303b36d21392966c344aff27215bd3a7791cd40a54093e55c9ba860a2e6eec0c6b3836eccf94b8930cbbb4483e55c578982
|
data/CHANGELOG.md
CHANGED
@@ -1,7 +1,22 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
-
## [
|
3
|
+
## [Unreleased](https://github.com/reenhanced/gitreflow/tree/v0.8.4)
|
4
|
+
|
5
|
+
[Full Changelog](https://github.com/reenhanced/gitreflow/compare/v0.8.3...v0.8.4)
|
6
|
+
|
7
|
+
**Closed issues:**
|
8
|
+
|
9
|
+
- Introduce the idea of "Workflows" to customize steps [\#53](https://github.com/reenhanced/gitreflow/issues/53)
|
10
|
+
- undefined method for strip during setup [\#197](https://github.com/reenhanced/gitreflow/issues/197)
|
4
11
|
|
12
|
+
**Merged pull requests:**
|
13
|
+
|
14
|
+
- \[53\] Create core workflow module to consolidate commands [\#198](https://github.com/reenhanced/gitreflow/pull/198) ([codenamev](https://github.com/codenamev))
|
15
|
+
|
16
|
+
## [v0.8.3](https://github.com/reenhanced/gitreflow/tree/v0.8.3) (2016-08-04)
|
17
|
+
[Full Changelog](https://github.com/reenhanced/gitreflow/compare/v0.8.2...v0.8.3)
|
18
|
+
|
19
|
+
## [v0.8.2](https://github.com/reenhanced/gitreflow/tree/v0.8.2) (2016-08-01)
|
5
20
|
[Full Changelog](https://github.com/reenhanced/gitreflow/compare/v0.8.1...v0.8.2)
|
6
21
|
|
7
22
|
**Fixed bugs:**
|
data/Gemfile.lock
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
git_reflow (0.8.
|
4
|
+
git_reflow (0.8.4)
|
5
5
|
colorize (>= 0.7.0)
|
6
6
|
github_api (= 0.14.0)
|
7
7
|
gli (= 2.14.0)
|
8
8
|
highline
|
9
9
|
httpclient
|
10
|
+
rack (>= 1.2, < 2)
|
10
11
|
reenhanced_bitbucket_api (= 0.3.2)
|
11
12
|
|
12
13
|
GEM
|
@@ -42,7 +43,7 @@ GEM
|
|
42
43
|
highline (1.7.8)
|
43
44
|
httpclient (2.8.0)
|
44
45
|
json (1.8.3)
|
45
|
-
jwt (1.5.
|
46
|
+
jwt (1.5.4)
|
46
47
|
method_source (0.8.2)
|
47
48
|
mini_portile2 (2.1.0)
|
48
49
|
multi_json (1.12.1)
|
@@ -51,9 +52,9 @@ GEM
|
|
51
52
|
nokogiri (1.6.8)
|
52
53
|
mini_portile2 (~> 2.1.0)
|
53
54
|
pkg-config (~> 1.1.7)
|
54
|
-
oauth2 (1.
|
55
|
+
oauth2 (1.2.0)
|
55
56
|
faraday (>= 0.8, < 0.10)
|
56
|
-
jwt (~> 1.0
|
57
|
+
jwt (~> 1.0)
|
57
58
|
multi_json (~> 1.3)
|
58
59
|
multi_xml (~> 0.5)
|
59
60
|
rack (>= 1.2, < 3)
|
@@ -65,7 +66,7 @@ GEM
|
|
65
66
|
pry-byebug (3.4.0)
|
66
67
|
byebug (~> 9.0)
|
67
68
|
pry (~> 0.10)
|
68
|
-
rack (
|
69
|
+
rack (1.6.4)
|
69
70
|
rake (11.1.2)
|
70
71
|
rdoc (4.2.2)
|
71
72
|
json (~> 1.4)
|
data/git_reflow.gemspec
CHANGED
@@ -34,6 +34,10 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.add_dependency('highline')
|
35
35
|
s.add_dependency('httpclient')
|
36
36
|
s.add_dependency('github_api', '0.14.0')
|
37
|
+
# rack is a dependency of oauth2, which is a dependency of github_api
|
38
|
+
# The latest rack only supports ruby > 2.2.2, so we lock this down until
|
39
|
+
# support for ruby 2.1.x is dropped
|
40
|
+
s.add_dependency('rack', ['>= 1.2', '< 2'])
|
37
41
|
s.add_dependency('reenhanced_bitbucket_api', '0.3.2')
|
38
42
|
|
39
43
|
s.post_install_message = "You need to setup your GitHub OAuth token\nPlease run 'git-reflow setup'"
|
@@ -5,11 +5,6 @@ command :deliver do |c|
|
|
5
5
|
c.desc 'merge your feature branch down to your base branch, and cleanup your feature branch'
|
6
6
|
c.switch [:f, :'skip-lgtm'], desc: 'skip the lgtm checks and deliver your feature branch'
|
7
7
|
c.action do |global_options, options, args|
|
8
|
-
|
9
|
-
base: args[0],
|
10
|
-
skip_lgtm: options[:'skip-lgtm']
|
11
|
-
}
|
12
|
-
|
13
|
-
GitReflow.deliver deliver_options
|
8
|
+
GitReflow.deliver base: args[0], force: options[:'skip-lgtm']
|
14
9
|
end
|
15
10
|
end
|
@@ -13,11 +13,8 @@ command :refresh do |c|
|
|
13
13
|
c.flag [:r,:remote], default_value: 'origin'
|
14
14
|
c.flag [:b,:base], default_value: 'master'
|
15
15
|
c.action do |global_options, options, args|
|
16
|
-
refresh_options = {
|
17
|
-
:remote => options[:remote],
|
18
|
-
:base => options[:base]
|
19
|
-
}
|
20
16
|
|
21
|
-
GitReflow.
|
17
|
+
GitReflow.refresh base: options[:base], remote: options[:remote]
|
18
|
+
|
22
19
|
end
|
23
20
|
end
|
@@ -6,16 +6,8 @@ command :review do |c|
|
|
6
6
|
c.flag [:t, :title]
|
7
7
|
c.flag [:m, :message]
|
8
8
|
c.action do |global_options,options,args|
|
9
|
-
if options[:title] || options[:message]
|
10
|
-
review_options = {
|
11
|
-
:base => args[0],
|
12
|
-
:title => options[:title],
|
13
|
-
:body => options[:message]
|
14
|
-
}
|
15
|
-
else
|
16
|
-
review_options = { :base => args[0] }
|
17
|
-
end
|
18
9
|
|
19
|
-
GitReflow.review
|
10
|
+
GitReflow.review base: args[0], title: options[:title], body: options[:message]
|
11
|
+
|
20
12
|
end
|
21
13
|
end
|
@@ -4,30 +4,8 @@ command :setup do |c|
|
|
4
4
|
c.switch [:l, :local], default_value: false, desc: 'setup GitReflow for the current project only'
|
5
5
|
c.switch [:e, :enterprise], default_value: false, desc: 'setup GitReflow with a Github Enterprise account'
|
6
6
|
c.action do |global_options, options, args|
|
7
|
-
reflow_options = { project_only: options[:local], enterprise: options[:enterprise] }
|
8
|
-
existing_git_include_paths = GitReflow::Config.get('include.path', all: true).split("\n")
|
9
7
|
|
10
|
-
|
11
|
-
GitReflow.run "touch #{GitReflow::Config::CONFIG_FILE_PATH}"
|
12
|
-
GitReflow.say "Created #{GitReflow::Config::CONFIG_FILE_PATH} for Reflow specific configurations", :notice
|
13
|
-
GitReflow::Config.add "include.path", GitReflow::Config::CONFIG_FILE_PATH, global: true
|
14
|
-
GitReflow.say "Added #{GitReflow::Config::CONFIG_FILE_PATH} to ~/.gitconfig include paths", :notice
|
15
|
-
end
|
8
|
+
GitReflow.setup local: options[:local], enterprise: options[:enterprise]
|
16
9
|
|
17
|
-
choose do |menu|
|
18
|
-
menu.header = "Available remote Git Server services"
|
19
|
-
menu.prompt = "Which service would you like to use for this project? "
|
20
|
-
|
21
|
-
menu.choice('GitHub') { GitReflow::GitServer.connect reflow_options.merge({ provider: 'GitHub', silent: false }) }
|
22
|
-
menu.choice('BitBucket (team-owned repos only)') { GitReflow::GitServer.connect reflow_options.merge({ provider: 'BitBucket', silent: false }) }
|
23
|
-
end
|
24
|
-
|
25
|
-
GitReflow::Config.set "constants.minimumApprovals", ask("Set the minimum number of approvals (leaving blank will require approval from all commenters): "), local: reflow_options[:project_only]
|
26
|
-
GitReflow::Config.set "constants.approvalRegex", GitReflow::GitServer::PullRequest::DEFAULT_APPROVAL_REGEX, local: reflow_options[:project_only]
|
27
|
-
|
28
|
-
if GitReflow::Config.get('core.editor').length <= 0
|
29
|
-
GitReflow::Config.set('core.editor', GitReflow.default_editor, local: reflow_options[:project_only])
|
30
|
-
GitReflow.say "Updated git's editor (via git config key 'core.editor') to: #{GitReflow.default_editor}.", :notice
|
31
|
-
end
|
32
10
|
end
|
33
11
|
end
|
@@ -2,30 +2,8 @@ desc 'Deliver your changes to a staging server'
|
|
2
2
|
command :stage do |c|
|
3
3
|
c.desc 'deliver your feature branch to the staging branch'
|
4
4
|
c.action do |global_options, options, args|
|
5
|
-
feature_branch_name = GitReflow.current_branch
|
6
|
-
staging_branch_name = GitReflow::Config.get('reflow.staging-branch', local: true)
|
7
5
|
|
8
|
-
|
9
|
-
staging_branch_name = GitReflow.ask("What's the name of your staging branch? (default: 'staging') ")
|
10
|
-
staging_branch_name = 'staging' if staging_branch_name.strip == ''
|
11
|
-
GitReflow::Config.set('reflow.staging-branch', staging_branch_name, local: true)
|
12
|
-
end
|
6
|
+
GitReflow.stage
|
13
7
|
|
14
|
-
GitReflow.run_command_with_label "git checkout #{staging_branch_name}"
|
15
|
-
GitReflow.run_command_with_label "git pull origin #{staging_branch_name}"
|
16
|
-
|
17
|
-
if GitReflow.run_command_with_label "git merge #{feature_branch_name}", with_system: true
|
18
|
-
GitReflow.run_command_with_label "git push origin #{staging_branch_name}"
|
19
|
-
|
20
|
-
staged = GitReflow.deploy(:staging)
|
21
|
-
|
22
|
-
if staged
|
23
|
-
GitReflow.say "Deployed to Staging.", :success
|
24
|
-
else
|
25
|
-
GitReflow.say "There were issues deploying to staging.", :error
|
26
|
-
end
|
27
|
-
else
|
28
|
-
GitReflow.say "There were issues merging your feature branch to staging.", :error
|
29
|
-
end
|
30
8
|
end
|
31
9
|
end
|
@@ -11,17 +11,12 @@ arg_name '[new-feature-branch-name] - name of the new feature branch'
|
|
11
11
|
command :start do |c|
|
12
12
|
c.flag [:b,:base], default_value: 'master'
|
13
13
|
c.action do |global_options, options, args|
|
14
|
+
|
14
15
|
if args.empty?
|
15
16
|
raise "usage: git-reflow start [new-branch-name]"
|
16
17
|
else
|
17
|
-
|
18
|
-
# This command allows you to 'git reflow start' off your base branch
|
19
|
-
base_branch = options[:base]
|
20
|
-
|
21
|
-
GitReflow.run_command_with_label "git checkout #{base_branch}"
|
22
|
-
GitReflow.run_command_with_label "git pull origin #{base_branch}"
|
23
|
-
GitReflow.run_command_with_label "git push origin #{GitReflow.current_branch}:refs/heads/#{args[0]}"
|
24
|
-
GitReflow.run_command_with_label "git checkout --track -b #{args[0]} origin/#{args[0]}"
|
18
|
+
GitReflow.start feature_branch: args[0], base: options[:base]
|
25
19
|
end
|
20
|
+
|
26
21
|
end
|
27
22
|
end
|
@@ -2,7 +2,6 @@ desc 'Display information about the status of your feature in the review process
|
|
2
2
|
arg_name "destination_branch - the branch you're merging your feature into ('master' is default)"
|
3
3
|
command :status do |c|
|
4
4
|
c.action do |global_options, options, args|
|
5
|
-
destination_branch
|
6
|
-
GitReflow.status destination_branch
|
5
|
+
GitReflow.status destination_branch: args[0]
|
7
6
|
end
|
8
7
|
end
|
data/lib/git_reflow/config.rb
CHANGED
@@ -25,7 +25,7 @@ module GitReflow
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.find_open(to: 'master', from: GitReflow.git_server.class.current_branch)
|
28
|
-
matching_pull = GitReflow.git_server.connection.pull_requests.all(GitReflow.
|
28
|
+
matching_pull = GitReflow.git_server.connection.pull_requests.all(GitReflow.remote_user, GitReflow.remote_repo_name, base: to, head: "#{GitReflow.remote_user}:#{from}", state: 'open').first
|
29
29
|
if matching_pull
|
30
30
|
self.new matching_pull
|
31
31
|
end
|
@@ -56,8 +56,8 @@ module GitReflow
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def comments
|
59
|
-
comments = GitReflow.git_server.connection.issues.comments.all GitReflow.
|
60
|
-
review_comments = GitReflow.git_server.connection.pull_requests.comments.all GitReflow.
|
59
|
+
comments = GitReflow.git_server.connection.issues.comments.all GitReflow.remote_user, GitReflow.remote_repo_name, number: self.number
|
60
|
+
review_comments = GitReflow.git_server.connection.pull_requests.comments.all GitReflow.remote_user, GitReflow.remote_repo_name, number: self.number
|
61
61
|
|
62
62
|
review_comments.to_a + comments.to_a
|
63
63
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require "highline"
|
2
|
+
|
1
3
|
module GitReflow
|
2
4
|
module RSpec
|
3
5
|
module CommandLineHelpers
|
@@ -10,9 +12,12 @@ module GitReflow
|
|
10
12
|
|
11
13
|
stub_run_for GitReflow
|
12
14
|
stub_run_for GitReflow::Sandbox
|
15
|
+
stub_run_for GitReflow::Workflow
|
16
|
+
stub_run_for GitReflow::Workflows::Core if defined? GitReflow::Workflows
|
13
17
|
|
14
18
|
stub_output_for(GitReflow)
|
15
19
|
stub_output_for(GitReflow::Sandbox)
|
20
|
+
stub_output_for(GitReflow::Workflow)
|
16
21
|
|
17
22
|
allow_any_instance_of(GitReflow::GitServer::PullRequest).to receive(:printf) do |format, *output|
|
18
23
|
$output << Array(output).join(" ")
|
data/lib/git_reflow/version.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'git_reflow/sandbox'
|
2
|
+
require 'git_reflow/git_helpers'
|
3
|
+
|
4
|
+
module GitReflow
|
5
|
+
module Workflow
|
6
|
+
def self.included base
|
7
|
+
base.extend ClassMethods
|
8
|
+
end
|
9
|
+
|
10
|
+
# @nodoc
|
11
|
+
def self.current
|
12
|
+
GitReflow::Workflows::Core
|
13
|
+
end
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
include GitReflow::Sandbox
|
17
|
+
include GitReflow::GitHelpers
|
18
|
+
|
19
|
+
# Creates a singleton method on the inlcuded class
|
20
|
+
#
|
21
|
+
# This method will take any number of keyword parameters. If @defaults keyword is provided, and the given
|
22
|
+
# key(s) in the defaults are not provided as keyword parameters, then it will use the value given in the
|
23
|
+
# defaults for that parameter.
|
24
|
+
#
|
25
|
+
# @param name [Symbol] the name of the method to create
|
26
|
+
# @param defaults [Hash] keyword arguments to provide fallbacks for
|
27
|
+
#
|
28
|
+
# @yield [a:, b:, c:, ...] Invokes the block with an arbitrary number of keyword arguments
|
29
|
+
def command(name, **params, &block)
|
30
|
+
defaults = params[:defaults] || {}
|
31
|
+
self.define_singleton_method(name) do |**args|
|
32
|
+
args_with_defaults = {}
|
33
|
+
args.each do |name, value|
|
34
|
+
if "#{value}".length <= 0
|
35
|
+
args_with_defaults[name] = defaults[name]
|
36
|
+
else
|
37
|
+
args_with_defaults[name] = value
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
defaults.each do |name, value|
|
42
|
+
if "#{args_with_defaults[name]}".length <= 0
|
43
|
+
args_with_defaults[name] = value
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
block.call(**args_with_defaults)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
extend GitReflow::Workflow
|
@@ -0,0 +1,240 @@
|
|
1
|
+
$: << File.expand_path(File.dirname(File.realpath(__FILE__)) + '/../..')
|
2
|
+
require 'git_reflow/workflow'
|
3
|
+
|
4
|
+
module GitReflow
|
5
|
+
module Workflows
|
6
|
+
# This class contains the core workflow for git-reflow. Going forward, this
|
7
|
+
# will act as the base class for customizing and extending git-reflow.
|
8
|
+
module Core
|
9
|
+
include GitReflow::Workflow
|
10
|
+
|
11
|
+
extend self
|
12
|
+
|
13
|
+
# Sets up the required git configurations that git-reflow depends on.
|
14
|
+
#
|
15
|
+
# @param local [Boolean] whether to configure git-reflow specific to the current project
|
16
|
+
# @param enterprise [Boolean] whether to configure git-reflow for use with Github Enterprise
|
17
|
+
command(:setup, defaults: {local: false, enterprise: false}) do |**params|
|
18
|
+
reflow_options = { project_only: params[:local], enterprise: params[:enterprise] }
|
19
|
+
existing_git_include_paths = GitReflow::Config.get('include.path', all: true).split("\n")
|
20
|
+
|
21
|
+
unless File.exist?(GitReflow::Config::CONFIG_FILE_PATH) or existing_git_include_paths.include?(GitReflow::Config::CONFIG_FILE_PATH)
|
22
|
+
GitReflow.say "We'll walk you through setting up git-reflow's defaults for all your projects.", :notice
|
23
|
+
GitReflow.say "In the future, you can run \`git-reflow setup\` from the root of any project you want to setup differently.", :notice
|
24
|
+
GitReflow.say "To adjust these settings globally, you can run \`git-reflow setup --global\`.", :notice
|
25
|
+
GitReflow.run "touch #{GitReflow::Config::CONFIG_FILE_PATH}"
|
26
|
+
GitReflow.say "Created #{GitReflow::Config::CONFIG_FILE_PATH} for git-reflow specific configurations.", :notice
|
27
|
+
GitReflow::Config.add "include.path", GitReflow::Config::CONFIG_FILE_PATH, global: true
|
28
|
+
GitReflow.say "Added #{GitReflow::Config::CONFIG_FILE_PATH} to include.path in $HOME/.gitconfig.", :notice
|
29
|
+
end
|
30
|
+
|
31
|
+
choose do |menu|
|
32
|
+
menu.header = "Available remote Git Server services"
|
33
|
+
menu.prompt = "Which service would you like to use for this project? "
|
34
|
+
|
35
|
+
menu.choice('GitHub') { GitReflow::GitServer.connect reflow_options.merge({ provider: 'GitHub', silent: false }) }
|
36
|
+
menu.choice('BitBucket (team-owned repos only)') { GitReflow::GitServer.connect reflow_options.merge({ provider: 'BitBucket', silent: false }) }
|
37
|
+
end
|
38
|
+
|
39
|
+
GitReflow::Config.set "constants.minimumApprovals", ask("Set the minimum number of approvals (leaving blank will require approval from all commenters): "), local: reflow_options[:project_only]
|
40
|
+
GitReflow::Config.set "constants.approvalRegex", GitReflow::GitServer::PullRequest::DEFAULT_APPROVAL_REGEX, local: reflow_options[:project_only]
|
41
|
+
|
42
|
+
if GitReflow::Config.get('core.editor').length <= 0
|
43
|
+
GitReflow::Config.set('core.editor', GitReflow.default_editor, local: reflow_options[:project_only])
|
44
|
+
GitReflow.say "Updated git's editor (via git config key 'core.editor') to: #{GitReflow.default_editor}.", :notice
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Start a new feature branch
|
49
|
+
#
|
50
|
+
# @param feature_branch [String] the name of the branch to create your feature on
|
51
|
+
# @option base [String] the name of the base branch you want to checkout your feature from
|
52
|
+
command(:start, defaults: {base: 'master'}) do |**params|
|
53
|
+
base_branch = params[:base]
|
54
|
+
feature_branch = params[:feature_branch]
|
55
|
+
|
56
|
+
if feature_branch.nil? or feature_branch.length <= 0
|
57
|
+
GitReflow.say "usage: git-reflow start [new-branch-name]", :error
|
58
|
+
else
|
59
|
+
GitReflow.run_command_with_label "git checkout #{base_branch}"
|
60
|
+
GitReflow.run_command_with_label "git pull origin #{base_branch}"
|
61
|
+
GitReflow.run_command_with_label "git push origin #{base_branch}:refs/heads/#{feature_branch}"
|
62
|
+
GitReflow.run_command_with_label "git checkout --track -b #{feature_branch} origin/#{feature_branch}"
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Submit a feature branch for review
|
67
|
+
#
|
68
|
+
# @option base [String] the name of the base branch you want to merge your feature into
|
69
|
+
# @option title [String] the title of your pull request
|
70
|
+
# @option body [String] the body of your pull request
|
71
|
+
command(:review, defaults: {base: 'master'}) do |**params|
|
72
|
+
base_branch = params[:base]
|
73
|
+
create_pull_request = true
|
74
|
+
|
75
|
+
GitReflow.fetch_destination base_branch
|
76
|
+
begin
|
77
|
+
GitReflow.push_current_branch
|
78
|
+
|
79
|
+
existing_pull_request = GitReflow.git_server.find_open_pull_request( from: GitReflow.current_branch, to: base_branch )
|
80
|
+
if existing_pull_request
|
81
|
+
say "A pull request already exists for these branches:", :notice
|
82
|
+
existing_pull_request.display_pull_request_summary
|
83
|
+
else
|
84
|
+
unless params[:title] || params[:body]
|
85
|
+
pull_request_msg_file = "#{GitReflow.git_root_dir}/.git/GIT_REFLOW_PR_MSG"
|
86
|
+
|
87
|
+
File.open(pull_request_msg_file, 'w') do |file|
|
88
|
+
file.write(params[:title] || GitReflow.pull_request_template || GitReflow.current_branch)
|
89
|
+
end
|
90
|
+
|
91
|
+
GitReflow.run("#{GitReflow.git_editor_command} #{pull_request_msg_file}", with_system: true)
|
92
|
+
|
93
|
+
pr_msg = File.read(pull_request_msg_file).split(/[\r\n]|\r\n/).map(&:strip)
|
94
|
+
title = pr_msg.shift
|
95
|
+
|
96
|
+
File.delete(pull_request_msg_file)
|
97
|
+
|
98
|
+
unless pr_msg.empty?
|
99
|
+
pr_msg.shift if pr_msg.first.empty?
|
100
|
+
end
|
101
|
+
|
102
|
+
params[:title] = title
|
103
|
+
params[:body] = "#{pr_msg.join("\n")}\n"
|
104
|
+
|
105
|
+
say "\nReview your PR:\n"
|
106
|
+
say "--------\n"
|
107
|
+
say "Title:\n#{params[:title]}\n\n"
|
108
|
+
say "Body:\n#{params[:body]}\n"
|
109
|
+
say "--------\n"
|
110
|
+
|
111
|
+
create_pull_request = ask("Submit pull request? (Y)") =~ /y/i
|
112
|
+
end
|
113
|
+
|
114
|
+
if create_pull_request
|
115
|
+
pull_request = GitReflow.git_server.create_pull_request(title: params[:title] || params[:body],
|
116
|
+
body: params[:body],
|
117
|
+
head: "#{GitReflow.remote_user}:#{GitReflow.current_branch}",
|
118
|
+
base: params[:base])
|
119
|
+
|
120
|
+
say "Successfully created pull request ##{pull_request.number}: #{pull_request.title}\nPull Request URL: #{pull_request.html_url}\n", :success
|
121
|
+
else
|
122
|
+
say "Review aborted. No pull request has been created.", :review_halted
|
123
|
+
end
|
124
|
+
end
|
125
|
+
rescue Github::Error::UnprocessableEntity => e
|
126
|
+
say "Github Error: #{e.to_s}", :error
|
127
|
+
rescue StandardError => e
|
128
|
+
say "\nError: #{e.inspect}", :error
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
# Checks the status of an existing pull request
|
133
|
+
#
|
134
|
+
# @option destination_branch [String] the branch you're merging your feature into ('master' is default)
|
135
|
+
command(:status, defaults: {destination_branch: 'master'}) do |**params|
|
136
|
+
pull_request = GitReflow.git_server.find_open_pull_request( :from => GitReflow.current_branch, :to => params[:destination_branch] )
|
137
|
+
|
138
|
+
if pull_request.nil?
|
139
|
+
say "No pull request exists for #{GitReflow.current_branch} -> #{params[:destination_branch]}", :notice
|
140
|
+
say "Run 'git reflow review #{params[:destination_branch]}' to start the review process", :notice
|
141
|
+
else
|
142
|
+
say "Here's the status of your review:"
|
143
|
+
pull_request.display_pull_request_summary
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
command(:deploy) do |**params|
|
148
|
+
destination_server = params[:destination_server] || 'default'
|
149
|
+
deploy_command = GitReflow::Config.get("reflow.deploy-to-#{destination_server}-command", local: true)
|
150
|
+
|
151
|
+
# first check is to allow for automated setup
|
152
|
+
if deploy_command.empty?
|
153
|
+
deploy_command = ask("Enter the command you use to deploy to #{destination_server} (leaving blank will skip deployment)")
|
154
|
+
end
|
155
|
+
|
156
|
+
# second check is to see if the user wants to skip
|
157
|
+
if deploy_command.empty?
|
158
|
+
say "Skipping deployment..."
|
159
|
+
false
|
160
|
+
else
|
161
|
+
GitReflow::Config.set("reflow.deploy-to-#{destination_server}-command", deploy_command, local: true)
|
162
|
+
run_command_with_label(deploy_command, with_system: true)
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# Merge and deploy a feature branch to a staging branch
|
167
|
+
command(:stage) do |**params|
|
168
|
+
feature_branch_name = GitReflow.current_branch
|
169
|
+
staging_branch_name = GitReflow::Config.get('reflow.staging-branch', local: true)
|
170
|
+
|
171
|
+
if staging_branch_name.empty?
|
172
|
+
staging_branch_name = GitReflow.ask("What's the name of your staging branch? (default: 'staging') ")
|
173
|
+
staging_branch_name = 'staging' if staging_branch_name.strip == ''
|
174
|
+
GitReflow::Config.set('reflow.staging-branch', staging_branch_name, local: true)
|
175
|
+
end
|
176
|
+
|
177
|
+
GitReflow.run_command_with_label "git checkout #{staging_branch_name}"
|
178
|
+
GitReflow.run_command_with_label "git pull origin #{staging_branch_name}"
|
179
|
+
|
180
|
+
if GitReflow.run_command_with_label "git merge #{feature_branch_name}", with_system: true
|
181
|
+
GitReflow.run_command_with_label "git push origin #{staging_branch_name}"
|
182
|
+
|
183
|
+
staged = self.deploy(destination_server: :staging)
|
184
|
+
|
185
|
+
if staged
|
186
|
+
GitReflow.say "Deployed to Staging.", :success
|
187
|
+
else
|
188
|
+
GitReflow.say "There were issues deploying to staging.", :error
|
189
|
+
end
|
190
|
+
else
|
191
|
+
GitReflow.say "There were issues merging your feature branch to staging.", :error
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
# Deliver a feature branch to a base branch
|
196
|
+
#
|
197
|
+
# @option base [String] base branch to merge your feature branch into
|
198
|
+
# @option force [Boolean] whether to force-deliver the feature branch, ignoring any QA checks
|
199
|
+
command(:deliver, defaults: {base: 'master'}) do |**params|
|
200
|
+
begin
|
201
|
+
existing_pull_request = GitReflow.git_server.find_open_pull_request( from: GitReflow.current_branch, to: params[:base] )
|
202
|
+
|
203
|
+
if existing_pull_request.nil?
|
204
|
+
say "No pull request exists for #{GitReflow.remote_user}:#{GitReflow.current_branch}\nPlease submit your branch for review first with \`git reflow review\`", :deliver_halted
|
205
|
+
else
|
206
|
+
|
207
|
+
if existing_pull_request.good_to_merge?(force: params[:force])
|
208
|
+
# displays current status and prompts user for confirmation
|
209
|
+
self.status destination_branch: params[:base]
|
210
|
+
# TODO: change name of this in the merge! method
|
211
|
+
params[:skip_lgtm] = params[:force] if params[:force]
|
212
|
+
existing_pull_request.merge!(params)
|
213
|
+
else
|
214
|
+
say existing_pull_request.rejection_message, :deliver_halted
|
215
|
+
end
|
216
|
+
|
217
|
+
end
|
218
|
+
|
219
|
+
rescue Github::Error::UnprocessableEntity => e
|
220
|
+
say "Github Error: #{e.inspect}", :error
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
|
225
|
+
# Updates and synchronizes your base branch and feature branch.
|
226
|
+
#
|
227
|
+
# Performs the following:
|
228
|
+
# $ git checkout <base_branch>
|
229
|
+
# $ git pull <remote_location> <base_branch>
|
230
|
+
# $ git checkout <current_branch>
|
231
|
+
# $ git pull origin <current_branch>
|
232
|
+
# $ git merge <base_branch>
|
233
|
+
# @param remote [String] the name of the remote repository to fetch updates from (origin by default)
|
234
|
+
# @param base [String] the branch that you want to fetch updates from (master by default)
|
235
|
+
command(:refresh, defaults: {remote: 'origin', base: 'master'}) do |**params|
|
236
|
+
GitReflow.update_feature_branch(params)
|
237
|
+
end
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|