Commit 5f9d78fdff746a0b50313cf415acac809569a186
1 parent
d58aca06
Exists in
master
and in
4 other branches
Include groups in import with import repos rake task
Expand the import glob to include `**/*.git` to find projects in groups as well as top level projects. Check for existing group, and create group if needed. Set namespace_id for imported projects.
Showing
2 changed files
with
38 additions
and
14 deletions
Show diff stats
doc/raketasks/maintenance.md
... | ... | @@ -116,6 +116,8 @@ bundle exec rake gitlab:satellites:create RAILS_ENV=production |
116 | 116 | Notes: |
117 | 117 | |
118 | 118 | * project owner will be a first admin |
119 | +* groups will be created as needed | |
120 | +* group owner will be the first admin | |
119 | 121 | * existing projects will be skipped |
120 | 122 | |
121 | 123 | How to use: |
... | ... | @@ -132,5 +134,8 @@ Example output: |
132 | 134 | ``` |
133 | 135 | Processing abcd.git |
134 | 136 | * Created abcd (abcd.git) |
137 | +Processing group/xyz.git | |
138 | + * Created Group group (2) | |
139 | + * Created xyz (group/xyz.git) | |
135 | 140 | [...] |
136 | 141 | ``` | ... | ... |
lib/tasks/gitlab/import.rake
... | ... | @@ -13,42 +13,61 @@ namespace :gitlab do |
13 | 13 | task repos: :environment do |
14 | 14 | |
15 | 15 | git_base_path = Gitlab.config.gitlab_shell.repos_path |
16 | - repos_to_import = Dir.glob(git_base_path + '/*') | |
16 | + repos_to_import = Dir.glob(git_base_path + '/**/*.git') | |
17 | 17 | |
18 | 18 | namespaces = Namespace.pluck(:path) |
19 | 19 | |
20 | 20 | repos_to_import.each do |repo_path| |
21 | - repo_name = File.basename repo_path | |
21 | + # strip repo base path | |
22 | + repo_path[0..git_base_path.length] = '' | |
22 | 23 | |
23 | - # Skip if group or user | |
24 | - next if namespaces.include?(repo_name) | |
24 | + path = repo_path.sub(/\.git$/, '') | |
25 | + name = File.basename path | |
26 | + group_name = File.dirname path | |
27 | + group_name = nil if group_name == '.' | |
25 | 28 | |
26 | - # skip if not git repo | |
27 | - next unless repo_name =~ /.git$/ | |
29 | + # Skip if group or user | |
30 | + next if namespaces.include?(name) | |
28 | 31 | |
29 | - next if repo_name == 'gitolite-admin.git' | |
32 | + next if name == 'gitolite-admin' | |
30 | 33 | |
31 | - path = repo_name.sub(/\.git$/, '') | |
34 | + puts "Processing #{repo_path}".yellow | |
32 | 35 | |
33 | 36 | project = Project.find_with_namespace(path) |
34 | 37 | |
35 | - puts "Processing #{repo_name}".yellow | |
36 | - | |
37 | 38 | if project |
38 | - puts " * #{project.name} (#{repo_name}) exists" | |
39 | + puts " * #{project.name} (#{repo_path}) exists" | |
39 | 40 | else |
40 | 41 | user = User.admins.first |
41 | 42 | |
42 | 43 | project_params = { |
43 | - name: path, | |
44 | + name: name, | |
44 | 45 | } |
45 | 46 | |
47 | + # find group namespace | |
48 | + if group_name | |
49 | + group = Group.find_by_path(group_name) | |
50 | + # create group namespace | |
51 | + if !group | |
52 | + group = Group.new(:name => group_name) | |
53 | + group.path = group_name | |
54 | + group.owner = user | |
55 | + if group.save | |
56 | + puts " * Created Group #{group.name} (#{group.id})".green | |
57 | + else | |
58 | + puts " * Failed trying to create group #{group.name}".red | |
59 | + end | |
60 | + end | |
61 | + # set project group | |
62 | + project_params[:namespace_id] = group.id | |
63 | + end | |
64 | + | |
46 | 65 | project = Projects::CreateContext.new(user, project_params).execute |
47 | 66 | |
48 | 67 | if project.valid? |
49 | - puts " * Created #{project.name} (#{repo_name})".green | |
68 | + puts " * Created #{project.name} (#{repo_path})".green | |
50 | 69 | else |
51 | - puts " * Failed trying to create #{project.name} (#{repo_name})".red | |
70 | + puts " * Failed trying to create #{project.name} (#{repo_path})".red | |
52 | 71 | end |
53 | 72 | end |
54 | 73 | end | ... | ... |