Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Jérome Perrin
gitlab-ce
Commits
3f7ed550
Commit
3f7ed550
authored
Jun 14, 2016
by
James Lopez
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
lots of refactoring to reuse import service
parent
1ea44ee7
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
143 additions
and
179 deletions
+143
-179
app/controllers/import/gitlab_projects_controller.rb
app/controllers/import/gitlab_projects_controller.rb
+4
-6
app/controllers/projects_controller.rb
app/controllers/projects_controller.rb
+1
-1
app/models/project.rb
app/models/project.rb
+4
-0
app/models/todo.rb
app/models/todo.rb
+0
-4
app/services/projects/create_service.rb
app/services/projects/create_service.rb
+3
-1
app/services/projects/import_service.rb
app/services/projects/import_service.rb
+5
-2
app/views/projects/edit.html.haml
app/views/projects/edit.html.haml
+13
-0
app/workers/project_import_worker.rb
app/workers/project_import_worker.rb
+4
-4
lib/gitlab/gitlab_import/project_creator.rb
lib/gitlab/gitlab_import/project_creator.rb
+9
-12
lib/gitlab/import_export/file_importer.rb
lib/gitlab/import_export/file_importer.rb
+30
-0
lib/gitlab/import_export/import_export.yml
lib/gitlab/import_export/import_export.yml
+0
-2
lib/gitlab/import_export/import_service.rb
lib/gitlab/import_export/import_service.rb
+0
-81
lib/gitlab/import_export/importer.rb
lib/gitlab/import_export/importer.rb
+64
-14
lib/gitlab/import_export/project_factory.rb
lib/gitlab/import_export/project_factory.rb
+0
-41
lib/gitlab/import_export/project_tree_restorer.rb
lib/gitlab/import_export/project_tree_restorer.rb
+6
-11
No files found.
app/controllers/import/gitlab_projects_controller.rb
View file @
3f7ed550
...
...
@@ -12,12 +12,10 @@ class Import::GitlabProjectsController < Import::BaseController
return
redirect_back_or_default
(
options:
{
alert:
"You need to upload a GitLab project export archive."
})
end
@project
=
Project
.
create_from_import_job
(
current_user_id:
current_user
.
id
,
tmp_file:
File
.
expand_path
(
params
[
:file
].
path
),
namespace_id:
project_params
[
:namespace_id
],
project_path:
project_params
[
:path
])
@project
=
Gitlab
::
GitlabImport
::
ProjectCreator
.
new
(
repo
,
namespace
,
current_user
,
access_params
).
execute
@project
=
Gitlab
::
GitlabImport
::
ProjectCreator
.
new
(
Namespace
.
find
(
project_params
[
:namespace_id
]),
current_user
,
File
.
expand_path
(
params
[
:file
].
path
),
project_params
[
:path
]).
execute
flash
[
:notice
]
=
"The project import has been started."
...
...
app/controllers/projects_controller.rb
View file @
3f7ed550
...
...
@@ -190,7 +190,7 @@ class ProjectsController < Projects::ApplicationController
redirect_to
(
edit_project_path
(
@project
),
notice:
"Project export successfully started"
notice:
"Project export successfully started
.
"
)
end
...
...
app/models/project.rb
View file @
3f7ed550
...
...
@@ -492,6 +492,10 @@ class Project < ActiveRecord::Base
Gitlab
::
UrlSanitizer
.
new
(
import_url
).
masked_url
end
def
gitlab_project_import?
import_type
==
'gitlab_project'
end
def
check_limit
unless
creator
.
can_create_project?
or
namespace
.
kind
==
'group'
projects_limit
=
creator
.
projects_limit
...
...
app/models/todo.rb
View file @
3f7ed550
...
...
@@ -45,10 +45,6 @@ class Todo < ActiveRecord::Base
target_type
==
"Commit"
end
def
for_project?
target_type
==
"Project"
end
# override to return commits, which are not active record
def
target
if
for_commit?
...
...
app/services/projects/create_service.rb
View file @
3f7ed550
...
...
@@ -52,9 +52,11 @@ module Projects
save_project_and_import_data
(
import_data
)
@project
.
import_url
=
download_export_namespace_project_path
(
@project
.
namespace
,
@project
)
if
@project
.
gitlab_project_import?
@project
.
import_start
if
@project
.
import?
after_create_actions
if
@project
.
persisted?
after_create_actions
if
@project
.
persisted?
&&
!
@project
.
gitlab_project_import?
if
@project
.
errors
.
empty?
@project
.
add_import_job
if
@project
.
import?
...
...
app/services/projects/import_service.rb
View file @
3f7ed550
...
...
@@ -9,7 +9,8 @@ module Projects
'fogbugz'
,
'gitlab'
,
'github'
,
'google_code'
'google_code'
,
'gitlab_project'
]
def
execute
...
...
@@ -37,7 +38,7 @@ module Projects
def
import_repository
begin
gitlab_shell
.
import_repository
(
project
.
path_with_namespace
,
project
.
import_url
)
gitlab_shell
.
import_repository
(
project
.
path_with_namespace
,
project
.
import_url
)
unless
@project
.
gitlab_project_import?
rescue
Gitlab
::
Shell
::
Error
=>
e
raise
Error
,
"Error importing repository
#{
project
.
import_url
}
into
#{
project
.
path_with_namespace
}
-
#{
e
.
message
}
"
end
...
...
@@ -58,6 +59,8 @@ module Projects
end
def
importer
return
Gitlab
::
ImportExport
::
Importer
if
@project
.
gitlab_project_import?
class_name
=
"Gitlab::
#{
project
.
import_type
.
camelize
}
Import::Importer"
class_name
.
constantize
.
new
(
project
)
end
...
...
app/views/projects/edit.html.haml
View file @
3f7ed550
...
...
@@ -120,6 +120,19 @@
=
link_to
'Housekeeping'
,
housekeeping_namespace_project_path
(
@project
.
namespace
,
@project
),
method: :post
,
class:
"btn btn-save"
%hr
.row.prepend-top-default
.col-lg-3
%h4
.prepend-top-0
Export project
%p
.append-bottom-0
%p
Generates a compressed export file of the project and sends a link to download the export.
.col-lg-9
=
link_to
'Generate new export'
,
export_namespace_project_path
(
@project
.
namespace
,
@project
),
method: :post
,
class:
"btn btn-default"
%hr
-
if
can?
current_user
,
:archive_project
,
@project
.row.prepend-top-default
.col-lg-3
...
...
app/workers/project_import_worker.rb
View file @
3f7ed550
...
...
@@ -7,10 +7,10 @@ class ProjectImportWorker
def
perform
(
current_user_id
,
tmp_file
,
namespace_id
,
path
)
current_user
=
User
.
find
(
current_user_id
)
project
=
Gitlab
::
ImportExport
::
Import
Service
.
execute
(
archive_file:
tmp_file
,
owner:
current_user
,
namespace_id:
namespace_id
,
project_path:
path
)
project
=
Gitlab
::
ImportExport
::
Import
er
.
execute
(
archive_file:
tmp_file
,
owner:
current_user
,
namespace_id:
namespace_id
,
project_path:
path
)
if
project
project
.
repository
.
after_import
else
...
...
lib/gitlab/gitlab_import/project_creator.rb
View file @
3f7ed550
...
...
@@ -3,24 +3,21 @@ module Gitlab
class
ProjectCreator
attr_reader
:repo
,
:namespace
,
:current_user
,
:session_data
def
initialize
(
repo
,
namespace
,
current_user
,
session_data
)
@repo
=
repo
@namespace
=
namespace
def
initialize
(
namespace_id
,
current_user
,
file
,
project_path
)
@namespace_id
=
namespace_id
@current_user
=
current_user
@session_data
=
session_data
@file
=
file
@project_path
=
project_path
end
def
execute
::
Projects
::
CreateService
.
new
(
current_user
,
name:
repo
[
"name"
],
path:
repo
[
"path"
],
description:
repo
[
"description"
],
namespace_id:
namespace
.
id
,
visibility_level:
repo
[
"visibility_level"
],
import_type:
"gitlab"
,
import_source:
repo
[
"path_with_namespace"
],
import_url:
repo
[
"http_url_to_repo"
].
sub
(
"://"
,
"://oauth2:
#{
@session_data
[
:gitlab_access_token
]
}
@"
)
name:
@project_path
,
path:
@project_path
,
namespace_id:
namespace_id
,
import_type:
"gitlab_project"
,
import_source:
@file
).
execute
end
end
...
...
lib/gitlab/import_export/file_importer.rb
0 → 100644
View file @
3f7ed550
module
Gitlab
module
ImportExport
class
FileImporter
include
Gitlab
::
ImportExport
::
CommandLineUtil
def
self
.
import
(
*
args
)
new
(
*
args
).
import
end
def
initialize
(
archive_file
:,
shared
:)
@archive_file
=
archive_file
@shared
=
shared
end
def
import
FileUtils
.
mkdir_p
(
@shared
.
export_path
)
decompress_archive
rescue
=>
e
@shared
.
error
(
e
)
false
end
private
def
decompress_archive
untar_zxf
(
archive:
@archive_file
,
dir:
@shared
.
export_path
)
end
end
end
end
lib/gitlab/import_export/import_export.yml
View file @
3f7ed550
...
...
@@ -30,8 +30,6 @@ project_tree:
# Only include the following attributes for the models specified.
included_attributes
:
project
:
-
:name
-
:path
-
:description
-
:issues_enabled
-
:merge_requests_enabled
...
...
lib/gitlab/import_export/import_service.rb
deleted
100644 → 0
View file @
1ea44ee7
module
Gitlab
module
ImportExport
class
ImportService
def
self
.
execute
(
*
args
)
new
(
*
args
).
execute
end
def
initialize
(
archive_file
:,
owner
:,
namespace_id
:,
project_path
:)
@archive_file
=
archive_file
@current_user
=
owner
@namespace
=
Namespace
.
find
(
namespace_id
)
@shared
=
Gitlab
::
ImportExport
::
Shared
.
new
(
relative_path:
path_with_namespace
(
project_path
),
project_path:
project_path
)
end
def
execute
Gitlab
::
ImportExport
::
Importer
.
import
(
archive_file:
@archive_file
,
shared:
@shared
)
if
check_version!
&&
[
project_tree
,
repo_restorer
,
wiki_restorer
,
uploads_restorer
].
all?
(
&
:restore
)
project_tree
.
project
else
project_tree
.
project
.
destroy
if
project_tree
.
project
nil
end
end
private
def
check_version!
Gitlab
::
ImportExport
::
VersionChecker
.
check!
(
shared:
@shared
)
end
def
project_tree
@project_tree
||=
Gitlab
::
ImportExport
::
ProjectTreeRestorer
.
new
(
user:
@current_user
,
shared:
@shared
,
namespace_id:
@namespace
.
id
)
end
def
repo_restorer
Gitlab
::
ImportExport
::
RepoRestorer
.
new
(
path_to_bundle:
repo_path
,
shared:
@shared
,
project:
project_tree
.
project
)
end
def
wiki_restorer
Gitlab
::
ImportExport
::
RepoRestorer
.
new
(
path_to_bundle:
wiki_repo_path
,
shared:
@shared
,
project:
ProjectWiki
.
new
(
project_tree
.
project
),
wiki:
true
)
end
def
uploads_restorer
Gitlab
::
ImportExport
::
UploadsRestorer
.
new
(
project:
project_tree
.
project
,
shared:
@shared
)
end
def
path_with_namespace
(
project_path
)
File
.
join
(
@namespace
.
path
,
project_path
)
end
def
repo_path
File
.
join
(
@shared
.
export_path
,
'project.bundle'
)
end
def
wiki_repo_path
File
.
join
(
@shared
.
export_path
,
'project.wiki.bundle'
)
end
def
attributes_for_todo
{
user_id:
@current_user
.
id
,
project_id:
project_tree
.
project
.
id
,
target_type:
'Project'
,
target:
project_tree
.
project
,
action:
Todo
::
IMPORTED
,
author_id:
@current_user
.
id
,
state: :pending
,
target_id:
project_tree
.
project
.
id
}
end
end
end
end
lib/gitlab/import_export/importer.rb
View file @
3f7ed550
module
Gitlab
module
ImportExport
class
Importer
include
Gitlab
::
ImportExport
::
CommandLineUtil
def
self
.
import
(
*
args
)
new
(
*
args
).
import
def
self
.
execute
(
*
args
)
new
(
*
args
).
execute
end
def
initialize
(
archive_file
:,
shared
:)
@archive_file
=
archive_file
@shared
=
shared
def
initialize
(
project
)
@archive_file
=
project
.
import_source
@current_user
=
project
.
creator
@shared
=
Gitlab
::
ImportExport
::
Shared
.
new
(
relative_path:
path_with_namespace
(
@project
.
path
))
end
def
import
FileUtils
.
mkdir_p
(
@shared
.
export_path
)
decompress_archive
rescue
=>
e
@shared
.
error
(
e
)
false
def
execute
Gitlab
::
ImportExport
::
FileImporter
.
import
(
archive_file:
@archive_file
,
shared:
@shared
)
if
check_version!
&&
[
project_tree
,
repo_restorer
,
wiki_restorer
,
uploads_restorer
].
all?
(
&
:restore
)
project_tree
.
project
else
project_tree
.
project
.
destroy
if
project_tree
.
project
nil
end
end
private
def
decompress_archive
untar_zxf
(
archive:
@archive_file
,
dir:
@shared
.
export_path
)
def
check_version!
Gitlab
::
ImportExport
::
VersionChecker
.
check!
(
shared:
@shared
)
end
def
project_tree
@project_tree
||=
Gitlab
::
ImportExport
::
ProjectTreeRestorer
.
new
(
user:
@current_user
,
shared:
@shared
,
project:
@project
)
end
def
repo_restorer
Gitlab
::
ImportExport
::
RepoRestorer
.
new
(
path_to_bundle:
repo_path
,
shared:
@shared
,
project:
project_tree
.
project
)
end
def
wiki_restorer
Gitlab
::
ImportExport
::
RepoRestorer
.
new
(
path_to_bundle:
wiki_repo_path
,
shared:
@shared
,
project:
ProjectWiki
.
new
(
project_tree
.
project
),
wiki:
true
)
end
def
uploads_restorer
Gitlab
::
ImportExport
::
UploadsRestorer
.
new
(
project:
project_tree
.
project
,
shared:
@shared
)
end
def
path_with_namespace
(
project_path
)
File
.
join
(
@namespace
.
path
,
project_path
)
end
def
repo_path
File
.
join
(
@shared
.
export_path
,
'project.bundle'
)
end
def
wiki_repo_path
File
.
join
(
@shared
.
export_path
,
'project.wiki.bundle'
)
end
def
attributes_for_todo
{
user_id:
@current_user
.
id
,
project_id:
project_tree
.
project
.
id
,
target_type:
'Project'
,
target:
project_tree
.
project
,
action:
Todo
::
IMPORTED
,
author_id:
@current_user
.
id
,
state: :pending
,
target_id:
project_tree
.
project
.
id
}
end
end
end
...
...
lib/gitlab/import_export/project_factory.rb
deleted
100644 → 0
View file @
1ea44ee7
module
Gitlab
module
ImportExport
module
ProjectFactory
extend
self
def
create
(
project_params
:,
user
:,
namespace_id
:)
project
=
Project
.
new
(
project_params
.
except
(
'id'
))
project
.
creator
=
user
check_namespace
(
namespace_id
,
project
,
user
)
end
def
check_namespace
(
namespace_id
,
project
,
user
)
if
namespace_id
# Find matching namespace and check if it allowed
# for current user if namespace_id passed.
if
allowed_namespace?
(
user
,
namespace_id
)
project
.
namespace_id
=
namespace_id
else
project
.
namespace_id
=
nil
deny_namespace
(
project
)
end
else
# Set current user namespace if namespace_id is nil
project
.
namespace_id
=
user
.
namespace_id
end
project
end
private
def
allowed_namespace?
(
user
,
namespace_id
)
namespace
=
Namespace
.
find_by
(
id:
namespace_id
)
user
.
can?
(
:create_projects
,
namespace
)
end
def
deny_namespace
(
project
)
project
.
errors
.
add
(
:namespace
,
"is not valid"
)
end
end
end
end
lib/gitlab/import_export/project_tree_restorer.rb
View file @
3f7ed550
...
...
@@ -2,12 +2,11 @@ module Gitlab
module
ImportExport
class
ProjectTreeRestorer
def
initialize
(
user
:,
shared
:,
namespace_id
:)
def
initialize
(
user
:,
shared
:,
project
:)
@path
=
File
.
join
(
shared
.
export_path
,
'project.json'
)
@user
=
user
@project_path
=
shared
.
opts
[
:project_path
]
@namespace_id
=
namespace_id
@shared
=
shared
@project
=
project
end
def
restore
...
...
@@ -21,7 +20,7 @@ module Gitlab
end
def
project
@
project
||=
creat
e_project
@
restored_project
||=
restor
e_project
end
private
...
...
@@ -57,14 +56,10 @@ module Gitlab
end
end
def
creat
e_project
def
restor
e_project
project_params
=
@tree_hash
.
reject
{
|
_key
,
value
|
value
.
is_a?
(
Array
)
}
project
=
Gitlab
::
ImportExport
::
ProjectFactory
.
create
(
project_params:
project_params
,
user:
@user
,
namespace_id:
@namespace_id
)
project
.
path
=
@project_path
project
.
name
=
@project_path
project
.
save!
project
@project
.
update
(
project_params
)
@project
end
# Given a relation hash containing one or more models and its relationships,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment