summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2017-12-01 14:31:42 +0000
committerDouwe Maan <douwe@gitlab.com>2017-12-01 14:31:42 +0000
commit7e81de5ba8fa2aaa13c6035c0e333b4b0ff0df9b (patch)
tree0a860cc696c9b2c9563c731debf607ff6d3aa8fd /lib
parent76e75549b9bec9dee1e856969ef169a4450b3f30 (diff)
parent2e44e3176fa726119ea9e74b62b14f540770425d (diff)
downloadgitlab-shell-7e81de5ba8fa2aaa13c6035c0e333b4b0ff0df9b.tar.gz
Merge branch '116-fix-fork-project-for-hashed-storage' into 'master'v5.10.0
Add a 'fork-repository' command that works with hashed storage Closes #116 See merge request gitlab-org/gitlab-shell!174
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab_projects.rb31
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/gitlab_projects.rb b/lib/gitlab_projects.rb
index 9586345..ad62cce 100644
--- a/lib/gitlab_projects.rb
+++ b/lib/gitlab_projects.rb
@@ -69,6 +69,8 @@ class GitlabProjects
import_project
when 'fork-project';
fork_project
+ when 'fork-repository';
+ fork_repository
when 'fetch-remote';
fetch_remote
when 'push-branches';
@@ -360,6 +362,35 @@ class GitlabProjects
end
end
+ def fork_repository
+ from_path = full_path
+
+ new_repos_path = ARGV.shift
+ new_full_path = ARGV.shift
+
+ unless new_repos_path && new_full_path
+ $logger.error "fork-repository failed: no destination repository path provided."
+ return false
+ end
+
+ to_path = File.join(new_repos_path, new_full_path)
+
+ # The repository cannot already exist
+ if File.exists?(to_path)
+ $logger.error "fork-repository failed: destination repository <#{to_path}> already exists."
+ return false
+ end
+
+ # Ensure the namepsace / hashed storage directory exists
+ FileUtils.mkdir_p(File.dirname(to_path), mode: 0770)
+
+ $logger.info "Forking repository from <#{from_path}> to <#{to_path}>."
+ cmd = %W(git clone --bare -- #{from_path} #{to_path})
+ system(*cmd) && self.class.create_hooks(to_path)
+ end
+
+ # DEPRECATED in favour of fork_repository, which takes a source and destination
+ # repository path and so can work with hashed storage. Remove in v6.0.0
def fork_project
destination_repos_path = ARGV.shift