flash_flow 1.2.3 → 1.3.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 +4 -4
- data/Gemfile.lock +5 -5
- data/lib/flash_flow/data/branch.rb +4 -1
- data/lib/flash_flow/data/collection.rb +1 -0
- data/lib/flash_flow/data/github.rb +4 -3
- data/lib/flash_flow/deploy.rb +6 -2
- data/lib/flash_flow/issue_tracker/pivotal.rb +4 -3
- data/lib/flash_flow/merge_order.rb +27 -0
- data/lib/flash_flow/options.rb +1 -1
- data/lib/flash_flow/version.rb +1 -1
- data/test/lib/data/test_branch.rb +1 -0
- data/test/lib/issue_tracker/test_pivotal.rb +5 -0
- data/test/lib/test_deploy.rb +17 -0
- data/test/lib/test_merge_order.rb +72 -0
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 26e9411883c55d49e496359a23debe7ce7cad73c
|
4
|
+
data.tar.gz: c08cd64b3c192f4073802a5b1254e5f821ee2d79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1dfe5cb15b0e924fac257397528ef2b4b6dcc00ae213abf1b909445f4059e2407056778d6f30e199dfc10711fc62ec72e766f937f869f3c0750dd46958e5c657
|
7
|
+
data.tar.gz: 45e2f8c31f6900c51f84e9c9d74bf1662c43ef74fc4f91c64f1f267c6f9ba41c2eb5e6cdb687aab711bd701f316118622e6568cafae13ea14cb88d93246a87b5
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
flash_flow (1.
|
4
|
+
flash_flow (1.3.0)
|
5
5
|
hipchat (~> 1.5)
|
6
6
|
octokit (~> 4.1)
|
7
7
|
pivotal-tracker (~> 0.5)
|
@@ -33,16 +33,16 @@ GEM
|
|
33
33
|
json (~> 1.8)
|
34
34
|
multi_xml (>= 0.5.2)
|
35
35
|
json (1.8.3)
|
36
|
-
mime-types (2.
|
36
|
+
mime-types (2.99)
|
37
37
|
mimemagic (0.3.0)
|
38
|
-
|
38
|
+
mini_portile2 (2.0.0)
|
39
39
|
minitest (5.3.5)
|
40
40
|
minitest-stub_any_instance (1.0.1)
|
41
41
|
multi_xml (0.5.5)
|
42
42
|
multipart-post (2.0.0)
|
43
43
|
netrc (0.11.0)
|
44
|
-
nokogiri (1.6.
|
45
|
-
|
44
|
+
nokogiri (1.6.7.2)
|
45
|
+
mini_portile2 (~> 2.0.0.rc2)
|
46
46
|
nokogiri-happymapper (0.5.9)
|
47
47
|
nokogiri (~> 1.5)
|
48
48
|
octokit (4.1.1)
|
@@ -5,7 +5,7 @@ module FlashFlow
|
|
5
5
|
|
6
6
|
class Branch
|
7
7
|
attr_accessor :remote, :remote_url, :ref, :sha, :status, :resolutions, :stories, :conflict_sha, :metadata,
|
8
|
-
:current_record, :updated_at, :created_at
|
8
|
+
:current_record, :merge_order, :updated_at, :created_at
|
9
9
|
|
10
10
|
def initialize(_remote, _remote_url, _ref)
|
11
11
|
@remote = _remote
|
@@ -21,6 +21,7 @@ module FlashFlow
|
|
21
21
|
branch = new(hash['remote'], hash['remote_url'], hash['ref'])
|
22
22
|
branch.sha = hash['sha']
|
23
23
|
branch.status = hash['status']
|
24
|
+
branch.merge_order = hash['merge_order']
|
24
25
|
branch.resolutions = hash['resolutions']
|
25
26
|
branch.stories = hash['stories']
|
26
27
|
branch.metadata = hash['metadata']
|
@@ -52,6 +53,7 @@ module FlashFlow
|
|
52
53
|
'ref' => ref,
|
53
54
|
'sha' => sha,
|
54
55
|
'status' => status,
|
56
|
+
'merge_order' => merge_order,
|
55
57
|
'resolutions' => resolutions,
|
56
58
|
'stories' => stories,
|
57
59
|
'conflict_sha' => conflict_sha,
|
@@ -70,6 +72,7 @@ module FlashFlow
|
|
70
72
|
unless other.nil?
|
71
73
|
self.sha = other.sha
|
72
74
|
self.status = other.status
|
75
|
+
self.merge_order = other.merge_order
|
73
76
|
self.resolutions = other.resolutions
|
74
77
|
self.stories = self.stories.to_a | other.stories.to_a
|
75
78
|
self.updated_at = Time.now
|
@@ -65,6 +65,7 @@ module FlashFlow
|
|
65
65
|
branch.created_at = info.created_at
|
66
66
|
branch.resolutions = info.resolutions.to_h.merge(branch.resolutions.to_h)
|
67
67
|
branch.stories = info.stories.to_a | merged_branches[full_ref].stories.to_a
|
68
|
+
branch.merge_order ||= info.merge_order
|
68
69
|
if branch.fail?
|
69
70
|
branch.conflict_sha ||= info.conflict_sha
|
70
71
|
end
|
@@ -38,7 +38,8 @@ module FlashFlow
|
|
38
38
|
'remote_url' => pr.head.repo.ssh_url,
|
39
39
|
'ref' => pr.head.ref,
|
40
40
|
'status' => status_from_labels(pr),
|
41
|
-
'metadata' => metadata(pr)
|
41
|
+
'metadata' => metadata(pr),
|
42
|
+
'sha' => pr.head.sha
|
42
43
|
)
|
43
44
|
end
|
44
45
|
end
|
@@ -98,7 +99,7 @@ module FlashFlow
|
|
98
99
|
end
|
99
100
|
|
100
101
|
def pull_requests
|
101
|
-
@pull_requests ||= octokit.pull_requests(repo).sort_by(&:
|
102
|
+
@pull_requests ||= octokit.pull_requests(repo).sort_by(&:created_at)
|
102
103
|
end
|
103
104
|
|
104
105
|
def remove_label(pull_request_number, label)
|
@@ -136,4 +137,4 @@ module FlashFlow
|
|
136
137
|
end
|
137
138
|
end
|
138
139
|
end
|
139
|
-
end
|
140
|
+
end
|
data/lib/flash_flow/deploy.rb
CHANGED
@@ -5,6 +5,7 @@ require 'flash_flow/data'
|
|
5
5
|
require 'flash_flow/lock'
|
6
6
|
require 'flash_flow/notifier'
|
7
7
|
require 'flash_flow/branch_merger'
|
8
|
+
require 'flash_flow/merge_order'
|
8
9
|
require 'flash_flow/shadow_repo'
|
9
10
|
|
10
11
|
module FlashFlow
|
@@ -104,7 +105,10 @@ module FlashFlow
|
|
104
105
|
end
|
105
106
|
|
106
107
|
def merge_branches
|
107
|
-
@data.mergeable.
|
108
|
+
ordered_branches = MergeOrder.new(@git, @data.merged_branches.mergeable).get_order
|
109
|
+
ordered_branches.each_with_index do |branch, index|
|
110
|
+
branch.merge_order = index + 1
|
111
|
+
|
108
112
|
remote = @git.fetch_remote_for_url(branch.remote_url)
|
109
113
|
if remote.nil?
|
110
114
|
raise RuntimeError.new("No remote found for #{branch.remote_url}. Please run 'git remote add *your_remote_name* #{branch.remote_url}' and try again.")
|
@@ -182,7 +186,7 @@ module FlashFlow
|
|
182
186
|
Flash Flow run from branch: #{@local_git.working_branch}
|
183
187
|
|
184
188
|
Merged branches:
|
185
|
-
#{@data.successes.empty? ? 'None' : @data.successes.map(&:ref).join("\n")}
|
189
|
+
#{@data.successes.empty? ? 'None' : @data.successes.sort_by(&:merge_order).map(&:ref).join("\n")}
|
186
190
|
|
187
191
|
Failed branches:
|
188
192
|
#{@data.failures.empty? ? 'None' : @data.failures.map(&:ref).join("\n")}
|
@@ -32,7 +32,8 @@ module FlashFlow
|
|
32
32
|
deliver(story_id)
|
33
33
|
end
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
|
+
removed_and_failed_branches.each do |branch|
|
36
37
|
branch.stories.to_a.each do |story_id|
|
37
38
|
undeliver(story_id)
|
38
39
|
end
|
@@ -188,8 +189,8 @@ module FlashFlow
|
|
188
189
|
@branches.select { |b| b.success? }
|
189
190
|
end
|
190
191
|
|
191
|
-
def
|
192
|
-
@branches.select { |b| b.removed? }
|
192
|
+
def removed_and_failed_branches
|
193
|
+
@branches.select { |b| b.removed? || b.fail? }
|
193
194
|
end
|
194
195
|
|
195
196
|
def merged_working_branch
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module FlashFlow
|
2
|
+
class MergeOrder
|
3
|
+
|
4
|
+
def initialize(git, branches)
|
5
|
+
@git = git
|
6
|
+
@branches = branches
|
7
|
+
end
|
8
|
+
|
9
|
+
def get_order
|
10
|
+
branches = @branches.sort_by(&:merge_order)
|
11
|
+
|
12
|
+
unchanged, changed = branches.partition { |branch| current_sha(branch) == branch.sha }
|
13
|
+
my_branch_index = changed.find_index { |branch| branch.ref == @git.working_branch }
|
14
|
+
my_branch_changed = my_branch_index ? changed.delete_at(my_branch_index) : nil
|
15
|
+
|
16
|
+
[unchanged, changed, my_branch_changed].flatten.compact
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def current_sha(branch)
|
22
|
+
@git.run("rev-parse #{branch.remote}/#{branch.ref}")
|
23
|
+
@git.last_stdout.strip if @git.last_success?
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
data/lib/flash_flow/options.rb
CHANGED
@@ -21,7 +21,7 @@ module FlashFlow
|
|
21
21
|
opts.on('-c', '--config-file FILE_PATH', 'The path to your config file. Defaults to config/flash_flow.yml.erb') { |v| options[:config_file] = v }
|
22
22
|
opts.on('--resolve', 'Launch a bash shell to save your conflict resolutions') { |v| options[:resolve] = true }
|
23
23
|
opts.on('--resolve-manual', 'Print instructions to use git to resolve conflicts') { |v| options[:resolve_manual] = true }
|
24
|
-
opts.on('--merge-status', '
|
24
|
+
opts.on('--merge-status', 'Show status of all branches and their stories and exit') { |v| options[:merge_status] = true }
|
25
25
|
|
26
26
|
opts.on_tail("-h", "--help", "Show this message") do
|
27
27
|
puts opts
|
data/lib/flash_flow/version.rb
CHANGED
@@ -28,6 +28,7 @@ module FlashFlow
|
|
28
28
|
stub_tracker_gem(@project_mock) do
|
29
29
|
mock_find(nil, '111')
|
30
30
|
mock_find(nil, '222')
|
31
|
+
mock_find(nil, '333')
|
31
32
|
mock_find(nil, '555')
|
32
33
|
|
33
34
|
Pivotal.new(sample_branches, nil).stories_delivered
|
@@ -46,11 +47,15 @@ module FlashFlow
|
|
46
47
|
.expect(:id, '222')
|
47
48
|
.expect(:current_state, 'delivered')
|
48
49
|
story3_mock = MiniTest::Mock.new
|
50
|
+
.expect(:id, '333')
|
51
|
+
.expect(:current_state, 'fail')
|
52
|
+
story4_mock = MiniTest::Mock.new
|
49
53
|
.expect(:id, '555')
|
50
54
|
.expect(:current_state, 'removed')
|
51
55
|
mock_find(story1_mock)
|
52
56
|
mock_find(story2_mock)
|
53
57
|
mock_find(story3_mock)
|
58
|
+
mock_find(story4_mock)
|
54
59
|
|
55
60
|
Pivotal.new(sample_branches, nil).stories_delivered
|
56
61
|
story1_mock.verify
|
data/test/lib/test_deploy.rb
CHANGED
@@ -141,6 +141,18 @@ module FlashFlow
|
|
141
141
|
end
|
142
142
|
end
|
143
143
|
|
144
|
+
def test_commit_message_ordering
|
145
|
+
data
|
146
|
+
.expect(:successes, ['data_successes'])
|
147
|
+
.expect(:successes, sample_branches)
|
148
|
+
.expect(:failures, [])
|
149
|
+
.expect(:removals, [])
|
150
|
+
|
151
|
+
expected_message = sample_branches.sort_by(&:merge_order).map(&:ref).join("\n")
|
152
|
+
assert_output(/#{expected_message}/) { print @deploy.commit_message }
|
153
|
+
data.verify
|
154
|
+
end
|
155
|
+
|
144
156
|
private
|
145
157
|
|
146
158
|
def with_versions(current, written)
|
@@ -172,5 +184,10 @@ module FlashFlow
|
|
172
184
|
@deploy.instance_variable_set('@data'.to_sym, @data)
|
173
185
|
end
|
174
186
|
|
187
|
+
def sample_branches
|
188
|
+
@sample_branches ||= [Data::Branch.from_hash({'ref' => 'branch3', 'merge_order' => 2}),
|
189
|
+
Data::Branch.from_hash({'ref' => 'branch1', 'merge_order' => 3}),
|
190
|
+
Data::Branch.from_hash({'ref' => 'branch2', 'merge_order' => 1})]
|
191
|
+
end
|
175
192
|
end
|
176
193
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'minitest_helper'
|
2
|
+
require 'minitest/stub_any_instance'
|
3
|
+
|
4
|
+
module FlashFlow
|
5
|
+
class TestMergeOrder < Minitest::Test
|
6
|
+
|
7
|
+
def setup
|
8
|
+
@git = Minitest::Mock.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_get_order_unchanged_shas_get_ordered_as_previous
|
12
|
+
mock_working_branch(sample_branches[2])
|
13
|
+
mock_current_sha(sample_branches[1], sample_branches[1].sha)
|
14
|
+
mock_current_sha(sample_branches[0], sample_branches[0].sha)
|
15
|
+
mock_current_sha(sample_branches[2], sample_branches[2].sha)
|
16
|
+
|
17
|
+
ordered_branches = MergeOrder.new(@git, mergeable_order(1,0,2)).get_order
|
18
|
+
assert_equal(ordered_branches.map(&:sha), mergeable_order(1,0,2).map(&:sha))
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_get_order_changed_working_branch_is_always_last
|
22
|
+
mock_working_branch(sample_branches[0])
|
23
|
+
mock_current_sha(sample_branches[1], sample_branches[1].sha)
|
24
|
+
mock_current_sha(sample_branches[0], sample_branches[0].sha)
|
25
|
+
mock_current_sha(sample_branches[2], sample_branches[2].sha)
|
26
|
+
|
27
|
+
sample_branches[0].sha = 'sha0-1'
|
28
|
+
|
29
|
+
ordered_branches = MergeOrder.new(@git, mergeable_order(1,0,2)).get_order
|
30
|
+
assert_equal(ordered_branches.map(&:sha), mergeable_order(1,2,0).map(&:sha))
|
31
|
+
end
|
32
|
+
#
|
33
|
+
def test_get_order_changed_shas_are_between_unchanged_shas_and_changed_working_branch
|
34
|
+
mock_working_branch(sample_branches[1])
|
35
|
+
mock_current_sha(sample_branches[2], sample_branches[2].sha)
|
36
|
+
mock_current_sha(sample_branches[1], sample_branches[1].sha)
|
37
|
+
mock_current_sha(sample_branches[0], sample_branches[0].sha)
|
38
|
+
|
39
|
+
sample_branches[1].sha = 'sha0-1'
|
40
|
+
sample_branches[2].sha = 'sha2-1'
|
41
|
+
|
42
|
+
ordered_branches = MergeOrder.new(@git, mergeable_order(2,1,0)).get_order
|
43
|
+
assert_equal(ordered_branches.map(&:sha), mergeable_order(0,2,1).map(&:sha))
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def mock_current_sha(branch, sha)
|
49
|
+
@git.expect(:run, sha, ["rev-parse #{branch.remote}/#{branch.ref}"])
|
50
|
+
.expect(:last_success?, true)
|
51
|
+
.expect(:last_stdout, sha)
|
52
|
+
end
|
53
|
+
|
54
|
+
def mock_working_branch(branch)
|
55
|
+
sample_branches.count.times { @git.expect(:working_branch, branch.ref) }
|
56
|
+
end
|
57
|
+
|
58
|
+
def sample_branches
|
59
|
+
@sample_branches ||= [Data::Branch.from_hash({'ref' => 'branch0', 'remote' => 'origin', 'sha' => 'sha0', 'merge_order' => 1}),
|
60
|
+
Data::Branch.from_hash({'ref' => 'branch1', 'remote' => 'origin', 'sha' => 'sha1', 'merge_order' => 2}),
|
61
|
+
Data::Branch.from_hash({'ref' => 'branch2', 'remote' => 'origin', 'sha' => 'sha2', 'merge_order' => 3})]
|
62
|
+
end
|
63
|
+
|
64
|
+
def mergeable_order(*order)
|
65
|
+
order.map.with_index do |nth, merge_order|
|
66
|
+
sample_branches[nth].merge_order = merge_order
|
67
|
+
sample_branches[nth]
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flash_flow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Flashfunders
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: octokit
|
@@ -176,6 +176,7 @@ files:
|
|
176
176
|
- lib/flash_flow/merge_master/merge_status.html.erb
|
177
177
|
- lib/flash_flow/merge_master/release_graph.rb
|
178
178
|
- lib/flash_flow/merge_master/status.rb
|
179
|
+
- lib/flash_flow/merge_order.rb
|
179
180
|
- lib/flash_flow/notifier.rb
|
180
181
|
- lib/flash_flow/notifier/hipchat.rb
|
181
182
|
- lib/flash_flow/options.rb
|
@@ -198,6 +199,7 @@ files:
|
|
198
199
|
- test/lib/test_deploy.rb
|
199
200
|
- test/lib/test_git.rb
|
200
201
|
- test/lib/test_issue_tracker.rb
|
202
|
+
- test/lib/test_merge_order.rb
|
201
203
|
- test/lib/test_notifier.rb
|
202
204
|
- test/lib/test_resolve.rb
|
203
205
|
- test/minitest_helper.rb
|
@@ -241,6 +243,7 @@ test_files:
|
|
241
243
|
- test/lib/test_deploy.rb
|
242
244
|
- test/lib/test_git.rb
|
243
245
|
- test/lib/test_issue_tracker.rb
|
246
|
+
- test/lib/test_merge_order.rb
|
244
247
|
- test/lib/test_notifier.rb
|
245
248
|
- test/lib/test_resolve.rb
|
246
249
|
- test/minitest_helper.rb
|