Commit 541d8994 authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Project.repository should never be nil so you can call repository.exists? or repository.empty?

Also specify separate project factory for project with filled repo
parent aa1fc70f925b
......@@ -96,7 +96,7 @@ def search_autocomplete_source
]
project_nav = []
if @project && @project.repository && @project.repository.root_ref
if @project && @project.repository.exists? && @project.repository.root_ref
project_nav = [
{ label: "#{simple_sanitize(@project.name_with_namespace)} - Issues", url: project_issues_path(@project) },
{ label: "#{simple_sanitize(@project.name_with_namespace)} - Commits", url: project_commits_path(@project, @ref || @project.repository.root_ref) },
......
......@@ -141,13 +141,7 @@ def team
end
def repository
if path
@repository ||= Repository.new(path_with_namespace, default_branch)
else
nil
end
rescue Gitlab::Git::NoRepository
nil
@repository ||= Repository.new(path_with_namespace, default_branch)
end
def saved?
......@@ -332,14 +326,14 @@ def update_merge_requests(oldrev, newrev, ref, user)
end
def valid_repo?
repo
repository.exists?
rescue
errors.add(:path, "Invalid repository path")
false
end
def empty_repo?
!repository || repository.empty?
!repository.exists? || repository.empty?
end
def ensure_satellite_exists
......@@ -363,7 +357,7 @@ def namespace_dir
end
def repo_exists?
@repo_exists ||= (repository && repository.branches.present?)
@repo_exists ||= repository.exists?
rescue
@repo_exists = false
end
......
......@@ -3,6 +3,16 @@ class Repository
def initialize(path_with_namespace, default_branch)
@raw_repository = Gitlab::Git::Repository.new(path_with_namespace, default_branch)
rescue Gitlab::Git::Repository::NoRepository
nil
end
def exists?
raw_repository
end
def empty?
raw_repository.empty?
end
def commit(id = nil)
......
......@@ -4,7 +4,7 @@
.form-horizontal= render "shared/clone_panel"
.span4.pull-right
.pull-right
- unless @project.empty_repo?
- if @project.empty_repo?
- if can? current_user, :download_code, @project
= link_to archive_project_repository_path(@project), class: "btn-small btn grouped" do
%i.icon-download-alt
......
......@@ -3,14 +3,14 @@ module SharedProject
# Create a project without caring about what it's called
And "I own a project" do
@project = create(:project)
@project = create(:project_with_code)
@project.team << [@user, :master]
end
# Create a specific project called "Shop"
And 'I own project "Shop"' do
@project = Project.find_by_name "Shop"
@project ||= create(:project, name: "Shop")
@project ||= create(:project_with_code, name: "Shop")
@project.team << [@user, :master]
end
......
......@@ -372,7 +372,7 @@ def handle_project_member_errors(errors)
ref = params[:ref_name] || user_project.try(:default_branch) || 'master'
commits = user_project.repository.commits(ref, nil, per_page, page * per_page)
present CommitDecorator.decorate(commits), with: Entities::RepoCommit
present commits, with: Entities::RepoCommit
end
# Get a project snippets
......
......@@ -85,8 +85,8 @@ def extract_ref(id)
# - @id - A string representing the joined ref and path
# - @ref - A string representing the ref (e.g., the branch, tag, or commit SHA)
# - @path - A string representing the filesystem path
# - @commit - A CommitDecorator representing the commit from the given ref
# - @tree - A TreeDecorator representing the tree at the given ref/path
# - @commit - A Commit representing the commit from the given ref
# - @tree - A Tree representing the tree at the given ref/path
#
# If the :id parameter appears to be requesting a specific response format,
# that will be handled as well.
......
......@@ -187,7 +187,7 @@ def reference_snippet(identifier)
def reference_commit(identifier)
if @project.valid_repo? && commit = @project.repository.commit(identifier)
link_to(identifier, project_commit_url(@project, commit), html_options.merge(title: CommitDecorator.new(commit).link_title, class: "gfm gfm-commit #{html_options[:class]}"))
link_to(identifier, project_commit_url(@project, commit), html_options.merge(title: commit.link_title, class: "gfm gfm-commit #{html_options[:class]}"))
end
end
end
......
......@@ -25,7 +25,7 @@
factory :project do
sequence(:name) { |n| "project#{n}" }
path { 'gitlabhq' }
path { name.downcase.gsub(/\s/, '_') }
creator
end
......@@ -34,6 +34,10 @@
issues_tracker_id { "project_name_in_redmine" }
end
factory :project_with_code, parent: :project do
path { 'gitlabhq' }
end
factory :group do
sequence(:name) { |n| "group#{n}" }
path { name.downcase.gsub(/\s/, '_') }
......
......@@ -7,7 +7,7 @@
let!(:project) { create(:project) }
let(:user) { create(:user, username: 'gfm') }
let(:commit) { CommitDecorator.decorate(Commit.new(project.repository.commit)) }
let(:commit) { project.repository.commit) }
let(:issue) { create(:issue, project: project) }
let(:merge_request) { create(:merge_request, project: project) }
let(:snippet) { create(:snippet, project: project) }
......
......@@ -3,35 +3,32 @@
describe Commit do
let(:commit) { create(:project).repository.commit }
describe CommitDecorator do
let(:decorator) { CommitDecorator.new(commit) }
describe '#title' do
it "returns no_commit_message when safe_message is blank" do
decorator.stub(:safe_message).and_return('')
decorator.title.should == "--no commit message"
end
describe '#title' do
it "returns no_commit_message when safe_message is blank" do
commit.stub(:safe_message).and_return('')
commit.title.should == "--no commit message"
end
it "truncates a message without a newline at 70 characters" do
message = commit.safe_message * 10
it "truncates a message without a newline at 70 characters" do
message = commit.safe_message * 10
decorator.stub(:safe_message).and_return(message)
decorator.title.should == "#{message[0..69]}&hellip;"
end
commit.stub(:safe_message).and_return(message)
commit.title.should == "#{message[0..69]}&hellip;"
end
it "truncates a message with a newline before 80 characters at the newline" do
message = commit.safe_message.split(" ").first
it "truncates a message with a newline before 80 characters at the newline" do
message = commit.safe_message.split(" ").first
decorator.stub(:safe_message).and_return(message + "\n" + message)
decorator.title.should == message
end
commit.stub(:safe_message).and_return(message + "\n" + message)
commit.title.should == message
end
it "truncates a message with a newline after 80 characters at 70 characters" do
message = (commit.safe_message * 10) + "\n"
it "truncates a message with a newline after 80 characters at 70 characters" do
message = (commit.safe_message * 10) + "\n"
decorator.stub(:safe_message).and_return(message)
decorator.title.should == "#{message[0..69]}&hellip;"
end
commit.stub(:safe_message).and_return(message)
commit.title.should == "#{message[0..69]}&hellip;"
end
end
......
......@@ -119,7 +119,7 @@
end
describe :update_merge_requests do
let(:project) { create(:project) }
let(:project) { create(:project_with_code) }
before do
@merge_request = create(:merge_request, project: project)
......@@ -187,11 +187,7 @@
let(:project) { create(:project) }
it "should return valid repo" do
project.repository.should be_kind_of(Gitlab::Git::Repository)
end
it "should return nil" do
Project.new(path: "empty").repository.should be_nil
project.repository.should be_kind_of(Repository)
end
end
......@@ -249,7 +245,7 @@
end
describe :open_branches do
let(:project) { create(:project) }
let(:project) { create(:project_with_code) }
before do
project.protected_branches.create(name: 'master')
......
......@@ -47,11 +47,7 @@
config.use_transactional_fixtures = false
config.before do
# Use tmp dir for FS manipulations
temp_repos_path = Rails.root.join('tmp', 'test-git-base-path')
Gitlab.config.gitlab_shell.stub(repos_path: temp_repos_path)
FileUtils.rm_rf temp_repos_path
FileUtils.mkdir_p temp_repos_path
TestEnv.init
end
end
end
......
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