|
1 | 1 | module CommitsRunner |
2 | | - def self.run(trigger_source, commits, repo, pattern = '') |
| 2 | + def self.run(trigger_source, commits, repo, pattern = '', smart: false) |
3 | 3 | formatted_commits = |
4 | 4 | if trigger_source == :webhook |
5 | 5 | format_webhook(commits, repo) |
6 | 6 | elsif trigger_source == :api |
7 | 7 | format_api(commits, repo) |
8 | 8 | end |
9 | 9 |
|
| 10 | + formatted_commits = smart_reorder(formatted_commits) if smart |
10 | 11 | formatted_commits.select { |commit| valid?(commit) } |
11 | 12 | .each { |commit| create_and_run(commit, pattern) } |
12 | 13 | .count |
@@ -59,4 +60,32 @@ def self.create_and_run(commit, pattern) |
59 | 60 | include_patterns: pattern |
60 | 61 | ) |
61 | 62 | end |
| 63 | + |
| 64 | + def self.smart_reorder(commits) |
| 65 | + return commits if commits.size < 3 |
| 66 | + |
| 67 | + reordered = [] |
| 68 | + reordered << commits.first |
| 69 | + reordered << commits[commits.size / 2] |
| 70 | + reordered << commits.last |
| 71 | + |
| 72 | + depth = 1 |
| 73 | + while (reorder_recursive(commits, 1, commits.size - 1, depth, reordered)) |
| 74 | + depth += 1 |
| 75 | + end |
| 76 | + reordered |
| 77 | + end |
| 78 | + |
| 79 | + def self.reorder_recursive(commits, first, last, depth, reordered) |
| 80 | + return false if last <= first |
| 81 | + mid = first + (last - first) / 2 |
| 82 | + if (depth == 0) |
| 83 | + reordered << commits[mid] |
| 84 | + true |
| 85 | + else |
| 86 | + half1 = reorder_recursive(commits, first, mid, depth - 1, reordered) |
| 87 | + half2 = reorder_recursive(commits, mid + 1, last, depth - 1, reordered) |
| 88 | + half1 || half2 |
| 89 | + end |
| 90 | + end |
62 | 91 | end |
0 commit comments