Commit 80eca67f authored by Nick Thomas's avatar Nick Thomas

Merge branch 'add-first-parent-to-find-commits' into 'master'

Add first_parent to find_commits

See merge request gitlab-org/gitlab!16822
parents ceb53d89 341a4ac8
...@@ -446,7 +446,7 @@ group :ed25519 do ...@@ -446,7 +446,7 @@ group :ed25519 do
end end
# Gitaly GRPC protocol definitions # Gitaly GRPC protocol definitions
gem 'gitaly', '~> 1.58.0' gem 'gitaly', '~> 1.65.0'
gem 'grpc', '~> 1.19.0' gem 'grpc', '~> 1.19.0'
......
...@@ -358,7 +358,7 @@ GEM ...@@ -358,7 +358,7 @@ GEM
po_to_json (>= 1.0.0) po_to_json (>= 1.0.0)
rails (>= 3.2.0) rails (>= 3.2.0)
git (1.5.0) git (1.5.0)
gitaly (1.58.0) gitaly (1.65.0)
grpc (~> 1.0) grpc (~> 1.0)
github-markup (1.7.0) github-markup (1.7.0)
gitlab-labkit (0.5.2) gitlab-labkit (0.5.2)
...@@ -1168,7 +1168,7 @@ DEPENDENCIES ...@@ -1168,7 +1168,7 @@ DEPENDENCIES
gettext (~> 3.2.2) gettext (~> 3.2.2)
gettext_i18n_rails (~> 1.8.0) gettext_i18n_rails (~> 1.8.0)
gettext_i18n_rails_js (~> 1.3) gettext_i18n_rails_js (~> 1.3)
gitaly (~> 1.58.0) gitaly (~> 1.65.0)
github-markup (~> 1.7.0) github-markup (~> 1.7.0)
gitlab-labkit (~> 0.5) gitlab-labkit (~> 0.5)
gitlab-license (~> 1.0) gitlab-license (~> 1.0)
......
...@@ -133,18 +133,28 @@ class Repository ...@@ -133,18 +133,28 @@ class Repository
end end
end end
def commits(ref = nil, path: nil, limit: nil, offset: nil, skip_merges: false, after: nil, before: nil, all: nil) # the opts are:
# - :path
# - :limit
# - :offset
# - :skip_merges
# - :after
# - :before
# - :all
# - :first_parent
def commits(ref = nil, opts = {})
options = { options = {
repo: raw_repository, repo: raw_repository,
ref: ref, ref: ref,
path: path, path: opts[:path],
limit: limit, follow: Array(opts[:path]).length == 1,
offset: offset, limit: opts[:limit],
after: after, offset: opts[:offset],
before: before, skip_merges: !!opts[:skip_merges],
follow: Array(path).length == 1, after: opts[:after],
skip_merges: skip_merges, before: opts[:before],
all: all all: !!opts[:all],
first_parent: !!opts[:first_parent]
} }
commits = Gitlab::Git::Commit.where(options) commits = Gitlab::Git::Commit.where(options)
......
---
title: Add first_parent option to list commits api
merge_request: 32410
author: jhenkens
type: added
...@@ -11,12 +11,13 @@ GET /projects/:id/repository/commits ...@@ -11,12 +11,13 @@ GET /projects/:id/repository/commits
| Attribute | Type | Required | Description | | Attribute | Type | Required | Description |
| --------- | ---- | -------- | ----------- | | --------- | ---- | -------- | ----------- |
| `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user | `id` | integer/string | yes | The ID or [URL-encoded path of the project](README.md#namespaced-path-encoding) owned by the authenticated user
| `ref_name` | string | no | The name of a repository branch or tag or if not given the default branch | | `ref_name` | string | no | The name of a repository branch, tag or revision range, or if not given the default branch |
| `since` | string | no | Only commits after or on this date will be returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ | | `since` | string | no | Only commits after or on this date will be returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ |
| `until` | string | no | Only commits before or on this date will be returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ | | `until` | string | no | Only commits before or on this date will be returned in ISO 8601 format YYYY-MM-DDTHH:MM:SSZ |
| `path` | string | no | The file path | | `path` | string | no | The file path |
| `all` | boolean | no | Retrieve every commit from the repository | | `all` | boolean | no | Retrieve every commit from the repository |
| `with_stats` | boolean | no | Stats about each commit will be added to the response | | `with_stats` | boolean | no | Stats about each commit will be added to the response |
| `first_parent` | boolean | no | Follow only the first parent commit upon seeing a merge commit |
```bash ```bash
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/repository/commits" curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/repository/commits"
......
...@@ -37,6 +37,7 @@ module API ...@@ -37,6 +37,7 @@ module API
optional :path, type: String, desc: 'The file path' optional :path, type: String, desc: 'The file path'
optional :all, type: Boolean, desc: 'Every commit will be returned' optional :all, type: Boolean, desc: 'Every commit will be returned'
optional :with_stats, type: Boolean, desc: 'Stats about each commit will be added to the response' optional :with_stats, type: Boolean, desc: 'Stats about each commit will be added to the response'
optional :first_parent, type: Boolean, desc: 'Only include the first parent of merges'
use :pagination use :pagination
end end
get ':id/repository/commits' do get ':id/repository/commits' do
...@@ -47,6 +48,7 @@ module API ...@@ -47,6 +48,7 @@ module API
offset = (params[:page] - 1) * params[:per_page] offset = (params[:page] - 1) * params[:per_page]
all = params[:all] all = params[:all]
with_stats = params[:with_stats] with_stats = params[:with_stats]
first_parent = params[:first_parent]
commits = user_project.repository.commits(ref, commits = user_project.repository.commits(ref,
path: path, path: path,
...@@ -54,11 +56,12 @@ module API ...@@ -54,11 +56,12 @@ module API
offset: offset, offset: offset,
before: before, before: before,
after: after, after: after,
all: all) all: all,
first_parent: first_parent)
commit_count = commit_count =
if all || path || before || after if all || path || before || after || first_parent
user_project.repository.count_commits(ref: ref, path: path, before: before, after: after, all: all) user_project.repository.count_commits(ref: ref, path: path, before: before, after: after, all: all, first_parent: first_parent)
else else
# Cacheable commit count. # Cacheable commit count.
user_project.repository.commit_count_for_ref(ref) user_project.repository.commit_count_for_ref(ref)
......
...@@ -140,7 +140,8 @@ module Gitlab ...@@ -140,7 +140,8 @@ module Gitlab
request = Gitaly::CountCommitsRequest.new( request = Gitaly::CountCommitsRequest.new(
repository: @gitaly_repo, repository: @gitaly_repo,
revision: encode_binary(ref), revision: encode_binary(ref),
all: !!options[:all] all: !!options[:all],
first_parent: !!options[:first_parent]
) )
request.after = Google::Protobuf::Timestamp.new(seconds: options[:after].to_i) if options[:after].present? request.after = Google::Protobuf::Timestamp.new(seconds: options[:after].to_i) if options[:after].present?
request.before = Google::Protobuf::Timestamp.new(seconds: options[:before].to_i) if options[:before].present? request.before = Google::Protobuf::Timestamp.new(seconds: options[:before].to_i) if options[:before].present?
...@@ -325,6 +326,7 @@ module Gitlab ...@@ -325,6 +326,7 @@ module Gitlab
follow: options[:follow], follow: options[:follow],
skip_merges: options[:skip_merges], skip_merges: options[:skip_merges],
all: !!options[:all], all: !!options[:all],
first_parent: !!options[:first_parent],
disable_walk: true # This option is deprecated. The 'walk' implementation is being removed. disable_walk: true # This option is deprecated. The 'walk' implementation is being removed.
) )
request.after = GitalyClient.timestamp(options[:after]) if options[:after] request.after = GitalyClient.timestamp(options[:after]) if options[:after]
......
...@@ -279,7 +279,7 @@ describe Repository do ...@@ -279,7 +279,7 @@ describe Repository do
describe '#commits' do describe '#commits' do
context 'when neither the all flag nor a ref are specified' do context 'when neither the all flag nor a ref are specified' do
it 'returns every commit from default branch' do it 'returns every commit from default branch' do
expect(repository.commits(limit: 60).size).to eq(37) expect(repository.commits(nil, limit: 60).size).to eq(37)
end end
end end
...@@ -320,7 +320,7 @@ describe Repository do ...@@ -320,7 +320,7 @@ describe Repository do
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(all: true, limit: 60).size).to eq(60) expect(repository.commits(nil, all: true, limit: 60).size).to eq(60)
end end
end end
end end
......
...@@ -169,6 +169,18 @@ describe API::Commits do ...@@ -169,6 +169,18 @@ describe API::Commits do
end end
end end
context 'first_parent optional parameter' do
it 'returns all first_parent commits' do
commit_count = project.repository.count_commits(ref: SeedRepo::Commit::ID, first_parent: true)
get api("/projects/#{project_id}/repository/commits", user), params: { ref_name: SeedRepo::Commit::ID, first_parent: 'true' }
expect(response).to include_pagination_headers
expect(commit_count).to eq(12)
expect(response.headers['X-Total']).to eq(commit_count.to_s)
end
end
context 'with_stats optional parameter' do context 'with_stats optional parameter' do
let(:project) { create(:project, :public, :repository) } let(:project) { create(:project, :public, :repository) }
......
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