summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDouwe Maan <douwe@selenight.nl>2016-09-27 13:29:56 +0200
committerDouwe Maan <douwe@selenight.nl>2016-09-27 13:29:56 +0200
commitedebd5e76395883213e40e10b7bfdc81d20d351b (patch)
treead7b2a591feac8b11b8818a33c3ac6b0d384a44b
parent04d9547c4893338f084b83f8c2c11c5405cb36df (diff)
parentda1fa1e14f86c1deabe047f61e6526e4870a07c5 (diff)
downloadgitlab-ce-edebd5e76395883213e40e10b7bfdc81d20d351b.tar.gz
Merge branch '22578-cycle-analytics-incorrect-commit-count'
-rw-r--r--CHANGELOG1
-rw-r--r--app/models/cycle_analytics/summary.rb28
-rw-r--r--spec/models/cycle_analytics/summary_spec.rb6
-rw-r--r--spec/support/cycle_analytics_helpers.rb26
4 files changed, 45 insertions, 16 deletions
diff --git a/CHANGELOG b/CHANGELOG
index b3650079e48..c3c9237d0c7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -9,6 +9,7 @@ v 8.12.2 (unreleased)
- Fix Import/Export not recognising correctly the imported services.
- Fix snippets pagination
- Fix List-Unsubscribe header in emails
+ - Fix an issue with the "Commits" section of the cycle analytics summary. !6513
v 8.12.1
- Fix a memory leak in HTML::Pipeline::SanitizationFilter::WHITELIST
diff --git a/app/models/cycle_analytics/summary.rb b/app/models/cycle_analytics/summary.rb
index 53b2cacb131..b46db449bf3 100644
--- a/app/models/cycle_analytics/summary.rb
+++ b/app/models/cycle_analytics/summary.rb
@@ -10,15 +10,33 @@ class CycleAnalytics
end
def commits
- repository = @project.repository.raw_repository
-
- if @project.default_branch
- repository.log(ref: @project.default_branch, after: @from).count
- end
+ ref = @project.default_branch.presence
+ count_commits_for(ref)
end
def deploys
@project.deployments.where("created_at > ?", @from).count
end
+
+ private
+
+ # Don't use the `Gitlab::Git::Repository#log` method, because it enforces
+ # a limit. Since we need a commit count, we _can't_ enforce a limit, so
+ # the easiest way forward is to replicate the relevant portions of the
+ # `log` function here.
+ def count_commits_for(ref)
+ return unless ref
+
+ repository = @project.repository.raw_repository
+ sha = @project.repository.commit(ref).sha
+
+ cmd = %W(git --git-dir=#{repository.path} log)
+ cmd << '--format=%H'
+ cmd << "--after=#{@from.iso8601}"
+ cmd << sha
+
+ raw_output = IO.popen(cmd) { |io| io.read }
+ raw_output.lines.count
+ end
end
end
diff --git a/spec/models/cycle_analytics/summary_spec.rb b/spec/models/cycle_analytics/summary_spec.rb
index 743bc2da33f..9d67bc82cba 100644
--- a/spec/models/cycle_analytics/summary_spec.rb
+++ b/spec/models/cycle_analytics/summary_spec.rb
@@ -34,6 +34,12 @@ describe CycleAnalytics::Summary, models: true do
expect(subject.commits).to eq(0)
end
+
+ it "finds a large (> 100) snumber of commits if present" do
+ Timecop.freeze(5.days.from_now) { create_commit("Test message", project, user, 'master', count: 100) }
+
+ expect(subject.commits).to eq(100)
+ end
end
describe "#deploys" do
diff --git a/spec/support/cycle_analytics_helpers.rb b/spec/support/cycle_analytics_helpers.rb
index e8e760a6187..62a5b46d47b 100644
--- a/spec/support/cycle_analytics_helpers.rb
+++ b/spec/support/cycle_analytics_helpers.rb
@@ -4,24 +4,28 @@ module CycleAnalyticsHelpers
create_commit("Commit for ##{issue.iid}", issue.project, user, branch_name)
end
- def create_commit(message, project, user, branch_name)
- filename = random_git_name
+ def create_commit(message, project, user, branch_name, count: 1)
oldrev = project.repository.commit(branch_name).sha
+ commit_shas = Array.new(count) do |index|
+ filename = random_git_name
- options = {
- committer: project.repository.user_to_committer(user),
- author: project.repository.user_to_committer(user),
- commit: { message: message, branch: branch_name, update_ref: true },
- file: { content: "content", path: filename, update: false }
- }
+ options = {
+ committer: project.repository.user_to_committer(user),
+ author: project.repository.user_to_committer(user),
+ commit: { message: message, branch: branch_name, update_ref: true },
+ file: { content: "content", path: filename, update: false }
+ }
+
+ commit_sha = Gitlab::Git::Blob.commit(project.repository, options)
+ project.repository.commit(commit_sha)
- commit_sha = Gitlab::Git::Blob.commit(project.repository, options)
- project.repository.commit(commit_sha)
+ commit_sha
+ end
GitPushService.new(project,
user,
oldrev: oldrev,
- newrev: commit_sha,
+ newrev: commit_shas.last,
ref: 'refs/heads/master').execute
end