From 88b1e0ffcd27ab3d9ff9ce1fe5b493e3f6296b21 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Sep 2014 16:40:13 +0300 Subject: [PATCH 1/2] Faster branch contains detection for commit Signed-off-by: Dmitriy Zaporozhets --- app/controllers/projects/commit_controller.rb | 8 +------- app/models/repository.rb | 17 +++++++++++++++++ spec/models/repository_spec.rb | 15 +++++++++++++++ 3 files changed, 33 insertions(+), 7 deletions(-) create mode 100644 spec/models/repository_spec.rb diff --git a/app/controllers/projects/commit_controller.rb b/app/controllers/projects/commit_controller.rb index 34bd682bd9..66c67b661d 100644 --- a/app/controllers/projects/commit_controller.rb +++ b/app/controllers/projects/commit_controller.rb @@ -12,13 +12,7 @@ class Projects::CommitController < Projects::ApplicationController return git_not_found! unless @commit @line_notes = project.notes.for_commit_id(commit.id).inline - - @branches = begin - project.repository.branch_names_contains(commit.id) - rescue Grit::Git::GitTimeout - [] - end - + @branches = project.repository.branch_names_contains(commit.id) @diffs = @commit.diffs @note = project.build_commit_note(commit) @notes_count = project.notes.for_commit_id(commit.id).count diff --git a/app/models/repository.rb b/app/models/repository.rb index ea87ea88fd..4108c4ee96 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -284,4 +284,21 @@ class Repository blob_at(commit.parent_id, diff.old_path) end end + + def branch_names_contains(sha) + args = %W(git branch --contains #{sha}) + names = Gitlab::Popen.popen(args, path_to_repo).first + + if names.respond_to?(:split) + names = names.split("\n").map(&:strip) + + names.each do |name| + name.slice! '* ' + end + + names + else + [] + end + end end diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb new file mode 100644 index 0000000000..6a95b5b33c --- /dev/null +++ b/spec/models/repository_spec.rb @@ -0,0 +1,15 @@ +require 'spec_helper' + +describe Repository do + include RepoHelpers + + let(:repository) { create(:project).repository } + + describe :branch_names_contains do + subject { repository.branch_names_contains(sample_commit.id) } + + it { should include('master') } + it { should_not include('feature') } + it { should_not include('fix') } + end +end From 36d7e18f4a6ba94e503d49fa544744d5c47a766b Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 29 Sep 2014 16:45:16 +0300 Subject: [PATCH 2/2] Add specs for Repository#last_commit_for_path Signed-off-by: Dmitriy Zaporozhets --- spec/models/repository_spec.rb | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 6a95b5b33c..6c3e221f34 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -12,4 +12,10 @@ describe Repository do it { should_not include('feature') } it { should_not include('fix') } end + + describe :last_commit_for_path do + subject { repository.last_commit_for_path(sample_commit.id, '.gitignore').id } + + it { should eq('c1acaa58bbcbc3eafe538cb8274ba387047b69f8') } + end end