def create
@group = Group.new(params[:group])
+ @group.path = @group.name.dup.parameterize if @group.name
@group.owner = current_user
if @group.save
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|
end
options = [
+ ["Global", [['/', Namespace.global_id]] ],
["Groups", groups.map {|g| [g.human_name, g.id]} ],
[ "Users", users.map {|u| [u.human_name, u.id]} ]
]
where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
end
+ def self.global_id
+ 'GLN'
+ end
+
def to_param
path
end
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
# 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
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
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
# 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
%h1= Project.count
%hr
= link_to 'New Project', new_project_path, class: "btn small"
+
+ = link_to 'New Group', new_admin_group_path, class: "btn small"
.span4
.ui-box
%h5 Users
%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
%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"
+
+ = 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
%b
Path:
%td
- = @group.path
+ %span.monospace= File.join(Gitlab.config.git_base_path, @group.path)
%tr
%td
%b
= 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"
- @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
= 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 & 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 & 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?
-%h3.page_title #{@admin_user.name} → Edit user
+%h3.page_title
+ #{@admin_user.name} →
+ %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|
- 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
%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}
%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")
- 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
end
def update_repository project
- config.update_project!(project.path, project)
+ config.update_project!(project)
end
def move_repository(old_repo, new_repo, project)
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|
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