diff options
author | Robert Speicher <robert@gitlab.com> | 2017-04-02 17:36:25 +0000 |
---|---|---|
committer | Robert Speicher <robert@gitlab.com> | 2017-04-02 17:36:25 +0000 |
commit | e7e9307219d1c81427f95444b36471c519dc06c2 (patch) | |
tree | 234d8b8d0674898e6538dbc65a0b81720e45a2cf | |
parent | fee49c995e1ba1f182fa8121ca833d06419b25e1 (diff) | |
parent | 1ea0ce827a619007c69010da512cb4e82224ed0f (diff) | |
download | gitlab-ce-e7e9307219d1c81427f95444b36471c519dc06c2.tar.gz |
Merge branch 'use-gitaly-commit-is-ancestor' into 'master'
Use gitaly commit is ancestor
See merge request !9864
-rw-r--r-- | app/models/repository.rb | 8 | ||||
-rw-r--r-- | changelogs/unreleased/feature-use-gitaly-for-commit-is-ancestor.yml | 4 | ||||
-rw-r--r-- | lib/gitlab/git/repository.rb | 5 | ||||
-rw-r--r-- | lib/gitlab/gitaly_client/commit.rb | 14 | ||||
-rw-r--r-- | spec/models/repository_spec.rb | 13 |
5 files changed, 43 insertions, 1 deletions
diff --git a/app/models/repository.rb b/app/models/repository.rb index 6ab04440ca8..596650353fc 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -981,7 +981,13 @@ class Repository end def is_ancestor?(ancestor_id, descendant_id) - merge_base(ancestor_id, descendant_id) == ancestor_id + Gitlab::GitalyClient.migrate(:is_ancestor) do |is_enabled| + if is_enabled + raw_repository.is_ancestor?(ancestor_id, descendant_id) + else + merge_base_commit(ancestor_id, descendant_id) == ancestor_id + end + end end def empty_repo? diff --git a/changelogs/unreleased/feature-use-gitaly-for-commit-is-ancestor.yml b/changelogs/unreleased/feature-use-gitaly-for-commit-is-ancestor.yml new file mode 100644 index 00000000000..733e3643ce5 --- /dev/null +++ b/changelogs/unreleased/feature-use-gitaly-for-commit-is-ancestor.yml @@ -0,0 +1,4 @@ +--- +title: Use Gitaly for Repository#is_ancestor +merge_request: 9864 +author: diff --git a/lib/gitlab/git/repository.rb b/lib/gitlab/git/repository.rb index 4e72519c81d..32aebb6f6f0 100644 --- a/lib/gitlab/git/repository.rb +++ b/lib/gitlab/git/repository.rb @@ -411,6 +411,11 @@ module Gitlab rugged.merge_base(from, to) end + # Returns true is +from+ is direct ancestor to +to+, otherwise false + def is_ancestor?(from, to) + Gitlab::GitalyClient::Commit.is_ancestor(self, from, to) + end + # Return an array of Diff objects that represent the diff # between +from+ and +to+. See Diff::filter_diff_options for the allowed # diff options. The +options+ hash can also include :break_rewrites to diff --git a/lib/gitlab/gitaly_client/commit.rb b/lib/gitlab/gitaly_client/commit.rb index 9c714a3ee45..f15faebe27e 100644 --- a/lib/gitlab/gitaly_client/commit.rb +++ b/lib/gitlab/gitaly_client/commit.rb @@ -21,6 +21,20 @@ module Gitlab Gitlab::Git::DiffCollection.new(stub.commit_diff(request), options) end + + def is_ancestor(repository, ancestor_id, child_id) + project = Project.find_by_path(repository.path) + channel = GitalyClient.get_channel(project.repository_storage) + stub = Gitaly::Commit::Stub.new(nil, nil, channel_override: channel) + repo = Gitaly::Repository.new(path: repository.path_to_repo) + request = Gitaly::CommitIsAncestorRequest.new( + repository: repo, + ancestor_id: ancestor_id, + child_id: child_id + ) + + stub.commit_is_ancestor(request).value + end end end end diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index 585b87b828d..df742ee8084 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -1851,4 +1851,17 @@ describe Repository, models: true do end end end + + describe '#is_ancestor?' do + context 'Gitaly is_ancestor feature enabled' do + it 'asks Gitaly server if it\'s an ancestor' do + commit = repository.commit + allow(Gitlab::GitalyClient).to receive(:feature_enabled?).with(:is_ancestor).and_return(true) + expect(Gitlab::GitalyClient::Commit).to receive(:is_ancestor). + with(repository.raw_repository, commit.id, commit.id).and_return(true) + + expect(repository.is_ancestor?(commit.id, commit.id)).to be true + end + end + end end |