From 8bf8c70c4bdd14502c6f3ae314207b99aa2c9f49 Mon Sep 17 00:00:00 2001
From: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Date: Mon, 11 Feb 2013 23:00:12 +0200
Subject: [PATCH] Import repo feature

---
 app/assets/javascripts/main.js.coffee   |  4 ++++
 app/assets/stylesheets/common.scss      |  4 ++++
 app/contexts/projects/create_context.rb | 14 ++++++++++++--
 app/models/project.rb                   |  9 ++++++---
 app/views/projects/_new_form.html.haml  | 14 ++++++++++++++
 5 files changed, 40 insertions(+), 5 deletions(-)

diff --git a/app/assets/javascripts/main.js.coffee b/app/assets/javascripts/main.js.coffee
index f6c398c0acf..5aaea50cf21 100644
--- a/app/assets/javascripts/main.js.coffee
+++ b/app/assets/javascripts/main.js.coffee
@@ -36,6 +36,10 @@ $ ->
   # Click a .one_click_select field, select the contents
   $(".one_click_select").on 'click', -> $(@).select()
 
+  # Click a .appear-link, appear-data fadeout
+  $(".appear-link").on 'click', ->
+    $('.appear-data').fadeIn()
+
   # Initialize chosen selects
   $('select.chosen').chosen()
 
diff --git a/app/assets/stylesheets/common.scss b/app/assets/stylesheets/common.scss
index c9a11d0a1ac..7ac8c2dd91c 100644
--- a/app/assets/stylesheets/common.scss
+++ b/app/assets/stylesheets/common.scss
@@ -564,3 +564,7 @@ img.emoji {
   vertical-align: middle;
   width: 20px;
 }
+
+.appear-data {
+  display: none;
+}
diff --git a/app/contexts/projects/create_context.rb b/app/contexts/projects/create_context.rb
index 915bd8be8b0..8e1da539a6c 100644
--- a/app/contexts/projects/create_context.rb
+++ b/app/contexts/projects/create_context.rb
@@ -34,13 +34,23 @@ 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)
+          true
+        else
+          @project.errors.add(:import_url, 'cannot clone repo')
+        end
+      end
+
       if @project.save
         @project.users_projects.create(project_access: UsersProject::MASTER, user: current_user)
       end
 
       @project
-    rescue => ex
-      @project.errors.add(:base, "Can't save project. Please try again later")
+    #rescue => ex
+      #@project.errors.add(:base, "Can't save project. Please try again later")
       @project
     end
 
diff --git a/app/models/project.rb b/app/models/project.rb
index fee45f57735..16f189fd71f 100644
--- a/app/models/project.rb
+++ b/app/models/project.rb
@@ -25,12 +25,13 @@ class Project < ActiveRecord::Base
 
   class TransferError < StandardError; end
 
-  attr_accessible :name, :path, :description, :default_branch, :issues_enabled,
-                  :wall_enabled, :merge_requests_enabled, :wiki_enabled, :public, as: [:default, :admin]
+  attr_accessible :name, :path, :description, :default_branch,
+    :issues_enabled, :wall_enabled, :merge_requests_enabled,
+    :wiki_enabled, :public, :import_url, as: [:default, :admin]
 
   attr_accessible :namespace_id, :creator_id, as: :admin
 
-  attr_accessor :error_code
+  attr_accessor :import_url
 
   # Relations
   belongs_to :creator,      foreign_key: "creator_id", class_name: "User"
@@ -75,6 +76,8 @@ class Project < ActiveRecord::Base
   validates_uniqueness_of :name, scope: :namespace_id
   validates_uniqueness_of :path, scope: :namespace_id
 
+  validates :import_url, format: { with: URI::regexp(%w(http https)), message: "should be a valid url" }
+
   validate :check_limit, :repo_name
 
   # Scopes
diff --git a/app/views/projects/_new_form.html.haml b/app/views/projects/_new_form.html.haml
index 185164955fc..d05838ae50d 100644
--- a/app/views/projects/_new_form.html.haml
+++ b/app/views/projects/_new_form.html.haml
@@ -16,6 +16,20 @@
       .input
         = f.select :namespace_id, namespaces_options(params[:namespace_id] || :current_user), {}, {class: 'chosen'}
 
+
+  .clearfix
+    .input
+      = link_to "#", class: 'appear-link' do
+        %i.icon-upload-alt
+        %span Import existing repository?
+  .clearfix.appear-data
+    = f.label :import_url do
+      %span Import existing repo
+    .input
+      = f.text_field :import_url, class: 'xlarge'
+      .light
+        URL should be clonable
+
   %p.padded
     New projects are private by default. You choose who can see the project and commit to repository.
   %hr
-- 
GitLab