From 25a868753b4b9e673af31f7f4f58f9e97811e9d9 Mon Sep 17 00:00:00 2001 From: Stan Hu Date: Tue, 2 Jan 2018 22:52:30 -0800 Subject: [PATCH] Speed up generation of commit stats by using Rugged native methods The previous implementation iterated across the entire patch set to determine the number of lines added, deleted, and changed. Rugged has a native method `Rugged::Diff#stat` that does this already, which appears to be a little faster and require less RAM than doing this ourselves. Improves performance in #41524 --- changelogs/unreleased/sh-optimize-commit-stats.yml | 5 +++++ lib/gitlab/git/commit_stats.rb | 9 ++------- spec/lib/gitlab/git/commit_spec.rb | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) create mode 100644 changelogs/unreleased/sh-optimize-commit-stats.yml diff --git a/changelogs/unreleased/sh-optimize-commit-stats.yml b/changelogs/unreleased/sh-optimize-commit-stats.yml new file mode 100644 index 00000000000..8c1be1252fb --- /dev/null +++ b/changelogs/unreleased/sh-optimize-commit-stats.yml @@ -0,0 +1,5 @@ +--- +title: Speed up generation of commit stats by using Rugged native methods +merge_request: +author: +type: performance diff --git a/lib/gitlab/git/commit_stats.rb b/lib/gitlab/git/commit_stats.rb index 6bf49a0af18..8463b1eb794 100644 --- a/lib/gitlab/git/commit_stats.rb +++ b/lib/gitlab/git/commit_stats.rb @@ -34,13 +34,8 @@ module Gitlab def rugged_stats(commit) diff = commit.rugged_diff_from_parent - - diff.each_patch do |p| - # TODO: Use the new Rugged convenience methods when they're released - @additions += p.stat[0] - @deletions += p.stat[1] - @total += p.changes - end + _files_changed, @additions, @deletions = diff.stat + @total = @additions + @deletions end end end diff --git a/spec/lib/gitlab/git/commit_spec.rb b/spec/lib/gitlab/git/commit_spec.rb index 5ed639543e0..6d35734d306 100644 --- a/spec/lib/gitlab/git/commit_spec.rb +++ b/spec/lib/gitlab/git/commit_spec.rb @@ -428,6 +428,11 @@ describe Gitlab::Git::Commit, seed_helper: true do subject { super().deletions } it { is_expected.to eq(6) } end + + describe '#total' do + subject { super().total } + it { is_expected.to eq(17) } + end end describe '#stats with gitaly on' do