Class: Gitlab::BranchPushMergeCommitAnalyzer
- Inherits:
-
Object
- Object
- Gitlab::BranchPushMergeCommitAnalyzer
- Defined in:
- lib/gitlab/branch_push_merge_commit_analyzer.rb
Overview
Analyse a graph of commits from a push to a branch, for each commit, analyze that if it is the head of a merge request, then what should its merge_commit be, relative to the branch.
A—–>B—–>C—–>D target branch | ^ | | –>E—–>F– merged branch
| ^
| |
+->G--+
(See merge-commit-analyze-after branch in gitlab-test)
Assuming
-
A is already in remote
-
B~D are all in its own branch with its own merge request, targeting the target branch
When D is finally pushed to the target branch, what are the merge commits for all the other merge requests?
We can walk backwards from the HEAD commit D, and find status of its parents. First we determine if commit belongs to the target branch (i.e. A, B, C, D), and then determine its merge commit.
--------
—————–--------------
| Commit | Direct ancestor | Merge commit | --------
—————–--------------
| D | Y | D | --------
—————–--------------
| C | Y | C | --------
—————–--------------
| F | | C | --------
—————–--------------
| B | Y | B | --------
—————–--------------
| E | | C | --------
—————–--------------
| G | | C | --------
—————–--------------
By examining the result, it can be said that
-
If commit is direct ancestor of HEAD, its merge commit is itself.
-
Otherwise, the merge commit is the same as its child’s merge commit.
Defined Under Namespace
Classes: CommitDecorator
Instance Method Summary collapse
- #get_merge_commit(id) ⇒ Object
-
#initialize(commits, relevant_commit_ids: nil) ⇒ BranchPushMergeCommitAnalyzer
constructor
A new instance of BranchPushMergeCommitAnalyzer.
Constructor Details
#initialize(commits, relevant_commit_ids: nil) ⇒ BranchPushMergeCommitAnalyzer
Returns a new instance of BranchPushMergeCommitAnalyzer.
68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/gitlab/branch_push_merge_commit_analyzer.rb', line 68 def initialize(commits, relevant_commit_ids: nil) @commits = commits @id_to_commit = {} @commits.each do |commit| @id_to_commit[commit.id] = CommitDecorator.new(commit) if relevant_commit_ids relevant_commit_ids.delete(commit.id) break if relevant_commit_ids.empty? # Only limit the analyze up to relevant_commit_ids end end analyze end |
Instance Method Details
#get_merge_commit(id) ⇒ Object
83 84 85 |
# File 'lib/gitlab/branch_push_merge_commit_analyzer.rb', line 83 def get_merge_commit(id) get_commit(id).merge_commit.id end |