Commit 6eeb6384 authored by Clement Ho's avatar Clement Ho

Make commits behind text a link to the target branch commits page

parent 09193a4f
...@@ -92,13 +92,13 @@ export default { ...@@ -92,13 +92,13 @@ export default {
:class="{'label-truncated has-tooltip': isBranchTitleLong(mr.targetBranch)}" :class="{'label-truncated has-tooltip': isBranchTitleLong(mr.targetBranch)}"
:title="isBranchTitleLong(mr.targetBranch) ? mr.targetBranch : ''" :title="isBranchTitleLong(mr.targetBranch) ? mr.targetBranch : ''"
data-placement="bottom"> data-placement="bottom">
<a :href="mr.targetBranchPath">{{mr.targetBranch}}</a> <a :href="mr.targetBranchTreePath">{{mr.targetBranch}}</a>
</span> </span>
</strong> </strong>
<span <span
v-if="shouldShowCommitsBehindText" v-if="shouldShowCommitsBehindText"
class="diverged-commits-count"> class="diverged-commits-count">
({{mr.divergedCommitsCount}} {{commitsText}} behind) (<a :href="mr.targetBranchPath">{{mr.divergedCommitsCount}} {{commitsText}} behind</a>)
</span> </span>
</div> </div>
</div> </div>
......
...@@ -47,7 +47,8 @@ export default class MergeRequestStore { ...@@ -47,7 +47,8 @@ export default class MergeRequestStore {
this.sourceBranchPath = data.source_branch_path; this.sourceBranchPath = data.source_branch_path;
this.sourceBranchLink = data.source_branch_with_namespace_link; this.sourceBranchLink = data.source_branch_with_namespace_link;
this.mergeError = data.merge_error; this.mergeError = data.merge_error;
this.targetBranchPath = data.target_branch_tree_path; this.targetBranchPath = data.target_branch_commits_path;
this.targetBranchTreePath = data.target_branch_tree_path;
this.conflictResolutionPath = data.conflict_resolution_path; this.conflictResolutionPath = data.conflict_resolution_path;
this.cancelAutoMergePath = data.cancel_merge_when_pipeline_succeeds_path; this.cancelAutoMergePath = data.cancel_merge_when_pipeline_succeeds_path;
this.removeWIPPath = data.remove_wip_path; this.removeWIPPath = data.remove_wip_path;
......
...@@ -82,6 +82,12 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated ...@@ -82,6 +82,12 @@ class MergeRequestPresenter < Gitlab::View::Presenter::Delegated
end end
end end
def target_branch_commits_path
if target_branch_exists?
project_commits_path(project, target_branch)
end
end
def source_branch_path def source_branch_path
if source_branch_exists? if source_branch_exists?
project_branch_path(source_project, source_branch) project_branch_path(source_project, source_branch)
......
...@@ -93,6 +93,10 @@ class MergeRequestEntity < IssuableEntity ...@@ -93,6 +93,10 @@ class MergeRequestEntity < IssuableEntity
# Paths # Paths
# #
expose :target_branch_commits_path do |merge_request|
presenter(merge_request).target_branch_commits_path
end
expose :target_branch_tree_path do |merge_request| expose :target_branch_tree_path do |merge_request|
presenter(merge_request).target_branch_tree_path presenter(merge_request).target_branch_tree_path
end end
......
...@@ -74,6 +74,7 @@ ...@@ -74,6 +74,7 @@
}, },
"additionalProperties": false "additionalProperties": false
}, },
"target_branch_commits_path": { "type": "string" },
"target_branch_tree_path": { "type": "string" }, "target_branch_tree_path": { "type": "string" },
"source_branch_path": { "type": "string" }, "source_branch_path": { "type": "string" },
"conflict_resolution_path": { "type": ["string", "null"] }, "conflict_resolution_path": { "type": ["string", "null"] },
......
...@@ -54,6 +54,7 @@ describe('MRWidgetHeader', () => { ...@@ -54,6 +54,7 @@ describe('MRWidgetHeader', () => {
sourceBranch: 'mr-widget-refactor', sourceBranch: 'mr-widget-refactor',
sourceBranchLink: `<a href="${sourceBranchPath}">mr-widget-refactor</a>`, sourceBranchLink: `<a href="${sourceBranchPath}">mr-widget-refactor</a>`,
targetBranchPath: 'foo/bar/commits-path', targetBranchPath: 'foo/bar/commits-path',
targetBranchTreePath: 'foo/bar/tree/path',
targetBranch: 'master', targetBranch: 'master',
isOpen: true, isOpen: true,
emailPatchesPath: '/mr/email-patches', emailPatchesPath: '/mr/email-patches',
...@@ -69,12 +70,14 @@ describe('MRWidgetHeader', () => { ...@@ -69,12 +70,14 @@ describe('MRWidgetHeader', () => {
expect(el.classList.contains('mr-source-target')).toBeTruthy(); expect(el.classList.contains('mr-source-target')).toBeTruthy();
const sourceBranchLink = el.querySelectorAll('.label-branch')[0]; const sourceBranchLink = el.querySelectorAll('.label-branch')[0];
const targetBranchLink = el.querySelectorAll('.label-branch')[1]; const targetBranchLink = el.querySelectorAll('.label-branch')[1];
const commitsCount = el.querySelector('.diverged-commits-count');
expect(sourceBranchLink.textContent).toContain(mr.sourceBranch); expect(sourceBranchLink.textContent).toContain(mr.sourceBranch);
expect(targetBranchLink.textContent).toContain(mr.targetBranch); expect(targetBranchLink.textContent).toContain(mr.targetBranch);
expect(sourceBranchLink.querySelector('a').getAttribute('href')).toEqual(sourceBranchPath); expect(sourceBranchLink.querySelector('a').getAttribute('href')).toEqual(sourceBranchPath);
expect(targetBranchLink.querySelector('a').getAttribute('href')).toEqual(mr.targetBranchPath); expect(targetBranchLink.querySelector('a').getAttribute('href')).toEqual(mr.targetBranchTreePath);
expect(el.querySelector('.diverged-commits-count').textContent).toContain('12 commits behind'); expect(commitsCount.textContent).toContain('12 commits behind');
expect(commitsCount.querySelector('a').getAttribute('href')).toEqual(mr.targetBranchPath);
expect(el.textContent).toContain('Check out branch'); expect(el.textContent).toContain('Check out branch');
expect(el.querySelectorAll('.dropdown li a')[0].getAttribute('href')).toEqual(mr.emailPatchesPath); expect(el.querySelectorAll('.dropdown li a')[0].getAttribute('href')).toEqual(mr.emailPatchesPath);
......
...@@ -317,6 +317,30 @@ describe MergeRequestPresenter do ...@@ -317,6 +317,30 @@ describe MergeRequestPresenter do
end end
end end
describe '#target_branch_commits_path' do
subject do
described_class.new(resource, current_user: user)
.target_branch_commits_path
end
context 'when target branch exists' do
it 'returns path' do
allow(resource).to receive(:target_branch_exists?) { true }
is_expected
.to eq("/#{resource.target_project.full_path}/commits/#{resource.target_branch}")
end
end
context 'when target branch does not exists' do
it 'returns nil' do
allow(resource).to receive(:target_branch_exists?) { false }
is_expected.to be_nil
end
end
end
describe '#target_branch_tree_path' do describe '#target_branch_tree_path' do
subject do subject do
described_class.new(resource, current_user: user) described_class.new(resource, current_user: user)
......
...@@ -46,8 +46,8 @@ describe MergeRequestEntity do ...@@ -46,8 +46,8 @@ describe MergeRequestEntity do
:conflict_resolution_path, :conflict_resolution_path,
:cancel_merge_when_pipeline_succeeds_path, :cancel_merge_when_pipeline_succeeds_path,
:create_issue_to_resolve_discussions_path, :create_issue_to_resolve_discussions_path,
:source_branch_path, :target_branch_tree_path, :source_branch_path, :target_branch_commits_path,
:commits_count) :target_branch_tree_path, :commits_count)
end end
it 'has email_patches_path' do it 'has email_patches_path' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment