Commit dccd8b6e authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Continue refactoring. Use repostory and team

parent c264e028f9a7
......@@ -9,7 +9,7 @@ def execute
@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"
......
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
......
......@@ -10,6 +10,7 @@ def index
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 @@ def edit
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 @@ def update
def destroy
# Delete team first in order to prevent multiple gitolite calls
@project.truncate_team
@project.team.truncate
@project.destroy
......
......@@ -83,12 +83,12 @@ def automerge
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
......
......@@ -2,6 +2,7 @@
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 @@ def show
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
......
......@@ -26,7 +26,7 @@ def update
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
......
......@@ -16,10 +16,9 @@ def new
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 @@ def destroy
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
......
......@@ -53,7 +53,7 @@ def web_app_url
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 @@ def search_autocomplete_source
]
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 @@ def show_last_push_widget?(event)
event.last_push_to_non_root? &&
!event.rm_ref? &&
event.project &&
event.project.repository &&
event.project.merge_requests_enabled
end
......
......@@ -4,7 +4,7 @@ def new_mr_path_from_push_event(event)
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
}
)
......
......@@ -204,7 +204,7 @@ def tag_name
# 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 @@ def push_action_name
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
......
......@@ -71,7 +71,7 @@ def notify_author
# 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
......
......@@ -166,7 +166,13 @@ def team
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 @@ def team_member_by_id(user_id)
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 @@ def execute_services(data)
#
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 @@ def post_receive_data(oldrev, newrev, ref, user)
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 @@ def valid_repo?
end
def empty_repo?
!repository || repository.empty_repo?
!repository || repository.empty?
end
def satellite
......
......@@ -26,6 +26,6 @@ def update_repository
end
def commit
project.commit(self.name)
project.repository.commit(self.name)
end
end
......@@ -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 @@ def path_to_repo
@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 @@ def has_commits?
false
end
def empty_repo?
def empty?
!has_commits?
end
......
......@@ -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 @@ def add_users(users, access)
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 @@ def developers
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
......@@ -188,7 +188,7 @@ def owned_projects
# 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
......
......@@ -48,10 +48,23 @@ class << self
# 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 @@ def truncate_team project
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|
......
......@@ -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:
......
......@@ -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
......
......@@ -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
......
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