Commit 9f6463d2 authored by Stan Hu's avatar Stan Hu

Merge branch 'find-commits-by-author' into 'master'

Return commits by author

See merge request gitlab-org/gitlab!25597
parents 6999eb9d 75c2e1a3
...@@ -64,10 +64,13 @@ class Projects::CommitsController < Projects::ApplicationController ...@@ -64,10 +64,13 @@ class Projects::CommitsController < Projects::ApplicationController
render_404 unless @path.empty? || request.format == :atom || @repository.blob_at(@commit.id, @path) || @repository.tree(@commit.id, @path).entries.present? render_404 unless @path.empty? || request.format == :atom || @repository.blob_at(@commit.id, @path) || @repository.tree(@commit.id, @path).entries.present?
@limit, @offset = (params[:limit] || 40).to_i, (params[:offset] || 0).to_i @limit, @offset = (params[:limit] || 40).to_i, (params[:offset] || 0).to_i
search = params[:search] search = params[:search]
author = params[:author]
@commits = @commits =
if search.present? if search.present?
@repository.find_commits_by_message(search, @ref, @path, @limit, @offset) @repository.find_commits_by_message(search, @ref, @path, @limit, @offset)
elsif author.present?
@repository.commits(@ref, author: author, path: @path, limit: @limit, offset: @offset)
else else
@repository.commits(@ref, path: @path, limit: @limit, offset: @offset) @repository.commits(@ref, path: @path, limit: @limit, offset: @offset)
end end
......
...@@ -139,6 +139,7 @@ class Repository ...@@ -139,6 +139,7 @@ class Repository
repo: raw_repository, repo: raw_repository,
ref: ref, ref: ref,
path: opts[:path], path: opts[:path],
author: opts[:author],
follow: Array(opts[:path]).length == 1, follow: Array(opts[:path]).length == 1,
limit: opts[:limit], limit: opts[:limit],
offset: opts[:offset], offset: opts[:offset],
......
---
title: Filter commits by author
merge_request: 25597
author:
type: added
...@@ -322,6 +322,7 @@ module Gitlab ...@@ -322,6 +322,7 @@ module Gitlab
limit: 10, limit: 10,
offset: 0, offset: 0,
path: nil, path: nil,
author: nil,
follow: false, follow: false,
skip_merges: false, skip_merges: false,
after: nil, after: nil,
......
...@@ -324,7 +324,8 @@ module Gitlab ...@@ -324,7 +324,8 @@ module Gitlab
request.after = GitalyClient.timestamp(options[:after]) if options[:after] request.after = GitalyClient.timestamp(options[:after]) if options[:after]
request.before = GitalyClient.timestamp(options[:before]) if options[:before] request.before = GitalyClient.timestamp(options[:before]) if options[:before]
request.revision = encode_binary(options[:ref]) if options[:ref] request.revision = encode_binary(options[:ref]) if options[:ref]
request.order = options[:order].upcase.sub('DEFAULT', 'NONE') if options[:order].present? request.author = encode_binary(options[:author]) if options[:author]
request.order = options[:order].upcase.sub('DEFAULT', 'NONE') if options[:order].present?
request.paths = encode_repeated(Array(options[:path])) if options[:path].present? request.paths = encode_repeated(Array(options[:path])) if options[:path].present?
......
...@@ -3,8 +3,8 @@ ...@@ -3,8 +3,8 @@
require 'spec_helper' require 'spec_helper'
describe 'Commits' do describe 'Commits' do
let(:project) { create(:project, :repository) } let_it_be(:project) { create(:project, :repository) }
let(:user) { create(:user) } let_it_be(:user) { create(:user) }
describe 'CI' do describe 'CI' do
before do before do
...@@ -183,4 +183,41 @@ describe 'Commits' do ...@@ -183,4 +183,41 @@ describe 'Commits' do
expect(find('.js-project-refs-dropdown')).to have_content branch_name expect(find('.js-project-refs-dropdown')).to have_content branch_name
end end
end end
context 'viewing commits for an author' do
let(:author_commit) { project.repository.commits(nil, limit: 1).first }
let(:commits) { project.repository.commits(nil, author: author, limit: 40) }
before do
project.add_maintainer(user)
sign_in(user)
visit project_commits_path(project, nil, author: author)
end
shared_examples 'show commits by author' do
it "includes the author's commits" do
commits.each do |commit|
expect(page).to have_content("#{author_commit.author_name} authored #{commit.authored_date.strftime("%b %d, %Y")}")
end
end
end
context 'author is complete' do
let(:author) { "#{author_commit.author_name} <#{author_commit.author_email}>" }
it_behaves_like 'show commits by author'
end
context 'author is just a name' do
let(:author) { "#{author_commit.author_name}" }
it_behaves_like 'show commits by author'
end
context 'author is just an email' do
let(:author) { "#{author_commit.author_email}" }
it_behaves_like 'show commits by author'
end
end
end end
...@@ -306,5 +306,19 @@ describe Gitlab::GitalyClient::CommitService do ...@@ -306,5 +306,19 @@ describe Gitlab::GitalyClient::CommitService do
client.find_commits(order: 'topo') client.find_commits(order: 'topo')
end end
it 'sends an RPC request with an author' do
request = Gitaly::FindCommitsRequest.new(
repository: repository_message,
disable_walk: true,
order: 'NONE',
author: "Billy Baggins <bilbo@shire.com>"
)
expect_any_instance_of(Gitaly::CommitService::Stub).to receive(:find_commits)
.with(request, kind_of(Hash)).and_return([])
client.find_commits(order: 'default', author: "Billy Baggins <bilbo@shire.com>")
end
end end
end end
...@@ -320,6 +320,21 @@ describe Repository do ...@@ -320,6 +320,21 @@ describe Repository do
end end
end end
context "when 'author' is set" do
it "returns commits from that author" do
commit = repository.commits(nil, limit: 1).first
known_author = "#{commit.author_name} <#{commit.author_email}>"
expect(repository.commits(nil, author: known_author, limit: 1)).not_to be_empty
end
it "doesn't returns commits from an unknown author" do
unknown_author = "The Man With No Name <zapp@brannigan.com>"
expect(repository.commits(nil, author: unknown_author, limit: 1)).to be_empty
end
end
context "when 'all' flag is set" do context "when 'all' flag is set" do
it 'returns every commit from the repository' do it 'returns every commit from the repository' do
expect(repository.commits(nil, all: true, limit: 60).size).to eq(60) expect(repository.commits(nil, all: true, limit: 60).size).to eq(60)
......
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