OSDN Git Service

Deprecate code for Project. Use title and path
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Fri, 23 Nov 2012 18:11:09 +0000 (21:11 +0300)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Fri, 23 Nov 2012 18:11:09 +0000 (21:11 +0300)
22 files changed:
app/controllers/admin/projects_controller.rb
app/controllers/application_controller.rb
app/models/namespace.rb
app/models/project.rb
app/models/user.rb
app/observers/project_observer.rb
app/roles/push_observer.rb
app/roles/repository.rb
app/views/admin/dashboard/index.html.haml
app/views/admin/groups/_form.html.haml
app/views/admin/projects/_form.html.haml
app/views/projects/_form.html.haml
db/fixtures/development/001_admin.rb
db/fixtures/development/003_users.rb
db/fixtures/production/001_admin.rb
db/migrate/20121123164910_rename_code_to_path.rb [new file with mode: 0644]
db/schema.rb
lib/api/helpers.rb
lib/gitlab/auth.rb
spec/factories.rb
spec/observers/user_observer_spec.rb
spec/routing/admin_routing_spec.rb

index 418ed4a..c10fa72 100644 (file)
@@ -5,7 +5,7 @@ class Admin::ProjectsController < AdminController
     @projects = Project.scoped
     @projects = @projects.where(namespace_id: params[:namespace_id]) if params[:namespace_id].present?
     @projects = @projects.search(params[:name]) if params[:name].present?
-    @projects = @projects.includes(:namespace).order("namespaces.code, projects.name ASC").page(params[:page]).per(20)
+    @projects = @projects.includes(:namespace).order("namespaces.path, projects.name ASC").page(params[:page]).per(20)
   end
 
   def show
index 3062b59..847523d 100644 (file)
@@ -66,7 +66,7 @@ class ApplicationController < ActionController::Base
     id = params[:project_id] || params[:id]
     id = id.split("/") if id.include?("/")
 
-    @project ||= current_user.projects.find_by_code(id)
+    @project ||= current_user.projects.find_by_path(id)
     @project || render_404
   end
 
index 2471153..4f53655 100644 (file)
@@ -1,11 +1,13 @@
 class Namespace < ActiveRecord::Base
-  attr_accessible :code, :name, :owner_id
+  attr_accessible :name, :path
 
-  has_many :projects
+  has_many :projects, dependent: :destroy
   belongs_to :owner, class_name: "User"
 
   validates :name, presence: true, uniqueness: true
-  validates :code, presence: true, uniqueness: true
+  validates :path, uniqueness: true, presence: true, length: { within: 1..255 },
+            format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
+                      message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
   validates :owner, presence: true
 
   delegate :name, to: :owner, allow_nil: true, prefix: true
@@ -15,11 +17,11 @@ class Namespace < ActiveRecord::Base
   scope :root, where('type IS NULL')
 
   def self.search query
-    where("name LIKE :query OR code LIKE :query", query: "%#{query}%")
+    where("name LIKE :query OR path LIKE :query", query: "%#{query}%")
   end
 
   def to_param
-    code
+    path
   end
 
   def human_name
@@ -27,7 +29,7 @@ class Namespace < ActiveRecord::Base
   end
 
   def ensure_dir_exist
-    namespace_dir_path = File.join(Gitlab.config.git_base_path, code)
+    namespace_dir_path = File.join(Gitlab.config.git_base_path, path)
     Dir.mkdir(namespace_dir_path) unless File.exists?(namespace_dir_path)
   end
 end
index 0ffa76c..2de5b2f 100644 (file)
@@ -27,7 +27,7 @@ class Project < ActiveRecord::Base
   include Authority
   include Team
 
-  attr_accessible :name, :path, :description, :code, :default_branch, :issues_enabled,
+  attr_accessible :name, :path, :description, :default_branch, :issues_enabled,
                   :wall_enabled, :merge_requests_enabled, :wiki_enabled, as: [:default, :admin]
 
   attr_accessible :namespace_id, as: :admin
@@ -58,16 +58,16 @@ class Project < ActiveRecord::Base
   # Validations
   validates :owner, presence: true
   validates :description, length: { within: 0..2000 }
-  validates :name, uniqueness: true, presence: true, length: { within: 0..255 }
-  validates :path, uniqueness: true, presence: true, length: { within: 0..255 },
-            format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
-                      message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
-  validates :code, presence: true, uniqueness: true, length: { within: 1..255 },
+  validates :name, presence: true, length: { within: 0..255 }
+  validates :path, presence: true, length: { within: 0..255 },
             format: { with: /\A[a-zA-Z][a-zA-Z0-9_\-\.]*\z/,
                       message: "only letters, digits & '_' '-' '.' allowed. Letter should be first" }
   validates :issues_enabled, :wall_enabled, :merge_requests_enabled,
             :wiki_enabled, inclusion: { in: [true, false] }
 
+  validates_uniqueness_of :name, scope: :namespace_id
+  validates_uniqueness_of :path, scope: :namespace_id
+
   validate :check_limit, :repo_name
 
   # Scopes
@@ -81,20 +81,23 @@ class Project < ActiveRecord::Base
     end
 
     def search query
-      where("projects.name LIKE :query OR projects.code LIKE :query OR projects.path LIKE :query", query: "%#{query}%")
+      where("projects.name LIKE :query OR projects.path LIKE :query", query: "%#{query}%")
     end
 
     def create_by_user(params, user)
-      namespace_id = params.delete(:namespace_id) || namespace.try(:id)
+      namespace_id = params.delete(:namespace_id)
+      namespace_id ||= current_user.namespace_id
 
       project = Project.new params
 
       Project.transaction do
 
-        # Build gitlab-hq code from GitLab HQ name
+        # Parametrize path for project
         #
-        slug = project.name.dup.parameterize
-        project.code = project.path = slug
+        # Ex.
+        #  'GitLab HQ'.parameterize => "gitlab-hq"
+        #
+        project.path = project.name.dup.parameterize
 
         project.owner = user
         project.namespace_id = namespace_id
@@ -149,14 +152,14 @@ class Project < ActiveRecord::Base
 
   def to_param
     if namespace
-      namespace.code + "/" + code
+      namespace.path + "/" + path
     else
-      code
+      path
     end
   end
 
   def web_url
-    [Gitlab.config.url, code].join("/")
+    [Gitlab.config.url, path].join("/")
   end
 
   def common_notes
@@ -213,7 +216,7 @@ class Project < ActiveRecord::Base
 
   def path_with_namespace
     if namespace
-      namespace.code + '/' + path
+      namespace.path + '/' + path
     else
       path
     end
index b50fe3b..20a5c47 100644 (file)
@@ -69,7 +69,8 @@ class User < ActiveRecord::Base
   before_save :ensure_authentication_token
   alias_attribute :private_token, :authentication_token
 
-  delegate :code, to: :namespace, allow_nil: true, prefix: true
+  delegate :path, to: :namespace, allow_nil: true, prefix: true
+  delegate :id, to: :namespace, allow_nil: true, prefix: true
 
   # Scopes
   scope :not_in_project, ->(project) { where("id not in (:ids)", ids: project.users.map(&:id) ) }
@@ -121,7 +122,7 @@ class User < ActiveRecord::Base
 
   def namespaces
     namespaces = []
-    namespaces << self.namespace
+    namespaces << self.namespace if self.namespace
     namespaces = namespaces + Group.all if admin
     namespaces
   end
index 16457e0..6d92562 100644 (file)
@@ -1,15 +1,13 @@
 class ProjectObserver < ActiveRecord::Observer
-  def before_save(project)
+  def after_save(project)
+    project.update_repository
+
     # Move repository if namespace changed
     if project.namespace_id_changed? and not project.new_record?
       move_project(project)
     end
   end
 
-  def after_save(project)
-    project.update_repository
-  end
-
   def after_destroy(project)
     log_info("Project \"#{project.name}\" was removed")
 
@@ -27,8 +25,8 @@ class ProjectObserver < ActiveRecord::Observer
   end
 
   def move_project(project)
-    old_dir = Namespace.find_by_id(project.namespace_id_was).try(:code) || ''
-    new_dir = Namespace.find_by_id(project.namespace_id).try(:code) || ''
+    old_dir = Namespace.find_by_id(project.namespace_id_was).try(:path) || ''
+    new_dir = Namespace.find_by_id(project.namespace_id).try(:path) || ''
 
     # Create new dir if missing
     new_dir_path = File.join(Gitlab.config.git_base_path, new_dir)
index 2ee6064..c5c5203 100644 (file)
@@ -114,7 +114,7 @@ module PushObserver
         id: commit.id,
         message: commit.safe_message,
         timestamp: commit.date.xmlschema,
-        url: "#{Gitlab.config.url}/#{code}/commits/#{commit.id}",
+        url: "#{Gitlab.config.url}/#{path}/commits/#{commit.id}",
         author: {
           name: commit.author_name,
           email: commit.author_email
index e49761b..ba61aa4 100644 (file)
@@ -87,7 +87,7 @@ module Repository
   end
 
   def namespace_dir
-    namespace.try(:code) || ''
+    namespace.try(:path) || ''
   end
 
   def update_repository
@@ -164,12 +164,12 @@ module Repository
     return nil unless commit
 
     # Build file path
-    file_name = self.code + "-" + commit.id.to_s + ".tar.gz"
-    storage_path = Rails.root.join("tmp", "repositories", self.code)
+    file_name = self.path + "-" + commit.id.to_s + ".tar.gz"
+    storage_path = Rails.root.join("tmp", "repositories", self.path)
     file_path = File.join(storage_path, file_name)
 
     # Put files into a directory before archiving
-    prefix = self.code + "/"
+    prefix = self.path + "/"
 
     # Create file if not exists
     unless File.exists?(file_path)
index b0b59a4..ad8d9f0 100644 (file)
@@ -27,7 +27,7 @@
         = link_to admin_projects_path do
           %h1= Project.count
         %hr
-        = link_to 'New Project', new_admin_project_path, class: "btn small"
+        = link_to 'New Project', new_project_path, class: "btn small"
   .span4
     .ui-box
       %h5 Users
index e85cce6..40d361b 100644 (file)
@@ -8,12 +8,12 @@
     .input
       = f.text_field :name, placeholder: "Example Group", class: "xxlarge"
   .clearfix
-    = f.label :code do
+    = f.label :path do
       URL
     .input
       .input-prepend
         %span.add-on= web_app_url + 'groups/'
-        = f.text_field :code, placeholder: "example"
+        = f.text_field :path, placeholder: "example"
 
   .form-actions
     = f.submit 'Save group', class: "btn save-btn"
index a238d93..eb12c61 100644 (file)
         Path
       .input
         = text_field_tag :ppath, @project.path_to_repo, class: "xlarge", disabled: true
-    .clearfix
-      = f.label :code do
-        URL
-      .input
-        .input-prepend
-          %span.add-on= web_app_url
-          = f.text_field :code, placeholder: "example"
 
     - unless project.new_record?
       .clearfix
index 9ee6594..68b9e78 100644 (file)
         .input-prepend
           %strong
             = text_field_tag :ppath, @project.path_to_repo, class: "xlarge", disabled: true
-    .clearfix
-      = f.label :code do
-        URL
-      .input
-        .input-prepend
-          %span.add-on= web_app_url
-          = f.text_field :code, placeholder: "example"
 
     - unless @project.new_record? || @project.heads.empty?
       .clearfix
index c857f6b..51939e8 100644 (file)
@@ -1,9 +1,10 @@
 unless User.count > 0
   admin = User.create(
-    :email => "admin@local.host",
-    :name => "Administrator",
-    :password => "5iveL!fe",
-    :password_confirmation => "5iveL!fe"
+    email: "admin@local.host",
+    name: "Administrator",
+    username: 'root',
+    password: "5iveL!fe",
+    password_confirmation: "5iveL!fe"
   )
 
   admin.projects_limit = 10000
index 309eb90..25705f1 100644 (file)
@@ -1,11 +1,11 @@
 User.seed(:id, [
-  { :id => 2, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
-  { :id => 3, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
-  { :id => 4, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
-  { :id => 5, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
-  { :id => 6, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
-  { :id => 7, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
-  { :id => 8, :name => Faker::Internet.user_name, :email => Faker::Internet.email},
-  { :id => 9, :name => Faker::Internet.user_name, :email => Faker::Internet.email}
+  { id: 2, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
+  { id: 3, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
+  { id: 4, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
+  { id: 5, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
+  { id: 6, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
+  { id: 7, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
+  { id: 8, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email},
+  { id: 9, username: Faker::Internet.user_name, name: Faker::Name.name, email: Faker::Internet.email}
 ])
 
index cfff6bf..f119694 100644 (file)
@@ -1,8 +1,9 @@
 admin = User.create(
-  :email => "admin@local.host",
-  :name => "Administrator",
-  :password => "5iveL!fe",
-  :password_confirmation => "5iveL!fe"
+  email: "admin@local.host",
+  name: "Administrator",
+  username: 'root',
+  password: "5iveL!fe",
+  password_confirmation: "5iveL!fe"
 )
 
 admin.projects_limit = 10000
diff --git a/db/migrate/20121123164910_rename_code_to_path.rb b/db/migrate/20121123164910_rename_code_to_path.rb
new file mode 100644 (file)
index 0000000..fb10baf
--- /dev/null
@@ -0,0 +1,11 @@
+class RenameCodeToPath < ActiveRecord::Migration
+  def up
+    remove_column :projects, :code
+    rename_column :namespaces, :code, :path
+  end
+
+  def down
+    add_column :projects, :code, :string
+    rename_column :namespaces, :path, :code
+  end
+end
index 8ce3df0..32dafed 100644 (file)
@@ -11,7 +11,7 @@
 #
 # It's strongly recommended to check this file into your version control system.
 
-ActiveRecord::Schema.define(:version => 20121123104937) do
+ActiveRecord::Schema.define(:version => 20121123164910) do
 
   create_table "events", :force => true do |t|
     t.string   "target_type"
@@ -82,7 +82,7 @@ ActiveRecord::Schema.define(:version => 20121123104937) do
 
   create_table "namespaces", :force => true do |t|
     t.string   "name",       :null => false
-    t.string   "code",       :null => false
+    t.string   "path",       :null => false
     t.integer  "owner_id",   :null => false
     t.datetime "created_at", :null => false
     t.datetime "updated_at", :null => false
@@ -111,7 +111,6 @@ ActiveRecord::Schema.define(:version => 20121123104937) do
     t.datetime "created_at",                               :null => false
     t.datetime "updated_at",                               :null => false
     t.boolean  "private_flag",           :default => true, :null => false
-    t.string   "code"
     t.integer  "owner_id"
     t.string   "default_branch"
     t.boolean  "issues_enabled",         :default => true, :null => false
index a339ec4..e9305b4 100644 (file)
@@ -6,7 +6,7 @@ module Gitlab
 
     def user_project
       if @project ||= current_user.projects.find_by_id(params[:id]) ||
-                      current_user.projects.find_by_code(params[:id])
+                      current_user.projects.find_by_path(params[:id])
       else
         not_found!
       end
index 5a24c5d..056fb03 100644 (file)
@@ -34,6 +34,7 @@ module Gitlab
         extern_uid: uid,
         provider: provider,
         name: name,
+        username: email.match(/^[^@]*/)[0],
         email: email,
         password: password,
         password_confirmation: password,
index a49cd69..51b4c5c 100644 (file)
@@ -12,6 +12,7 @@ FactoryGirl.define do
   factory :user, aliases: [:author, :assignee, :owner] do
     email { Faker::Internet.email }
     name
+    username 'john'
     password "123456"
     password_confirmation { password }
 
index 08254f4..ea5cf79 100644 (file)
@@ -13,7 +13,7 @@ describe UserObserver do
   end
 
   context 'when a new user is created' do
-    let(:user) { double(:user, id: 42, password: 'P@ssword!', name: 'John', email: 'u@mail.local') }
+    let(:user) { double(:user, id: 42, password: 'P@ssword!', name: 'John', email: 'u@mail.local', username: 'root') }
     let(:notification) { double :notification }
 
     it 'sends an email' do
index 60261c7..fb26bf9 100644 (file)
@@ -78,14 +78,6 @@ describe Admin::ProjectsController, "routing" do
     get("/admin/projects").should route_to('admin/projects#index')
   end
 
-  it "to #create" do
-    post("/admin/projects").should route_to('admin/projects#create')
-  end
-
-  it "to #new" do
-    get("/admin/projects/new").should route_to('admin/projects#new')
-  end
-
   it "to #edit" do
     get("/admin/projects/gitlab/edit").should route_to('admin/projects#edit', id: 'gitlab')
   end