Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-08-12 19:21:47 +0400
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-08-12 19:21:47 +0400
commit7ecebdd02df9b11fa6ba4f8033dcfe097935ed66 (patch)
treea080ef380992f880b7b29714772152dc3ac71ed5
parente2f946fddb7caf9757b33ba3dc7de8634f4ee825 (diff)
Repository import during project creation often return timeout for medium and large repos.
So lets do it async. First create project, then import repo and create satellite with Sidekiq
-rw-r--r--app/contexts/projects/create_context.rb14
-rw-r--r--app/models/project.rb10
-rw-r--r--app/observers/project_observer.rb20
-rw-r--r--app/views/projects/empty.html.haml61
-rw-r--r--app/workers/repository_import_worker.rb22
-rw-r--r--db/migrate/20130812143708_add_import_url_to_project.rb5
-rw-r--r--db/schema.rb3
7 files changed, 80 insertions, 55 deletions
diff --git a/app/contexts/projects/create_context.rb b/app/contexts/projects/create_context.rb
index aee3c1c566c..64c2785302d 100644
--- a/app/contexts/projects/create_context.rb
+++ b/app/contexts/projects/create_context.rb
@@ -45,20 +45,6 @@ module Projects
@project.creator = current_user
- # Import project from cloneable resource
- if @project.valid? && @project.import_url.present?
- shell = Gitlab::Shell.new
-
- if shell.import_repository(@project.path_with_namespace, @project.import_url)
- # We should create satellite for imported repo
- @project.satellite.create unless @project.satellite.exists?
- @project.imported = true
- true
- else
- @project.errors.add(:import_url, 'cannot clone repo')
- end
- end
-
if @project.save
unless @project.group
@project.users_projects.create(project_access: UsersProject::MASTER, user: current_user)
diff --git a/app/models/project.rb b/app/models/project.rb
index 59c6d212f48..5ffbead5555 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -37,8 +37,6 @@ class Project < ActiveRecord::Base
acts_as_taggable_on :labels, :issues_default_labels
- attr_accessor :import_url
-
# Relations
belongs_to :creator, foreign_key: "creator_id", class_name: "User"
belongs_to :group, foreign_key: "namespace_id", conditions: "type = 'Group'"
@@ -157,6 +155,10 @@ class Project < ActiveRecord::Base
import_url.present?
end
+ def imported?
+ imported
+ end
+
def check_limit
unless creator.can_create_project?
errors[:limit_reached] << ("Your own projects limit is #{creator.projects_limit}! Please contact administrator to increase it")
@@ -411,10 +413,6 @@ class Project < ActiveRecord::Base
!(forked_project_link.nil? || forked_project_link.forked_from_project.nil?)
end
- def imported?
- imported
- end
-
def personal?
!group
end
diff --git a/app/observers/project_observer.rb b/app/observers/project_observer.rb
index c1a4611536d..83c1795b185 100644
--- a/app/observers/project_observer.rb
+++ b/app/observers/project_observer.rb
@@ -1,13 +1,17 @@
class ProjectObserver < BaseObserver
def after_create(project)
- return true if project.forked? || project.imported?
-
- GitlabShellWorker.perform_async(
- :add_repository,
- project.path_with_namespace
- )
-
- log_info("#{project.owner.name} created a new project \"#{project.name_with_namespace}\"")
+ return true if project.forked?
+
+ if project.import?
+ RepositoryImportWorker.perform_in(5.seconds, project.id)
+ else
+ GitlabShellWorker.perform_async(
+ :add_repository,
+ project.path_with_namespace
+ )
+
+ log_info("#{project.owner.name} created a new project \"#{project.name_with_namespace}\"")
+ end
end
def after_update(project)
diff --git a/app/views/projects/empty.html.haml b/app/views/projects/empty.html.haml
index 56dbbf0755e..5279ddf47ef 100644
--- a/app/views/projects/empty.html.haml
+++ b/app/views/projects/empty.html.haml
@@ -1,33 +1,42 @@
= render 'clone_panel'
-%div.git-empty
- %fieldset
- %legend Git global setup:
- %pre.dark
- :preserve
- git config --global user.name "#{current_user.name}"
- git config --global user.email "#{current_user.email}"
+- if @project.import? && !@project.imported
+ .save-project-loader
+ %center
+ = image_tag "ajax_loader.gif"
+ %h3 Importing repository.
+ %p.monospace git clone --bare #{@project.import_url}
+ %p Please wait until we import repository for you. Refresh at will.
- %fieldset
- %legend Create Repository
- %pre.dark
- :preserve
- mkdir #{@project.path}
- cd #{@project.path}
- git init
- touch README
- git add README
- git commit -m 'first commit'
- git remote add origin #{@project.url_to_repo}
- git push -u origin master
+- else
+ %div.git-empty
+ %fieldset
+ %legend Git global setup:
+ %pre.dark
+ :preserve
+ git config --global user.name "#{current_user.name}"
+ git config --global user.email "#{current_user.email}"
- %fieldset
- %legend Existing Git Repo?
- %pre.dark
- :preserve
- cd existing_git_repo
- git remote add origin #{@project.url_to_repo}
- git push -u origin master
+ %fieldset
+ %legend Create Repository
+ %pre.dark
+ :preserve
+ mkdir #{@project.path}
+ cd #{@project.path}
+ git init
+ touch README
+ git add README
+ git commit -m 'first commit'
+ git remote add origin #{@project.url_to_repo}
+ git push -u origin master
+
+ %fieldset
+ %legend Existing Git Repo?
+ %pre.dark
+ :preserve
+ cd existing_git_repo
+ git remote add origin #{@project.url_to_repo}
+ git push -u origin master
- if can? current_user, :remove_project, @project
.prepend-top-20
diff --git a/app/workers/repository_import_worker.rb b/app/workers/repository_import_worker.rb
new file mode 100644
index 00000000000..a3b4bd0c9b5
--- /dev/null
+++ b/app/workers/repository_import_worker.rb
@@ -0,0 +1,22 @@
+class RepositoryImportWorker
+ include Sidekiq::Worker
+ include Gitlab::ShellAdapter
+
+ sidekiq_options queue: :gitlab_shell
+
+ def perform(project_id)
+ project = Project.find(project_id)
+ result = gitlab_shell.send(:import_repository,
+ project.path_with_namespace,
+ project.import_url)
+
+ if result
+ project.imported = true
+ project.save
+ project.satellite.create unless project.satellite.exists?
+ project.discover_default_branch
+ else
+ project.imported = false
+ end
+ end
+end
diff --git a/db/migrate/20130812143708_add_import_url_to_project.rb b/db/migrate/20130812143708_add_import_url_to_project.rb
new file mode 100644
index 00000000000..023a48741b2
--- /dev/null
+++ b/db/migrate/20130812143708_add_import_url_to_project.rb
@@ -0,0 +1,5 @@
+class AddImportUrlToProject < ActiveRecord::Migration
+ def change
+ add_column :projects, :import_url, :string
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index f6adfe3c522..e0e7d47b92e 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended to check this file into your version control system.
-ActiveRecord::Schema.define(:version => 20130804151314) do
+ActiveRecord::Schema.define(:version => 20130812143708) do
create_table "deploy_keys_projects", :force => true do |t|
t.integer "deploy_key_id", :null => false
@@ -178,6 +178,7 @@ ActiveRecord::Schema.define(:version => 20130804151314) do
t.boolean "snippets_enabled", :default => true, :null => false
t.datetime "last_activity_at"
t.boolean "imported", :default => false, :null => false
+ t.string "import_url"
end
add_index "projects", ["creator_id"], :name => "index_projects_on_owner_id"