OSDN Git Service

Create dir with namespace. Create namespace with user
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Fri, 23 Nov 2012 06:11:09 +0000 (09:11 +0300)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Fri, 23 Nov 2012 06:11:09 +0000 (09:11 +0300)
app/models/namespace.rb
app/models/project.rb
app/models/user.rb
app/observers/user_observer.rb
app/views/admin/users/_form.html.haml
app/views/projects/_new_form.html.haml

index 120dac1..2471153 100644 (file)
@@ -10,6 +10,8 @@ class Namespace < ActiveRecord::Base
 
   delegate :name, to: :owner, allow_nil: true, prefix: true
 
+  after_save :ensure_dir_exist
+
   scope :root, where('type IS NULL')
 
   def self.search query
@@ -23,4 +25,9 @@ class Namespace < ActiveRecord::Base
   def human_name
     owner_name
   end
+
+  def ensure_dir_exist
+    namespace_dir_path = File.join(Gitlab.config.git_base_path, code)
+    Dir.mkdir(namespace_dir_path) unless File.exists?(namespace_dir_path)
+  end
 end
index 7575212..0ffa76c 100644 (file)
@@ -67,6 +67,7 @@ class Project < ActiveRecord::Base
                       message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
   validates :issues_enabled, :wall_enabled, :merge_requests_enabled,
             :wiki_enabled, inclusion: { in: [true, false] }
+
   validate :check_limit, :repo_name
 
   # Scopes
@@ -89,6 +90,12 @@ class Project < ActiveRecord::Base
       project = Project.new params
 
       Project.transaction do
+
+        # Build gitlab-hq code from GitLab HQ name
+        #
+        slug = project.name.dup.parameterize
+        project.code = project.path = slug
+
         project.owner = user
         project.namespace_id = namespace_id
         project.save!
index cd1dd20..b50fe3b 100644 (file)
@@ -63,11 +63,14 @@ class User < ActiveRecord::Base
   validates :bio, length: { within: 0..255 }
   validates :extern_uid, :allow_blank => true, :uniqueness => {:scope => :provider}
   validates :projects_limit, presence: true, numericality: {greater_than_or_equal_to: 0}
+  validates :username, presence: true
 
   before_validation :generate_password, on: :create
   before_save :ensure_authentication_token
   alias_attribute :private_token, :authentication_token
 
+  delegate :code, to: :namespace, allow_nil: true, prefix: true
+
   # Scopes
   scope :not_in_project, ->(project) { where("id not in (:ids)", ids: project.users.map(&:id) ) }
   scope :admins, where(admin:  true)
@@ -122,4 +125,8 @@ class User < ActiveRecord::Base
     namespaces = namespaces + Group.all if admin
     namespaces
   end
+
+  def several_namespaces?
+    namespaces.size > 1
+  end
 end
index 3834123..e96ba28 100644 (file)
@@ -1,5 +1,7 @@
 class UserObserver < ActiveRecord::Observer
   def after_create(user)
+    user.create_namespace(code: user.username, name: user.name)
+
     log_info("User \"#{user.name}\" (#{user.email}) was created")
 
     Notify.new_user_email(user.id, user.password).deliver
@@ -10,7 +12,7 @@ class UserObserver < ActiveRecord::Observer
   end
 
   def after_save user
-    if user.username_changed?
+    if user.username_changed? and user.namespace
       user.namespace.update_attributes(code: user.username)
     end
   end
index 7010c27..3123985 100644 (file)
               = 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
               = f.label :force_random_password do
                 %span Generate random password
               .input= f.check_box :force_random_password, {}, true, nil
-          
+
           %div.password-fields
             .clearfix
               = f.label :password
-              .input= f.password_field :password, disabled: f.object.force_random_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
index 978352e..ae7b051 100644 (file)
@@ -9,27 +9,12 @@
       = f.text_field :name, placeholder: "Example Project", class: "xxlarge"
       = f.submit 'Create project', class: "btn primary project-submit"
 
-  %hr
-  %div.adv_settings
-    %h6 Advanced settings:
-    - if current_user.namespaces.size > 1
-      .clearfix
-        = f.label :namespace_id do
-          Namespace
-        .input
-          = f.select :namespace_id, namespaces_options, {}, {class: 'chosen'}
-    .clearfix
-      = f.label :path do
-        Git Clone
-      .input
-        .input-prepend
-          %span.add-on= Gitlab.config.ssh_path
-          = f.text_field :path, placeholder: "example_project", disabled: !@project.new_record?
-          %span.add-on= ".git"
+  - if current_user.several_namespaces?
     .clearfix
-      = f.label :code do
-        URL
+      = f.label :namespace_id do
+        %span.cgray Namespace
       .input
-        .input-prepend
-          %span.add-on= web_app_url
-          = f.text_field :code, placeholder: "example"
+        = f.select :namespace_id, namespaces_options, {}, {class: 'chosen'}
+  %hr
+  %p.padded
+    All created project are private. You choose who can see project and commit to repository.