summaryrefslogtreecommitdiff
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/event.rb10
-rw-r--r--app/models/note.rb2
-rw-r--r--app/models/project.rb47
-rw-r--r--app/models/protected_branch.rb2
-rw-r--r--app/models/repository.rb12
-rw-r--r--app/models/team.rb73
-rw-r--r--app/models/user.rb2
-rw-r--r--app/models/users_project.rb49
8 files changed, 116 insertions, 81 deletions
diff --git a/app/models/event.rb b/app/models/event.rb
index a737bfb0626..d0ba61544d1 100644
--- a/app/models/event.rb
+++ b/app/models/event.rb
@@ -204,7 +204,7 @@ class Event < ActiveRecord::Base
# Max 20 commits from push DESC
def commits
- @commits ||= data[:commits].map { |commit| project.commit(commit[:id]) }.reverse
+ @commits ||= data[:commits].map { |commit| repository.commit(commit[:id]) }.reverse
end
def commits_count
@@ -225,14 +225,18 @@ class Event < ActiveRecord::Base
end
end
+ def repository
+ project.repository
+ end
+
def parent_commit
- project.commit(commit_from)
+ repository.commit(commit_from)
rescue => ex
nil
end
def last_commit
- project.commit(commit_to)
+ repository.commit(commit_to)
rescue => ex
nil
end
diff --git a/app/models/note.rb b/app/models/note.rb
index 100f72b6eac..abd89a8a46e 100644
--- a/app/models/note.rb
+++ b/app/models/note.rb
@@ -71,7 +71,7 @@ class Note < ActiveRecord::Base
# override to return commits, which are not active record
def noteable
if for_commit?
- project.commit(commit_id)
+ project.repository.commit(commit_id)
else
super
end
diff --git a/app/models/project.rb b/app/models/project.rb
index f2ad390b5b6..850653988c9 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -166,7 +166,13 @@ class Project < ActiveRecord::Base
end
def repository
- @repository ||= Repository.new(path_with_namespace, default_branch)
+ if path
+ @repository ||= Repository.new(path_with_namespace, default_branch)
+ else
+ nil
+ end
+ rescue Grit::NoSuchPathError
+ nil
end
def git_error?
@@ -279,39 +285,6 @@ class Project < ActiveRecord::Base
users_projects.find_by_user_id(user_id)
end
- # Update multiple project users
- # to same access role by user ids
- def update_users_ids_to_role(users_ids, access_role)
- UsersProject.bulk_update(self, users_ids, access_role)
- end
-
- # Delete multiple users from project by user ids
- def delete_users_ids_from_team(users_ids)
- UsersProject.bulk_delete(self, users_ids)
- end
-
- def repository_readers
- repository_members[UsersProject::REPORTER]
- end
-
- def repository_writers
- repository_members[UsersProject::DEVELOPER]
- end
-
- def repository_masters
- repository_members[UsersProject::MASTER]
- end
-
- def repository_members
- keys = Hash.new {|h,k| h[k] = [] }
- UsersProject.select("keys.identifier, project_access").
- joins(user: :keys).where(project_id: id).
- each {|row| keys[row.project_access] << [row.identifier] }
-
- keys[UsersProject::REPORTER] += deploy_keys.pluck(:identifier)
- keys
- end
-
def transfer(new_namespace)
Project.transaction do
old_namespace = namespace
@@ -441,7 +414,7 @@ class Project < ActiveRecord::Base
#
def post_receive_data(oldrev, newrev, ref, user)
- push_commits = commits_between(oldrev, newrev)
+ push_commits = repository.commits_between(oldrev, newrev)
# Total commits count
push_commits_count = push_commits.size
@@ -488,7 +461,7 @@ class Project < ActiveRecord::Base
def update_merge_requests(oldrev, newrev, ref, user)
return true unless ref =~ /heads/
branch_name = ref.gsub("refs/heads/", "")
- c_ids = self.commits_between(oldrev, newrev).map(&:id)
+ c_ids = self.repository.commits_between(oldrev, newrev).map(&:id)
# Update code for merge requests
mrs = self.merge_requests.opened.find_all_by_branch(branch_name).all
@@ -510,7 +483,7 @@ class Project < ActiveRecord::Base
end
def empty_repo?
- !repository || repository.empty_repo?
+ !repository || repository.empty?
end
def satellite
diff --git a/app/models/protected_branch.rb b/app/models/protected_branch.rb
index f405a7bf7bc..3308caf360a 100644
--- a/app/models/protected_branch.rb
+++ b/app/models/protected_branch.rb
@@ -26,6 +26,6 @@ class ProtectedBranch < ActiveRecord::Base
end
def commit
- project.commit(self.name)
+ project.repository.commit(self.name)
end
end
diff --git a/app/models/repository.rb b/app/models/repository.rb
index a0351ce28c7..cf8ba4530a1 100644
--- a/app/models/repository.rb
+++ b/app/models/repository.rb
@@ -13,9 +13,11 @@ class Repository
attr_accessor :root_ref
def initialize(path_with_namespace, root_ref = 'master')
- @root_ref = root_ref
+ @root_ref = root_ref || "master"
@path_with_namespace = path_with_namespace
- @repo = Grit::Repo.new(path_to_repo)
+
+ # Init grit repo object
+ repo
end
def raw
@@ -26,6 +28,10 @@ class Repository
@path_to_repo ||= File.join(Gitlab.config.gitolite.repos_path, "#{path_with_namespace}.git")
end
+ def repo
+ @repo ||= Grit::Repo.new(path_to_repo)
+ end
+
def commit(commit_id = nil)
Commit.find_or_first(repo, commit_id, root_ref)
end
@@ -114,7 +120,7 @@ class Repository
false
end
- def empty_repo?
+ def empty?
!has_commits?
end
diff --git a/app/models/team.rb b/app/models/team.rb
index 894361d1273..f235d20ebdb 100644
--- a/app/models/team.rb
+++ b/app/models/team.rb
@@ -3,7 +3,22 @@ class Team
def initialize(project)
@project = project
- @roles = UsersProject.roles_hash
+ end
+
+ # Shortcut to add users
+ #
+ # Use:
+ # @team << [@user, :master]
+ # @team << [@users, :master]
+ #
+ def << args
+ users = args.first
+
+ if users.respond_to?(:each)
+ add_users(users, args.second)
+ else
+ add_user(users, args.second)
+ end
end
def add_user(user, access)
@@ -14,7 +29,7 @@ class Team
add_users_ids(users.map(&:id), access)
end
- def add_users_ids(users_ids, access)
+ def add_users_ids(user_ids, access)
UsersProject.add_users_into_projects(
[project.id],
user_ids,
@@ -46,4 +61,58 @@ class Team
def masters
members.masters.map(&:user)
end
+
+ def repository_readers
+ repository_members[UsersProject::REPORTER]
+ end
+
+ def repository_writers
+ repository_members[UsersProject::DEVELOPER]
+ end
+
+ def repository_masters
+ repository_members[UsersProject::MASTER]
+ end
+
+ def repository_members
+ keys = Hash.new {|h,k| h[k] = [] }
+ UsersProject.select("keys.identifier, project_access").
+ joins(user: :keys).where(project_id: project.id).
+ each {|row| keys[row.project_access] << [row.identifier] }
+
+ keys[UsersProject::REPORTER] += project.deploy_keys.pluck(:identifier)
+ keys
+ end
+
+ def import(source_project)
+ target_project = project
+
+ source_team = source_project.users_projects.all
+ target_team = target_project.users_projects.all
+ target_user_ids = target_team.map(&:user_id)
+
+ source_team.reject! do |tm|
+ # Skip if user already present in team
+ target_user_ids.include?(tm.user_id)
+ end
+
+ source_team.map! do |tm|
+ new_tm = tm.dup
+ new_tm.id = nil
+ new_tm.project_id = target_project.id
+ new_tm.skip_git = true
+ new_tm
+ end
+
+ UsersProject.transaction do
+ source_team.each do |tm|
+ tm.save
+ end
+ target_project.update_repository
+ end
+
+ true
+ rescue
+ false
+ end
end
diff --git a/app/models/user.rb b/app/models/user.rb
index d166ae4dc79..5e4815da865 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -188,7 +188,7 @@ class User < ActiveRecord::Base
# Team membership in personal projects
def tm_in_personal_projects
- personal_projects.users_projects.where(user_id: self.id)
+ UsersProject.where(project_id: personal_projects.map(&:id), user_id: self.id)
end
# Returns a string for use as a Gitolite user identifier
diff --git a/app/models/users_project.rb b/app/models/users_project.rb
index a8e14675cd7..450eb3d59fd 100644
--- a/app/models/users_project.rb
+++ b/app/models/users_project.rb
@@ -48,10 +48,23 @@ class UsersProject < ActiveRecord::Base
# access can be an integer representing a access code
# or symbol like :master representing role
#
+ # Ex.
+ # add_users_into_projects(
+ # project_ids,
+ # user_ids,
+ # UsersProject::MASTER
+ # )
+ #
+ # add_users_into_projects(
+ # project_ids,
+ # user_ids,
+ # :master
+ # )
+ #
def add_users_into_projects(project_ids, user_ids, access)
- project_access = if @roles.has_key?(access)
- @roles[access]
- elsif @roles.values.include?(access)
+ project_access = if roles_hash.has_key?(access)
+ roles_hash[access]
+ elsif roles_hash.values.include?(access.to_i)
access
else
raise "Non valid access"
@@ -93,36 +106,6 @@ class UsersProject < ActiveRecord::Base
truncate_teams [project.id]
end
- def import_team(source_project, target_project)
- source_team = source_project.users_projects.all
- target_team = target_project.users_projects.all
- target_user_ids = target_team.map(&:user_id)
-
- source_team.reject! do |tm|
- # Skip if user already present in team
- target_user_ids.include?(tm.user_id)
- end
-
- source_team.map! do |tm|
- new_tm = tm.dup
- new_tm.id = nil
- new_tm.project_id = target_project.id
- new_tm.skip_git = true
- new_tm
- end
-
- UsersProject.transaction do
- source_team.each do |tm|
- tm.save
- end
- target_project.update_repository
- end
-
- true
- rescue
- false
- end
-
def bulk_delete(project, user_ids)
UsersProject.transaction do
UsersProject.where(user_id: user_ids, project_id: project.id).each do |users_project|