Skip to content
Snippets Groups Projects
Commit f5551efd authored by Dmitriy Zaporozhets's avatar Dmitriy Zaporozhets
Browse files

Rewrite and improve git backend logic. Fix project movind. Raise exception to...

Rewrite and improve git backend logic. Fix project movind. Raise exception to prevent unexpected issues
parent 70bf7f6e
No related branches found
No related tags found
No related merge requests found
Showing
with 147 additions and 100 deletions
Loading
Loading
@@ -22,6 +22,7 @@ class Admin::GroupsController < AdminController
 
def create
@group = Group.new(params[:group])
@group.path = @group.name.dup.parameterize if @group.name
@group.owner = current_user
 
if @group.save
Loading
Loading
Loading
Loading
@@ -34,11 +34,16 @@ class ProjectsController < ProjectResourceController
end
 
def update
namespace_id = params[:project].delete(:namespace_id)
if namespace_id.present? and namespace_id.to_i != project.namespace_id
namespace = Namespace.find(namespace_id)
project.transfer(namespace)
if params[:project].has_key?(:namespace_id)
namespace_id = params[:project].delete(:namespace_id)
if namespace_id == Namespace.global_id and project.namespace.present?
# Transfer to global namespace from anyone
project.transfer(nil)
elsif namespace_id.present? and namespace_id.to_i != project.namespace_id
# Transfer to someone namespace
namespace = Namespace.find(namespace_id)
project.transfer(namespace)
end
end
 
respond_to do |format|
Loading
Loading
Loading
Loading
@@ -84,6 +84,7 @@ module ApplicationHelper
end
 
options = [
["Global", [['/', Namespace.global_id]] ],
["Groups", groups.map {|g| [g.human_name, g.id]} ],
[ "Users", users.map {|u| [u.human_name, u.id]} ]
]
Loading
Loading
Loading
Loading
@@ -35,6 +35,10 @@ class Namespace < ActiveRecord::Base
where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
end
 
def self.global_id
'GLN'
end
def to_param
path
end
Loading
Loading
@@ -51,6 +55,9 @@ class Namespace < ActiveRecord::Base
def move_dir
old_path = File.join(Gitlab.config.git_base_path, path_was)
new_path = File.join(Gitlab.config.git_base_path, path)
if File.exists?(new_path)
raise "Already exists"
end
system("mv #{old_path} #{new_path}")
end
 
Loading
Loading
Loading
Loading
@@ -111,12 +111,14 @@ class Project < ActiveRecord::Base
 
# Apply namespace if user has access to it
# else fallback to user namespace
project.namespace_id = user.namespace_id
if namespace_id
group = Group.find_by_id(namespace_id)
if user.can? :manage_group, group
project.namespace_id = namespace_id
if namespace_id != Namespace.global_id
project.namespace_id = user.namespace_id
if namespace_id
group = Group.find_by_id(namespace_id)
if user.can? :manage_group, group
project.namespace_id = namespace_id
end
end
end
 
Loading
Loading
@@ -254,12 +256,16 @@ class Project < ActiveRecord::Base
old_dir = old_namespace.try(:path) || ''
new_dir = new_namespace.try(:path) || ''
 
old_repo = File.join(old_dir, self.path)
git_host.move_repository(old_repo, self.path_with_namespace, self)
old_repo = if old_dir.present?
File.join(old_dir, self.path)
else
self.path
end
 
Gitlab::ProjectMover.new(self, old_dir, new_dir).execute
 
git_host.move_repository(old_repo, self.path_with_namespace, self)
save!
end
end
Loading
Loading
Loading
Loading
@@ -83,7 +83,7 @@ module Repository
end
 
def path_to_repo
File.join(Gitlab.config.git_base_path, namespace_dir, "#{path}.git")
File.join(Gitlab.config.git_base_path, "#{path_with_namespace}.git")
end
 
def namespace_dir
Loading
Loading
@@ -165,7 +165,7 @@ module Repository
 
# Build file path
file_name = self.path + "-" + commit.id.to_s + ".tar.gz"
storage_path = Rails.root.join("tmp", "repositories", self.path)
storage_path = Rails.root.join("tmp", "repositories", self.path_with_namespace)
file_path = File.join(storage_path, file_name)
 
# Put files into a directory before archiving
Loading
Loading
Loading
Loading
@@ -28,6 +28,8 @@
%h1= Project.count
%hr
= link_to 'New Project', new_project_path, class: "btn small"
&nbsp;
= link_to 'New Group', new_admin_group_path, class: "btn small"
.span4
.ui-box
%h5 Users
Loading
Loading
@@ -44,7 +46,7 @@
%hr
- @projects.each do |project|
%p
= link_to project.name, [:admin, project]
= link_to project.name_with_namespace, [:admin, project]
.span6
%h3 Latest users
%hr
Loading
Loading
%h3.page_title New Group
%br
= render 'form'
%hr
= form_for [:admin, @group] do |f|
- if @group.errors.any?
.alert-message.block-message.error
%span= @group.errors.full_messages.first
.clearfix
= f.label :name do
Group name is
.input
= f.text_field :name, placeholder: "Ex. OpenSource", class: "xxlarge left"
&nbsp;
= f.submit 'Create group', class: "btn primary"
%hr
.padded
%ul
%li Group is kind of directory for several projects
%li All created groups are private
%li People within a group see only projects they have access to
%li All projects of group will be stored in group directory
%li You will be able to move existing projects into group
Loading
Loading
@@ -22,7 +22,7 @@
%b
Path:
%td
= @group.path
%span.monospace= File.join(Gitlab.config.git_base_path, @group.path)
%tr
%td
%b
Loading
Loading
@@ -43,10 +43,14 @@
= link_to 'Remove from group', remove_project_admin_group_path(@group, project_id: project.id), confirm: 'Are you sure?', method: :delete, class: "btn danger small"
.clearfix
 
%br
%h3 Add new project
%br
= form_tag project_update_admin_group_path(@group), class: "bulk_import", method: :put do
= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'
.form-actions
= submit_tag 'Add', class: "btn primary"
%fieldset
%legend Move projects to group
.clearfix
= label_tag :project_ids do
Projects
.input
= select_tag :project_ids, options_from_collection_for_select(@projects , :id, :name_with_namespace), multiple: true, data: {placeholder: 'Select projects'}, class: 'chosen span5'
.form-actions
= submit_tag 'Add', class: "btn primary"
Loading
Loading
@@ -6,52 +6,42 @@
- @admin_user.errors.full_messages.each do |msg|
%li= msg
 
.row
.span7
.ui-box
%br
.clearfix
= f.label :name
.input
= f.text_field :name
%span.help-inline * required
.clearfix
= f.label :username
.input
= f.text_field :username
%span.help-inline * required
.clearfix
= f.label :email
.input
= f.text_field :email
%span.help-inline * required
%hr
-if f.object.new_record?
.clearfix
= f.label :force_random_password do
%span Generate random password
.input= f.check_box :force_random_password, {}, true, nil
%fieldset
%legend Account
.clearfix
= f.label :name
.input
= f.text_field :name, required: true
%span.help-inline * required
.clearfix
= f.label :username
.input
= f.text_field :username, required: true
%span.help-inline * required
.clearfix
= f.label :email
.input
= f.text_field :email, required: true
%span.help-inline * required
 
%div.password-fields
.clearfix
= f.label :password
.input= f.password_field :password, disabled: f.object.force_random_password
.clearfix
= f.label :password_confirmation
.input= f.password_field :password_confirmation, disabled: f.object.force_random_password
%hr
.clearfix
= f.label :skype
.input= f.text_field :skype
.clearfix
= f.label :linkedin
.input= f.text_field :linkedin
.clearfix
= f.label :twitter
.input= f.text_field :twitter
.span5
.ui-box
%br
%fieldset
%legend Password
.clearfix
= f.label :password
.input= f.password_field :password, disabled: f.object.force_random_password
.clearfix
= f.label :password_confirmation
.input= f.password_field :password_confirmation, disabled: f.object.force_random_password
-if f.object.new_record?
.clearfix
= f.label :force_random_password do
%span Generate random password
.input= f.check_box :force_random_password, {}, true, nil
%fieldset
%legend Access
.row
.span8
.clearfix
= f.label :projects_limit
.input= f.number_field :projects_limit
Loading
Loading
@@ -60,23 +50,27 @@
= f.label :admin do
%strong.cred Administrator
.input= f.check_box :admin
.span4
- unless @admin_user.new_record?
%hr
.padded.cred
.alert.alert-error
- if @admin_user.blocked
%span
This user is blocked and is not able to login to GitLab
.clearfix
= link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn small right"
%p This user is blocked and is not able to login to GitLab
= link_to 'Unblock User', unblock_admin_user_path(@admin_user), method: :put, class: "btn small"
- else
%span
Blocked users will be removed from all projects &amp; will not be able to login to GitLab.
.clearfix
= link_to 'Block User', block_admin_user_path(@admin_user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn small right danger"
%p Blocked users will be removed from all projects &amp; will not be able to login to GitLab.
= link_to 'Block User', block_admin_user_path(@admin_user), confirm: 'USER WILL BE BLOCKED! Are you sure?', method: :put, class: "btn small danger"
%fieldset
%legend Profile
.clearfix
= f.label :skype
.input= f.text_field :skype
.clearfix
= f.label :linkedin
.input= f.text_field :linkedin
.clearfix
= f.label :twitter
.input= f.text_field :twitter
 
.row
.span6
.span6
.actions
= f.submit 'Save', class: "btn save-btn"
- if @admin_user.new_record?
Loading
Loading
%h3.page_title #{@admin_user.name} &rarr; Edit user
%h3.page_title
#{@admin_user.name} &rarr;
%i.icon-edit
Edit user
%hr
= render 'form'
%h3.page_title New user
%br
%h3.page_title
%i.icon-plus
New user
%hr
= render 'form'
xml.instruct!
xml.feed "xmlns" => "http://www.w3.org/2005/Atom", "xmlns:media" => "http://search.yahoo.com/mrss/" do
xml.title "#{@user.name} issues"
xml.link :href => dashboard_issues_url(:atom, :private_token => @user.private_token), :rel => "self", :type => "application/atom+xml"
xml.link :href => dashboard_issues_url(:private_token => @user.private_token), :rel => "alternate", :type => "text/html"
xml.id dashboard_issues_url(:private_token => @user.private_token)
xml.title "#{current_user.name} issues"
xml.link :href => dashboard_issues_url(:atom, :private_token => current_user.private_token), :rel => "self", :type => "application/atom+xml"
xml.link :href => dashboard_issues_url(:private_token => current_user.private_token), :rel => "alternate", :type => "text/html"
xml.id dashboard_issues_url(:private_token => current_user.private_token)
xml.updated @issues.first.created_at.strftime("%Y-%m-%dT%H:%M:%SZ") if @issues.any?
 
@issues.each do |issue|
Loading
Loading
- if event.allowed?
%div.event-item
= event_image(event)
= image_tag gravatar_icon(event.author_email), class: "avatar"
= image_tag gravatar_icon(event.author_email), class: "avatar s24"
 
- if event.push?
= render "events/event/push", event: event
Loading
Loading
Loading
Loading
@@ -20,7 +20,7 @@
%td{style: "font-size: 0px;", width: "20"}
\
%td{align: "left", style: "padding: 18px 0 10px;", width: "580"}
%h1{style: "color: #BBBBBB; font: normal 32px Helvetica, Arial, sans-serif; margin: 0; padding: 0; line-height: 40px;"}
%h1{style: "color: #BBBBBB; font: normal 22px Helvetica, Arial, sans-serif; margin: 0; padding: 0; line-height: 32px;"}
GITLAB
- if @project
| #{@project.name}
Loading
Loading
Loading
Loading
@@ -23,7 +23,7 @@
%tr
%td
= link_to project do
%strong.term= project.name
%strong.term= project.name_with_namespace
%small.cgray
last activity at
= project.last_activity_date.stamp("Aug 25, 2011")
Loading
Loading
- if current_user.require_ssh_key?
%p.error_message
You won't be able to pull or push project code until you #{link_to 'add an SSH key', new_key_path} to your profile
You won't be able to pull or push project code via SSH until you #{link_to 'add an SSH key', new_key_path} to your profile
Loading
Loading
@@ -23,7 +23,7 @@ module Gitlab
end
 
def update_repository project
config.update_project!(project.path, project)
config.update_project!(project)
end
 
def move_repository(old_repo, new_repo, project)
Loading
Loading
Loading
Loading
@@ -109,18 +109,18 @@ module Gitlab
end
 
# update or create
def update_project(repo_name, project)
def update_project(project)
repo = update_project_config(project, conf)
conf.add_repo(repo, true)
end
 
def update_project!(repo_name, project)
def update_project!( project)
apply do |config|
config.update_project(repo_name, project)
config.update_project(project)
end
end
 
# Updates many projects and uses project.path as the repo path
# Updates many projects and uses project.path_with_namespace as the repo path
# An order of magnitude faster than update_project
def update_projects(projects)
projects.each do |project|
Loading
Loading
Loading
Loading
@@ -21,6 +21,10 @@ module Gitlab
old_path = File.join(Gitlab.config.git_base_path, old_dir, "#{project.path}.git")
new_path = File.join(new_dir_path, "#{project.path}.git")
 
if File.exists? new_path
raise ProjectMoveError.new("Destination #{new_path} already exists")
end
if system("mv #{old_path} #{new_path}")
log_info "Project #{project.name} was moved from #{old_path} to #{new_path}"
true
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment