repository.rb 2.9 KB
Newer Older
D
Dmitriy Zaporozhets 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
require 'yaml'

module Backup
  class Repository
    attr_reader :repos_path

    def dump
      prepare

      Project.find_each(batch_size: 1000) do |project|
        print " * #{project.path_with_namespace} ... "

        if project.empty_repo?
          puts "[SKIPPED]".cyan
          next
        end

        # Create namespace dir if missing
        FileUtils.mkdir_p(File.join(backup_repos_path, project.namespace.path)) if project.namespace

21
        if system(*%W(git --git-dir=#{path_to_repo(project)} bundle create #{path_to_bundle(project)} --all), silent)
D
Dmitriy Zaporozhets 已提交
22 23 24 25
          puts "[DONE]".green
        else
          puts "[FAILED]".red
        end
26

27
        wiki = ProjectWiki.new(project)
28 29 30

        if File.exists?(path_to_repo(wiki))
          print " * #{wiki.path_with_namespace} ... "
31 32
          if wiki.empty?
            puts " [SKIPPED]".cyan
33
          elsif system(*%W(git --git-dir=#{path_to_repo(wiki)} bundle create #{path_to_bundle(wiki)} --all), silent)
34 35 36 37 38
            puts " [DONE]".green
          else
            puts " [FAILED]".red
          end
        end
D
Dmitriy Zaporozhets 已提交
39 40 41 42 43 44
      end
    end

    def restore
      if File.exists?(repos_path)
        # Move repos dir to 'repositories.old' dir
45
        bk_repos_path = File.join(repos_path, '..', 'repositories.old.' + Time.now.to_i.to_s)
D
Dmitriy Zaporozhets 已提交
46 47 48 49 50 51 52 53 54 55
        FileUtils.mv(repos_path, bk_repos_path)
      end

      FileUtils.mkdir_p(repos_path)

      Project.find_each(batch_size: 1000) do |project|
        print "#{project.path_with_namespace} ... "

        project.namespace.ensure_dir_exist if project.namespace

56
        if system(*%W(git clone --bare #{path_to_bundle(project)} #{path_to_repo(project)}), silent)
D
Dmitriy Zaporozhets 已提交
57 58 59 60
          puts "[DONE]".green
        else
          puts "[FAILED]".red
        end
61

62
        wiki = ProjectWiki.new(project)
63 64 65

        if File.exists?(path_to_bundle(wiki))
          print " * #{wiki.path_with_namespace} ... "
66
          if system(*%W(git clone --bare #{path_to_bundle(wiki)} #{path_to_repo(wiki)}), silent)
67 68 69 70 71
            puts " [DONE]".green
          else
            puts " [FAILED]".red
          end
        end
D
Dmitriy Zaporozhets 已提交
72
      end
73 74

      print 'Put GitLab hooks in repositories dirs'.yellow
75
      if system("#{Gitlab.config.gitlab_shell.path}/support/rewrite-hooks.sh", Gitlab.config.gitlab_shell.repos_path)
76 77 78 79 80
        puts " [DONE]".green
      else
        puts " [FAILED]".red
      end

D
Dmitriy Zaporozhets 已提交
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
    end

    protected

    def path_to_repo(project)
      File.join(repos_path, project.path_with_namespace + '.git')
    end

    def path_to_bundle(project)
      File.join(backup_repos_path, project.path_with_namespace + ".bundle")
    end

    def repos_path
      Gitlab.config.gitlab_shell.repos_path
    end

    def backup_repos_path
      File.join(Gitlab.config.backup.path, "repositories")
    end

    def prepare
      FileUtils.rm_rf(backup_repos_path)
      FileUtils.mkdir_p(backup_repos_path)
    end
105 106 107 108

    def silent
      {err: '/dev/null', out: '/dev/null'}
    end
D
Dmitriy Zaporozhets 已提交
109 110
  end
end