Skip to content

Commit

Permalink
Merge branch 'merge-request-closes-issues-performance' into 'master'
Browse files Browse the repository at this point in the history
Optimize fetching issues closed by a merge request

Related issue: #12419

See merge request !2625
  • Loading branch information
rspeicher committed Feb 1, 2016
2 parents c3df208 + 99492d6 commit f805231
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 19 deletions.
1 change: 1 addition & 0 deletions CHANGELOG
Expand Up @@ -16,6 +16,7 @@ v 8.5.0 (unreleased)
- Track project import failure
- Fix visibility level text in admin area (Zeger-Jan van de Weg)
- Update the ExternalIssue regex pattern (Blake Hitchcock)
- Optimized performance of finding issues to be closed by a merge request
- Revert "Add IP check against DNSBLs at account sign-up"
- Deprecate API "merge_request/:merge_request_id/comments". Use "merge_requests/:merge_request_id/notes" instead
- Deprecate API "merge_request/:merge_request_id/...". Use "merge_requests/:merge_request_id/..." instead
Expand Down
8 changes: 4 additions & 4 deletions app/models/merge_request.rb
Expand Up @@ -346,10 +346,10 @@ def closes_issue?(issue)
# Return the set of issues that will be closed if this merge request is accepted.
def closes_issues(current_user = self.author)
if target_branch == project.default_branch
issues = commits.flat_map { |c| c.closes_issues(current_user) }
issues.push(*Gitlab::ClosingIssueExtractor.new(project, current_user).
closed_by_message(description))
issues.uniq(&:id)
messages = commits.map(&:safe_message) << description

Gitlab::ClosingIssueExtractor.new(project, current_user).
closed_by_message(messages.join("\n"))
else
[]
end
Expand Down
22 changes: 7 additions & 15 deletions spec/models/merge_request_spec.rb
Expand Up @@ -137,9 +137,10 @@
describe 'detection of issues to be closed' do
let(:issue0) { create :issue, project: subject.project }
let(:issue1) { create :issue, project: subject.project }
let(:commit0) { double('commit0', closes_issues: [issue0]) }
let(:commit1) { double('commit1', closes_issues: [issue0]) }
let(:commit2) { double('commit2', closes_issues: [issue1]) }

let(:commit0) { double('commit0', safe_message: "Fixes #{issue0.to_reference}") }
let(:commit1) { double('commit1', safe_message: "Fixes #{issue0.to_reference}") }
let(:commit2) { double('commit2', safe_message: "Fixes #{issue1.to_reference}") }

before do
allow(subject).to receive(:commits).and_return([commit0, commit1, commit2])
Expand All @@ -149,7 +150,9 @@
allow(subject.project).to receive(:default_branch).
and_return(subject.target_branch)

expect(subject.closes_issues).to eq([issue0, issue1].sort_by(&:id))
closed = subject.closes_issues

expect(closed).to include(issue0, issue1)
end

it 'only lists issues as to be closed if it targets the default branch' do
Expand All @@ -167,17 +170,6 @@

expect(subject.closes_issues).to include(issue2)
end

context 'for a project with JIRA integration' do
let(:issue0) { JiraIssue.new('JIRA-123', subject.project) }
let(:issue1) { JiraIssue.new('FOOBAR-4567', subject.project) }

it 'returns sorted JiraIssues' do
allow(subject.project).to receive_messages(default_branch: subject.target_branch)

expect(subject.closes_issues).to eq([issue0, issue1])
end
end
end

describe "#work_in_progress?" do
Expand Down

0 comments on commit f805231

Please sign in to comment.