From: Dmitriy Zaporozhets Date: Fri, 4 Jan 2013 06:43:25 +0000 (+0200) Subject: Continue refactoring. Use repostory and team X-Git-Tag: v4.1.0~150^2~7 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=dccd8b6eaa8b2e98b0245262a8e39df8fb8ae634;p=wvm%2Fgitlab.git Continue refactoring. Use repostory and team --- diff --git a/app/contexts/notes/load_context.rb b/app/contexts/notes/load_context.rb index 05626c31a..907c7c7ad 100644 --- a/app/contexts/notes/load_context.rb +++ b/app/contexts/notes/load_context.rb @@ -9,7 +9,7 @@ module Notes @notes = case target_type when "commit" - project.commit_notes(project.commit(target_id)).fresh.limit(20) + project.commit_notes(project.repository.commit(target_id)).fresh.limit(20) when "issue" project.issues.find(target_id).notes.inc_author.fresh.limit(20) when "merge_request" diff --git a/app/contexts/test_hook_context.rb b/app/contexts/test_hook_context.rb index cba5d1f87..d2d82a52c 100644 --- a/app/contexts/test_hook_context.rb +++ b/app/contexts/test_hook_context.rb @@ -1,7 +1,7 @@ class TestHookContext < BaseContext def execute hook = project.hooks.find(params[:id]) - commits = project.commits(project.default_branch, nil, 3) + commits = project.repository.commits(project.default_branch, nil, 3) data = project.post_receive_data(commits.last.id, commits.first.id, "refs/heads/#{project.default_branch}", current_user) hook.execute(data) end diff --git a/app/controllers/admin/projects_controller.rb b/app/controllers/admin/projects_controller.rb index e1982eee5..d5e6f3cdc 100644 --- a/app/controllers/admin/projects_controller.rb +++ b/app/controllers/admin/projects_controller.rb @@ -10,6 +10,7 @@ class Admin::ProjectsController < AdminController end def show + @repository = @project.repository @users = User.active @users = @users.not_in_project(@project) if @project.users.present? @users = @users.all @@ -19,7 +20,7 @@ class Admin::ProjectsController < AdminController end def team_update - @project.add_users_ids_to_team(params[:user_ids], params[:project_access]) + @project.team.add_users_ids(params[:user_ids], params[:project_access]) redirect_to [:admin, @project], notice: 'Project was successfully updated.' end @@ -36,7 +37,7 @@ class Admin::ProjectsController < AdminController def destroy # Delete team first in order to prevent multiple gitolite calls - @project.truncate_team + @project.team.truncate @project.destroy diff --git a/app/controllers/merge_requests_controller.rb b/app/controllers/merge_requests_controller.rb index fa4eaff84..d2d92e605 100644 --- a/app/controllers/merge_requests_controller.rb +++ b/app/controllers/merge_requests_controller.rb @@ -83,12 +83,12 @@ class MergeRequestsController < ProjectResourceController end def branch_from - @commit = project.commit(params[:ref]) + @commit = @repository.commit(params[:ref]) @commit = CommitDecorator.decorate(@commit) end def branch_to - @commit = project.commit(params[:ref]) + @commit = @repository.commit(params[:ref]) @commit = CommitDecorator.decorate(@commit) end diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 47143624e..0df30220e 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -2,6 +2,7 @@ require Rails.root.join('lib', 'gitlab', 'graph', 'json_builder') class ProjectsController < ProjectResourceController skip_before_filter :project, only: [:new, :create] + skip_before_filter :repository, only: [:new, :create] # Authorize before_filter :authorize_read_project!, except: [:index, :new, :create] @@ -58,7 +59,7 @@ class ProjectsController < ProjectResourceController respond_to do |format| format.html do - unless @project.empty_repo? + if @project.repository && !@project.repository.empty? @last_push = current_user.recent_push(@project.id) render :show else diff --git a/app/controllers/services_controller.rb b/app/controllers/services_controller.rb index 50f7e97af..d0df469b9 100644 --- a/app/controllers/services_controller.rb +++ b/app/controllers/services_controller.rb @@ -26,7 +26,7 @@ class ServicesController < ProjectResourceController end def test - commits = project.commits(project.default_branch, nil, 3) + commits = project.repository.commits(project.default_branch, nil, 3) data = project.post_receive_data(commits.last.id, commits.first.id, "refs/heads/#{project.default_branch}", current_user) @service = project.gitlab_ci_service diff --git a/app/controllers/team_members_controller.rb b/app/controllers/team_members_controller.rb index 311af62b8..8378a8458 100644 --- a/app/controllers/team_members_controller.rb +++ b/app/controllers/team_members_controller.rb @@ -16,10 +16,9 @@ class TeamMembersController < ProjectResourceController end def create - @project.add_users_ids_to_team( - params[:user_ids], - params[:project_access] - ) + users = User.where(id: params[:user_ids]) + + @project.team << [users, params[:project_access]] if params[:redirect_to] redirect_to params[:redirect_to] @@ -50,7 +49,7 @@ class TeamMembersController < ProjectResourceController def apply_import giver = Project.find(params[:source_project_id]) - status = UsersProject.import_team(giver, project) + status = @project.team.import(giver) notice = status ? "Succesfully imported" : "Import failed" redirect_to project_team_members_path(project), notice: notice diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 045929f9d..a1eea96be 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -53,7 +53,7 @@ module ApplicationHelper def last_commit(project) if project.repo_exists? - time_ago_in_words(project.commit.committed_date) + " ago" + time_ago_in_words(project.repository.commit.committed_date) + " ago" else "Never" end @@ -102,7 +102,7 @@ module ApplicationHelper ] project_nav = [] - if @project && !@project.new_record? + if @project && @project.repository && @project.repository.root_ref project_nav = [ { label: "#{@project.name} Issues", url: project_issues_path(@project) }, { label: "#{@project.name} Commits", url: project_commits_path(@project, @ref || @project.repository.root_ref) }, @@ -142,6 +142,7 @@ module ApplicationHelper event.last_push_to_non_root? && !event.rm_ref? && event.project && + event.project.repository && event.project.merge_requests_enabled end diff --git a/app/helpers/merge_requests_helper.rb b/app/helpers/merge_requests_helper.rb index f48425bd6..ca0a89c37 100644 --- a/app/helpers/merge_requests_helper.rb +++ b/app/helpers/merge_requests_helper.rb @@ -4,7 +4,7 @@ module MergeRequestsHelper event.project, merge_request: { source_branch: event.branch_name, - target_branch: event.project.root_ref, + target_branch: event.project.repository.root_ref, title: event.branch_name.titleize } ) diff --git a/app/models/event.rb b/app/models/event.rb index a737bfb06..d0ba61544 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 100f72b6e..abd89a8a4 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 f2ad390b5..850653988 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 f405a7bf7..3308caf36 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 a0351ce28..cf8ba4530 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 894361d12..f235d20eb 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 d166ae4dc..5e4815da8 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 a8e14675c..450eb3d59 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| diff --git a/app/views/admin/projects/_form.html.haml b/app/views/admin/projects/_form.html.haml index 27c22872d..534c42223 100644 --- a/app/views/admin/projects/_form.html.haml +++ b/app/views/admin/projects/_form.html.haml @@ -22,7 +22,7 @@ - if project.repo_exists? .clearfix = f.label :default_branch, "Default Branch" - .input= f.select(:default_branch, project.heads.map(&:name), {}, style: "width:210px;") + .input= f.select(:default_branch, repository.heads.map(&:name), {}, style: "width:210px;") %fieldset.adv_settings %legend Features: diff --git a/app/views/admin/projects/show.html.haml b/app/views/admin/projects/show.html.haml index ca9b9d3d4..1a4c57058 100644 --- a/app/views/admin/projects/show.html.haml +++ b/app/views/admin/projects/show.html.haml @@ -4,15 +4,15 @@ %i.icon-edit Edit -- if @project.has_commits? - - if !@project.has_post_receive_file? +- if @repository.has_commits? + - if !@repository.has_post_receive_file? %br .alert.alert-error %span %strong Project has commits but missing post-receive file. %br If you exported project manually - make a link of post-receive hook file from gitolite to project repository - - elsif !@project.valid_post_receive_file? + - elsif !@repository.valid_post_receive_file? %br .alert.alert-error %span @@ -76,7 +76,7 @@ %b FS Path: %td - %code= @project.path_to_repo + %code= @repository.path_to_repo %tr %td %b @@ -100,7 +100,7 @@ %b Post Receive File: %td - = check_box_tag :post_receive_file, 1, @project.has_post_receive_file?, disabled: true + = check_box_tag :post_receive_file, 1, @repository.has_post_receive_file?, disabled: true %br %h5 diff --git a/app/views/merge_requests/_form.html.haml b/app/views/merge_requests/_form.html.haml index 9606e2e53..37cde8122 100644 --- a/app/views/merge_requests/_form.html.haml +++ b/app/views/merge_requests/_form.html.haml @@ -13,7 +13,7 @@ .mr_branch_box %h5 From (Head Branch) .body - .padded= f.select(:source_branch, @project.heads.map(&:name), { include_blank: "Select branch" }, {class: 'chosen span4'}) + .padded= f.select(:source_branch, @repository.heads.map(&:name), { include_blank: "Select branch" }, {class: 'chosen span4'}) .mr_source_commit .span2 @@ -22,7 +22,7 @@ .mr_branch_box %h5 To (Base Branch) .body - .padded= f.select(:target_branch, @project.heads.map(&:name), { include_blank: "Select branch" }, {class: 'chosen span4'}) + .padded= f.select(:target_branch, @repository.heads.map(&:name), { include_blank: "Select branch" }, {class: 'chosen span4'}) .mr_target_commit %h4.cdark 2. Fill info diff --git a/app/views/projects/_form.html.haml b/app/views/projects/_form.html.haml index 7044d1f20..c8eacdc2a 100644 --- a/app/views/projects/_form.html.haml +++ b/app/views/projects/_form.html.haml @@ -15,13 +15,13 @@ = f.label :path do Repository .controls - = text_field_tag :ppath, @project.path_to_repo, class: "xxlarge", readonly: true + = text_field_tag :ppath, @repository.path_to_repo, class: "xxlarge", readonly: true - - unless @project.heads.empty? + - unless @repository.heads.empty? .clearfix = f.label :default_branch, "Default Branch" - .input= f.select(:default_branch, @project.heads.map(&:name), {}, style: "width:210px;") + .input= f.select(:default_branch, @repository.heads.map(&:name), {}, style: "width:210px;") %fieldset.features %legend Features: diff --git a/app/workers/post_receive.rb b/app/workers/post_receive.rb index 1414ed490..9e3f32f83 100644 --- a/app/workers/post_receive.rb +++ b/app/workers/post_receive.rb @@ -11,7 +11,7 @@ class PostReceive # Ignore push from non-gitlab users user = if identifier.eql? Gitlab.config.gitolite.admin_key - email = project.commit(newrev).author.email rescue nil + email = project.repository.commit(newrev).author.email rescue nil User.find_by_email(email) if email elsif /^[A-Z0-9._%a-z\-]+@(?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}$/.match(identifier) User.find_by_email(identifier) diff --git a/features/steps/admin/admin_groups.rb b/features/steps/admin/admin_groups.rb index 4cd071657..cbca2daa7 100644 --- a/features/steps/admin/admin_groups.rb +++ b/features/steps/admin/admin_groups.rb @@ -16,7 +16,7 @@ class AdminGroups < Spinach::FeatureSteps @project = create(:project, group: @group) @event = create(:closed_issue_event, project: @project) - @project.add_access current_user, :admin + @project.team << [current_user, :master] end And 'Create gitlab user "John"' do diff --git a/features/steps/dashboard/dashboard.rb b/features/steps/dashboard/dashboard.rb index 775a721f1..73e226737 100644 --- a/features/steps/dashboard/dashboard.rb +++ b/features/steps/dashboard/dashboard.rb @@ -61,7 +61,7 @@ class Dashboard < Spinach::FeatureSteps And 'I own project "Shop"' do @project = create :project, name: 'Shop' - @project.add_access(@user, :admin) + @project.team << [@user, :master] end And 'I have group with projects' do @@ -69,7 +69,7 @@ class Dashboard < Spinach::FeatureSteps @project = create(:project, group: @group) @event = create(:closed_issue_event, project: @project) - @project.add_access current_user, :admin + @project.team << [current_user, :master] end And 'project "Shop" has push event' do diff --git a/features/steps/dashboard/dashboard_issues.rb b/features/steps/dashboard/dashboard_issues.rb index 5ace88023..fcf4296ad 100644 --- a/features/steps/dashboard/dashboard_issues.rb +++ b/features/steps/dashboard/dashboard_issues.rb @@ -13,7 +13,7 @@ class DashboardIssues < Spinach::FeatureSteps And 'I have assigned issues' do project = create :project - project.add_access(@user, :read, :write) + project.team << [@user, :master] 2.times { create :issue, author: @user, assignee: @user, project: project } end diff --git a/features/steps/dashboard/dashboard_merge_requests.rb b/features/steps/dashboard/dashboard_merge_requests.rb index 485a4ccc1..7cfa8a13f 100644 --- a/features/steps/dashboard/dashboard_merge_requests.rb +++ b/features/steps/dashboard/dashboard_merge_requests.rb @@ -14,8 +14,8 @@ class DashboardMergeRequests < Spinach::FeatureSteps project1 = create :project project2 = create :project - project1.add_access(@user, :read, :write) - project2.add_access(@user, :read, :write) + project1.team << [@user, :master] + project2.team << [@user, :master] merge_request1 = create :merge_request, author: @user, project: project1 merge_request2 = create :merge_request, author: @user, project: project2 diff --git a/features/steps/dashboard/dashboard_search.rb b/features/steps/dashboard/dashboard_search.rb index a34c14d0c..9c8c87947 100644 --- a/features/steps/dashboard/dashboard_search.rb +++ b/features/steps/dashboard/dashboard_search.rb @@ -1,6 +1,7 @@ class DashboardSearch < Spinach::FeatureSteps include SharedAuthentication include SharedPaths + include SharedProject Given 'I search for "Sho"' do fill_in "dashboard_search", with: "Sho" @@ -11,11 +12,6 @@ class DashboardSearch < Spinach::FeatureSteps page.should have_link "Shop" end - And 'I own project "Shop"' do - @project = create(:project, :name => "Shop") - @project.add_access(@user, :admin) - end - Given 'I search for "Contibuting"' do fill_in "dashboard_search", with: "Contibuting" click_button "Search" diff --git a/features/steps/group/group.rb b/features/steps/group/group.rb index e3364f09e..04d8c874b 100644 --- a/features/steps/group/group.rb +++ b/features/steps/group/group.rb @@ -13,7 +13,7 @@ class Groups < Spinach::FeatureSteps @project = create(:project, group: @group) @event = create(:closed_issue_event, project: @project) - @project.add_access current_user, :admin + @project.team << [current_user, :master] end And 'I should see projects activity feed' do diff --git a/features/steps/project/project_team_management.rb b/features/steps/project/project_team_management.rb index 6bde0b64d..91b3ffeee 100644 --- a/features/steps/project/project_team_management.rb +++ b/features/steps/project/project_team_management.rb @@ -84,18 +84,18 @@ class ProjectTeamManagement < Spinach::FeatureSteps And '"Sam" is "Shop" developer' do user = User.find_by_name("Sam") project = Project.find_by_name("Shop") - project.add_access(user, :write) + project.team << [user, :developer] end Given 'I own project "Website"' do @project = create(:project, :name => "Website") - @project.add_access(@user, :admin) + @project.team << [@user, :master] end And '"Mike" is "Website" reporter' do user = User.find_by_name("Mike") project = Project.find_by_name("Website") - project.add_access(user, :read) + project.team << [user, :reporter] end And 'I click link "Import team from another project"' do diff --git a/features/steps/shared/paths.rb b/features/steps/shared/paths.rb index bd43ba6b3..22d1f3350 100644 --- a/features/steps/shared/paths.rb +++ b/features/steps/shared/paths.rb @@ -114,15 +114,15 @@ module SharedPaths end Given "I visit my project's files page" do - visit project_tree_path(@project, @project.root_ref) + visit project_tree_path(@project, root_ref) end Given "I visit my project's commits page" do - visit project_commits_path(@project, @project.root_ref, {limit: 5}) + visit project_commits_path(@project, root_ref, {limit: 5}) end Given "I visit my project's commits page for a specific path" do - visit project_commits_path(@project, @project.root_ref + "/app/models/project.rb", {limit: 5}) + visit project_commits_path(@project, root_ref + "/app/models/project.rb", {limit: 5}) end Given 'I visit my project\'s commits stats page' do @@ -174,7 +174,7 @@ module SharedPaths end Given 'I visit project commits page' do - visit project_commits_path(@project, @project.root_ref, {limit: 5}) + visit project_commits_path(@project, root_ref, {limit: 5}) end Given 'I visit project commits page for stable branch' do @@ -182,7 +182,7 @@ module SharedPaths end Given 'I visit project source page' do - visit project_tree_path(@project, @project.root_ref) + visit project_tree_path(@project, root_ref) end Given 'I visit blob file from repo' do @@ -240,4 +240,8 @@ module SharedPaths Given 'I visit project wiki page' do visit project_wiki_path(@project, :index) end + + def root_ref + @project.repository.root_ref + end end diff --git a/features/steps/shared/project.rb b/features/steps/shared/project.rb index dfc8ce9d9..12dae15ed 100644 --- a/features/steps/shared/project.rb +++ b/features/steps/shared/project.rb @@ -4,13 +4,13 @@ module SharedProject # Create a project without caring about what it's called And "I own a project" do @project = create(:project) - @project.add_access(@user, :admin) + @project.team << [@user, :master] end # Create a specific project called "Shop" And 'I own project "Shop"' do - @project = create(:project, :name => "Shop") - @project.add_access(@user, :admin) + @project = create(:project, name: "Shop") + @project.team << [@user, :master] end def current_project diff --git a/lib/gitlab/backend/gitolite_config.rb b/lib/gitlab/backend/gitolite_config.rb index a2bc4ca8d..10e527eac 100644 --- a/lib/gitlab/backend/gitolite_config.rb +++ b/lib/gitlab/backend/gitolite_config.rb @@ -82,7 +82,7 @@ module Gitlab end def destroy_project(project) - FileUtils.rm_rf(project.path_to_repo) + FileUtils.rm_rf(project.repository.path_to_repo) conf.rm_repo(project.path_with_namespace) end @@ -138,9 +138,9 @@ module Gitlab ::Gitolite::Config::Repo.new(repo_name) end - name_readers = project.repository_readers - name_writers = project.repository_writers - name_masters = project.repository_masters + name_readers = project.team.repository_readers + name_writers = project.team.repository_writers + name_masters = project.team.repository_masters pr_br = project.protected_branches.map(&:name).join("$ ") diff --git a/lib/gitlab/markdown.rb b/lib/gitlab/markdown.rb index 859184b6c..59249a229 100644 --- a/lib/gitlab/markdown.rb +++ b/lib/gitlab/markdown.rb @@ -170,7 +170,7 @@ module Gitlab end def reference_commit(identifier) - if @project.valid_repo? && commit = @project.commit(identifier) + if @project.valid_repo? && commit = @project.repository.commit(identifier) link_to(identifier, project_commit_path(@project, commit), html_options.merge(title: CommitDecorator.new(commit).link_title, class: "gfm gfm-commit #{html_options[:class]}")) end end diff --git a/lib/gitlab/satellite/merge_action.rb b/lib/gitlab/satellite/merge_action.rb index 832db6621..556a1e2d5 100644 --- a/lib/gitlab/satellite/merge_action.rb +++ b/lib/gitlab/satellite/merge_action.rb @@ -31,7 +31,7 @@ module Gitlab merge_repo.git.push({raise: true, timeout: true}, :origin, merge_request.target_branch) # remove source branch - if merge_request.should_remove_source_branch && !project.root_ref?(merge_request.source_branch) + if merge_request.should_remove_source_branch && !project.repository.root_ref?(merge_request.source_branch) # will raise CommandFailed when push fails merge_repo.git.push({raise: true, timeout: true}, :origin, ":#{merge_request.source_branch}") end diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e09797acd..8016c67ce 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -75,35 +75,19 @@ describe Project do end describe "Respond to" do - it { should respond_to(:public?) } - it { should respond_to(:private?) } it { should respond_to(:url_to_repo) } it { should respond_to(:path_to_repo) } it { should respond_to(:valid_repo?) } it { should respond_to(:repo_exists?) } # Repository Role - it { should respond_to(:tree) } - it { should respond_to(:root_ref) } - it { should respond_to(:repo) } - it { should respond_to(:tags) } - it { should respond_to(:commit) } - it { should respond_to(:commits) } - it { should respond_to(:commits_between) } - it { should respond_to(:commits_with_refs) } - it { should respond_to(:commits_since) } - it { should respond_to(:commits_between) } it { should respond_to(:satellite) } it { should respond_to(:update_repository) } it { should respond_to(:destroy_repository) } it { should respond_to(:archive_repo) } # Authority Role - it { should respond_to(:add_access) } it { should respond_to(:reset_access) } - it { should respond_to(:repository_writers) } - it { should respond_to(:repository_masters) } - it { should respond_to(:repository_readers) } it { should respond_to(:allow_read_for?) } it { should respond_to(:guest_access_for?) } it { should respond_to(:report_access_for?) } diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb new file mode 100644 index 000000000..160fed17e --- /dev/null +++ b/spec/models/repository_spec.rb @@ -0,0 +1,14 @@ +describe Repository do + describe "Respond to" do + it { should respond_to(:repo) } + it { should respond_to(:tree) } + it { should respond_to(:root_ref) } + it { should respond_to(:tags) } + it { should respond_to(:commit) } + it { should respond_to(:commits) } + it { should respond_to(:commits_between) } + it { should respond_to(:commits_with_refs) } + it { should respond_to(:commits_since) } + it { should respond_to(:commits_between) } + end +end diff --git a/spec/models/system_hook_spec.rb b/spec/models/system_hook_spec.rb index 7ae483a40..cc358a2ed 100644 --- a/spec/models/system_hook_spec.rb +++ b/spec/models/system_hook_spec.rb @@ -56,7 +56,7 @@ describe SystemHook do user = create(:user) project = create(:project) with_resque do - project.add_access(user, :admin) + project.team << [user, :master] end WebMock.should have_requested(:post, @system_hook.url).with(body: /user_add_to_team/).once end @@ -64,7 +64,7 @@ describe SystemHook do it "project_destroy hook" do user = create(:user) project = create(:project) - project.add_access(user, :admin) + project.team << [user, :master] with_resque do project.users_projects.clear end diff --git a/spec/models/team_spec.rb b/spec/models/team_spec.rb new file mode 100644 index 000000000..1e3c7f07c --- /dev/null +++ b/spec/models/team_spec.rb @@ -0,0 +1,12 @@ +describe Team do + describe "Respond to" do + it { should respond_to(:developers) } + it { should respond_to(:masters) } + it { should respond_to(:reporters) } + it { should respond_to(:guests) } + it { should respond_to(:repository_writers) } + it { should respond_to(:repository_masters) } + it { should respond_to(:repository_readers) } + end +end + diff --git a/spec/models/users_project_spec.rb b/spec/models/users_project_spec.rb index f85e21ff3..e8f5b647c 100644 --- a/spec/models/users_project_spec.rb +++ b/spec/models/users_project_spec.rb @@ -48,10 +48,10 @@ describe UsersProject do @user_1 = create :user @user_2 = create :user - @project_1.add_access @user_1, :write - @project_2.add_access @user_2, :read + @project_1.team << [ @user_1, :developer ] + @project_2.team << [ @user_2, :reporter ] - @status = UsersProject.import_team(@project_1, @project_2) + @status = @project_2.team.import(@project_1) end it { @status.should be_true } @@ -101,8 +101,8 @@ describe UsersProject do @user_1 = create :user @user_2 = create :user - @project_1.add_access @user_1, :write - @project_2.add_access @user_2, :read + @project_1.team << [ @user_1, :developer] + @project_2.team << [ @user_2, :reporter] UsersProject.truncate_teams([@project_1.id, @project_2.id]) end diff --git a/spec/requests/issues_spec.rb b/spec/requests/issues_spec.rb index 081410852..2e94ffd00 100644 --- a/spec/requests/issues_spec.rb +++ b/spec/requests/issues_spec.rb @@ -7,8 +7,7 @@ describe "Issues" do login_as :user user2 = create(:user) - project.add_access(@user, :read, :write) - project.add_access(user2, :read, :write) + project.team << [[@user, user2], :developer] end describe "Edit issue" do diff --git a/spec/requests/projects_spec.rb b/spec/requests/projects_spec.rb index ea87e35ed..8f613b458 100644 --- a/spec/requests/projects_spec.rb +++ b/spec/requests/projects_spec.rb @@ -6,7 +6,7 @@ describe "Projects" do describe "GET /projects/show" do before do @project = create(:project, namespace: @user.namespace) - @project.add_access(@user, :read) + @project.team << [@user, :reporter] visit project_path(@project) end @@ -19,7 +19,7 @@ describe "Projects" do describe "GET /projects/:id/edit" do before do @project = create(:project) - @project.add_access(@user, :admin, :read) + @project.team << [@user, :master] visit edit_project_path(@project) end @@ -38,7 +38,7 @@ describe "Projects" do describe "PUT /projects/:id" do before do @project = create(:project, namespace: @user.namespace) - @project.add_access(@user, :admin, :read) + @project.team << [@user, :master] visit edit_project_path(@project) @@ -59,7 +59,7 @@ describe "Projects" do describe "DELETE /projects/:id" do before do @project = create(:project, namespace: @user.namespace) - @project.add_access(@user, :read, :admin) + @project.team << [@user, :master] visit edit_project_path(@project) end diff --git a/spec/support/stubbed_repository.rb b/spec/support/stubbed_repository.rb index ad88dd77a..0e5628d05 100644 --- a/spec/support/stubbed_repository.rb +++ b/spec/support/stubbed_repository.rb @@ -1,18 +1,6 @@ # Stubs out all Git repository access done by models so that specs can run # against fake repositories without Grit complaining that they don't exist. class Project - def path_to_repo - if new_record? || path == 'newproject' - # There are a couple Project specs and features that expect the Project's - # path to be in the returned path, so let's patronize them. - Rails.root.join('tmp', 'repositories', path) - else - # For everything else, just give it the path to one of our real seeded - # repos. - Rails.root.join('tmp', 'repositories', 'gitlabhq') - end - end - def satellite FakeSatellite.new end @@ -27,3 +15,9 @@ class Project end end end + +class Repository + def repo + @repo ||= Grit::Repo.new(Rails.root.join('tmp', 'repositories', 'gitlabhq')) + end +end