diff options
Diffstat (limited to 'app/models')
-rw-r--r-- | app/models/event.rb | 10 | ||||
-rw-r--r-- | app/models/note.rb | 2 | ||||
-rw-r--r-- | app/models/project.rb | 47 | ||||
-rw-r--r-- | app/models/protected_branch.rb | 2 | ||||
-rw-r--r-- | app/models/repository.rb | 12 | ||||
-rw-r--r-- | app/models/team.rb | 73 | ||||
-rw-r--r-- | app/models/user.rb | 2 | ||||
-rw-r--r-- | app/models/users_project.rb | 49 |
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| |