Commit ebdfda69 authored by Robert Speicher's avatar Robert Speicher

Merge branch 'gitaly-refs' into 'master'

Implement Gitaly refs client

See merge request !9291
parents fec40d78 56cf0274
...@@ -59,7 +59,7 @@ class Repository ...@@ -59,7 +59,7 @@ class Repository
def raw_repository def raw_repository
return nil unless path_with_namespace return nil unless path_with_namespace
@raw_repository ||= Gitlab::Git::Repository.new(path_to_repo) @raw_repository ||= initialize_raw_repository
end end
# Return absolute path to repository # Return absolute path to repository
...@@ -146,12 +146,7 @@ class Repository ...@@ -146,12 +146,7 @@ class Repository
# may cause the branch to "disappear" erroneously or have the wrong SHA. # may cause the branch to "disappear" erroneously or have the wrong SHA.
# #
# See: https://github.com/libgit2/libgit2/issues/1534 and https://gitlab.com/gitlab-org/gitlab-ce/issues/15392 # See: https://github.com/libgit2/libgit2/issues/1534 and https://gitlab.com/gitlab-org/gitlab-ce/issues/15392
raw_repo = raw_repo = fresh_repo ? initialize_raw_repository : raw_repository
if fresh_repo
Gitlab::Git::Repository.new(path_to_repo)
else
raw_repository
end
raw_repo.find_branch(name) raw_repo.find_branch(name)
end end
...@@ -505,9 +500,7 @@ class Repository ...@@ -505,9 +500,7 @@ class Repository
end end
end end
def branch_names delegate :branch_names, to: :raw_repository
branches.map(&:name)
end
cache_method :branch_names, fallback: [] cache_method :branch_names, fallback: []
delegate :tag_names, to: :raw_repository delegate :tag_names, to: :raw_repository
...@@ -1168,4 +1161,8 @@ class Repository ...@@ -1168,4 +1161,8 @@ class Repository
def repository_storage_path def repository_storage_path
@project.repository_storage_path @project.repository_storage_path
end end
def initialize_raw_repository
Gitlab::Git::Repository.new(project.repository_storage, path_with_namespace + '.git')
end
end end
---
title: Incorporate Gitaly client for refs service
merge_request: 9291
author:
...@@ -8,11 +8,10 @@ class MigrateRepoSize < ActiveRecord::Migration ...@@ -8,11 +8,10 @@ class MigrateRepoSize < ActiveRecord::Migration
project_data.each do |project| project_data.each do |project|
id = project['id'] id = project['id']
namespace_path = project['namespace_path'] || '' namespace_path = project['namespace_path'] || ''
repos_path = Gitlab.config.gitlab_shell['repos_path'] || Gitlab.config.repositories.storages.default['path'] path = File.join(namespace_path, project['project_path'] + '.git')
path = File.join(repos_path, namespace_path, project['project_path'] + '.git')
begin begin
repo = Gitlab::Git::Repository.new(path) repo = Gitlab::Git::Repository.new('default', path)
if repo.empty? if repo.empty?
print '-' print '-'
else else
......
...@@ -138,8 +138,11 @@ module API ...@@ -138,8 +138,11 @@ module API
return unless Gitlab::GitalyClient.enabled? return unless Gitlab::GitalyClient.enabled?
relative_path = Gitlab::RepoPath.strip_storage_path(params[:repo_path])
project = Project.find_by_full_path(relative_path.sub(/\.(git|wiki)\z/, ''))
begin begin
Gitlab::GitalyClient::Notifications.new(params[:repo_path]).post_receive Gitlab::GitalyClient::Notifications.new(project.repository_storage, relative_path).post_receive
rescue GRPC::Unavailable => e rescue GRPC::Unavailable => e
render_api_error(e, 500) render_api_error(e, 500)
end end
......
...@@ -4,6 +4,8 @@ module Gitlab ...@@ -4,6 +4,8 @@ module Gitlab
TAG_REF_PREFIX = "refs/tags/".freeze TAG_REF_PREFIX = "refs/tags/".freeze
BRANCH_REF_PREFIX = "refs/heads/".freeze BRANCH_REF_PREFIX = "refs/heads/".freeze
CommandError = Class.new(StandardError)
class << self class << self
def ref_name(ref) def ref_name(ref)
ref.sub(/\Arefs\/(tags|heads)\//, '') ref.sub(/\Arefs\/(tags|heads)\//, '')
......
...@@ -25,9 +25,13 @@ module Gitlab ...@@ -25,9 +25,13 @@ module Gitlab
# 'path' must be the path to a _bare_ git repository, e.g. # 'path' must be the path to a _bare_ git repository, e.g.
# /path/to/my-repo.git # /path/to/my-repo.git
def initialize(path) def initialize(repository_storage, relative_path)
@path = path @repository_storage = repository_storage
@name = path.split("/").last @relative_path = relative_path
storage_path = Gitlab.config.repositories.storages[@repository_storage]['path']
@path = File.join(storage_path, @relative_path)
@name = @relative_path.split("/").last
@attributes = Gitlab::Git::Attributes.new(path) @attributes = Gitlab::Git::Attributes.new(path)
end end
...@@ -37,7 +41,15 @@ module Gitlab ...@@ -37,7 +41,15 @@ module Gitlab
# Default branch in the repository # Default branch in the repository
def root_ref def root_ref
@root_ref ||= discover_default_branch @root_ref ||= Gitlab::GitalyClient.migrate(:root_ref) do |is_enabled|
if is_enabled
gitaly_ref_client.default_branch_name
else
discover_default_branch
end
end
rescue GRPC::BadStatus => e
raise CommandError.new(e)
end end
# Alias to old method for compatibility # Alias to old method for compatibility
...@@ -54,7 +66,15 @@ module Gitlab ...@@ -54,7 +66,15 @@ module Gitlab
# Returns an Array of branch names # Returns an Array of branch names
# sorted by name ASC # sorted by name ASC
def branch_names def branch_names
branches.map(&:name) Gitlab::GitalyClient.migrate(:branch_names) do |is_enabled|
if is_enabled
gitaly_ref_client.branch_names
else
branches.map(&:name)
end
end
rescue GRPC::BadStatus => e
raise CommandError.new(e)
end end
# Returns an Array of Branches # Returns an Array of Branches
...@@ -107,7 +127,15 @@ module Gitlab ...@@ -107,7 +127,15 @@ module Gitlab
# Returns an Array of tag names # Returns an Array of tag names
def tag_names def tag_names
rugged.tags.map { |t| t.name } Gitlab::GitalyClient.migrate(:tag_names) do |is_enabled|
if is_enabled
gitaly_ref_client.tag_names
else
rugged.tags.map { |t| t.name }
end
end
rescue GRPC::BadStatus => e
raise CommandError.new(e)
end end
# Returns an Array of Tags # Returns an Array of Tags
...@@ -1202,6 +1230,10 @@ module Gitlab ...@@ -1202,6 +1230,10 @@ module Gitlab
diff.find_similar!(break_rewrites: break_rewrites) diff.find_similar!(break_rewrites: break_rewrites)
diff.each_patch diff.each_patch
end end
def gitaly_ref_client
@gitaly_ref_client ||= Gitlab::GitalyClient::Ref.new(@repository_storage, @relative_path)
end
end end
end end
end end
...@@ -3,18 +3,13 @@ module Gitlab ...@@ -3,18 +3,13 @@ module Gitlab
class Notifications class Notifications
attr_accessor :stub attr_accessor :stub
def initialize(repo_path) def initialize(repository_storage, relative_path)
full_path = Gitlab::RepoPath.strip_storage_path(repo_path). @channel, @repository = Util.process_path(repository_storage, relative_path)
sub(/\.git\z/, '').sub(/\.wiki\z/, '') @stub = Gitaly::Notifications::Stub.new(nil, nil, channel_override: @channel)
@project = Project.find_by_full_path(full_path)
channel = GitalyClient.get_channel(@project.repository_storage)
@stub = Gitaly::Notifications::Stub.new(nil, nil, channel_override: channel)
end end
def post_receive def post_receive
repository = Gitaly::Repository.new(path: @project.repository.path_to_repo) request = Gitaly::PostReceiveRequest.new(repository: @repository)
request = Gitaly::PostReceiveRequest.new(repository: repository)
@stub.post_receive(request) @stub.post_receive(request)
end end
end end
......
module Gitlab
module GitalyClient
class Ref
attr_accessor :stub
def initialize(repository_storage, relative_path)
@channel, @repository = Util.process_path(repository_storage, relative_path)
@stub = Gitaly::Ref::Stub.new(nil, nil, channel_override: @channel)
end
def default_branch_name
request = Gitaly::FindDefaultBranchNameRequest.new(repository: @repository)
stub.find_default_branch_name(request).name.gsub(/^refs\/heads\//, '')
end
def branch_names
request = Gitaly::FindAllBranchNamesRequest.new(repository: @repository)
consume_refs_response(stub.find_all_branch_names(request), prefix: 'refs/heads/')
end
def tag_names
request = Gitaly::FindAllTagNamesRequest.new(repository: @repository)
consume_refs_response(stub.find_all_tag_names(request), prefix: 'refs/tags/')
end
private
def consume_refs_response(response, prefix:)
response.flat_map do |r|
r.names.map { |name| name.sub(/\A#{Regexp.escape(prefix)}/, '') }
end
end
end
end
end
module Gitlab
module GitalyClient
module Util
def self.process_path(repository_storage, relative_path)
channel = GitalyClient.get_channel(repository_storage)
storage_path = Gitlab.config.repositories.storages[repository_storage]['path']
repository = Gitaly::Repository.new(path: File.join(storage_path, relative_path))
[channel, repository]
end
end
end
end
...@@ -2,7 +2,7 @@ require 'spec_helper' ...@@ -2,7 +2,7 @@ require 'spec_helper'
describe Gitlab::Git::Attributes, seed_helper: true do describe Gitlab::Git::Attributes, seed_helper: true do
let(:path) do let(:path) do
File.join(SEED_REPOSITORY_PATH, 'with-git-attributes.git') File.join(SEED_STORAGE_PATH, 'with-git-attributes.git')
end end
subject { described_class.new(path) } subject { described_class.new(path) }
...@@ -141,7 +141,7 @@ describe Gitlab::Git::Attributes, seed_helper: true do ...@@ -141,7 +141,7 @@ describe Gitlab::Git::Attributes, seed_helper: true do
end end
it 'does not yield when the attributes file has an unsupported encoding' do it 'does not yield when the attributes file has an unsupported encoding' do
path = File.join(SEED_REPOSITORY_PATH, 'with-invalid-git-attributes.git') path = File.join(SEED_STORAGE_PATH, 'with-invalid-git-attributes.git')
attrs = described_class.new(path) attrs = described_class.new(path)
expect { |b| attrs.each_line(&b) }.not_to yield_control expect { |b| attrs.each_line(&b) }.not_to yield_control
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
require "spec_helper" require "spec_helper"
describe Gitlab::Git::Blame, seed_helper: true do describe Gitlab::Git::Blame, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
let(:blame) do let(:blame) do
Gitlab::Git::Blame.new(repository, SeedRepo::Commit::ID, "CONTRIBUTING.md") Gitlab::Git::Blame.new(repository, SeedRepo::Commit::ID, "CONTRIBUTING.md")
end end
......
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
require "spec_helper" require "spec_helper"
describe Gitlab::Git::Blob, seed_helper: true do describe Gitlab::Git::Blob, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
describe 'initialize' do describe 'initialize' do
let(:blob) { Gitlab::Git::Blob.new(name: 'test') } let(:blob) { Gitlab::Git::Blob.new(name: 'test') }
......
require "spec_helper" require "spec_helper"
describe Gitlab::Git::Branch, seed_helper: true do describe Gitlab::Git::Branch, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
subject { repository.branches } subject { repository.branches }
......
require "spec_helper" require "spec_helper"
describe Gitlab::Git::Commit, seed_helper: true do describe Gitlab::Git::Commit, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
let(:commit) { Gitlab::Git::Commit.find(repository, SeedRepo::Commit::ID) } let(:commit) { Gitlab::Git::Commit.find(repository, SeedRepo::Commit::ID) }
let(:rugged_commit) do let(:rugged_commit) do
repository.rugged.lookup(SeedRepo::Commit::ID) repository.rugged.lookup(SeedRepo::Commit::ID)
...@@ -9,7 +9,7 @@ describe Gitlab::Git::Commit, seed_helper: true do ...@@ -9,7 +9,7 @@ describe Gitlab::Git::Commit, seed_helper: true do
describe "Commit info" do describe "Commit info" do
before do before do
repo = Gitlab::Git::Repository.new(TEST_REPO_PATH).rugged repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH).rugged
@committer = { @committer = {
email: 'mike@smith.com', email: 'mike@smith.com',
...@@ -59,7 +59,7 @@ describe Gitlab::Git::Commit, seed_helper: true do ...@@ -59,7 +59,7 @@ describe Gitlab::Git::Commit, seed_helper: true do
after do after do
# Erase the new commit so other tests get the original repo # Erase the new commit so other tests get the original repo
repo = Gitlab::Git::Repository.new(TEST_REPO_PATH).rugged repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH).rugged
repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID) repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
end end
end end
...@@ -95,7 +95,7 @@ describe Gitlab::Git::Commit, seed_helper: true do ...@@ -95,7 +95,7 @@ describe Gitlab::Git::Commit, seed_helper: true do
end end
context 'with broken repo' do context 'with broken repo' do
let(:repository) { Gitlab::Git::Repository.new(TEST_BROKEN_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_BROKEN_REPO_PATH) }
it 'returns nil' do it 'returns nil' do
expect(Gitlab::Git::Commit.find(repository, SeedRepo::Commit::ID)).to be_nil expect(Gitlab::Git::Commit.find(repository, SeedRepo::Commit::ID)).to be_nil
......
require "spec_helper" require "spec_helper"
describe Gitlab::Git::Compare, seed_helper: true do describe Gitlab::Git::Compare, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
let(:compare) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, false) } let(:compare) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, false) }
let(:compare_straight) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, true) } let(:compare_straight) { Gitlab::Git::Compare.new(repository, SeedRepo::BigCommit::ID, SeedRepo::Commit::ID, true) }
......
require "spec_helper" require "spec_helper"
describe Gitlab::Git::Diff, seed_helper: true do describe Gitlab::Git::Diff, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
before do before do
@raw_diff_hash = { @raw_diff_hash = {
......
...@@ -2,7 +2,7 @@ require "spec_helper" ...@@ -2,7 +2,7 @@ require "spec_helper"
describe Gitlab::Git::EncodingHelper do describe Gitlab::Git::EncodingHelper do
let(:ext_class) { Class.new { extend Gitlab::Git::EncodingHelper } } let(:ext_class) { Class.new { extend Gitlab::Git::EncodingHelper } }
let(:binary_string) { File.join(SEED_REPOSITORY_PATH, 'gitlab_logo.png') } let(:binary_string) { File.join(SEED_STORAGE_PATH, 'gitlab_logo.png') }
describe '#encode!' do describe '#encode!' do
[ [
......
require 'spec_helper' require 'spec_helper'
describe Gitlab::Git::Index, seed_helper: true do describe Gitlab::Git::Index, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
let(:index) { described_class.new(repository) } let(:index) { described_class.new(repository) }
before do before do
......
...@@ -3,7 +3,7 @@ require "spec_helper" ...@@ -3,7 +3,7 @@ require "spec_helper"
describe Gitlab::Git::Repository, seed_helper: true do describe Gitlab::Git::Repository, seed_helper: true do
include Gitlab::Git::EncodingHelper include Gitlab::Git::EncodingHelper
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
describe "Respond to" do describe "Respond to" do
subject { repository } subject { repository }
...@@ -14,6 +14,32 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -14,6 +14,32 @@ describe Gitlab::Git::Repository, seed_helper: true do
it { is_expected.to respond_to(:tags) } it { is_expected.to respond_to(:tags) }
end end
describe '#root_ref' do
context 'with gitaly disabled' do
before { allow(Gitlab::GitalyClient).to receive(:feature_enabled?).and_return(false) }
it 'calls #discover_default_branch' do
expect(repository).to receive(:discover_default_branch)
repository.root_ref
end
end
context 'with gitaly enabled' do
before { stub_gitaly }
it 'gets the branch name from GitalyClient' do
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name)
repository.root_ref
end
it 'wraps GRPC exceptions' do
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:default_branch_name).
and_raise(GRPC::Unknown)
expect { repository.root_ref }.to raise_error(Gitlab::Git::CommandError)
end
end
end
describe "#discover_default_branch" do describe "#discover_default_branch" do
let(:master) { 'master' } let(:master) { 'master' }
let(:feature) { 'feature' } let(:feature) { 'feature' }
...@@ -55,6 +81,21 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -55,6 +81,21 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
it { is_expected.to include("master") } it { is_expected.to include("master") }
it { is_expected.not_to include("branch-from-space") } it { is_expected.not_to include("branch-from-space") }
context 'with gitaly enabled' do
before { stub_gitaly }
it 'gets the branch names from GitalyClient' do
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names)
subject
end
it 'wraps GRPC exceptions' do
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:branch_names).
and_raise(GRPC::Unknown)
expect { subject }.to raise_error(Gitlab::Git::CommandError)
end
end
end end
describe '#tag_names' do describe '#tag_names' do
...@@ -71,6 +112,21 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -71,6 +112,21 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
it { is_expected.to include("v1.0.0") } it { is_expected.to include("v1.0.0") }
it { is_expected.not_to include("v5.0.0") } it { is_expected.not_to include("v5.0.0") }
context 'with gitaly enabled' do
before { stub_gitaly }
it 'gets the tag names from GitalyClient' do
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names)
subject
end
it 'wraps GRPC exceptions' do
expect_any_instance_of(Gitlab::GitalyClient::Ref).to receive(:tag_names).
and_raise(GRPC::Unknown)
expect { subject }.to raise_error(Gitlab::Git::CommandError)
end
end
end end
shared_examples 'archive check' do |extenstion| shared_examples 'archive check' do |extenstion|
...@@ -221,7 +277,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -221,7 +277,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
context '#submodules' do context '#submodules' do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
context 'where repo has submodules' do context 'where repo has submodules' do
let(:submodules) { repository.submodules('master') } let(:submodules) { repository.submodules('master') }
...@@ -290,9 +346,9 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -290,9 +346,9 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
describe "#reset" do describe "#reset" do
change_path = File.join(TEST_NORMAL_REPO_PATH, "CHANGELOG") change_path = File.join(SEED_STORAGE_PATH, TEST_NORMAL_REPO_PATH, "CHANGELOG")
untracked_path = File.join(TEST_NORMAL_REPO_PATH, "UNTRACKED") untracked_path = File.join(SEED_STORAGE_PATH, TEST_NORMAL_REPO_PATH, "UNTRACKED")
tracked_path = File.join(TEST_NORMAL_REPO_PATH, "files", "ruby", "popen.rb") tracked_path = File.join(SEED_STORAGE_PATH, TEST_NORMAL_REPO_PATH, "files", "ruby", "popen.rb")
change_text = "New changelog text" change_text = "New changelog text"
untracked_text = "This file is untracked" untracked_text = "This file is untracked"
...@@ -311,7 +367,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -311,7 +367,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
f.write(untracked_text) f.write(untracked_text)
end end
@normal_repo = Gitlab::Git::Repository.new(TEST_NORMAL_REPO_PATH) @normal_repo = Gitlab::Git::Repository.new('default', TEST_NORMAL_REPO_PATH)
@normal_repo.reset("HEAD", :hard) @normal_repo.reset("HEAD", :hard)
end end
...@@ -354,7 +410,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -354,7 +410,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
context "-b" do context "-b" do
before(:all) do before(:all) do
@normal_repo = Gitlab::Git::Repository.new(TEST_NORMAL_REPO_PATH) @normal_repo = Gitlab::Git::Repository.new('default', TEST_NORMAL_REPO_PATH)
@normal_repo.checkout(new_branch, { b: true }, "origin/feature") @normal_repo.checkout(new_branch, { b: true }, "origin/feature")
end end
...@@ -382,7 +438,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -382,7 +438,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
context "without -b" do context "without -b" do
context "and specifying a nonexistent branch" do context "and specifying a nonexistent branch" do
it "should not do anything" do it "should not do anything" do
normal_repo = Gitlab::Git::Repository.new(TEST_NORMAL_REPO_PATH) normal_repo = Gitlab::Git::Repository.new('default', TEST_NORMAL_REPO_PATH)
expect { normal_repo.checkout(new_branch) }.to raise_error(Rugged::ReferenceError) expect { normal_repo.checkout(new_branch) }.to raise_error(Rugged::ReferenceError)
expect(normal_repo.rugged.branches[new_branch]).to be_nil expect(normal_repo.rugged.branches[new_branch]).to be_nil
...@@ -402,7 +458,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -402,7 +458,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
context "and with a valid branch" do context "and with a valid branch" do
before(:all) do before(:all) do
@normal_repo = Gitlab::Git::Repository.new(TEST_NORMAL_REPO_PATH) @normal_repo = Gitlab::Git::Repository.new('default', TEST_NORMAL_REPO_PATH)
@normal_repo.rugged.branches.create("feature", "origin/feature") @normal_repo.rugged.branches.create("feature", "origin/feature")
@normal_repo.checkout("feature") @normal_repo.checkout("feature")
end end
...@@ -414,13 +470,13 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -414,13 +470,13 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
it "should update the working directory" do it "should update the working directory" do
File.open(File.join(TEST_NORMAL_REPO_PATH, ".gitignore"), "r") do |f| File.open(File.join(SEED_STORAGE_PATH, TEST_NORMAL_REPO_PATH, ".gitignore"), "r") do |f|
expect(f.read.each_line.to_a).not_to include(".DS_Store\n") expect(f.read.each_line.to_a).not_to include(".DS_Store\n")
end end
end end
after(:all) do after(:all) do
FileUtils.rm_rf(TEST_NORMAL_REPO_PATH) FileUtils.rm_rf(SEED_STORAGE_PATH, TEST_NORMAL_REPO_PATH)
ensure_seeds ensure_seeds
end end
end end
...@@ -429,7 +485,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -429,7 +485,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
describe "#delete_branch" do describe "#delete_branch" do
before(:all) do before(:all) do
@repo = Gitlab::Git::Repository.new(TEST_MUTABLE_REPO_PATH) @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH)
@repo.delete_branch("feature") @repo.delete_branch("feature")
end end
...@@ -449,7 +505,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -449,7 +505,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
describe "#create_branch" do describe "#create_branch" do
before(:all) do before(:all) do
@repo = Gitlab::Git::Repository.new(TEST_MUTABLE_REPO_PATH) @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH)
end end
it "should create a new branch" do it "should create a new branch" do
...@@ -496,7 +552,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -496,7 +552,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
describe "#remote_delete" do describe "#remote_delete" do
before(:all) do before(:all) do
@repo = Gitlab::Git::Repository.new(TEST_MUTABLE_REPO_PATH) @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH)
@repo.remote_delete("expendable") @repo.remote_delete("expendable")
end end
...@@ -512,7 +568,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -512,7 +568,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
describe "#remote_add" do describe "#remote_add" do
before(:all) do before(:all) do
@repo = Gitlab::Git::Repository.new(TEST_MUTABLE_REPO_PATH) @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH)
@repo.remote_add("new_remote", SeedHelper::GITLAB_GIT_TEST_REPO_URL) @repo.remote_add("new_remote", SeedHelper::GITLAB_GIT_TEST_REPO_URL)
end end
...@@ -528,7 +584,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -528,7 +584,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
describe "#remote_update" do describe "#remote_update" do
before(:all) do before(:all) do
@repo = Gitlab::Git::Repository.new(TEST_MUTABLE_REPO_PATH) @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH)
@repo.remote_update("expendable", url: TEST_NORMAL_REPO_PATH) @repo.remote_update("expendable", url: TEST_NORMAL_REPO_PATH)
end end
...@@ -551,7 +607,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -551,7 +607,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
before(:context) do before(:context) do
# Add new commits so that there's a renamed file in the commit history # Add new commits so that there's a renamed file in the commit history
repo = Gitlab::Git::Repository.new(TEST_REPO_PATH).rugged repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH).rugged
commit_with_old_name = new_commit_edit_old_file(repo) commit_with_old_name = new_commit_edit_old_file(repo)
rename_commit = new_commit_move_file(repo) rename_commit = new_commit_move_file(repo)
...@@ -560,7 +616,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -560,7 +616,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
after(:context) do after(:context) do
# Erase our commits so other tests get the original repo # Erase our commits so other tests get the original repo
repo = Gitlab::Git::Repository.new(TEST_REPO_PATH).rugged repo = Gitlab::Git::Repository.new('default', TEST_REPO_PATH).rugged
repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID) repo.references.update("refs/heads/master", SeedRepo::LastCommit::ID)
end end
...@@ -885,7 +941,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -885,7 +941,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
describe '#autocrlf' do describe '#autocrlf' do
before(:all) do before(:all) do
@repo = Gitlab::Git::Repository.new(TEST_MUTABLE_REPO_PATH) @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH)
@repo.rugged.config['core.autocrlf'] = true @repo.rugged.config['core.autocrlf'] = true
end end
...@@ -900,14 +956,14 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -900,14 +956,14 @@ describe Gitlab::Git::Repository, seed_helper: true do
describe '#autocrlf=' do describe '#autocrlf=' do
before(:all) do before(:all) do
@repo = Gitlab::Git::Repository.new(TEST_MUTABLE_REPO_PATH) @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH)
@repo.rugged.config['core.autocrlf'] = false @repo.rugged.config['core.autocrlf'] = false
end end
it 'should set the autocrlf option to the provided option' do it 'should set the autocrlf option to the provided option' do
@repo.autocrlf = :input @repo.autocrlf = :input
File.open(File.join(TEST_MUTABLE_REPO_PATH, '.git', 'config')) do |config_file| File.open(File.join(SEED_STORAGE_PATH, TEST_MUTABLE_REPO_PATH, '.git', 'config')) do |config_file|
expect(config_file.read).to match('autocrlf = input') expect(config_file.read).to match('autocrlf = input')
end end
end end
...@@ -999,7 +1055,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -999,7 +1055,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
describe "#copy_gitattributes" do describe "#copy_gitattributes" do
let(:attributes_path) { File.join(TEST_REPO_PATH, 'info/attributes') } let(:attributes_path) { File.join(SEED_STORAGE_PATH, TEST_REPO_PATH, 'info/attributes') }
it "raises an error with invalid ref" do it "raises an error with invalid ref" do
expect { repository.copy_gitattributes("invalid") }.to raise_error(Gitlab::Git::Repository::InvalidRef) expect { repository.copy_gitattributes("invalid") }.to raise_error(Gitlab::Git::Repository::InvalidRef)
...@@ -1075,7 +1131,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -1075,7 +1131,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
end end
describe '#diffable' do describe '#diffable' do
info_dir_path = attributes_path = File.join(TEST_REPO_PATH, 'info') info_dir_path = attributes_path = File.join(SEED_STORAGE_PATH, TEST_REPO_PATH, 'info')
attributes_path = File.join(info_dir_path, 'attributes') attributes_path = File.join(info_dir_path, 'attributes')
before(:all) do before(:all) do
...@@ -1143,7 +1199,7 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -1143,7 +1199,7 @@ describe Gitlab::Git::Repository, seed_helper: true do
describe '#local_branches' do describe '#local_branches' do
before(:all) do before(:all) do
@repo = Gitlab::Git::Repository.new(TEST_MUTABLE_REPO_PATH) @repo = Gitlab::Git::Repository.new('default', TEST_MUTABLE_REPO_PATH)
end end
after(:all) do after(:all) do
...@@ -1235,4 +1291,11 @@ describe Gitlab::Git::Repository, seed_helper: true do ...@@ -1235,4 +1291,11 @@ describe Gitlab::Git::Repository, seed_helper: true do
sha = Rugged::Commit.create(repo, options) sha = Rugged::Commit.create(repo, options)
repo.lookup(sha) repo.lookup(sha)
end end
def stub_gitaly
allow(Gitlab::GitalyClient).to receive(:feature_enabled?).and_return(true)
stub = double(:stub)
allow(Gitaly::Ref::Stub).to receive(:new).and_return(stub)
end
end end
require "spec_helper" require "spec_helper"
describe Gitlab::Git::Tag, seed_helper: true do describe Gitlab::Git::Tag, seed_helper: true do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
describe 'first tag' do describe 'first tag' do
let(:tag) { repository.tags.first } let(:tag) { repository.tags.first }
......
...@@ -2,7 +2,7 @@ require "spec_helper" ...@@ -2,7 +2,7 @@ require "spec_helper"
describe Gitlab::Git::Tree, seed_helper: true do describe Gitlab::Git::Tree, seed_helper: true do
context :repo do context :repo do
let(:repository) { Gitlab::Git::Repository.new(TEST_REPO_PATH) } let(:repository) { Gitlab::Git::Repository.new('default', TEST_REPO_PATH) }
let(:tree) { Gitlab::Git::Tree.where(repository, SeedRepo::Commit::ID) } let(:tree) { Gitlab::Git::Tree.where(repository, SeedRepo::Commit::ID) }
it { expect(tree).to be_kind_of Array } it { expect(tree).to be_kind_of Array }
......
...@@ -2,12 +2,15 @@ require 'spec_helper' ...@@ -2,12 +2,15 @@ require 'spec_helper'
describe Gitlab::GitalyClient::Notifications do describe Gitlab::GitalyClient::Notifications do
describe '#post_receive' do describe '#post_receive' do
let(:project) { create(:empty_project) }
let(:repo_path) { project.repository.path_to_repo }
subject { described_class.new(project.repository_storage, project.full_path + '.git') }
it 'sends a post_receive message' do it 'sends a post_receive message' do
repo_path = create(:empty_project).repository.path_to_repo
expect_any_instance_of(Gitaly::Notifications::Stub). expect_any_instance_of(Gitaly::Notifications::Stub).
to receive(:post_receive).with(post_receive_request_with_repo_path(repo_path)) to receive(:post_receive).with(gitaly_request_with_repo_path(repo_path))
described_class.new(repo_path).post_receive subject.post_receive
end end
end end
end end
require 'spec_helper'
describe Gitlab::GitalyClient::Ref do
let(:project) { create(:empty_project) }
let(:repo_path) { project.repository.path_to_repo }
let(:client) { Gitlab::GitalyClient::Ref.new(project.repository_storage, project.full_path + '.git') }
before do
allow(Gitlab.config.gitaly).to receive(:enabled).and_return(true)
end
describe '#branch_names' do
it 'sends a find_all_branch_names message' do
expect_any_instance_of(Gitaly::Ref::Stub).
to receive(:find_all_branch_names).with(gitaly_request_with_repo_path(repo_path)).
and_return([])
client.branch_names
end
end
describe '#tag_names' do
it 'sends a find_all_tag_names message' do
expect_any_instance_of(Gitaly::Ref::Stub).
to receive(:find_all_tag_names).with(gitaly_request_with_repo_path(repo_path)).
and_return([])
client.tag_names
end
end
describe '#default_branch_name' do
it 'sends a find_default_branch_name message' do
expect_any_instance_of(Gitaly::Ref::Stub).
to receive(:find_default_branch_name).with(gitaly_request_with_repo_path(repo_path)).
and_return(double(name: 'foo'))
client.default_branch_name
end
end
end
RSpec::Matchers.define :post_receive_request_with_repo_path do |path| RSpec::Matchers.define :gitaly_request_with_repo_path do |path|
match { |actual| actual.repository.path == path } match { |actual| actual.repository.path == path }
end end
require_relative 'test_env'
# This file is specific to specs in spec/lib/gitlab/git/ # This file is specific to specs in spec/lib/gitlab/git/
SEED_REPOSITORY_PATH = File.expand_path('../../tmp/repositories', __dir__) SEED_STORAGE_PATH = TestEnv.repos_path
TEST_REPO_PATH = File.join(SEED_REPOSITORY_PATH, 'gitlab-git-test.git') TEST_REPO_PATH = 'gitlab-git-test.git'.freeze
TEST_NORMAL_REPO_PATH = File.join(SEED_REPOSITORY_PATH, "not-bare-repo.git") TEST_NORMAL_REPO_PATH = 'not-bare-repo.git'.freeze
TEST_MUTABLE_REPO_PATH = File.join(SEED_REPOSITORY_PATH, "mutable-repo.git") TEST_MUTABLE_REPO_PATH = 'mutable-repo.git'.freeze
TEST_BROKEN_REPO_PATH = File.join(SEED_REPOSITORY_PATH, "broken-repo.git") TEST_BROKEN_REPO_PATH = 'broken-repo.git'.freeze
module SeedHelper module SeedHelper
GITLAB_GIT_TEST_REPO_URL = ENV.fetch('GITLAB_GIT_TEST_REPO_URL', 'https://gitlab.com/gitlab-org/gitlab-git-test.git').freeze GITLAB_GIT_TEST_REPO_URL = ENV.fetch('GITLAB_GIT_TEST_REPO_URL', 'https://gitlab.com/gitlab-org/gitlab-git-test.git').freeze
def ensure_seeds def ensure_seeds
if File.exist?(SEED_REPOSITORY_PATH) if File.exist?(SEED_STORAGE_PATH)
FileUtils.rm_r(SEED_REPOSITORY_PATH) FileUtils.rm_r(SEED_STORAGE_PATH)
end end
FileUtils.mkdir_p(SEED_REPOSITORY_PATH) FileUtils.mkdir_p(SEED_STORAGE_PATH)
create_bare_seeds create_bare_seeds
create_normal_seeds create_normal_seeds
...@@ -26,41 +28,45 @@ module SeedHelper ...@@ -26,41 +28,45 @@ module SeedHelper
def create_bare_seeds def create_bare_seeds
system(git_env, *%W(#{Gitlab.config.git.bin_path} clone --bare #{GITLAB_GIT_TEST_REPO_URL}), system(git_env, *%W(#{Gitlab.config.git.bin_path} clone --bare #{GITLAB_GIT_TEST_REPO_URL}),
chdir: SEED_REPOSITORY_PATH, chdir: SEED_STORAGE_PATH,
out: '/dev/null', out: '/dev/null',
err: '/dev/null') err: '/dev/null')
end end
def create_normal_seeds def create_normal_seeds
system(git_env, *%W(#{Gitlab.config.git.bin_path} clone #{TEST_REPO_PATH} #{TEST_NORMAL_REPO_PATH}), system(git_env, *%W(#{Gitlab.config.git.bin_path} clone #{TEST_REPO_PATH} #{TEST_NORMAL_REPO_PATH}),
chdir: SEED_STORAGE_PATH,
out: '/dev/null', out: '/dev/null',
err: '/dev/null') err: '/dev/null')
end end
def create_mutable_seeds def create_mutable_seeds
system(git_env, *%W(#{Gitlab.config.git.bin_path} clone #{TEST_REPO_PATH} #{TEST_MUTABLE_REPO_PATH}), system(git_env, *%W(#{Gitlab.config.git.bin_path} clone #{TEST_REPO_PATH} #{TEST_MUTABLE_REPO_PATH}),
chdir: SEED_STORAGE_PATH,
out: '/dev/null', out: '/dev/null',
err: '/dev/null') err: '/dev/null')
system(git_env, *%w(git branch -t feature origin/feature), mutable_repo_full_path = File.join(SEED_STORAGE_PATH, TEST_MUTABLE_REPO_PATH)
chdir: TEST_MUTABLE_REPO_PATH, out: '/dev/null', err: '/dev/null') system(git_env, *%W(#{Gitlab.config.git.bin_path} branch -t feature origin/feature),
chdir: mutable_repo_full_path, out: '/dev/null', err: '/dev/null')
system(git_env, *%W(#{Gitlab.config.git.bin_path} remote add expendable #{GITLAB_GIT_TEST_REPO_URL}), system(git_env, *%W(#{Gitlab.config.git.bin_path} remote add expendable #{GITLAB_GIT_TEST_REPO_URL}),
chdir: TEST_MUTABLE_REPO_PATH, out: '/dev/null', err: '/dev/null') chdir: mutable_repo_full_path, out: '/dev/null', err: '/dev/null')
end end
def create_broken_seeds def create_broken_seeds
system(git_env, *%W(#{Gitlab.config.git.bin_path} clone --bare #{TEST_REPO_PATH} #{TEST_BROKEN_REPO_PATH}), system(git_env, *%W(#{Gitlab.config.git.bin_path} clone --bare #{TEST_REPO_PATH} #{TEST_BROKEN_REPO_PATH}),
chdir: SEED_STORAGE_PATH,
out: '/dev/null', out: '/dev/null',
err: '/dev/null') err: '/dev/null')
refs_path = File.join(TEST_BROKEN_REPO_PATH, 'refs') refs_path = File.join(SEED_STORAGE_PATH, TEST_BROKEN_REPO_PATH, 'refs')
FileUtils.rm_r(refs_path) FileUtils.rm_r(refs_path)
end end
def create_git_attributes def create_git_attributes
dir = File.join(SEED_REPOSITORY_PATH, 'with-git-attributes.git', 'info') dir = File.join(SEED_STORAGE_PATH, 'with-git-attributes.git', 'info')
FileUtils.mkdir_p(dir) FileUtils.mkdir_p(dir)
...@@ -85,7 +91,7 @@ bla/bla.txt ...@@ -85,7 +91,7 @@ bla/bla.txt
end end
def create_invalid_git_attributes def create_invalid_git_attributes
dir = File.join(SEED_REPOSITORY_PATH, 'with-invalid-git-attributes.git', 'info') dir = File.join(SEED_STORAGE_PATH, 'with-invalid-git-attributes.git', 'info')
FileUtils.mkdir_p(dir) FileUtils.mkdir_p(dir)
......
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