flash_flow 1.2.1 → 1.2.2.a
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/Gemfile.lock +3 -1
- data/bin/flash_flow +2 -0
- data/flash_flow.gemspec +1 -0
- data/lib/flash_flow.rb +1 -0
- data/lib/flash_flow/cmd_runner.rb +21 -5
- data/lib/flash_flow/data/base.rb +6 -14
- data/lib/flash_flow/data/branch.rb +2 -1
- data/lib/flash_flow/data/collection.rb +22 -3
- data/lib/flash_flow/data/github.rb +14 -4
- data/lib/flash_flow/data/store.rb +4 -2
- data/lib/flash_flow/deploy.rb +31 -48
- data/lib/flash_flow/git.rb +25 -11
- data/lib/flash_flow/issue_tracker.rb +21 -1
- data/lib/flash_flow/issue_tracker/pivotal.rb +44 -3
- data/lib/flash_flow/merge_master.rb +6 -0
- data/lib/flash_flow/merge_master/merge_status.html.erb +144 -0
- data/lib/flash_flow/merge_master/release_graph.rb +135 -0
- data/lib/flash_flow/merge_master/status.rb +108 -0
- data/lib/flash_flow/options.rb +1 -0
- data/lib/flash_flow/resolve.rb +18 -35
- data/lib/flash_flow/shadow_repo.rb +7 -14
- data/lib/flash_flow/version.rb +1 -1
- data/test/lib/data/test_collection.rb +50 -0
- data/test/lib/data/test_store.rb +3 -0
- data/test/lib/issue_tracker/test_pivotal.rb +71 -0
- data/test/lib/merge_master/test_release_graph.rb +74 -0
- data/test/lib/merge_master/test_status.rb +119 -0
- data/test/lib/test_deploy.rb +6 -8
- data/test/lib/test_git.rb +4 -4
- data/test/lib/test_issue_tracker.rb +15 -0
- data/test/lib/test_resolve.rb +0 -29
- data/test/minitest_helper.rb +6 -4
- data/update_gem.sh +5 -0
- metadata +27 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3aab35b80fc7adc67ef12b0833d6434f49c6ec52
|
4
|
+
data.tar.gz: 4c400dc91f4caf0c10c2f15adbec98d00861fa6a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 324c1d564582f90976a185bc6fc5491b6b4f7003694609c17b73cb42ebb5fc9533d78e4c04618b2bbebccc1e540c3ba04cfb4f3776b385f2c754abdb24b12d8e
|
7
|
+
data.tar.gz: 4d96b4211dea4aed6d7b6c7bb89a0b2c39bd61f0e33cfdbd701e60b30930f58231782e53f80fcf1728220c3c93e48938765098960a1b899467c63c41f1cfbff1
|
data/Gemfile.lock
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
flash_flow (1.2.
|
4
|
+
flash_flow (1.2.2.a)
|
5
5
|
hipchat (~> 1.5)
|
6
6
|
octokit (~> 4.1)
|
7
7
|
pivotal-tracker (~> 0.5)
|
8
|
+
ruby-graphviz (> 0)
|
8
9
|
|
9
10
|
GEM
|
10
11
|
remote: https://rubygems.org/
|
@@ -57,6 +58,7 @@ GEM
|
|
57
58
|
http-cookie (>= 1.0.2, < 2.0)
|
58
59
|
mime-types (>= 1.16, < 3.0)
|
59
60
|
netrc (~> 0.7)
|
61
|
+
ruby-graphviz (1.2.2)
|
60
62
|
safe_yaml (1.0.4)
|
61
63
|
sawyer (0.6.0)
|
62
64
|
addressable (~> 2.3.5)
|
data/bin/flash_flow
CHANGED
@@ -24,6 +24,8 @@ case
|
|
24
24
|
FlashFlow::Resolve.new(FlashFlow::Config.configuration.git, FlashFlow::Config.configuration.branch_info_file, logger: FlashFlow::Config.configuration.logger).start
|
25
25
|
when options[:resolve_manual]
|
26
26
|
FlashFlow::Resolve.new(FlashFlow::Config.configuration.git, FlashFlow::Config.configuration.branch_info_file, logger: FlashFlow::Config.configuration.logger).manual_instructions
|
27
|
+
when options[:merge_status]
|
28
|
+
FlashFlow::MergeMaster::Status.new(FlashFlow::Config.configuration.issue_tracker, FlashFlow::Config.configuration.branches, FlashFlow::Config.configuration.branch_info_file, FlashFlow::Config.configuration.git, logger: FlashFlow::Config.configuration.logger).status
|
27
29
|
else
|
28
30
|
FlashFlow::Deploy.new(options).run
|
29
31
|
FlashFlow::IssueTracker::Base.new(FlashFlow::Config.configuration.issue_tracker).stories_pushed
|
data/flash_flow.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.add_dependency 'octokit', "~> 4.1"
|
21
21
|
spec.add_dependency 'hipchat', "~> 1.5"
|
22
22
|
spec.add_dependency 'pivotal-tracker', "~> 0.5"
|
23
|
+
spec.add_dependency 'ruby-graphviz', "> 0"
|
23
24
|
|
24
25
|
spec.add_development_dependency "bundler", "~> 1.6"
|
25
26
|
spec.add_development_dependency "rake", "> 0"
|
data/lib/flash_flow.rb
CHANGED
@@ -3,7 +3,11 @@ require 'open3'
|
|
3
3
|
|
4
4
|
module FlashFlow
|
5
5
|
class CmdRunner
|
6
|
-
|
6
|
+
LOG_NONE = :log_none
|
7
|
+
LOG_CMD = :log_cmd
|
8
|
+
|
9
|
+
attr_reader :dry_run, :last_command, :last_stderr, :last_stdout
|
10
|
+
attr_accessor :dir
|
7
11
|
|
8
12
|
def initialize(opts={})
|
9
13
|
@dir = opts[:dir] || '.'
|
@@ -11,7 +15,7 @@ module FlashFlow
|
|
11
15
|
@logger = opts[:logger] || Logger.new('/dev/null')
|
12
16
|
end
|
13
17
|
|
14
|
-
def run(cmd)
|
18
|
+
def run(cmd, opts={})
|
15
19
|
@last_command = cmd
|
16
20
|
if dry_run
|
17
21
|
puts "#{dir}$ #{cmd}"
|
@@ -24,14 +28,26 @@ module FlashFlow
|
|
24
28
|
@success = wait_thr.value.success?
|
25
29
|
end
|
26
30
|
end
|
27
|
-
|
28
|
-
last_stdout.split("\n").each { |line| @logger.debug(line) }
|
29
|
-
last_stderr.split("\n").each { |line| @logger.debug(line) }
|
31
|
+
log(cmd, opts[:log])
|
30
32
|
end
|
31
33
|
end
|
32
34
|
|
33
35
|
def last_success?
|
34
36
|
@success
|
35
37
|
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def log(cmd, log_what)
|
42
|
+
if log_what == LOG_NONE
|
43
|
+
# Do nothing
|
44
|
+
else
|
45
|
+
@logger.debug("#{dir}$ #{cmd}")
|
46
|
+
unless log_what == LOG_CMD
|
47
|
+
last_stdout.split("\n").each { |line| @logger.debug(line) }
|
48
|
+
last_stderr.split("\n").each { |line| @logger.debug(line) }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
36
52
|
end
|
37
53
|
end
|
data/lib/flash_flow/data/base.rb
CHANGED
@@ -9,8 +9,8 @@ module FlashFlow
|
|
9
9
|
class Base
|
10
10
|
extend Forwardable
|
11
11
|
|
12
|
-
def_delegators :@collection, :add_story, :mergeable, :mark_deleted, :mark_success,
|
13
|
-
:
|
12
|
+
def_delegators :@collection, :add_story, :mergeable, :mark_deleted, :mark_success, :mark_failure,
|
13
|
+
:remove_from_merge, :add_to_merge, :failures, :set_resolutions, :to_a, :can_ship?, :branch_link
|
14
14
|
|
15
15
|
def initialize(branch_config, filename, git, opts={})
|
16
16
|
@git = git
|
@@ -19,8 +19,10 @@ module FlashFlow
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def initialize_collection(branch_config, remotes)
|
22
|
-
Collection.fetch(remotes, branch_config) ||
|
22
|
+
collection = Collection.fetch(remotes, branch_config) ||
|
23
23
|
Collection.from_hash(remotes, backwards_compatible_store['branches'])
|
24
|
+
collection.mark_all_as_current
|
25
|
+
collection
|
24
26
|
end
|
25
27
|
|
26
28
|
def version
|
@@ -44,9 +46,7 @@ module FlashFlow
|
|
44
46
|
|
45
47
|
def backwards_compatible_store
|
46
48
|
@backwards_compatible_store ||= begin
|
47
|
-
hash =
|
48
|
-
@store.get
|
49
|
-
end
|
49
|
+
hash = @store.get
|
50
50
|
|
51
51
|
hash.has_key?('branches') ? hash : { 'branches' => hash }
|
52
52
|
end
|
@@ -55,14 +55,6 @@ module FlashFlow
|
|
55
55
|
def saved_branches
|
56
56
|
Collection.from_hash(@git.remotes, backwards_compatible_store['branches']).to_a
|
57
57
|
end
|
58
|
-
|
59
|
-
private
|
60
|
-
|
61
|
-
def in_shadow_repo
|
62
|
-
ShadowRepo.new(@git).in_dir do
|
63
|
-
yield
|
64
|
-
end
|
65
|
-
end
|
66
58
|
end
|
67
59
|
end
|
68
60
|
end
|
@@ -4,7 +4,8 @@ module FlashFlow
|
|
4
4
|
module Data
|
5
5
|
|
6
6
|
class Branch
|
7
|
-
attr_accessor :remote, :remote_url, :ref, :sha, :status, :resolutions, :stories, :conflict_sha, :metadata,
|
7
|
+
attr_accessor :remote, :remote_url, :ref, :sha, :status, :resolutions, :stories, :conflict_sha, :metadata,
|
8
|
+
:current_record, :updated_at, :created_at
|
8
9
|
|
9
10
|
def initialize(_remote, _remote_url, _ref)
|
10
11
|
@remote = _remote
|
@@ -24,9 +24,10 @@ module FlashFlow
|
|
24
24
|
collection
|
25
25
|
end
|
26
26
|
|
27
|
-
def self.from_hash(remotes, hash)
|
27
|
+
def self.from_hash(remotes, hash, collection_instance=nil)
|
28
28
|
collection = new(remotes)
|
29
29
|
collection.branches = branches_from_hash(hash.dup)
|
30
|
+
collection.instance_variable_set(:@collection_instance, collection_instance)
|
30
31
|
collection
|
31
32
|
end
|
32
33
|
|
@@ -73,7 +74,7 @@ module FlashFlow
|
|
73
74
|
end
|
74
75
|
end
|
75
76
|
|
76
|
-
self.class.from_hash(remotes, merged_branches)
|
77
|
+
self.class.from_hash(remotes, merged_branches, @collection_instance)
|
77
78
|
end
|
78
79
|
|
79
80
|
def to_a
|
@@ -84,8 +85,12 @@ module FlashFlow
|
|
84
85
|
to_a.each
|
85
86
|
end
|
86
87
|
|
88
|
+
def current_branches
|
89
|
+
to_a.select { |branch| branch.current_record }
|
90
|
+
end
|
91
|
+
|
87
92
|
def mergeable
|
88
|
-
|
93
|
+
current_branches.select { |branch| (branch.success? || branch.fail? || branch.unknown?) }
|
89
94
|
end
|
90
95
|
|
91
96
|
def failures
|
@@ -100,6 +105,12 @@ module FlashFlow
|
|
100
105
|
end
|
101
106
|
end
|
102
107
|
|
108
|
+
def mark_all_as_current
|
109
|
+
@branches.each do |_, branch|
|
110
|
+
branch.current_record = true
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
103
114
|
def add_to_merge(remote, ref)
|
104
115
|
branch = record(remote, nil, ref)
|
105
116
|
@collection_instance.add_to_merge(branch) if @collection_instance.respond_to?(:add_to_merge)
|
@@ -143,6 +154,14 @@ module FlashFlow
|
|
143
154
|
branch
|
144
155
|
end
|
145
156
|
|
157
|
+
def can_ship?(branch)
|
158
|
+
@collection_instance.respond_to?(:can_ship?) ? @collection_instance.can_ship?(branch) : true
|
159
|
+
end
|
160
|
+
|
161
|
+
def branch_link(branch)
|
162
|
+
@collection_instance.branch_link(branch) if @collection_instance.respond_to?(:branch_link)
|
163
|
+
end
|
164
|
+
|
146
165
|
def set_resolutions(branch, resolutions)
|
147
166
|
update_or_add(branch)
|
148
167
|
branch.set_resolutions(resolutions)
|
@@ -13,6 +13,7 @@ module FlashFlow
|
|
13
13
|
@master_branch = config['master_branch'] || master
|
14
14
|
@unmergeable_label = config['unmergeable_label'] || 'unmergeable'
|
15
15
|
@do_not_merge_label = config['do_not_merge_label'] || 'do not merge'
|
16
|
+
@code_reviewed_label = config['code_reviewed_label'] || 'code reviewed'
|
16
17
|
end
|
17
18
|
|
18
19
|
def initialize_connection!(token)
|
@@ -61,6 +62,14 @@ module FlashFlow
|
|
61
62
|
add_label(branch.metadata['pr_number'], @unmergeable_label)
|
62
63
|
end
|
63
64
|
|
65
|
+
def can_ship?(branch)
|
66
|
+
has_label?(branch.metadata['pr_number'], @code_reviewed_label)
|
67
|
+
end
|
68
|
+
|
69
|
+
def branch_link(branch)
|
70
|
+
branch.metadata['pr_url']
|
71
|
+
end
|
72
|
+
|
64
73
|
private
|
65
74
|
|
66
75
|
def status_from_labels(pull_request)
|
@@ -105,19 +114,20 @@ module FlashFlow
|
|
105
114
|
end
|
106
115
|
|
107
116
|
def has_label?(pull_request_number, label_name)
|
108
|
-
labels(pull_request_number).detect { |label| label
|
117
|
+
!!labels(pull_request_number).detect { |label| label == label_name }
|
109
118
|
end
|
110
119
|
|
111
120
|
def labels(pull_request_number)
|
112
121
|
@labels ||= {}
|
113
|
-
@labels[pull_request_number] ||= octokit.labels_for_issue(repo, pull_request_number)
|
122
|
+
@labels[pull_request_number] ||= octokit.labels_for_issue(repo, pull_request_number).map(&:name)
|
114
123
|
end
|
115
124
|
|
116
125
|
def metadata(pr)
|
117
126
|
{
|
118
127
|
'pr_number' => pr.number,
|
119
|
-
'
|
120
|
-
'
|
128
|
+
'pr_url' => pr.html_url,
|
129
|
+
'user_url' => pr.user.html_url,
|
130
|
+
'repo_url' => pr.head.repo.html_url
|
121
131
|
}
|
122
132
|
end
|
123
133
|
|
@@ -20,12 +20,14 @@ module FlashFlow
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def write(branches, file=nil)
|
23
|
-
@git.
|
23
|
+
@git.in_dir do
|
24
24
|
file ||= File.open(@filename, 'w')
|
25
25
|
file.puts JSON.pretty_generate(sort_branches(branches))
|
26
26
|
file.close
|
27
|
+
end
|
27
28
|
|
28
|
-
|
29
|
+
@git.in_temp_merge_branch do
|
30
|
+
@git.add_and_commit(@filename, 'Branch Info', add: {force: true})
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
data/lib/flash_flow/deploy.rb
CHANGED
@@ -18,7 +18,8 @@ module FlashFlow
|
|
18
18
|
@rerere_forget = opts[:rerere_forget]
|
19
19
|
@stories = [opts[:stories]].flatten.compact
|
20
20
|
|
21
|
-
@
|
21
|
+
@local_git = Git.new(Config.configuration.git, logger)
|
22
|
+
@git = ShadowGit.new(Config.configuration.git, logger)
|
22
23
|
@lock = Lock::Base.new(Config.configuration.lock)
|
23
24
|
@notifier = Notifier::Base.new(Config.configuration.notifier)
|
24
25
|
@data = Data::Base.new(Config.configuration.branches, Config.configuration.branch_info_file, @git, logger: logger)
|
@@ -31,45 +32,42 @@ module FlashFlow
|
|
31
32
|
def run
|
32
33
|
check_version
|
33
34
|
check_repo
|
34
|
-
puts "Building #{@
|
35
|
-
logger.info "\n\n### Beginning #{@
|
36
|
-
|
35
|
+
puts "Building #{@local_git.merge_branch}... Log can be found in #{FlashFlow::Config.configuration.log_file}"
|
36
|
+
logger.info "\n\n### Beginning #{@local_git.merge_branch} merge ###\n\n"
|
37
37
|
|
38
38
|
begin
|
39
39
|
open_pull_request
|
40
40
|
|
41
|
-
|
42
|
-
@
|
43
|
-
|
44
|
-
@git.
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
commit_rerere
|
53
|
-
end
|
54
|
-
|
55
|
-
@git.copy_temp_to_merge_branch
|
56
|
-
@git.delete_temp_merge_branch
|
57
|
-
@git.push_merge_branch
|
41
|
+
@lock.with_lock do
|
42
|
+
@git.fetch(@git.merge_remote)
|
43
|
+
@git.in_original_merge_branch do
|
44
|
+
@git.initialize_rerere
|
45
|
+
end
|
46
|
+
|
47
|
+
@git.reset_temp_merge_branch
|
48
|
+
@git.in_temp_merge_branch do
|
49
|
+
merge_branches
|
50
|
+
commit_branch_info
|
51
|
+
commit_rerere
|
58
52
|
end
|
53
|
+
|
54
|
+
@git.copy_temp_to_merge_branch
|
55
|
+
@git.delete_temp_merge_branch
|
56
|
+
@git.push_merge_branch
|
59
57
|
end
|
60
58
|
|
61
59
|
print_errors
|
62
|
-
logger.info "### Finished #{@
|
60
|
+
logger.info "### Finished #{@local_git.merge_branch} merge ###"
|
63
61
|
rescue Lock::Error, OutOfSyncWithRemote => e
|
64
62
|
puts 'Failure!'
|
65
63
|
puts e.message
|
66
64
|
ensure
|
67
|
-
@
|
65
|
+
@local_git.run("checkout #{@local_git.working_branch}")
|
68
66
|
end
|
69
67
|
end
|
70
68
|
|
71
69
|
def check_repo
|
72
|
-
if @
|
70
|
+
if @local_git.staged_and_working_dir_files.any?
|
73
71
|
raise RuntimeError.new('You have changes in your working directory. Please stash and try again')
|
74
72
|
end
|
75
73
|
end
|
@@ -112,7 +110,7 @@ module FlashFlow
|
|
112
110
|
raise RuntimeError.new("No remote found for #{branch.remote_url}. Please run 'git remote add *your_remote_name* #{branch.remote_url}' and try again.")
|
113
111
|
end
|
114
112
|
|
115
|
-
fetch(branch.remote)
|
113
|
+
@git.fetch(branch.remote)
|
116
114
|
git_merge(branch, branch.ref == @git.working_branch)
|
117
115
|
end
|
118
116
|
end
|
@@ -142,17 +140,17 @@ module FlashFlow
|
|
142
140
|
end
|
143
141
|
|
144
142
|
def open_pull_request
|
145
|
-
return false if [@
|
143
|
+
return false if [@local_git.master_branch, @local_git.merge_branch].include?(@local_git.working_branch)
|
146
144
|
|
147
145
|
# TODO - This should use the actual remote for the branch we're on
|
148
|
-
@
|
149
|
-
raise OutOfSyncWithRemote.new("Your branch is out of sync with the remote. If you want to force push, run 'flash_flow -f'") unless @
|
146
|
+
@local_git.push(@local_git.working_branch, force: @force)
|
147
|
+
raise OutOfSyncWithRemote.new("Your branch is out of sync with the remote. If you want to force push, run 'flash_flow -f'") unless @local_git.last_success?
|
150
148
|
|
151
149
|
# TODO - This should use the actual remote for the branch we're on
|
152
150
|
if @do_not_merge
|
153
|
-
@data.remove_from_merge(@
|
151
|
+
@data.remove_from_merge(@local_git.merge_remote, @local_git.working_branch)
|
154
152
|
else
|
155
|
-
@data.add_to_merge(@
|
153
|
+
@data.add_to_merge(@local_git.merge_remote, @local_git.working_branch)
|
156
154
|
end
|
157
155
|
end
|
158
156
|
|
@@ -164,10 +162,10 @@ module FlashFlow
|
|
164
162
|
errors = []
|
165
163
|
branch_not_merged = nil
|
166
164
|
@data.failures.each do |full_ref, failure|
|
167
|
-
if failure.ref == @
|
168
|
-
branch_not_merged = "ERROR: Your branch did not merge to #{@
|
165
|
+
if failure.ref == @local_git.working_branch
|
166
|
+
branch_not_merged = "ERROR: Your branch did not merge to #{@local_git.merge_branch}. Run 'flash_flow --resolve', fix the merge conflict(s) and then re-run this script\n"
|
169
167
|
else
|
170
|
-
errors << "WARNING: Unable to merge branch #{failure.remote}/#{failure.ref} to #{@
|
168
|
+
errors << "WARNING: Unable to merge branch #{failure.remote}/#{failure.ref} to #{@local_git.merge_branch} due to conflicts."
|
171
169
|
end
|
172
170
|
end
|
173
171
|
errors << branch_not_merged if branch_not_merged
|
@@ -179,20 +177,5 @@ module FlashFlow
|
|
179
177
|
end
|
180
178
|
end
|
181
179
|
|
182
|
-
private
|
183
|
-
|
184
|
-
def in_shadow_repo
|
185
|
-
ShadowRepo.new(@git, logger: logger).in_dir do
|
186
|
-
yield
|
187
|
-
end
|
188
|
-
end
|
189
|
-
|
190
|
-
def fetch(remote)
|
191
|
-
@fetched_remotes ||= {}
|
192
|
-
unless @fetched_remotes[remote]
|
193
|
-
@git.fetch(remote)
|
194
|
-
@fetched_remotes[remote] = true
|
195
|
-
end
|
196
|
-
end
|
197
180
|
end
|
198
181
|
end
|
data/lib/flash_flow/git.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'flash_flow/cmd_runner'
|
2
|
+
require 'shellwords'
|
2
3
|
|
3
4
|
module FlashFlow
|
4
5
|
class Git
|
@@ -22,6 +23,12 @@ module FlashFlow
|
|
22
23
|
@working_branch = current_branch
|
23
24
|
end
|
24
25
|
|
26
|
+
def in_dir
|
27
|
+
Dir.chdir(@cmd_runner.dir) do
|
28
|
+
yield
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
25
32
|
def last_stdout
|
26
33
|
@cmd_runner.last_stdout
|
27
34
|
end
|
@@ -34,8 +41,8 @@ module FlashFlow
|
|
34
41
|
@cmd_runner.last_success?
|
35
42
|
end
|
36
43
|
|
37
|
-
def run(cmd)
|
38
|
-
@cmd_runner.run("git #{cmd}")
|
44
|
+
def run(cmd, opts={})
|
45
|
+
@cmd_runner.run("git #{cmd}", opts)
|
39
46
|
end
|
40
47
|
|
41
48
|
def add_and_commit(files, message, opts={})
|
@@ -53,7 +60,11 @@ module FlashFlow
|
|
53
60
|
end
|
54
61
|
|
55
62
|
def fetch(remote)
|
56
|
-
|
63
|
+
@fetched_remotes ||= {}
|
64
|
+
unless @fetched_remotes[remote]
|
65
|
+
run("fetch #{remote}")
|
66
|
+
@fetched_remotes[remote] = true
|
67
|
+
end
|
57
68
|
end
|
58
69
|
|
59
70
|
def master_branch_contains?(ref)
|
@@ -73,7 +84,7 @@ module FlashFlow
|
|
73
84
|
end
|
74
85
|
|
75
86
|
def read_file_from_merge_branch(filename)
|
76
|
-
run("show #{merge_remote}/#{merge_branch}:#{filename}")
|
87
|
+
run("show #{merge_remote}/#{merge_branch}:#{filename}", log: CmdRunner::LOG_CMD)
|
77
88
|
last_stdout
|
78
89
|
end
|
79
90
|
|
@@ -113,9 +124,11 @@ module FlashFlow
|
|
113
124
|
end
|
114
125
|
|
115
126
|
def unresolved_conflicts
|
116
|
-
|
117
|
-
|
118
|
-
|
127
|
+
in_dir do
|
128
|
+
conflicted_files.map do |file|
|
129
|
+
File.open(file) { |f| f.grep(/>>>>/) }.empty? ? nil : file
|
130
|
+
end.compact
|
131
|
+
end
|
119
132
|
end
|
120
133
|
|
121
134
|
def resolutions(files)
|
@@ -128,10 +141,10 @@ module FlashFlow
|
|
128
141
|
|
129
142
|
# git rerere doesn't give you a deterministic way to determine which resolution was used
|
130
143
|
def resolution_candidates(file)
|
131
|
-
@cmd_runner.run("diff -q --from-file #{file} .git/rr-cache/*/postimage")
|
144
|
+
@cmd_runner.run("diff -q --from-file #{file} .git/rr-cache/*/postimage", log: CmdRunner::LOG_CMD)
|
132
145
|
different_files = split_diff_lines(@cmd_runner.last_stdout)
|
133
146
|
|
134
|
-
@cmd_runner.run('ls -la .git/rr-cache/*/postimage')
|
147
|
+
@cmd_runner.run('ls -la .git/rr-cache/*/postimage', log: CmdRunner::LOG_CMD)
|
135
148
|
all_files = split_diff_lines(@cmd_runner.last_stdout)
|
136
149
|
|
137
150
|
all_files - different_files
|
@@ -237,14 +250,15 @@ module FlashFlow
|
|
237
250
|
|
238
251
|
def squash_commits
|
239
252
|
# There are three commits created by flash flow that we don't need in the message
|
240
|
-
run("log #{merge_remote}/#{merge_branch}..#{merge_branch}~3")
|
253
|
+
run("log #{merge_remote}/#{merge_branch}..#{merge_branch}~3", log: CmdRunner::LOG_CMD)
|
241
254
|
log = last_stdout
|
242
255
|
|
243
256
|
# Get all the files that differ between existing acceptance and new acceptance
|
244
257
|
run("diff --name-only #{merge_remote}/#{merge_branch} #{merge_branch}")
|
245
258
|
files = last_stdout.split("\n")
|
246
259
|
run("reset #{merge_remote}/#{merge_branch}")
|
247
|
-
|
260
|
+
|
261
|
+
run("add -f #{files.map { |f| "\"#{Shellwords.escape(f)}\"" }.join(" ")}")
|
248
262
|
|
249
263
|
run("commit -m '#{commit_message(log)}'")
|
250
264
|
end
|